Add option to load/save default palette preset (fix #626)

Now the default palette is saved in the user configuration
directory, so we can set any palette as the default (it doesn't
matter if it's related or not to a file, it will be copied into
the user directory anyway).
This commit is contained in:
David Capello 2015-05-08 16:08:55 -03:00
parent d3dbc11451
commit d31f83e098
15 changed files with 130 additions and 80 deletions

View File

@ -736,8 +736,15 @@
<param name="size" value="17" />
</item>
<separator />
<item command="LoadPalette" text="&amp;Load Palette" />
<item command="SavePalette" text="&amp;Save Palette" />
<item command="LoadPalette" text="L&amp;oad Palette from File" />
<item command="SavePalette" text="S&amp;ave Palette to File" />
<separator />
<item command="LoadPalette" text="Load Default Palette">
<param name="preset" value="default" />
</item>
<item command="SavePalette" text="Save as Default Palette">
<param name="preset" value="default" />
</item>
</menu>
</menus>

View File

@ -7,7 +7,6 @@
<hbox>
<button id="load_pal" text="Load" width="80" />
<hbox expansive="true" />
<button id="set_default" text="Set as Default" width="80" />
<button id="open_folder" text="Open Folder" width="60" />
</hbox>
</vbox>

View File

@ -164,28 +164,36 @@ void App::initialize(const AppOptions& options)
if (isPortable())
PRINTF("Running in portable mode\n");
// Default palette.
std::string palFile(!options.paletteFileName().empty() ?
options.paletteFileName():
std::string(get_config_string("GfxMode", "Palette", "")));
// Default palette from command line.
std::string palFile = options.paletteFileName();
if (palFile.empty()) {
// Try to use a default pixel art palette.
ResourceFinder rf;
rf.includeDataDir("palettes/db32.gpl");
if (rf.findFirst())
palFile = rf.filename();
// If there is no palette in command line, we use the default one.
palFile = get_preset_palette_filename(get_default_palette_preset_name());
// If the default palette file doesn't exist, we copy db32.gpl as
// the default one.
if (!base::is_file(palFile)) {
ResourceFinder rf;
rf.includeDataDir("palettes/db32.gpl");
if (rf.findFirst()) {
// Copy db32.gpl as the default palette file.
base::UniquePtr<Palette> pal(load_palette(rf.filename().c_str()));
if (pal)
save_palette(palFile.c_str(), pal.get());
}
}
}
// Load default palette file.
if (!palFile.empty()) {
PRINTF("Loading custom palette file: %s\n", palFile.c_str());
PRINTF("Loading default palette file: %s\n", palFile.c_str());
base::UniquePtr<Palette> pal(load_palette(palFile.c_str()));
if (pal.get() != NULL) {
if (pal) {
set_default_palette(pal.get());
}
else {
PRINTF("Error loading custom palette file\n");
PRINTF("Error loading default palette file\n");
}
}

View File

@ -15,6 +15,7 @@
#include "app/context.h"
#include "app/file/palette_file.h"
#include "app/file_selector.h"
#include "app/modules/palettes.h"
#include "base/unique_ptr.h"
#include "doc/palette.h"
#include "ui/alert.h"
@ -29,7 +30,11 @@ public:
Command* clone() const override { return new LoadPaletteCommand(*this); }
protected:
void onLoadParams(const Params& params) override;
void onExecute(Context* context) override;
private:
std::string m_preset;
};
LoadPaletteCommand::LoadPaletteCommand()
@ -39,12 +44,23 @@ LoadPaletteCommand::LoadPaletteCommand()
{
}
void LoadPaletteCommand::onLoadParams(const Params& params)
{
m_preset = params.get("preset");
}
void LoadPaletteCommand::onExecute(Context* context)
{
std::string exts = get_readable_palette_extensions();
std::string filename =
app::show_file_selector("Load Palette", "", exts,
FileSelectorType::Open);
std::string filename;
if (!m_preset.empty()) {
filename = get_preset_palette_filename(m_preset);
}
else {
std::string exts = get_readable_palette_extensions();
filename = app::show_file_selector("Load Palette", "", exts,
FileSelectorType::Open);
}
if (!filename.empty()) {
base::UniquePtr<doc::Palette> palette(load_palette(filename.c_str()));

View File

@ -9,7 +9,10 @@
#include "config.h"
#endif
#include "app/commands/command.h"
#include "app/commands/cmd_set_palette.h"
#include "app/commands/commands.h"
#include "app/commands/params.h"
#include "app/context.h"
#include "app/file/palette_file.h"
#include "app/file_selector.h"
#include "app/modules/palettes.h"
@ -28,7 +31,11 @@ public:
Command* clone() const override { return new SavePaletteCommand(*this); }
protected:
void onLoadParams(const Params& params) override;
void onExecute(Context* context) override;
private:
std::string m_preset;
};
SavePaletteCommand::SavePaletteCommand()
@ -38,16 +45,29 @@ SavePaletteCommand::SavePaletteCommand()
{
}
void SavePaletteCommand::onLoadParams(const Params& params)
{
m_preset = params.get("preset");
}
void SavePaletteCommand::onExecute(Context* context)
{
std::string exts = get_writable_palette_extensions();
const doc::Palette* palette = get_current_palette();
std::string filename;
int ret;
again:
filename = app::show_file_selector("Save Palette", "", exts,
FileSelectorType::Save);
if (!filename.empty()) {
if (!m_preset.empty()) {
filename = get_preset_palette_filename(m_preset);
}
else {
std::string exts = get_writable_palette_extensions();
int ret;
again:
filename = app::show_file_selector("Save Palette", "", exts,
FileSelectorType::Save);
if (filename.empty())
return;
if (base::is_file(filename)) {
ret = Alert::show("Warning<<File exists, overwrite it?<<%s||&Yes||&No||&Cancel",
base::get_file_name(filename).c_str());
@ -57,11 +77,15 @@ again:
else if (ret != 1)
return;
}
}
doc::Palette* palette = get_current_palette();
if (!save_palette(filename.c_str(), palette)) {
Alert::show("Error<<Saving palette file||&Close");
}
if (!save_palette(filename.c_str(), palette))
Alert::show("Error<<Saving palette file||&Close");
if (m_preset == get_default_palette_preset_name()) {
set_default_palette(palette);
if (!context->activeDocument())
set_current_palette(palette, false);
}
}

View File

@ -30,7 +30,6 @@ SetPaletteCommand::SetPaletteCommand()
"Set Palette",
CmdRecordableFlag)
, m_palette(NULL)
, m_target(Target::Document)
{
}
@ -40,31 +39,14 @@ void SetPaletteCommand::onExecute(Context* context)
if (!m_palette)
return;
switch (m_target) {
case Target::Document: {
ContextWriter writer(context);
if (writer.document()) {
Transaction transaction(writer.context(), "Set Palette");
writer.document()->getApi(transaction)
.setPalette(writer.sprite(), writer.frame(), m_palette);
transaction.commit();
}
set_current_palette(m_palette, false);
break;
}
// Set default palette
case Target::App: {
set_default_palette(m_palette);
set_config_string("GfxMode", "Palette", m_palette->filename().c_str());
if (!context->activeDocument())
set_current_palette(m_palette, false);
break;
}
ContextWriter writer(context);
if (writer.document()) {
Transaction transaction(writer.context(), "Set Palette");
writer.document()->getApi(transaction)
.setPalette(writer.sprite(), writer.frame(), m_palette);
transaction.commit();
}
set_current_palette(m_palette, false);
// Redraw the entire screen
ui::Manager::getDefault()->invalidate();

View File

@ -24,15 +24,13 @@ namespace app {
SetPaletteCommand();
Command* clone() const override { return new SetPaletteCommand(*this); }
void setPalette(doc::Palette* palette) { m_palette = palette; }
void setTarget(Target target) { m_target = target; }
void setPalette(const doc::Palette* palette) { m_palette = palette; }
protected:
virtual void onExecute(Context* context) override;
private:
doc::Palette* m_palette;
Target m_target;
const doc::Palette* m_palette;
};
} // namespace app

View File

@ -501,7 +501,7 @@ void DocumentApi::setMaskPosition(int x, int y)
m_transaction.execute(new cmd::SetMaskPosition(m_document, gfx::Point(x, y)));
}
void DocumentApi::setPalette(Sprite* sprite, frame_t frame, Palette* newPalette)
void DocumentApi::setPalette(Sprite* sprite, frame_t frame, const Palette* newPalette)
{
Palette* currentSpritePalette = sprite->palette(frame); // Sprite current pal
int from, to;

View File

@ -101,7 +101,7 @@ namespace app {
void setMaskPosition(int x, int y);
// Palette API
void setPalette(Sprite* sprite, frame_t frame, Palette* newPalette);
void setPalette(Sprite* sprite, frame_t frame, const Palette* newPalette);
private:
void setCelFramePosition(Cel* cel, frame_t frame);

View File

@ -88,7 +88,7 @@ Palette* load_palette(const char *filename)
return pal;
}
bool save_palette(const char *filename, Palette* pal)
bool save_palette(const char *filename, const Palette* pal)
{
std::string ext = base::string_to_lower(base::get_file_extension(filename));
bool success = false;

View File

@ -19,7 +19,7 @@ namespace app {
std::string get_writable_palette_extensions();
doc::Palette* load_palette(const char *filename);
bool save_palette(const char *filename, doc::Palette* pal);
bool save_palette(const char *filename, const doc::Palette* pal);
} // namespace app

View File

@ -9,8 +9,12 @@
#include "config.h"
#endif
#include "app/app.h"
#include "app/modules/palettes.h"
#include "app/app.h"
#include "app/resource_finder.h"
#include "base/fs.h"
#include "base/path.h"
#include "doc/blend.h"
#include "doc/image.h"
#include "doc/palette.h"
@ -54,7 +58,7 @@ Palette* get_default_palette()
return ase_default_palette;
}
void set_default_palette(Palette* palette)
void set_default_palette(const Palette* palette)
{
palette->copyColorsTo(ase_default_palette);
}
@ -92,4 +96,21 @@ void set_black_palette()
delete p;
}
std::string get_preset_palette_filename(const std::string& preset)
{
ResourceFinder rf;
rf.includeUserDir(base::join_path("palettes", ".").c_str());
std::string palettesDir = rf.getFirstOrCreateDefault();
if (!base::is_directory(palettesDir))
base::make_directory(palettesDir);
return base::join_path(palettesDir, preset + ".gpl");
}
std::string get_default_palette_preset_name()
{
return "default";
}
} // namespace app

View File

@ -9,6 +9,8 @@
#define APP_MODULES_PALETTES_H_INCLUDED
#pragma once
#include <string>
namespace doc {
class Palette;
}
@ -22,10 +24,13 @@ namespace app {
Palette* get_default_palette();
Palette* get_current_palette();
void set_default_palette(Palette* palette);
void set_default_palette(const Palette* palette);
bool set_current_palette(const Palette* palette, bool forced);
void set_black_palette();
std::string get_preset_palette_filename(const std::string& preset);
std::string get_default_palette_preset_name();
} // namespace app
#endif

View File

@ -39,8 +39,7 @@ PalettePopup::PalettePopup()
addChild(m_popup);
m_popup->loadPal()->Click.connect(Bind<void>(&PalettePopup::onLoadPal, this, false));
m_popup->setDefault()->Click.connect(Bind<void>(&PalettePopup::onLoadPal, this, true));
m_popup->loadPal()->Click.connect(Bind<void>(&PalettePopup::onLoadPal, this));
m_popup->openFolder()->Click.connect(Bind<void>(&PalettePopup::onOpenFolder, this));
m_popup->view()->attachToView(&m_paletteListBox);
@ -51,7 +50,6 @@ PalettePopup::PalettePopup()
void PalettePopup::showPopup(const gfx::Rect& bounds)
{
m_popup->loadPal()->setEnabled(false);
m_popup->setDefault()->setEnabled(false);
m_paletteListBox.selectChild(NULL);
moveWindow(bounds);
@ -67,11 +65,9 @@ void PalettePopup::onPalChange(doc::Palette* palette)
m_popup->loadPal()->setEnabled(
UIContext::instance()->activeDocument() &&
palette != NULL);
m_popup->setDefault()->setEnabled(palette != NULL);
}
void PalettePopup::onLoadPal(bool asDefault)
void PalettePopup::onLoadPal()
{
doc::Palette* palette = m_paletteListBox.selectedPalette();
if (!palette)
@ -79,13 +75,7 @@ void PalettePopup::onLoadPal(bool asDefault)
SetPaletteCommand* cmd = static_cast<SetPaletteCommand*>(
CommandsModule::instance()->getCommandByName(CommandId::SetPalette));
cmd->setPalette(palette);
if (asDefault)
cmd->setTarget(SetPaletteCommand::Target::App);
else
cmd->setTarget(SetPaletteCommand::Target::Document);
UIContext::instance()->executeCommand(cmd);
}

View File

@ -31,7 +31,7 @@ namespace app {
protected:
void onPalChange(doc::Palette* palette);
void onLoadPal(bool asDefault);
void onLoadPal();
void onOpenFolder();
private: