1// Aseprite
2// Copyright (C) 2019 Igara Studio S.A.
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/app.h"
12#include "app/commands/cmd_set_palette.h"
13#include "app/commands/new_params.h"
14#include "app/context.h"
15#include "app/context_access.h"
16#include "app/doc_api.h"
17#include "app/pref/preferences.h"
18#include "app/tx.h"
19#include "app/util/pal_ops.h"
20#include "doc/palette.h"
21#include "doc/palette_picks.h"
22#include "doc/remap.h"
23
24namespace app {
25
26using namespace ui;
27
28struct MoveColorsParams : public NewParams {
29 Param<int> before { this, 0, "before" };
30};
31
32class MoveColorsCommand : public CommandWithNewParams<MoveColorsParams> {
33public:
34 MoveColorsCommand(bool copy)
35 : CommandWithNewParams<MoveColorsParams>(
36 (copy ? CommandId::CopyColors():
37 CommandId::MoveColors()), CmdRecordableFlag),
38 m_copy(copy) { }
39
40protected:
41 bool onEnabled(Context* ctx) override {
42 return ctx->checkFlags(ContextFlags::ActiveDocumentIsWritable |
43 ContextFlags::HasSelectedColors);
44 }
45
46 void onExecute(Context* ctx) override {
47 ContextWriter writer(ctx);
48 Site site = ctx->activeSite();
49
50 PalettePicks picks = site.selectedColors();
51 if (picks.picks() == 0)
52 return; // Do nothing
53
54 ASSERT(writer.palette());
55 if (!writer.palette())
56 return;
57
58 Tx tx(writer.context(), friendlyName(), ModifyDocument);
59 const int beforeIndex = params().before();
60 int currentEntry = picks.firstPick();
61
62#ifdef ENABLE_UI
63 if (ctx->isUIAvailable()) {
64 auto& fgColor = Preferences::instance().colorBar.fgColor;
65 if (fgColor().getType() == app::Color::IndexType)
66 currentEntry = fgColor().getIndex();
67 }
68#endif
69
70 doc::Palette palette(*writer.palette());
71 doc::Palette newPalette(palette);
72 move_or_copy_palette_colors(palette, newPalette, picks,
73 currentEntry,
74 beforeIndex,
75 m_copy);
76
77 writer.document()->getApi(tx)
78 .setPalette(writer.sprite(), writer.frame(), &newPalette);
79
80 ctx->setSelectedColors(picks);
81
82#ifdef ENABLE_UI
83 if (ctx->isUIAvailable()) {
84 auto& fgColor = Preferences::instance().colorBar.fgColor;
85 if (fgColor().getType() == app::Color::IndexType)
86 fgColor(Color::fromIndex(currentEntry));
87 }
88#endif
89
90 tx.commit();
91 }
92
93private:
94 bool m_copy;
95};
96
97Command* CommandFactory::createMoveColorsCommand()
98{
99 return new MoveColorsCommand(false);
100}
101
102Command* CommandFactory::createCopyColorsCommand()
103{
104 return new MoveColorsCommand(true);
105}
106
107} // namespace app
108