Load palettes from all possible places (fix #757)

- Extensions
- data/palettes/ in all locations
- palettes/ in the user dir
This commit is contained in:
David Capello 2017-06-10 17:12:55 -03:00
parent b7b69ce538
commit 950955787f
7 changed files with 49 additions and 45 deletions

View File

@ -18,16 +18,21 @@ namespace app {
class PaletteResource : public Resource {
public:
PaletteResource(const std::string& id, doc::Palette* palette)
PaletteResource(const std::string& id,
const std::string& path,
doc::Palette* palette)
: m_id(id)
, m_path(path)
, m_palette(palette) {
}
virtual ~PaletteResource() { }
virtual const std::string& id() const override { return m_id; }
virtual const std::string& path() const override { return m_path; }
virtual doc::Palette* palette() { return m_palette; }
private:
std::string m_id;
std::string m_path;
doc::Palette* m_palette;
};

View File

@ -23,23 +23,33 @@
namespace app {
std::string PalettesLoaderDelegate::resourcesLocation() const
void PalettesLoaderDelegate::getResourcesPaths(std::map<std::string, std::string>& idAndPath) const
{
// Include extension palettes
idAndPath = App::instance()->extensions().palettes();
// Search old palettes too
std::string path;
ResourceFinder rf;
rf.includeDataDir("palettes");
rf.includeDataDir("palettes"); // data/palettes/ in all places
rf.includeUserDir("palettes"); // palettes/ in user home
while (rf.next()) {
if (base::is_directory(rf.filename())) {
path = rf.filename();
break;
}
}
return base::fix_path_separators(path);
}
path = base::fix_path_separators(path);
for (const auto& fn : base::list_files(path)) {
// Ignore the default palette that is inside the palettes/ dir
// in the user home dir.
if (fn == "default.ase" ||
fn == "default.gpl")
continue;
const std::map<std::string, std::string>& PalettesLoaderDelegate::extensionResources() const
{
return App::instance()->extensions().palettes();
std::string fullFn = base::join_path(path, fn);
if (base::is_file(fullFn))
idAndPath[base::get_file_title(fn)] = fullFn;
}
}
}
}
Resource* PalettesLoaderDelegate::loadResource(const std::string& id,
@ -47,7 +57,7 @@ Resource* PalettesLoaderDelegate::loadResource(const std::string& id,
{
doc::Palette* palette = load_palette(path.c_str());
if (palette)
return new PaletteResource(id, palette);
return new PaletteResource(id, path, palette);
else
return nullptr;
}

View File

@ -15,8 +15,7 @@ namespace app {
class PalettesLoaderDelegate : public ResourcesLoaderDelegate {
public:
// ResourcesLoaderDelegate impl
virtual std::string resourcesLocation() const override;
virtual const std::map<std::string, std::string>& extensionResources() const override;
virtual void getResourcesPaths(std::map<std::string, std::string>& idAndPath) const override;
virtual Resource* loadResource(const std::string& id,
const std::string& path) override;
};

View File

@ -14,6 +14,7 @@ namespace app {
public:
virtual ~Resource() { }
virtual const std::string& id() const = 0;
virtual const std::string& path() const = 0;
};
} // namespace app

View File

@ -53,36 +53,17 @@ void ResourcesLoader::threadLoadResources()
{
base::ScopedValue<bool> scoped(m_done, false, true);
std::string path = m_delegate->resourcesLocation();
TRACE("RESLOAD: Loading resources from %s...\n", path.c_str());
if (path.empty())
return;
FileSystemModule* fs = FileSystemModule::instance();
LockFS lock(fs);
IFileItem* item = fs->getFileItemFromPath(path);
if (!item)
return;
// Load resources from a fixed location
FileItemList list = item->children();
for (auto child : list) {
if (m_cancel)
break;
Resource* resource =
m_delegate->loadResource(base::get_file_title(child->fileName()),
child->fileName());
if (resource)
m_queue.push(resource);
}
// Load resources from extensions
for (const auto& idAndPath : m_delegate->extensionResources()) {
std::map<std::string, std::string> idAndPaths;
m_delegate->getResourcesPaths(idAndPaths);
for (const auto& idAndPath : idAndPaths) {
if (m_cancel)
break;
TRACE("RESLOAD: Loading resource '%s' from '%s'...\n",
idAndPath.first.c_str(),
idAndPath.second.c_str());
Resource* resource =
m_delegate->loadResource(idAndPath.first,
idAndPath.second);

View File

@ -18,8 +18,7 @@ namespace app {
class ResourcesLoaderDelegate {
public:
virtual ~ResourcesLoaderDelegate() { }
virtual std::string resourcesLocation() const = 0;
virtual const std::map<std::string, std::string>& extensionResources() const = 0;
virtual void getResourcesPaths(std::map<std::string, std::string>& idAndPath) const = 0;
virtual Resource* loadResource(const std::string& id,
const std::string& path) = 0;
};

View File

@ -15,6 +15,7 @@
#include "app/launcher.h"
#include "app/match_words.h"
#include "app/res/palettes_loader_delegate.h"
#include "app/res/resource.h"
#include "app/ui/palettes_listbox.h"
#include "app/ui/search_entry.h"
#include "app/ui_context.h"
@ -53,6 +54,7 @@ PalettePopup::PalettePopup()
void PalettePopup::showPopup(const gfx::Rect& bounds)
{
m_popup->loadPal()->setEnabled(false);
m_popup->openFolder()->setEnabled(false);
m_paletteListBox.selectChild(NULL);
moveWindow(bounds);
@ -62,9 +64,12 @@ void PalettePopup::showPopup(const gfx::Rect& bounds)
void PalettePopup::onPalChange(doc::Palette* palette)
{
m_popup->loadPal()->setEnabled(
UIContext::instance()->activeDocument() &&
palette != NULL);
const bool state =
(UIContext::instance()->activeDocument() &&
palette != nullptr);
m_popup->loadPal()->setEnabled(state);
m_popup->openFolder()->setEnabled(state);
}
void PalettePopup::onSearchChange()
@ -107,7 +112,11 @@ void PalettePopup::onLoadPal()
void PalettePopup::onOpenFolder()
{
launcher::open_folder(PalettesLoaderDelegate().resourcesLocation());
Resource* res = m_paletteListBox.selectedResource();
if (!res)
return;
launcher::open_folder(res->path());
}
} // namespace app