From 50bbdd6ffdedc1d10395841532c90fbfb6fe2d87 Mon Sep 17 00:00:00 2001 From: Mirek Fidler Date: Thu, 23 Jan 2025 00:10:37 +0100 Subject: [PATCH 1/2] CtrlLib: Slider and Linux Chameleon improvements --- reference/Slider/Slider.h | 16 ++++++ reference/Slider/Slider.lay | 11 ++++ reference/Slider/Slider.upp | 22 ++++---- reference/Slider/main.cpp | 73 +++++++++++++------------- uppsrc/Core/Color.cpp | 2 +- uppsrc/CtrlLib/ArrayCtrl.h | 2 +- uppsrc/CtrlLib/Ch.cpp | 2 +- uppsrc/CtrlLib/SliderCtrl.cpp | 82 +++++++++++++++++------------- uppsrc/CtrlLib/SliderCtrl.h | 3 +- upptst/TestChStyle/TestChStyle.lay | 16 ++++-- upptst/TestChStyle/main.cpp | 12 +++++ 11 files changed, 148 insertions(+), 93 deletions(-) create mode 100644 reference/Slider/Slider.h create mode 100644 reference/Slider/Slider.lay diff --git a/reference/Slider/Slider.h b/reference/Slider/Slider.h new file mode 100644 index 000000000..3fbb9830c --- /dev/null +++ b/reference/Slider/Slider.h @@ -0,0 +1,16 @@ +#ifndef _Slider_Slider_h +#define _Slider_Slider_h + +#include + +using namespace Upp; + +#define LAYOUTFILE +#include + +class Slider : public WithSliderLayout { +public: + Slider(); +}; + +#endif diff --git a/reference/Slider/Slider.lay b/reference/Slider/Slider.lay new file mode 100644 index 000000000..941a7834e --- /dev/null +++ b/reference/Slider/Slider.lay @@ -0,0 +1,11 @@ +LAYOUT(SliderLayout, 204, 252) + ITEM(Upp::SliderCtrl, hslider, LeftPosZ(4, 148).TopPosZ(8, 24)) + ITEM(Upp::SliderCtrl, vslider, LeftPosZ(4, 20).VCenterPosZ(160, 18)) + ITEM(Upp::Label, vslider_val, LeftPosZ(4, 40).TopPosZ(228, 19)) + ITEM(Upp::SliderCtrl, vslider2, LeftPosZ(56, 20).VCenterPosZ(160, 18)) + ITEM(Upp::Label, vslider_val2, LeftPosZ(56, 40).VCenterPosZ(19, 112)) + ITEM(Upp::Label, hslider_val, LeftPosZ(156, 40).TopPosZ(8, 19)) + ITEM(Upp::SliderCtrl, hslider2, LeftPosZ(4, 148).TopPosZ(36, 24)) + ITEM(Upp::Label, hslider_val2, LeftPosZ(156, 40).TopPosZ(36, 19)) +END_LAYOUT + diff --git a/reference/Slider/Slider.upp b/reference/Slider/Slider.upp index c38ffa04c..8c2f64a4e 100644 --- a/reference/Slider/Slider.upp +++ b/reference/Slider/Slider.upp @@ -1,11 +1,11 @@ -description "SliderCtrl example\377"; - -uses - CtrlLib; - -file - main.cpp; - -mainconfig - "" = "GUI"; - +uses + CtrlLib; + +file + Slider.h, + main.cpp, + Slider.lay; + +mainconfig + "" = "GUI"; + diff --git a/reference/Slider/main.cpp b/reference/Slider/main.cpp index 6647883f2..a5cb12fd8 100644 --- a/reference/Slider/main.cpp +++ b/reference/Slider/main.cpp @@ -1,37 +1,36 @@ -#include - -using namespace Upp; - -struct App : TopWindow { - StaticRect dynarect; - SliderCtrl slider; - Label text; - - typedef App CLASSNAME; - - App() { - Sizeable().Zoomable(); - - slider << [=] { - dynarect.SetRectX(50, ~slider); - text = "\1[C6*/@b " + AsString(~slider); - }; - - slider.Range(700); - slider <<= 250; - - Add(slider.BottomPosZ(5, 30).HSizePos(10, 10)); - - dynarect.Color(SRed); - Add(dynarect.VSizePosZ(40, 40)); - - Add(text.LeftPosZ(0, 200).TopPosZ(0, 40)); - - slider.WhenAction(); - } -}; - -GUI_APP_MAIN -{ - App().Run(); -} +#include "Slider.h" + +Slider::Slider() +{ + CtrlLayout(*this, "Slider example"); + + auto Show = [=] { + vslider_val = ~~vslider; + vslider_val2 = ~~vslider2; + hslider_val = ~~hslider; + hslider_val2 = ~~hslider2; + }; + + vslider.Range(100); + vslider << [=] { Show(); }; + vslider <<= 0; + + vslider2.MinMax(100, 0); + vslider2 << [=] { Show(); }; + vslider2 <<= 0; + + hslider.Range(100); + hslider << [=] { Show(); }; + hslider <<= 0; + + hslider2.MinMax(100, 0); + hslider2 << [=] { Show(); }; + hslider2 <<= 0; + + Show(); +} + +GUI_APP_MAIN +{ + Slider().Run(); +} diff --git a/uppsrc/Core/Color.cpp b/uppsrc/Core/Color.cpp index a5784f85a..df8501cd2 100644 --- a/uppsrc/Core/Color.cpp +++ b/uppsrc/Core/Color.cpp @@ -326,7 +326,7 @@ int Grayscale(const Color& c) double Difference(Color c1, Color c2) { - return 2.75 * abs(c2.GetR() - c1.GetR()) + 5.4 * (c2.GetG() - c1.GetG()) + abs(c2.GetB() - c1.GetB()); + return 2.75 * abs(c2.GetR() - c1.GetR()) + 5.4 * abs(c2.GetG() - c1.GetG()) + abs(c2.GetB() - c1.GetB()); } bool IsDark(Color c) diff --git a/uppsrc/CtrlLib/ArrayCtrl.h b/uppsrc/CtrlLib/ArrayCtrl.h index 887518915..9e4d0a2f2 100644 --- a/uppsrc/CtrlLib/ArrayCtrl.h +++ b/uppsrc/CtrlLib/ArrayCtrl.h @@ -687,7 +687,7 @@ public: ArrayCtrl& NoGrid() { return Grid(false); } ArrayCtrl& GridColor(Color c) { gridcolor = c; return *this; } ArrayCtrl& EvenRowColor(Color paper = SColorEvenRow(), Color ink = SColorText); - ArrayCtrl& OddRowColor(Color paper = SColorInfo(), Color ink = SColorText); + ArrayCtrl& OddRowColor(Color paper = SLtYellow(), Color ink = SColorText); ArrayCtrl& NoCursor(bool b = true) { nocursor = b; return *this; } ArrayCtrl& MouseMoveCursor(bool b = true) { mousemove = b; return *this; } ArrayCtrl& NoMouseMoveCursor() { return MouseMoveCursor(false); } diff --git a/uppsrc/CtrlLib/Ch.cpp b/uppsrc/CtrlLib/Ch.cpp index 6a884937e..d8a34ec2b 100644 --- a/uppsrc/CtrlLib/Ch.cpp +++ b/uppsrc/CtrlLib/Ch.cpp @@ -644,7 +644,7 @@ int ChSynthetic(Image *button100x100, Color *text, bool macos, int dpi) .Close(); }); CtrlImg::Set(CtrlImg::I_hthumb + i, sm); -// CtrlImg::Set(i == CTRL_PRESSED ? CtrlImg::I_vthumb1 : CtrlImg::I_vthumb, RotateClockwise(sm)); + CtrlImg::Set(CtrlImg::I_vthumb + i, RotateClockwise(sm)); { SyntheticTab(i, roundness, ink); } diff --git a/uppsrc/CtrlLib/SliderCtrl.cpp b/uppsrc/CtrlLib/SliderCtrl.cpp index 1cd728eb7..e8074acf8 100644 --- a/uppsrc/CtrlLib/SliderCtrl.cpp +++ b/uppsrc/CtrlLib/SliderCtrl.cpp @@ -19,14 +19,32 @@ bool SliderCtrl::IsVert() const return GetSize().cx < GetSize().cy; } -int SliderCtrl::HoVe(int x, int y) const +int SliderCtrl::HoVe(int x, int y) const { return IsVert() ? y : x; } -int& SliderCtrl::HoVeR(int& x, int& y) const +int SliderCtrl::ThumbSz() const { - return IsVert() ? y : x; + return HoVe(CtrlImg::hthumb().GetSize().cx, CtrlImg::vthumb().GetSize().cy); +} + +int SliderCtrl::SliderSz() const +{ + Size sz = GetSize(); + return HoVe(sz.cx, sz.cy) - ThumbSz(); +} + +int SliderCtrl::SliderToClient(int v) const +{ + if(IsNull(v)) + return Null; + + int sz = SliderSz(); + + v = iscale(clamp(v, Min(), Max()) - min, sz, max - min); + + return HoVe(v, sz - v) + ThumbSz() / 2; } void SliderCtrl::Paint(Draw& w) @@ -37,31 +55,43 @@ void SliderCtrl::Paint(Draw& w) : CTRL_NORMAL : CTRL_DISABLED; int l = SliderToClient(min); - int t = Nvl(SliderToClient(value)); - int h = SliderToClient(max) - l; - Color hl = SColorHighlight(); - if(Difference(hl, Gray()) < 16) - hl = SBlack(); + int t = Nvl(SliderToClient(value), l); + int h = SliderToClient(max); + Color c1 = SColorHighlight(); + if(Difference(c1, Gray()) < 16) + c1 = SBlack(); + Color c2 = Gray(); + if(max < min) + Swap(c1, c2); if(IsVert()) { int half = size.cx >> 1; - w.DrawRect(half - DPI(1), l, DPI(2), t - l, hl); - w.DrawRect(half - DPI(1), t, DPI(2), h - t, Gray()); + w.DrawRect(half - DPI(1), l, DPI(2), t - l, c1); + w.DrawRect(half - DPI(1), t, DPI(2), h - t, c2); if(!IsNull(value)) - w.DrawImage((size.cx - CtrlImg::vthumb().GetSize().cx) >> 1, t, + w.DrawImage((size.cx - CtrlImg::vthumb().GetSize().cx) >> 1, t - ThumbSz() / 2, CtrlImg::Get(CtrlImg::I_vthumb + ii)); } else { int half = size.cy >> 1; - w.DrawRect(l, half - DPI(1), t - l, DPI(2), hl); - w.DrawRect(t, half - DPI(1), h - t, DPI(2), Gray()); + w.DrawRect(l, half - DPI(1), t - l, DPI(2), c1); + w.DrawRect(t, half - DPI(1), h - t, DPI(2), c2); if(!IsNull(value)) - w.DrawImage(t, (size.cy - CtrlImg::hthumb().GetSize().cy) >> 1, + w.DrawImage(t - ThumbSz() / 2, (size.cy - CtrlImg::hthumb().GetSize().cy) >> 1, CtrlImg::Get(CtrlImg::I_hthumb + ii)); } if(HasFocus()) DrawFocus(w, size); } +int SliderCtrl::ClientToSlider(int p) const +{ + int sz = SliderSz(); + p -= ThumbSz() / 2; + if(IsVert()) + p = sz - p; + return clamp(min + iscale(p, max - min, sz), Min(), Max()); +} + bool SliderCtrl::Key(dword key, int repcnt) { if(IsEditable()) @@ -91,7 +121,7 @@ void SliderCtrl::LeftDown(Point pos, dword keyflags) UpdateActionRefresh(); } else - if(p >= thumb && p < thumb + HoVe(CtrlImg::hthumb().GetSize().cx, CtrlImg::vthumb().GetSize().cy)) + if(abs(p - thumb) <= ThumbSz() / 2) SetCapture(); else if(jump) { @@ -100,7 +130,7 @@ void SliderCtrl::LeftDown(Point pos, dword keyflags) UpdateActionRefresh(); } else { - if( ( ( p < thumb) && (min == Min() ) ) || ( (p > thumb) && ( min == Max() ) ) ) + if((min < max) != IsVert() ? p < thumb : p > thumb) Dec(); else Inc(); @@ -178,26 +208,6 @@ SliderCtrl& SliderCtrl::MinMax(int _min, int _max) return *this; } -int SliderCtrl::SliderToClient(int v) const -{ - if(IsNull(v)) - return Null; - v = minmax(v, Min(), Max()); - - v = iscale(v - min, HoVe(GetSize().cx - CtrlImg::hthumb().GetSize().cx, - GetSize().cy - CtrlImg::vthumb().GetSize().cy), max - min); - return v; -} - -int SliderCtrl::ClientToSlider(int p) const -{ - Size hsz = CtrlImg::hthumb().GetSize(); - Size vsz = CtrlImg::vthumb().GetSize(); - p -= HoVe(hsz.cx / 2, vsz.cy / 2); - return minmax(min + iscale(p, max - min, - HoVe(GetSize().cx - hsz.cx, GetSize().cy - vsz.cy)), Min(), Max()); -} - void SliderCtrl::Dec() { int n = value; diff --git a/uppsrc/CtrlLib/SliderCtrl.h b/uppsrc/CtrlLib/SliderCtrl.h index 945c1bb1c..8ef64d77a 100644 --- a/uppsrc/CtrlLib/SliderCtrl.h +++ b/uppsrc/CtrlLib/SliderCtrl.h @@ -8,10 +8,11 @@ class SliderCtrl : public Ctrl { int ClientToSlider(int x) const; int HoVe(int x, int y) const; - int& HoVeR(int& x, int& y) const; int Min() const { return Upp::min(min, max); }; int Max() const { return Upp::max(min, max); }; + int ThumbSz() const; + int SliderSz() const; public: typedef SliderCtrl CLASSNAME; diff --git a/upptst/TestChStyle/TestChStyle.lay b/upptst/TestChStyle/TestChStyle.lay index c2f65e092..3fa71475b 100644 --- a/upptst/TestChStyle/TestChStyle.lay +++ b/upptst/TestChStyle/TestChStyle.lay @@ -1,5 +1,5 @@ LAYOUT(TestChStyleLayout, 972, 532) - ITEM(Upp::OptionBox, dv___0, SetLabel(t_("OptionBox")).LeftPosZ(12, 140).TopPosZ(324, 128)) + ITEM(Upp::OptionBox, dv___0, SetLabel(t_("OptionBox")).LeftPosZ(16, 140).TopPosZ(304, 32)) ITEM(Upp::EditString, readonly, SetEditable(false).LeftPosZ(20, 80).TopPosZ(52, 19)) ITEM(Upp::DropList, dl_readonly, SetEditable(false).LeftPosZ(108, 96).TopPosZ(52, 19)) ITEM(Upp::WithDropChoice, dc_readonly, SetEditable(false).LeftPosZ(212, 96).TopPosZ(52, 19)) @@ -27,7 +27,7 @@ LAYOUT(TestChStyleLayout, 972, 532) ITEM(Upp::TabCtrl, tab, LeftPosZ(316, 150).TopPosZ(136, 100)) ITEM(Upp::Label, dv___26, SetLabel(t_("This is label")).SetInk(Upp::Cyan).LeftPosZ(16, 168).TopPosZ(240, 19)) ITEM(Upp::DropTime, dv___27, LeftPosZ(316, 120).TopPosZ(244, 19)) - ITEM(Upp::SliderCtrl, dv___28, LeftPosZ(16, 64).TopPosZ(272, 24)) + ITEM(Upp::SliderCtrl, hslider, SetFrame(Upp::BlackFrame()).LeftPosZ(16, 72).TopPosZ(344, 24)) ITEM(Upp::Button, dis, SetLabel(t_("disabled")).LeftPosZ(88, 56).TopPosZ(272, 24)) ITEM(Upp::ArrayCtrl, dv___30, LeftPosZ(260, 52).TopPosZ(188, 100)) ITEM(Upp::ProgressIndicator, pi1, LeftPosZ(180, 192).TopPosZ(296, 12)) @@ -35,8 +35,8 @@ LAYOUT(TestChStyleLayout, 972, 532) ITEM(Upp::ProgressIndicator, pi5, LeftPosZ(180, 192).TopPosZ(328, 24)) ITEM(Upp::ProgressIndicator, pi3, LeftPosZ(380, 24).TopPosZ(296, 148)) ITEM(Upp::ProgressIndicator, pi4, LeftPosZ(412, 24).TopPosZ(296, 148)) - ITEM(Upp::SliderCtrl, dv___36, LeftPosZ(180, 20).VCenterPosZ(80, 138)) - UNTYPED(sample, LeftPosZ(212, 160).TopPosZ(364, 80)) + ITEM(Upp::SliderCtrl, vslider, SetFrame(Upp::BlackFrame()).LeftPosZ(16, 20).VCenterPosZ(80, 186)) + UNTYPED(sample, LeftPosZ(216, 156).TopPosZ(364, 80)) ITEM(Upp::DropList, dl_empty, LeftPosZ(480, 96).TopPosZ(4, 19)) ITEM(Upp::WithDropChoice, dc_empty, LeftPosZ(480, 96).TopPosZ(28, 19)) ITEM(Upp::DataPusher, dv___40, LeftPosZ(480, 152).TopPosZ(52, 24)) @@ -57,6 +57,12 @@ LAYOUT(TestChStyleLayout, 972, 532) ITEM(Upp::TreeCtrl, dv___55, LeftPosZ(696, 152).TopPosZ(12, 196)) ITEM(Upp::RichTextView, dv___56, LeftPosZ(696, 152).TopPosZ(348, 136)) ITEM(Upp::ColumnList, dv___57, LeftPosZ(696, 152).TopPosZ(212, 132)) - ITEM(Upp::DropList, skin, LeftPosZ(12, 164).TopPosZ(464, 19)) + ITEM(Upp::DropList, skin, LeftPosZ(8, 140).TopPosZ(504, 19)) + ITEM(Upp::Label, vslider_val, LeftPosZ(40, 40).TopPosZ(472, 19)) + ITEM(Upp::SliderCtrl, vslider2, SetFrame(Upp::BlackFrame()).LeftPosZ(92, 20).VCenterPosZ(80, 186)) + ITEM(Upp::Label, vslider_val2, LeftPosZ(116, 40).TopPosZ(472, 19)) + ITEM(Upp::Label, hslider_val, LeftPosZ(92, 40).TopPosZ(344, 19)) + ITEM(Upp::SliderCtrl, hslider2, SetFrame(Upp::BlackFrame()).LeftPosZ(16, 72).TopPosZ(372, 24)) + ITEM(Upp::Label, hslider_val2, LeftPosZ(92, 40).TopPosZ(372, 19)) END_LAYOUT diff --git a/upptst/TestChStyle/main.cpp b/upptst/TestChStyle/main.cpp index 58a4026ed..d831a6001 100644 --- a/upptst/TestChStyle/main.cpp +++ b/upptst/TestChStyle/main.cpp @@ -176,6 +176,18 @@ TestChStyle::TestChStyle() FillTree(droptree.TreeObject()); + vslider.Range(100); + vslider << [=] { vslider_val = ~~vslider; }; + + vslider2.MinMax(100, 0); + vslider2 << [=] { vslider_val2 = ~~vslider2; }; + + hslider.Range(100); + hslider << [=] { hslider_val = ~~hslider; }; + + hslider2.MinMax(100, 0); + hslider2 << [=] { hslider_val2 = ~~hslider2; }; + Sizeable(); } From dfd7ff70b9dca0e7725f6ea6c48f4543d1fbdb05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20Y=C4=B1lmaz?= <32938453+ismail-yilmaz@users.noreply.github.com> Date: Thu, 23 Jan 2025 02:47:44 +0300 Subject: [PATCH 2/2] Keyboard shortcut fix. (#226) --- uppsrc/CtrlLib/AKeys.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uppsrc/CtrlLib/AKeys.cpp b/uppsrc/CtrlLib/AKeys.cpp index 6ca52830e..4d4966b4e 100644 --- a/uppsrc/CtrlLib/AKeys.cpp +++ b/uppsrc/CtrlLib/AKeys.cpp @@ -301,7 +301,7 @@ dword ParseKeyDesc(CParser& p) ONCELOCK { extern Tuple KeyNames__[]; for(int i = 0; KeyNames__[i].a; i++) { - String n = KeyNames__[i].b; + String n = Filter(KeyNames__[i].b, CharFilterNoSpace); int q = n.Find('\v'); if(q) n = n.Mid(q + 1);