widgetpainter begins

This commit is contained in:
Adam D. Ruppe 2019-08-23 22:50:37 -04:00
parent 11f9602ced
commit b82dd94195
2 changed files with 57 additions and 39 deletions

2
dom.d
View File

@ -1,5 +1,5 @@
// FIXME: add classList // 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: 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. // FIXME: appendChild should not fail if the thing already has a parent; it should just automatically remove it per standard.

View File

@ -366,7 +366,7 @@ class DropDownSelection : ComboboxBase {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
draw3dFrame(this, painter, FrameStyle.risen); draw3dFrame(this, painter, FrameStyle.risen);
painter.outlineColor = Color.black; painter.outlineColor = Color.black;
painter.drawText(Point(4, 4), selection == -1 ? "" : options[selection]); painter.drawText(Point(4, 4), selection == -1 ? "" : options[selection]);
@ -1108,6 +1108,21 @@ extern(Windows) BOOL childHandler(HWND hwnd, LPARAM lparam) {
return true; 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 The way this module works is it builds on top of a SimpleWindow
from simpledisplay to provide simple controls and such. from simpledisplay to provide simple controls and such.
@ -1126,6 +1141,9 @@ extern(Windows) BOOL childHandler(HWND hwnd, LPARAM lparam) {
class Widget { class Widget {
mixin LayoutInfo!(); mixin LayoutInfo!();
deprecated("Change ScreenPainter to WidgetPainter")
final void paint(ScreenPainter) { assert(0, "Change ScreenPainter to WidgetPainter and recompile your code"); }
/// ///
@scriptable @scriptable
void removeWidget() { 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 /// I don't actually like the name of this
/// this draws a background on it /// this draws a background on it
void erase(ScreenPainter painter) { void erase(WidgetPainter painter) {
version(win32_widgets) version(win32_widgets)
if(hwnd) return; // Windows will do it. I think. 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; int x = this.x, y = this.y;
auto parent = this.parent; auto parent = this.parent;
while(parent) { while(parent) {
@ -1578,10 +1596,10 @@ class Widget {
painter.originX = x; painter.originX = x;
painter.originY = y; painter.originY = y;
painter.setClipRectangle(Point(0, 0), width, height); 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) if(hidden)
return; return;
@ -1609,7 +1627,7 @@ class Widget {
version(win32_widgets) version(win32_widgets)
foreach(child; children) { foreach(child; children) {
if(child.hwnd){ if(child.hwnd){
painter = child.simpleWindowWrappingHwnd.draw; painter = WidgetPainter(child.simpleWindowWrappingHwnd.draw);
child.privatePaint(painter, painter.originX, painter.originY, actuallyPainted); child.privatePaint(painter, painter.originX, painter.originY, actuallyPainted);
} }
} }
@ -1653,7 +1671,7 @@ class Widget {
ugh = ugh.parent; ugh = ugh.parent;
} }
auto painter = w.draw(); auto painter = w.draw();
privatePaint(painter, lox, loy); privatePaint(WidgetPainter(painter), lox, loy);
} }
SimpleWindow drawableWindow; SimpleWindow drawableWindow;
@ -1703,7 +1721,7 @@ class OpenGlWidget : Widget {
} }
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
win.redrawOpenGlSceneNow(); win.redrawOpenGlSceneNow();
} }
@ -1776,11 +1794,11 @@ class ListWidget : ScrollableWidget {
super(parent); super(parent);
} }
override void paintFrameAndBackground(ScreenPainter painter) { override void paintFrameAndBackground(WidgetPainter painter) {
draw3dFrame(this, painter, FrameStyle.sunk, Color.white); draw3dFrame(this, painter, FrameStyle.sunk, Color.white);
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
auto pos = Point(4, 4); auto pos = Point(4, 4);
foreach(idx, option; options) { foreach(idx, option; options) {
painter.fillColor = Color.white; painter.fillColor = Color.white;
@ -2157,7 +2175,7 @@ class ScrollableWidget : Widget {
/// This is called before the ordinary paint delegate, /// This is called before the ordinary paint delegate,
/// giving you a chance to draw the window frame, etc, /// giving you a chance to draw the window frame, etc,
/// before the scroll clip takes effect /// before the scroll clip takes effect
void paintFrameAndBackground(ScreenPainter painter) { void paintFrameAndBackground(WidgetPainter painter) {
version(win32_widgets) { version(win32_widgets) {
auto b = SelectObject(painter.impl.hdc, GetSysColorBrush(COLOR_3DFACE)); auto b = SelectObject(painter.impl.hdc, GetSysColorBrush(COLOR_3DFACE));
auto p = SelectObject(painter.impl.hdc, GetStockObject(NULL_PEN)); auto p = SelectObject(painter.impl.hdc, GetStockObject(NULL_PEN));
@ -2177,7 +2195,7 @@ class ScrollableWidget : Widget {
END SCROLLING END SCROLLING
*/ */
override ScreenPainter draw() { override WidgetPainter draw() {
int x = this.x, y = this.y; int x = this.x, y = this.y;
auto parent = this.parent; auto parent = this.parent;
while(parent) { while(parent) {
@ -2198,10 +2216,10 @@ class ScrollableWidget : Widget {
painter.originY = painter.originY - scrollOrigin.y; painter.originY = painter.originY - scrollOrigin.y;
painter.setClipRectangle(scrollOrigin, viewportWidth(), viewportHeight()); 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) if(hidden)
return; return;
@ -2346,7 +2364,7 @@ class ScrollableClientWidget : Widget {
this(Widget parent) { this(Widget parent) {
super(parent); super(parent);
} }
override void paint(ScreenPainter p) { override void paint(WidgetPainter p) {
parent.paint(p); parent.paint(p);
} }
} }
@ -2563,7 +2581,7 @@ class MouseTrackingWidget : Widget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
auto c = darken(windowBackgroundColor, 0.2); auto c = darken(windowBackgroundColor, 0.2);
painter.outlineColor = c; painter.outlineColor = c;
painter.fillColor = c; painter.fillColor = c;
@ -2988,7 +3006,7 @@ class TabWidget : Widget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
draw3dFrame(0, tabBarHeight - 2, width, height - tabBarHeight + 2, painter, FrameStyle.risen); draw3dFrame(0, tabBarHeight - 2, width, height - tabBarHeight + 2, painter, FrameStyle.risen);
@ -3456,7 +3474,7 @@ class Window : Widget {
} }
version(win32_widgets) version(win32_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
/* /*
RECT rect; RECT rect;
rect.right = this.width; rect.right = this.width;
@ -3472,7 +3490,7 @@ class Window : Widget {
SelectObject(painter.impl.hdc, b); SelectObject(painter.impl.hdc, b);
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
painter.fillColor = windowBackgroundColor; painter.fillColor = windowBackgroundColor;
painter.outlineColor = windowBackgroundColor; painter.outlineColor = windowBackgroundColor;
painter.drawRectangle(Point(0, 0), this.width, this.height); painter.drawRectangle(Point(0, 0), this.width, this.height);
@ -4233,7 +4251,7 @@ class ToolButton : Button {
override int minHeight() { return toolbarIconSize; } override int minHeight() { return toolbarIconSize; }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor); this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor);
painter.outlineColor = Color.black; painter.outlineColor = Color.black;
@ -4360,7 +4378,7 @@ class MenuBar : Widget {
} else static assert(false); } else static assert(false);
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
draw3dFrame(this, painter, FrameStyle.risen); draw3dFrame(this, painter, FrameStyle.risen);
} }
@ -4515,7 +4533,7 @@ class StatusBar : Widget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
this.draw3dFrame(painter, FrameStyle.sunk); this.draw3dFrame(painter, FrameStyle.sunk);
int cpos = 0; int cpos = 0;
int remainingLength = this.width; int remainingLength = this.width;
@ -4569,7 +4587,7 @@ class ProgressBar : Widget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
this.draw3dFrame(painter, FrameStyle.sunk); this.draw3dFrame(painter, FrameStyle.sunk);
painter.fillColor = progressBarColor; painter.fillColor = progressBarColor;
painter.drawRectangle(Point(0, 0), width * current / max, height); painter.drawRectangle(Point(0, 0), width * current / max, height);
@ -4670,7 +4688,7 @@ class Fieldset : Widget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
painter.fillColor = Color.transparent; painter.fillColor = Color.transparent;
painter.pen = Pen(Color.black, 1); painter.pen = Pen(Color.black, 1);
painter.drawRectangle(Point(0, Window.lineHeight / 2), width, height - Window.lineHeight / 2); painter.drawRectangle(Point(0, Window.lineHeight / 2), width, height - Window.lineHeight / 2);
@ -4723,7 +4741,7 @@ class HorizontalRule : Widget {
super(parent); super(parent);
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
painter.outlineColor = darkAccentColor; painter.outlineColor = darkAccentColor;
painter.drawLine(Point(0, 0), Point(width, 0)); painter.drawLine(Point(0, 0), Point(width, 0));
painter.outlineColor = lightAccentColor; painter.outlineColor = lightAccentColor;
@ -4742,7 +4760,7 @@ class VerticalRule : Widget {
super(parent); super(parent);
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
painter.outlineColor = darkAccentColor; painter.outlineColor = darkAccentColor;
painter.drawLine(Point(0, 0), Point(0, height)); painter.drawLine(Point(0, 0), Point(0, height));
painter.outlineColor = lightAccentColor; painter.outlineColor = lightAccentColor;
@ -4894,7 +4912,7 @@ class Menu : Window {
override int minHeight() { return Window.lineHeight; } override int minHeight() { return Window.lineHeight; }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
this.draw3dFrame(painter, FrameStyle.risen); this.draw3dFrame(painter, FrameStyle.risen);
} }
} }
@ -4927,7 +4945,7 @@ class MenuItem : MouseActivatedWidget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
if(isDepressed) if(isDepressed)
this.draw3dFrame(painter, FrameStyle.sunk); this.draw3dFrame(painter, FrameStyle.sunk);
if(isHovering) if(isHovering)
@ -5094,7 +5112,7 @@ class Checkbox : MouseActivatedWidget {
} }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
if(isFocused()) { if(isFocused()) {
painter.pen = Pen(Color.black, 1, Pen.Style.Dotted); painter.pen = Pen(Color.black, 1, Pen.Style.Dotted);
painter.fillColor = windowBackgroundColor; painter.fillColor = windowBackgroundColor;
@ -5186,7 +5204,7 @@ class Radiobox : MouseActivatedWidget {
else static assert(false); else static assert(false);
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
if(isFocused) { if(isFocused) {
painter.fillColor = windowBackgroundColor; painter.fillColor = windowBackgroundColor;
painter.pen = Pen(Color.black, 1, Pen.Style.Dotted); painter.pen = Pen(Color.black, 1, Pen.Style.Dotted);
@ -5303,7 +5321,7 @@ class Button : MouseActivatedWidget {
override int minHeight() { return Window.lineHeight + 4; } override int minHeight() { return Window.lineHeight + 4; }
version(custom_widgets) version(custom_widgets)
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor); this.draw3dFrame(painter, isDepressed ? FrameStyle.sunk : FrameStyle.risen, currentButtonColor);
@ -5367,7 +5385,7 @@ class ArrowButton : Button {
override int minWidth() { return 16; } override int minWidth() { return 16; }
override int maxWidth() { return 16; } override int maxWidth() { return 16; }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
super.paint(painter); super.paint(painter);
painter.outlineColor = Color.black; painter.outlineColor = Color.black;
@ -5478,7 +5496,7 @@ class ImageBox : Widget {
sprite = new Sprite(this.parentWindow.win, Image.fromMemoryImage(image_)); sprite = new Sprite(this.parentWindow.win, Image.fromMemoryImage(image_));
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
updateSprite(); updateSprite();
if(backgroundColor_.a) { if(backgroundColor_.a) {
painter.fillColor = backgroundColor_; painter.fillColor = backgroundColor_;
@ -5529,7 +5547,7 @@ class TextLabel : Widget {
TextAlignment alignment; TextAlignment alignment;
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
painter.outlineColor = Color.black; painter.outlineColor = Color.black;
painter.drawText(Point(0, 0), this.label, Point(width,height), alignment); painter.drawText(Point(0, 0), this.label, Point(width,height), alignment);
} }
@ -5649,7 +5667,7 @@ abstract class EditableTextWidget : EditableTextWidgetParent {
} }
version(custom_widgets) version(custom_widgets)
override void paintFrameAndBackground(ScreenPainter painter) { override void paintFrameAndBackground(WidgetPainter painter) {
this.draw3dFrame(painter, FrameStyle.sunk, Color.white); 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)); 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; if(parentWindow.win.closed) return;
textLayout.boundingBox = Rectangle(4, 2, width - 8, height - 4); textLayout.boundingBox = Rectangle(4, 2, width - 8, height - 4);
@ -5937,7 +5955,7 @@ class MessageBox : Window {
redraw(); redraw();
} }
override void paint(ScreenPainter painter) { override void paint(WidgetPainter painter) {
super.paint(painter); super.paint(painter);
painter.outlineColor = Color.black; painter.outlineColor = Color.black;
painter.drawText(Point(0, 0), message, Point(width, height / 2), TextAlignment.Center | TextAlignment.VerticalCenter); painter.drawText(Point(0, 0), message, Point(width, height / 2), TextAlignment.Center | TextAlignment.VerticalCenter);