summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2020-06-19 14:55:47 +0200
committertrustable-code <krauter.simon@arcor.de>2020-06-19 14:55:47 +0200
commit6b5a397d555ffe4f294531f90cbc9d490fef9a98 (patch)
tree39619ac8fe6217bdd3abe9df91fd3f8470142336
parenta7464ccdb303fb888cab3acc368a356dd8997d9d (diff)
downloadNiGui-6b5a397d555ffe4f294531f90cbc9d490fef9a98.tar.gz
NiGui-6b5a397d555ffe4f294531f90cbc9d490fef9a98.zip
Allow container widgets to have a custom draw method
Gtk: Replace GtkFixed by GtkLayout Windows: No change needed
-rwxr-xr-xsrc/nigui.nim2
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim2
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim30
3 files changed, 18 insertions, 16 deletions
diff --git a/src/nigui.nim b/src/nigui.nim
index 82e6282..b63ecbe 100755
--- a/src/nigui.nim
+++ b/src/nigui.nim
@@ -2116,8 +2116,6 @@ method triggerRelayoutDownwards(container: Container) =
for control in container.childControls:
control.triggerRelayoutDownwards()
-method `onDraw=`(container: ContainerImpl, callback: DrawProc) = raiseError("ContainerImpl does not allow onDraw.")
-
# ----------------------------------------------------------------------------------------
# LayoutContainer
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index 5db784b..0b63e89 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -308,7 +308,7 @@ proc gtk_fixed_move*(fixed, widget: pointer, x, y: cint) {.importc, libgtk3.}
proc gtk_layout_new*(hadjustment, vadjustment: pointer): pointer {.importc, libgtk3.}
# proc gtk_layout_put*(layout, child_widget: pointer, x, y: cint) {.importc, libgtk3.}
proc gtk_layout_move*(layout, child_widget: pointer, x, y: cint) {.importc, libgtk3.}
-# proc gtk_layout_set_size*(layout: pointer, width, height: cint) {.importc, libgtk3.}
+proc gtk_layout_set_size*(layout: pointer, width, height: cint) {.importc, libgtk3.}
# proc gtk_layout_get_hadjustment*(layout: pointer): pointer {.importc, libgtk3.}
# proc gtk_layout_get_vadjustment*(layout: pointer): pointer {.importc, libgtk3.}
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index 3cfff3e..786e1e8 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -1111,8 +1111,7 @@ method setSize(control: ControlImpl, width, height: int) =
method setPosition(control: ControlImpl, x, y: int) =
procCall control.Control.setPosition(x, y)
if control.fParentControl != nil:
- gtk_fixed_move(cast[ContainerImpl](control.fParentControl).fInnerHandle, control.fHandle, x.cint, y.cint)
- # gtk_layout_move(cast[ContainerImpl](control.fParentControl).fHandle, control.fHandle, x.cint, y.cint)
+ gtk_layout_move(cast[ContainerImpl](control.fParentControl).fInnerHandle, control.fHandle, x.cint, y.cint)
method forceRedraw(control: ControlImpl) = gtk_widget_queue_draw(control.fHandle)
@@ -1193,12 +1192,15 @@ proc init(container: ContainerImpl) =
gtk_widget_show(container.fScrollWndHandle)
gtk_container_add(container.fHandle, container.fScrollWndHandle)
# Inner:
- container.fInnerHandle = gtk_fixed_new()
+ container.fInnerHandle = gtk_layout_new(nil, nil)
gtk_widget_show(container.fInnerHandle)
gtk_container_add(container.fScrollWndHandle, container.fInnerHandle)
container.Container.init()
+ discard g_signal_connect_data(container.fInnerHandle, "draw", pControlDrawSignal, cast[pointer](container))
+
method pAddButtonPressEvent(container: ContainerImpl) =
+ # Overwrite base method
gtk_widget_add_events(container.fInnerHandle, GDK_BUTTON_PRESS_MASK)
discard g_signal_connect_data(container.fInnerHandle, "button-press-event", pCustomControlButtonPressSignal, cast[pointer](container))
@@ -1245,6 +1247,8 @@ method pUpdateScrollBar(container: ContainerImpl) =
if fScrollbarSize == -1:
return
+ gtk_layout_set_size(container.fInnerHandle, container.scrollableWidth.cint, container.scrollableHeight.cint)
+
container.fXScrollEnabled = false
container.fYScrollEnabled = false
@@ -1258,22 +1262,22 @@ method pUpdateScrollBar(container: ContainerImpl) =
if container.fYScrollEnabled and not container.fXScrollEnabled and container.scrollableWidth > container.width - fScrollbarSize:
container.fXScrollEnabled = true
- # TODO: move to common part
-
- var xPolicy: cint = GTK_POLICY_NEVER
- var yPolicy: cint = GTK_POLICY_NEVER
- if container.fXScrollEnabled:
- xPolicy = GTK_POLICY_AUTOMATIC
- if container.fYScrollEnabled:
- yPolicy = GTK_POLICY_AUTOMATIC
- gtk_scrolled_window_set_policy(container.fScrollWndHandle, xPolicy, yPolicy)
-
method mousePosition(control: Control): tuple[x, y: int] =
var x, y: cint
gtk_widget_get_pointer(cast[ControlImpl](control).fHandle, x, y)
result.x = x
result.y = y
+method handleDrawEvent(container: ContainerImpl, event: DrawEvent) =
+ # Overwrites base method
+ let callback = container.onDraw
+ if callback != nil:
+ callback(event)
+ else:
+ # Draw regular window background
+ container.canvas.areaColor = app.defaultBackgroundColor
+ container.canvas.fill()
+
# ----------------------------------------------------------------------------------------
# Frame