1// Aseprite
2// Copyright (C) 2001-2017 David Capello
3//
4// This program is distributed under the terms of
5// the End-User License Agreement for Aseprite.
6
7#ifdef HAVE_CONFIG_H
8#include "config.h"
9#endif
10
11#include "app/commands/command.h"
12#include "app/commands/params.h"
13#include "app/i18n/strings.h"
14#include "app/ui/color_bar.h"
15#include "fmt/format.h"
16
17namespace app {
18
19class PaletteEditorCommand : public Command {
20public:
21 PaletteEditorCommand();
22
23protected:
24 void onLoadParams(const Params& params) override;
25 bool onChecked(Context* context) override;
26 void onExecute(Context* context) override;
27 std::string onGetFriendlyName() const override;
28
29private:
30 bool m_edit;
31 bool m_popup;
32 bool m_background;
33};
34
35PaletteEditorCommand::PaletteEditorCommand()
36 : Command(CommandId::PaletteEditor(), CmdRecordableFlag)
37{
38 m_edit = true;
39 m_popup = false;
40 m_background = false;
41}
42
43void PaletteEditorCommand::onLoadParams(const Params& params)
44{
45 m_edit =
46 (params.empty() ||
47 params.get("edit") == "switch" ||
48 params.get_as<bool>("switch")); // "switch" for backward compatibility
49 m_popup = (!params.get("popup").empty());
50 m_background = (params.get("popup") == "background");
51}
52
53bool PaletteEditorCommand::onChecked(Context* context)
54{
55 return ColorBar::instance()->inEditMode();
56}
57
58void PaletteEditorCommand::onExecute(Context* context)
59{
60 auto colorBar = ColorBar::instance();
61 bool editMode = colorBar->inEditMode();
62 ColorButton* button =
63 (m_background ?
64 colorBar->bgColorButton():
65 colorBar->fgColorButton());
66
67 // Switch edit mode
68 if (m_edit && !m_popup) {
69 colorBar->setEditMode(!editMode);
70 }
71 // Switch popup
72 else if (!m_edit && m_popup) {
73 if (button->isPopupVisible())
74 button->closePopup();
75 else
76 button->openPopup(true);
77 }
78 // Switch both (the popup visibility is used to switch both states)
79 else if (m_edit && m_popup) {
80 if (button->isPopupVisible()) {
81 colorBar->setEditMode(false);
82 button->closePopup();
83 }
84 else {
85 colorBar->setEditMode(true);
86 button->openPopup(true);
87 }
88 }
89}
90
91std::string PaletteEditorCommand::onGetFriendlyName() const
92{
93 std::string edit, plus, popup;
94 if (m_edit) {
95 edit = Strings::commands_PaletteEditor_Edit();
96 }
97 if (m_edit && m_popup) {
98 plus = Strings::commands_PaletteEditor_And();
99 }
100 if (m_popup) {
101 if (m_background)
102 popup = Strings::commands_PaletteEditor_BgPopup();
103 else
104 popup = Strings::commands_PaletteEditor_FgPopup();
105 }
106 return fmt::format(getBaseFriendlyName(), edit, plus, popup);
107}
108
109Command* CommandFactory::createPaletteEditorCommand()
110{
111 return new PaletteEditorCommand;
112}
113
114} // namespace app
115