From b82dd94195813ddf787db530628a9c14d1a111b7 Mon Sep 17 00:00:00 2001 From: "Adam D. Ruppe" Date: Fri, 23 Aug 2019 22:50:37 -0400 Subject: [PATCH] widgetpainter begins --- dom.d | 2 +- minigui.d | 94 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/dom.d b/dom.d index 00dccef..cf1d168 100644 --- a/dom.d +++ b/dom.d @@ -1,5 +1,5 @@ // FIXME: add classList -// FIXME: add matchesSelector +// FIXME: add matchesSelector - standard name is `matches`. also `closest` walks up to find the parent that matches // FIXME: https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML // FIXME: appendChild should not fail if the thing already has a parent; it should just automatically remove it per standard. diff --git a/minigui.d b/minigui.d index 35e2b11..5a54c85 100644 --- a/minigui.d +++ b/minigui.d @@ -366,7 +366,7 @@ class DropDownSelection : ComboboxBase { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { draw3dFrame(this, painter, FrameStyle.risen); painter.outlineColor = Color.black; painter.drawText(Point(4, 4), selection == -1 ? "" : options[selection]); @@ -1108,6 +1108,21 @@ extern(Windows) BOOL childHandler(HWND hwnd, LPARAM lparam) { return true; } +/++ + ++/ +struct WidgetPainter { + /// + ScreenPainter screenPainter; + /// Forward to the screen painter for other methods + alias screenPainter this; + + /++ + This is the list of rectangles that actually need to be redrawn. + +/ + Rectangle[] invalidatedRectangles; +} + /** The way this module works is it builds on top of a SimpleWindow from simpledisplay to provide simple controls and such. @@ -1126,6 +1141,9 @@ extern(Windows) BOOL childHandler(HWND hwnd, LPARAM lparam) { class Widget { mixin LayoutInfo!(); + deprecated("Change ScreenPainter to WidgetPainter") + final void paint(ScreenPainter) { assert(0, "Change ScreenPainter to WidgetPainter and recompile your code"); } + /// @scriptable void removeWidget() { @@ -1518,11 +1536,11 @@ class Widget { } /// - void paint(ScreenPainter painter) {} + void paint(WidgetPainter painter) {} /// I don't actually like the name of this /// this draws a background on it - void erase(ScreenPainter painter) { + void erase(WidgetPainter painter) { version(win32_widgets) if(hwnd) return; // Windows will do it. I think. @@ -1565,7 +1583,7 @@ class Widget { } /// - ScreenPainter draw() { + WidgetPainter draw() { int x = this.x, y = this.y; auto parent = this.parent; while(parent) { @@ -1578,10 +1596,10 @@ class Widget { painter.originX = x; painter.originY = y; painter.setClipRectangle(Point(0, 0), width, height); - return painter; + return WidgetPainter(painter); } - protected void privatePaint(ScreenPainter painter, int lox, int loy, bool force = false) { + protected void privatePaint(WidgetPainter painter, int lox, int loy, bool force = false) { if(hidden) return; @@ -1609,7 +1627,7 @@ class Widget { version(win32_widgets) foreach(child; children) { if(child.hwnd){ - painter = child.simpleWindowWrappingHwnd.draw; + painter = WidgetPainter(child.simpleWindowWrappingHwnd.draw); child.privatePaint(painter, painter.originX, painter.originY, actuallyPainted); } } @@ -1653,7 +1671,7 @@ class Widget { ugh = ugh.parent; } auto painter = w.draw(); - privatePaint(painter, lox, loy); + privatePaint(WidgetPainter(painter), lox, loy); } SimpleWindow drawableWindow; @@ -1703,7 +1721,7 @@ class OpenGlWidget : Widget { } } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { win.redrawOpenGlSceneNow(); } @@ -1776,11 +1794,11 @@ class ListWidget : ScrollableWidget { super(parent); } - override void paintFrameAndBackground(ScreenPainter painter) { + override void paintFrameAndBackground(WidgetPainter painter) { draw3dFrame(this, painter, FrameStyle.sunk, Color.white); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { auto pos = Point(4, 4); foreach(idx, option; options) { painter.fillColor = Color.white; @@ -2157,7 +2175,7 @@ class ScrollableWidget : Widget { /// This is called before the ordinary paint delegate, /// giving you a chance to draw the window frame, etc, /// before the scroll clip takes effect - void paintFrameAndBackground(ScreenPainter painter) { + void paintFrameAndBackground(WidgetPainter painter) { version(win32_widgets) { auto b = SelectObject(painter.impl.hdc, GetSysColorBrush(COLOR_3DFACE)); auto p = SelectObject(painter.impl.hdc, GetStockObject(NULL_PEN)); @@ -2177,7 +2195,7 @@ class ScrollableWidget : Widget { END SCROLLING */ - override ScreenPainter draw() { + override WidgetPainter draw() { int x = this.x, y = this.y; auto parent = this.parent; while(parent) { @@ -2198,10 +2216,10 @@ class ScrollableWidget : Widget { painter.originY = painter.originY - scrollOrigin.y; painter.setClipRectangle(scrollOrigin, viewportWidth(), viewportHeight()); - return painter; + return WidgetPainter(painter); } - override protected void privatePaint(ScreenPainter painter, int lox, int loy, bool force = false) { + override protected void privatePaint(WidgetPainter painter, int lox, int loy, bool force = false) { if(hidden) return; @@ -2346,7 +2364,7 @@ class ScrollableClientWidget : Widget { this(Widget parent) { super(parent); } - override void paint(ScreenPainter p) { + override void paint(WidgetPainter p) { parent.paint(p); } } @@ -2563,7 +2581,7 @@ class MouseTrackingWidget : Widget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { auto c = darken(windowBackgroundColor, 0.2); painter.outlineColor = c; painter.fillColor = c; @@ -2988,7 +3006,7 @@ class TabWidget : Widget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { draw3dFrame(0, tabBarHeight - 2, width, height - tabBarHeight + 2, painter, FrameStyle.risen); @@ -3456,7 +3474,7 @@ class Window : Widget { } version(win32_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { /* RECT rect; rect.right = this.width; @@ -3472,7 +3490,7 @@ class Window : Widget { SelectObject(painter.impl.hdc, b); } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { painter.fillColor = windowBackgroundColor; painter.outlineColor = windowBackgroundColor; painter.drawRectangle(Point(0, 0), this.width, this.height); @@ -4233,7 +4251,7 @@ class ToolButton : Button { override int minHeight() { return toolbarIconSize; } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor); painter.outlineColor = Color.black; @@ -4360,7 +4378,7 @@ class MenuBar : Widget { } else static assert(false); version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { draw3dFrame(this, painter, FrameStyle.risen); } @@ -4515,7 +4533,7 @@ class StatusBar : Widget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { this.draw3dFrame(painter, FrameStyle.sunk); int cpos = 0; int remainingLength = this.width; @@ -4569,7 +4587,7 @@ class ProgressBar : Widget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { this.draw3dFrame(painter, FrameStyle.sunk); painter.fillColor = progressBarColor; painter.drawRectangle(Point(0, 0), width * current / max, height); @@ -4670,7 +4688,7 @@ class Fieldset : Widget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { painter.fillColor = Color.transparent; painter.pen = Pen(Color.black, 1); painter.drawRectangle(Point(0, Window.lineHeight / 2), width, height - Window.lineHeight / 2); @@ -4723,7 +4741,7 @@ class HorizontalRule : Widget { super(parent); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { painter.outlineColor = darkAccentColor; painter.drawLine(Point(0, 0), Point(width, 0)); painter.outlineColor = lightAccentColor; @@ -4742,7 +4760,7 @@ class VerticalRule : Widget { super(parent); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { painter.outlineColor = darkAccentColor; painter.drawLine(Point(0, 0), Point(0, height)); painter.outlineColor = lightAccentColor; @@ -4894,7 +4912,7 @@ class Menu : Window { override int minHeight() { return Window.lineHeight; } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { this.draw3dFrame(painter, FrameStyle.risen); } } @@ -4927,7 +4945,7 @@ class MenuItem : MouseActivatedWidget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { if(isDepressed) this.draw3dFrame(painter, FrameStyle.sunk); if(isHovering) @@ -5094,7 +5112,7 @@ class Checkbox : MouseActivatedWidget { } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { if(isFocused()) { painter.pen = Pen(Color.black, 1, Pen.Style.Dotted); painter.fillColor = windowBackgroundColor; @@ -5186,7 +5204,7 @@ class Radiobox : MouseActivatedWidget { else static assert(false); version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { if(isFocused) { painter.fillColor = windowBackgroundColor; painter.pen = Pen(Color.black, 1, Pen.Style.Dotted); @@ -5303,7 +5321,7 @@ class Button : MouseActivatedWidget { override int minHeight() { return Window.lineHeight + 4; } version(custom_widgets) - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor); @@ -5367,7 +5385,7 @@ class ArrowButton : Button { override int minWidth() { return 16; } override int maxWidth() { return 16; } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { super.paint(painter); painter.outlineColor = Color.black; @@ -5478,7 +5496,7 @@ class ImageBox : Widget { sprite = new Sprite(this.parentWindow.win, Image.fromMemoryImage(image_)); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { updateSprite(); if(backgroundColor_.a) { painter.fillColor = backgroundColor_; @@ -5529,7 +5547,7 @@ class TextLabel : Widget { TextAlignment alignment; - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { painter.outlineColor = Color.black; painter.drawText(Point(0, 0), this.label, Point(width,height), alignment); } @@ -5649,7 +5667,7 @@ abstract class EditableTextWidget : EditableTextWidgetParent { } version(custom_widgets) - override void paintFrameAndBackground(ScreenPainter painter) { + override void paintFrameAndBackground(WidgetPainter painter) { this.draw3dFrame(painter, FrameStyle.sunk, Color.white); } @@ -5664,7 +5682,7 @@ abstract class EditableTextWidget : EditableTextWidgetParent { textLayout = new TextLayout(Rectangle(4, 2, width - 8, height - 4)); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { if(parentWindow.win.closed) return; textLayout.boundingBox = Rectangle(4, 2, width - 8, height - 4); @@ -5937,7 +5955,7 @@ class MessageBox : Window { redraw(); } - override void paint(ScreenPainter painter) { + override void paint(WidgetPainter painter) { super.paint(painter); painter.outlineColor = Color.black; painter.drawText(Point(0, 0), message, Point(width, height / 2), TextAlignment.Center | TextAlignment.VerticalCenter);