This commit is contained in:
Mirek Fidler 2025-01-23 07:09:46 +01:00
commit 91b7c7e709
12 changed files with 149 additions and 94 deletions

16
reference/Slider/Slider.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef _Slider_Slider_h
#define _Slider_Slider_h
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#define LAYOUTFILE <Slider/Slider.lay>
#include <CtrlCore/lay.h>
class Slider : public WithSliderLayout<TopWindow> {
public:
Slider();
};
#endif

View file

@ -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

View file

@ -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";

View file

@ -1,37 +1,36 @@
#include <CtrlLib/CtrlLib.h>
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();
}

View file

@ -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)

View file

@ -301,7 +301,7 @@ dword ParseKeyDesc(CParser& p)
ONCELOCK {
extern Tuple<dword, const char *> 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);

View file

@ -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); }

View file

@ -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);
}

View file

@ -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;

View file

@ -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;

View file

@ -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<Upp::EditString>, 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<Upp::EditString>, 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

View file

@ -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();
}