ultimatepp/uppsrc/CtrlLib/DlgColor.h
2024-12-26 14:25:32 +01:00

220 lines
6.5 KiB
C++

#ifndef __CtrlLib_DlgColor__
#define __CtrlLib_DlgColor__
class WheelRampCtrl : public Ctrl
{
public:
WheelRampCtrl(bool ramp);
~WheelRampCtrl();
virtual void Layout();
virtual void Paint(Draw& draw);
virtual void SetData(const Value& value);
virtual Value GetData() const { return color; }
virtual void LeftDown(Point pt, dword keyflags);
virtual void LeftUp(Point pt, dword keyflags);
virtual void LeftDouble(Point pt, dword keyflags);
virtual void MouseMove(Point pt, dword keyflags);
Event<> WhenLeftDouble;
WheelRampCtrl& DarkContent(bool b = true) { dark_content = b; return *this; }
WheelRampCtrl& AllowDarkContent(bool b = true) { allow_dark_content = b; return *this; }
bool IsDarkContent() const { return dark_content || allow_dark_content && IsDarkTheme(); }
private:
void SetColor(Color color, bool set_norm, bool set_hsv);
Image PaintRamp(Size size);
Image PaintWheel(Size size);
void PaintColumn(Draw& draw);
int ClientToLevel(int y) const;
int LevelToClient(int l) const;
private:
bool ramp;
bool dark_content = false;
bool allow_dark_content = false;
Color color;
Color normalized_color;
int h16, s16, v16;
int round_step;
enum STYLE { S_WHEEL, S_RECT, S_HEXAGON };
STYLE style;
Image cache;
int cache_level;
Image wheel_cache;
Rect wheel_rect;
Rect column_rect;
int firstclick;
struct WheelBuff
{
int arg;
int l;
};
};
struct ColorWheelCtrl : public WheelRampCtrl {
ColorWheelCtrl() : WheelRampCtrl(false) {}
};
struct ColorRampCtrl : public WheelRampCtrl {
ColorRampCtrl() : WheelRampCtrl(true) {}
};
const Display& StdColorDisplayNull();
class ColorPopUp : public Ctrl {
public:
virtual void Paint(Draw& w);
virtual void LeftUp(Point p, dword);
virtual void LeftDown(Point p, dword);
virtual void MouseMove(Point p, dword);
virtual void MouseLeave();
virtual bool Key(dword key, int count);
virtual void Layout();
private:
void PopupDeactivate();
struct Popup : Ctrl {
ColorPopUp *color;
virtual void Deactivate() { color->PopupDeactivate(); }
};
int Get(Point p);
int GetCy();
void Setup(Color c);
void Finish();
void Ramp();
void Wheel();
int GetColorCount() const;
Color GetColor(int i) const;
void Select();
void DrawFilledFrame(Draw &w, int x, int y, int cx, int cy, Color fcol, Color bcol);
void DrawFilledFrame(Draw &w, Rect &r, Color fcol, Color bcol);
int colori;
bool notnull;
bool scolors;
bool norampwheel;
bool animating;
bool hints;
bool open;
bool withvoid;
String nulltext;
String voidtext;
Color color;
ColorRampCtrl ramp;
ColorWheelCtrl wheel;
Button settext;
One<Popup> popup;
static Color hint[18];
friend void ColorPopUp_InitHint();
public:
Event<> WhenCancel;
Event<> WhenSelect;
static void Hint(Color c);
typedef ColorPopUp CLASSNAME;
void PopUp(Ctrl *owner, Color c = White);
Color Get() const;
ColorPopUp& NotNull(bool b = true) { notnull = b; return *this; }
ColorPopUp& SColors(bool b = true) { scolors = b; return *this; }//Deprecated, BUT NEEDED IN THEIDE
ColorPopUp& NullText(const char *s) { nulltext = s; Refresh(); return *this; }
ColorPopUp& WithVoid(bool b = true) { withvoid = b; Refresh(); return *this; }
ColorPopUp& VoidText(const char *s) { voidtext = s; Refresh(); return *this; }
ColorPopUp& NoRampWheel(bool b = true) { norampwheel = b; return *this; }
ColorPopUp& Hints(bool b = true) { hints = b; return *this; }
ColorPopUp& DarkContent(bool b = true);
ColorPopUp& AllowDarkContent(bool b = true);
bool IsDarkContent() const { return wheel.IsDarkContent(); }
ColorPopUp();
virtual ~ColorPopUp();
};
class ColorPusher : public Ctrl {
public:
virtual void Paint(Draw& w);
virtual void LeftDown(Point p, dword);
virtual bool Key(dword key, int);
virtual void GotFocus() { Refresh(); }
virtual void LostFocus() { Refresh(); }
virtual void SetData(const Value& v);
virtual Value GetData() const;
protected:
bool push;
bool withtext;
bool withhex;
bool track;
Color color, saved_color;
ColorPopUp colors;
String nulltext;
String voidtext;
void AcceptColors();
void CloseColors();
void NewColor();
void Drop();
public:
typedef ColorPusher CLASSNAME;
ColorPusher& NullText(const char *s) { nulltext = s; colors.NullText(s); Refresh(); return *this; }
ColorPusher& NotNull(bool b = true) { colors.NotNull(b); return *this; }
ColorPusher& WithVoid(bool b = true) { colors.WithVoid(b); return *this; }
ColorPusher& VoidText(const char *s) { voidtext = s; colors.VoidText(s); Refresh(); return *this; }
ColorPusher& SColors(bool b = true) { colors.SColors(b); return *this; }
ColorPusher& WithText(bool b = true) { withtext = b; Refresh(); return *this; }
ColorPusher& WithHex(bool b = true) { withhex = b; Refresh(); return *this; }
ColorPusher& Track(bool b = true) { track = b; return *this; }
ColorPusher& NoTrack() { return Track(false); }
ColorPusher& NoRampWheel(bool b = true) { colors.NoRampWheel(b); return *this; }
ColorPusher& DarkContent(bool b = true) { colors.DarkContent(b); Refresh(); return *this; }
ColorPusher& AllowDarkContent(bool b = true) { colors.AllowDarkContent(b); Refresh(); return *this; }
ColorPusher();
virtual ~ColorPusher();
};
class ColorButton : public ColorPusher {
public:
virtual void Paint(Draw& w);
virtual void MouseEnter(Point p, dword keyflags);
virtual void MouseLeave();
virtual Size GetMinSize() const;
protected:
Image image, nullimage, staticimage;
const ToolButton::Style *style;
public:
ColorButton& ColorImage(const Image& img) { image = img; Refresh(); return *this; }
ColorButton& NullImage(const Image& img) { nullimage = img; Refresh(); return *this; }
ColorButton& StaticImage(const Image& img) { staticimage = img; Refresh(); return *this; }
ColorButton& SetStyle(const ToolButton::Style& s) { style = &s; Refresh(); return *this; }
ColorButton();
virtual ~ColorButton();
};
String FormatColor(Color c);
Color ReadColor(CParser& p);
Color RealizeColor(Color c);
#endif//__TCtrlLib_DlgColor__