1// Aseprite
2// Copyright (C) 2018-2022 Igara Studio S.A.
3// Copyright (C) 2001-2017 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_CONTEXT_BAR_H_INCLUDED
9#define APP_UI_CONTEXT_BAR_H_INCLUDED
10#pragma once
11
12#include "app/pref/preferences.h"
13#include "app/shade.h"
14#include "app/tools/active_tool_observer.h"
15#include "app/tools/dynamics.h"
16#include "app/tools/ink_type.h"
17#include "app/tools/tool_loop_modifiers.h"
18#include "app/ui/context_bar_observer.h"
19#include "app/ui/doc_observer_widget.h"
20#include "doc/brush.h"
21#include "obs/connection.h"
22#include "obs/observable.h"
23#include "obs/signal.h"
24#include "render/gradient.h"
25#include "ui/box.h"
26
27#include <vector>
28
29namespace doc {
30 class Remap;
31}
32
33namespace render {
34 class DitheringAlgorithmBase;
35 class DitheringMatrix;
36}
37
38namespace ui {
39 class Box;
40 class Button;
41 class Label;
42 class TooltipManager;
43}
44
45namespace app {
46
47 namespace tools {
48 class Ink;
49 class Tool;
50 }
51
52 class BrushSlot;
53 class ColorBar;
54 class DitheringSelector;
55 class GradientTypeSelector;
56 class SamplingSelector;
57 class Transformation;
58
59 class ContextBar : public DocObserverWidget<ui::HBox>
60 , public obs::observable<ContextBarObserver>
61 , public tools::ActiveToolObserver {
62 public:
63 ContextBar(ui::TooltipManager* tooltipManager,
64 ColorBar* colorBar);
65 ~ContextBar();
66
67 void updateForActiveTool();
68 void updateForTool(tools::Tool* tool);
69 void updateForMovingPixels(const Transformation& t);
70 void updateForSelectingBox(const std::string& text);
71 void updateToolLoopModifiersIndicators(tools::ToolLoopModifiers modifiers);
72 bool updateSamplingVisibility(tools::Tool* tool = nullptr);
73 void updateAutoSelectLayer(bool state);
74 bool isAutoSelectLayer() const;
75
76 void setActiveBrush(const doc::BrushRef& brush);
77 void setActiveBrushBySlot(tools::Tool* tool, int slot);
78 doc::BrushRef activeBrush(tools::Tool* tool = nullptr,
79 tools::Ink* ink = nullptr) const;
80 void discardActiveBrush();
81
82 BrushSlot createBrushSlotFromPreferences();
83 static doc::BrushRef createBrushFromPreferences(
84 ToolPreferences::Brush* brushPref = nullptr);
85
86 doc::Remap* createShadeRemap(bool left);
87 void reverseShadeColors();
88 Shade getShade() const;
89
90 void setInkType(tools::InkType type);
91
92 // For gradients
93 render::DitheringMatrix ditheringMatrix();
94 render::DitheringAlgorithmBase* ditheringAlgorithm();
95 render::GradientType gradientType();
96
97 // For freehand with dynamics
98 const tools::DynamicsOptions& getDynamics() const;
99
100 // Signals
101 obs::signal<void()> BrushChange;
102
103 protected:
104 void onInitTheme(ui::InitThemeEvent& ev) override;
105 void onSizeHint(ui::SizeHintEvent& ev) override;
106 void onToolSetOpacity(const int& newOpacity);
107 void onToolSetFreehandAlgorithm();
108 void onToolSetContiguous();
109
110 // ContextObserver impl
111 void onActiveSiteChange(const Site& site) override;
112
113 // DocObserverWidget overrides
114 void onDocChange(Doc* doc) override;
115
116 // DocObserver impl
117 void onAddSlice(DocEvent& ev) override;
118 void onRemoveSlice(DocEvent& ev) override;
119 void onSliceNameChange(DocEvent& ev) override;
120
121 private:
122 void onBrushSizeChange();
123 void onBrushAngleChange();
124 void onSymmetryModeChange();
125 void onFgOrBgColorChange(doc::Brush::ImageColor imageColor);
126 void onDropPixels(ContextBarObserver::DropAction action);
127 void updateSliceFields(const Site& site);
128
129 // ActiveToolObserver impl
130 void onActiveToolChange(tools::Tool* tool) override;
131
132 void setupTooltips(ui::TooltipManager* tooltipManager);
133 void registerCommands();
134 void showBrushes();
135 void showDynamics();
136 bool needZoomButtons(tools::Tool* tool) const;
137
138 class ZoomButtons;
139 class BrushBackField;
140 class BrushTypeField;
141 class BrushAngleField;
142 class BrushSizeField;
143 class ToleranceField;
144 class ContiguousField;
145 class PaintBucketSettingsField;
146 class InkTypeField;
147 class InkOpacityField;
148 class InkShadesField;
149 class SprayWidthField;
150 class SpraySpeedField;
151 class SelectionModeField;
152 class GradientTypeField;
153 class TransparentColorField;
154 class PivotField;
155 class RotAlgorithmField;
156 class TransformationFields;
157 class DynamicsField;
158 class FreehandAlgorithmField;
159 class BrushPatternField;
160 class EyedropperField;
161 class DropPixelsField;
162 class AutoSelectLayerField;
163 class SymmetryField;
164 class SliceFields;
165
166 ZoomButtons* m_zoomButtons;
167 SamplingSelector* m_samplingSelector;
168 BrushBackField* m_brushBack;
169 BrushTypeField* m_brushType;
170 BrushAngleField* m_brushAngle;
171 BrushSizeField* m_brushSize;
172 ui::Label* m_toleranceLabel;
173 ToleranceField* m_tolerance;
174 ContiguousField* m_contiguous;
175 PaintBucketSettingsField* m_paintBucketSettings;
176 InkTypeField* m_inkType;
177 ui::Label* m_inkOpacityLabel;
178 InkOpacityField* m_inkOpacity;
179 InkShadesField* m_inkShades;
180 EyedropperField* m_eyedropperField;
181 AutoSelectLayerField* m_autoSelectLayer;
182 ui::Box* m_freehandBox;
183 DynamicsField* m_dynamics;
184 FreehandAlgorithmField* m_freehandAlgo;
185 BrushPatternField* m_brushPatternField;
186 ui::Box* m_sprayBox;
187 ui::Label* m_sprayLabel;
188 SprayWidthField* m_sprayWidth;
189 SpraySpeedField* m_spraySpeed;
190 ui::Box* m_selectionOptionsBox;
191 DitheringSelector* m_ditheringSelector;
192 SelectionModeField* m_selectionMode;
193 GradientTypeField* m_gradientType;
194 TransparentColorField* m_transparentColor;
195 PivotField* m_pivot;
196 RotAlgorithmField* m_rotAlgo;
197 TransformationFields* m_transformation = nullptr;
198 DropPixelsField* m_dropPixels;
199 doc::BrushRef m_activeBrush;
200 ui::Label* m_selectBoxHelp;
201 SymmetryField* m_symmetry;
202 SliceFields* m_sliceFields;
203 obs::scoped_connection m_symmModeConn;
204 obs::scoped_connection m_fgColorConn;
205 obs::scoped_connection m_bgColorConn;
206 obs::scoped_connection m_keysConn;
207 obs::scoped_connection m_dropPixelsConn;
208 obs::scoped_connection m_sizeConn;
209 obs::scoped_connection m_angleConn;
210 obs::scoped_connection m_opacityConn;
211 obs::scoped_connection m_freehandAlgoConn;
212 obs::scoped_connection m_contiguousConn;
213 };
214
215} // namespace app
216
217#endif
218