mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-03 21:46:20 +00:00
Load palettes from all possible places (fix #757)
- Extensions - data/palettes/ in all locations - palettes/ in the user dir
This commit is contained in:
parent
b7b69ce538
commit
950955787f
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user