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

View File

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