1// Aseprite
2// Copyright (C) 2020 Igara Studio S.A.
3// Copyright (C) 2001-2018 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifndef APP_UI_COLOR_POPUP_H_INCLUDED
9#define APP_UI_COLOR_POPUP_H_INCLUDED
10#pragma once
11
12#include "app/color.h"
13#include "app/shade.h"
14#include "app/ui/button_set.h"
15#include "app/ui/color_button_options.h"
16#include "app/ui/color_shades.h"
17#include "app/ui/color_sliders.h"
18#include "app/ui/hex_color_entry.h"
19#include "app/ui/palette_view.h"
20#include "app/ui/popup_window_pin.h"
21#include "obs/connection.h"
22#include "obs/signal.h"
23#include "ui/grid.h"
24#include "ui/label.h"
25#include "ui/tooltips.h"
26#include "ui/view.h"
27
28namespace app {
29 class PaletteIndexChangeEvent;
30
31 class ColorPopup : public PopupWindowPin
32 , public PaletteViewDelegate {
33 public:
34 enum SetColorOptions {
35 ChangeType,
36 DontChangeType
37 };
38
39 ColorPopup(const ColorButtonOptions& options);
40 ~ColorPopup();
41
42 void setColor(const app::Color& color,
43 const SetColorOptions options);
44 app::Color getColor() const;
45
46 // Signals
47 obs::signal<void(const app::Color&)> ColorChange;
48
49 protected:
50 bool onProcessMessage(ui::Message* msg) override;
51 void onWindowResize() override;
52 void onMakeFloating() override;
53 void onMakeFixed() override;
54 void onColorSlidersChange(ColorSlidersChangeEvent& ev);
55 void onColorHexEntryChange(const app::Color& color);
56 void onSelectOldColor(ColorShades::ClickEvent& ev);
57 void onSimpleColorClick();
58 void onColorTypeClick();
59 void onPaletteChange();
60
61 // PaletteViewDelegate impl
62 void onPaletteViewIndexChange(int index, ui::MouseButton button) override;
63
64 private:
65 void selectColorType(app::Color::Type type);
66 void setColorWithSignal(const app::Color& color,
67 const SetColorOptions options);
68 void findBestfitIndex(const app::Color& color);
69 bool inEditMode();
70
71 class SimpleColors;
72 class CustomButtonSet : public ButtonSet {
73 public:
74 CustomButtonSet();
75 private:
76 void onSelectItem(Item* item, bool focusItem, ui::Message* msg) override;
77 };
78
79 ui::Box m_vbox;
80 ui::TooltipManager m_tooltips;
81 ui::Box m_topBox;
82 app::Color m_color;
83 Widget* m_closeButton;
84 ui::View* m_colorPaletteContainer;
85 PaletteView* m_colorPalette;
86 SimpleColors* m_simpleColors;
87 CustomButtonSet m_colorType;
88 HexColorEntry m_hexColorEntry;
89 ColorShades m_oldAndNew;
90 ColorSliders m_sliders;
91 ui::Label m_maskLabel;
92 obs::scoped_connection m_onPaletteChangeConn;
93 bool m_canPin;
94 bool m_insideChange;
95
96 // This variable is used to avoid updating the m_hexColorEntry text
97 // when the color change is generated from a
98 // HexColorEntry::ColorChange signal. In this way we don't override
99 // what the user is writting in the text field.
100 bool m_disableHexUpdate;
101 };
102
103} // namespace app
104
105#endif
106