RichEdit: Fixed cosmetics issue with Diagram shape icons in droplist

This commit is contained in:
Mirek Fidler 2026-01-14 11:21:36 +01:00
parent f29a9f2b96
commit fef58bbcb8
7 changed files with 48 additions and 33 deletions

View file

@ -599,13 +599,18 @@ Rect MultiButton::Paint0(Draw& w, bool getcr)
return cr;
}
Rect MultiButton::GetContentRect()
{
NilDraw nw;
return Paint0(nw, true);
}
void MultiButton::SyncInfo()
{
if((HasMouse() || info.HasMouse()) && display &&
(GetMouseFlags() & (K_MOUSELEFT|K_MOUSERIGHT|K_MOUSEMIDDLE)) == 0) {
Point p = GetMouseViewPos();
NilDraw nw;
Rect r = Paint0(nw, true);
Rect r = GetContentRect();
if(r.Contains(p)) {
Value v = convert->Format(value);
int cm = DPI(2);

View file

@ -113,7 +113,6 @@ private:
int FindButton(int px);
void Margins(int& l, int& r);
Rect ContentRect();
void GetLR(int& lx, int& rx);
bool GetPos(SubButton& b, int& lx, int& rx, int& x, int& cx, int px = -1);
void GetPos(int ii, int& x, int& cx);
@ -166,6 +165,7 @@ public:
SubButton& MainButton();
Rect GetPushScreenRect() const { return pushrect; }
Rect GetContentRect();
const Display& GetDisplay() const { return *display; }
const Convert& GetConvert() const { return *convert; }

View file

@ -55,7 +55,7 @@ void DiagramEditor::TheBar(Bar& bar)
bar.Separator();
bar.Add("Diagram size", DiagramImg::Size(), [=] { ChangeSize(); });
bar.Separator();
int icx = IconSz().cx + DPI(4) + DPI(18);
int icx = IconDlCx();
bar.Add(shape, icx);
shape.Enable(!(IsCursor() && findarg(CursorItem().shape, DiagramItem::SHAPE_SVGPATH, DiagramItem::SHAPE_IMAGE) >= 0));
bar.Add(line_start, icx);
@ -94,7 +94,7 @@ void DiagramEditor::TheBar(Bar& bar)
})
.Check(ar);
bar.Separator();
Size isz = IconSz();
Size isz = icon_sz;
for(int i = 0; i < tool_count; i++) {
DiagramItem m = tl[i];
if(m.IsLine()) {

View file

@ -8,6 +8,14 @@ namespace Upp {
DiagramEditor::DiagramEditor()
{
{ // estimate the size of icons
DropList shape;
shape.SetRect(0, 0, IconDlCx(), shape.MultiButton::GetStdSize().cy);
icon_sz = shape.GetContentRect().GetSize();
icon_sz.cx = max(icon_sz.cx, 8); // sanity
icon_sz.cy = max(icon_sz.cy, 8);
}
AddFrame(toolbar);
Add(text_editor);

View file

@ -33,8 +33,8 @@ public:
Size isz = Size(64, 32);
int count = 18;
Event<int> WhenSelect;
Event<Draw&, Size, int, bool> WhenPaintItem;
Event<int> WhenSelect;
Event<Draw&, const Rect&, int, bool> WhenPaintItem;
ColumnPopUp();
};
@ -75,6 +75,8 @@ private:
bool allow_dark_content = false;
bool dark_content = false;
Size icon_sz;
Point sizehandle = Point(0, 0);
Point draghandle = Point(0, 0);
@ -148,7 +150,7 @@ private:
double GetZoom() const { return DPI(1) * 0.01 * zoom_percent; }
void Map(Point& p);
Image MakeIcon(DiagramItem& m, Size isz);
Size IconSz() { return Size(DPI(24), DPI(16)); }
int IconDlCx() { return DPI(24 + 4 + 18); }
Image ShapeIcon(int i);
Image CapIcon(int start, int end);
Image DashIcon(int i);
@ -158,7 +160,7 @@ private:
void Grid(Point& p);
void Grid(Pointf& p);
void ChangeSize();
void PopPaint(Draw& w, const Image& m, bool sel);
void PopPaint(Draw& w, const Rect& r, const Image& m, bool sel);
void Shapes(ColumnPopUp& shape);
void Caps(ColumnPopUp& m, bool left);
void Dashes(ColumnPopUp& m);

View file

@ -32,7 +32,7 @@ Image DiagramEditor::MakeIcon(DiagramItem& m, Size isz)
Image DiagramEditor::ShapeIcon(int i)
{
Size isz = IconSz();
Size isz = icon_sz;
DiagramItem m;
m.shape = i;
if(m.IsLine()) {
@ -50,11 +50,11 @@ Image DiagramEditor::ShapeIcon(int i)
Image DiagramEditor::CapIcon(int start, int end)
{
Size isz = IconSz();
Size isz = icon_sz;
DiagramItem m;
m.pos = Point(findarg(start, DiagramItem::CAP_CIRCLEL, DiagramItem::CAP_DISCL) >= 0 ? DPI(6) : DPI(4), isz.cy / 2);
m.size = Size(isz.cx - (findarg(end, DiagramItem::CAP_CIRCLEL, DiagramItem::CAP_DISCL) >= 0 ? DPI(10) :
findarg(end, DiagramItem::CAP_CIRCLE, DiagramItem::CAP_DISC) >= 0 ? DPI(8) : DPI(4)), 0);
findarg(end, DiagramItem::CAP_CIRCLE, DiagramItem::CAP_DISC) >= 0 ? DPI(8) : DPI(6)), 0);
m.shape = DiagramItem::SHAPE_LINE;
m.width = DPI(1);
m.cap[0] = start;
@ -67,7 +67,7 @@ Image DiagramEditor::DashIcon(int i)
return MakeValue(
[=] { return String((char *)&i, sizeof(i)) + String("D", (int)IsDarkTheme()); },
[=](Value& v) {
Size isz = IconSz();
Size isz = icon_sz;
ImagePainter p(isz);
p.Clear();
@ -90,7 +90,7 @@ Image DiagramEditor::WidthIcon(int i)
return MakeValue(
[=] { return String((char *)&i, sizeof(i)) + String("D", (int)IsDarkTheme()); },
[=](Value& v) {
Size isz = IconSz();
Size isz = icon_sz;
ImagePainter p(isz);
p.Clear();
p.Move(DPI(2), isz.cy / 2.0 - (i & 1) * 0.5)
@ -107,15 +107,15 @@ void DiagramEditor::Dashes(ColumnPopUp& m)
{
m.count = DiagramItem::DASH_COUNT;
m.columns = 4;
m.isz = IconSz() + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, Size isz, int ii, bool sel) {
PopPaint(w, DashIcon(ii), sel);
m.isz = icon_sz + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, const Rect& r, int ii, bool sel) {
PopPaint(w, r, DashIcon(ii), sel);
};
}
void DiagramEditor::PopPaint(Draw& w, const Image& m, bool sel)
void DiagramEditor::PopPaint(Draw& w, const Rect& r, const Image& m, bool sel)
{
Point p = Rect(IconSz() + Size(DPI(4), DPI(4))).CenterPos(m.GetSize());
Point p = r.CenterPos(m.GetSize());
if(sel)
w.DrawImage(p.x, p.y, m, SColorHighlightText());
else
@ -126,11 +126,11 @@ void DiagramEditor::Shapes(ColumnPopUp& shape)
{
shape.count = DiagramItem::SHAPE_COUNT;
shape.columns = 5;
shape.isz = IconSz() + Size(DPI(4), DPI(4));
shape.WhenPaintItem = [=](Draw& w, Size isz, int ii, bool sel) {
PopPaint(w, ii == DiagramItem::SHAPE_SVGPATH ? DiagramImg::FontSvg() :
ii == DiagramItem::SHAPE_IMAGE ? CtrlImg::open()
: ShapeIcon(ii),
shape.isz = icon_sz + Size(DPI(4), DPI(4));
shape.WhenPaintItem = [=](Draw& w, const Rect& r, int ii, bool sel) {
PopPaint(w, r, ii == DiagramItem::SHAPE_SVGPATH ? DiagramImg::FontSvg() :
ii == DiagramItem::SHAPE_IMAGE ? CtrlImg::open()
: ShapeIcon(ii),
sel && ii != DiagramItem::SHAPE_IMAGE);
};
}
@ -139,9 +139,9 @@ void DiagramEditor::Caps(ColumnPopUp& m, bool left)
{
m.count = DiagramItem::CAP_COUNT;
m.columns = 3;
m.isz = IconSz() + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, Size isz, int ii, bool sel) {
PopPaint(w, left ? CapIcon(ii, 0) : CapIcon(0, ii), sel);
m.isz = icon_sz + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, const Rect& r, int ii, bool sel) {
PopPaint(w, r, left ? CapIcon(ii, 0) : CapIcon(0, ii), sel);
};
}
@ -149,15 +149,15 @@ void DiagramEditor::Widths(ColumnPopUp& m)
{
m.count = 15;
m.columns = 5;
m.isz = IconSz() + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, Size isz, int ii, bool sel) {
PopPaint(w, WidthIcon(ii), sel);
m.isz = icon_sz + Size(DPI(4), DPI(4));
m.WhenPaintItem = [=](Draw& w, const Rect& r, int ii, bool sel) {
PopPaint(w, r, WidthIcon(ii), sel);
};
}
void Upp::DiagramEditor::DropColumns::Paint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const
{
popup.WhenPaintItem(w, r.GetSize(), (int)q, false);
popup.WhenPaintItem(w, r, (int)q, false);
}
DiagramEditor::DropColumns::DropColumns()

View file

@ -31,8 +31,8 @@ void DiagramEditor::RightDown(Point p, dword keyflags)
Dashes(menu);
menu.count = DiagramItem::DASH_COUNT + 15;
menu.columns = 5;
menu.WhenPaintItem = [=](Draw& w, Size isz, int ii, bool sel) {
PopPaint(w, ii < DiagramItem::DASH_COUNT ? DashIcon(ii) : WidthIcon(ii - DiagramItem::DASH_COUNT), sel);
menu.WhenPaintItem = [=](Draw& w, const Rect& r, int ii, bool sel) {
PopPaint(w, r, ii < DiagramItem::DASH_COUNT ? DashIcon(ii) : WidthIcon(ii - DiagramItem::DASH_COUNT), sel);
};
int n = menu.Execute();