diff --git a/uppsrc/CtrlLib/MultiButton.cpp b/uppsrc/CtrlLib/MultiButton.cpp index 4407b0817..db9df572a 100644 --- a/uppsrc/CtrlLib/MultiButton.cpp +++ b/uppsrc/CtrlLib/MultiButton.cpp @@ -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); diff --git a/uppsrc/CtrlLib/MultiButton.h b/uppsrc/CtrlLib/MultiButton.h index b4b3943b8..fb10002d3 100644 --- a/uppsrc/CtrlLib/MultiButton.h +++ b/uppsrc/CtrlLib/MultiButton.h @@ -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; } diff --git a/uppsrc/RichEdit/DiagramBar.cpp b/uppsrc/RichEdit/DiagramBar.cpp index b31d1a366..e10d90ffa 100644 --- a/uppsrc/RichEdit/DiagramBar.cpp +++ b/uppsrc/RichEdit/DiagramBar.cpp @@ -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()) { diff --git a/uppsrc/RichEdit/DiagramEditor.cpp b/uppsrc/RichEdit/DiagramEditor.cpp index ea791ed54..06f507c6a 100644 --- a/uppsrc/RichEdit/DiagramEditor.cpp +++ b/uppsrc/RichEdit/DiagramEditor.cpp @@ -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); diff --git a/uppsrc/RichEdit/DiagramEditor.h b/uppsrc/RichEdit/DiagramEditor.h index 3cb71baec..2d9499925 100644 --- a/uppsrc/RichEdit/DiagramEditor.h +++ b/uppsrc/RichEdit/DiagramEditor.h @@ -33,8 +33,8 @@ public: Size isz = Size(64, 32); int count = 18; - Event WhenSelect; - Event WhenPaintItem; + Event WhenSelect; + Event 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); diff --git a/uppsrc/RichEdit/DiagramIcon.cpp b/uppsrc/RichEdit/DiagramIcon.cpp index f13a5e689..8dfd62ccc 100644 --- a/uppsrc/RichEdit/DiagramIcon.cpp +++ b/uppsrc/RichEdit/DiagramIcon.cpp @@ -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() diff --git a/uppsrc/RichEdit/DiagramRight.cpp b/uppsrc/RichEdit/DiagramRight.cpp index 33f1b4999..38f60d8aa 100644 --- a/uppsrc/RichEdit/DiagramRight.cpp +++ b/uppsrc/RichEdit/DiagramRight.cpp @@ -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();