From 03e1f3afb56d539a13d415f93db2dc6bbcb9c4ed Mon Sep 17 00:00:00 2001 From: trustable-code Date: Fri, 8 Nov 2019 17:20:40 +0100 Subject: Add Progress Bar control Fixes #71 --- examples/example_02_controls.nim | 5 ++++ src/nigui.nim | 38 +++++++++++++++++++++++++++ src/nigui/private/gtk3/gtk3.nim | 3 +++ src/nigui/private/gtk3/platform_impl.nim | 15 +++++++++++ src/nigui/private/gtk3/platform_types2.nim | 2 ++ src/nigui/private/windows/platform_impl.nim | 17 ++++++++++++ src/nigui/private/windows/platform_types2.nim | 2 ++ src/nigui/private/windows/windows.nim | 2 ++ 8 files changed, 84 insertions(+) diff --git a/examples/example_02_controls.nim b/examples/example_02_controls.nim index b2a9e1c..402a652 100755 --- a/examples/example_02_controls.nim +++ b/examples/example_02_controls.nim @@ -21,6 +21,11 @@ container.add(checkbox) var label = newLabel("Label") container.add(label) +# Add a Progress Bar control: +var progressBar = newProgressBar() +progressBar.value = 0.5 +container.add(progressBar) + # Add a TextBox control: var textBox = newTextBox("TextBox") container.add(textBox) diff --git a/src/nigui.nim b/src/nigui.nim index 86381af..2068e3b 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -377,6 +377,9 @@ type Label* = ref object of ControlImpl fText: string + ProgressBar* = ref object of ControlImpl + fValue: float # should be between 0.0 and 1.0 + TextBox* = ref object of ControlImpl fEditable: bool fOnTextChange: TextChangeProc @@ -943,6 +946,20 @@ method text*(label: Label): string {.base.} method `text=`*(label: Label, text: string) {.base.} +# ---------------------------------------------------------------------------------------- +# ProgressBar +# ---------------------------------------------------------------------------------------- + +proc newProgressBar*(): ProgressBar + +proc init*(progressBar: ProgressBar) +proc init*(progressBar: NativeProgressBar) + +method value*(progressBar: ProgressBar): float {.base.} +method `value=`*(progressBar: ProgressBar, value: float) {.base.} +## value should be between 0.0 and 1.0 + + # ---------------------------------------------------------------------------------------- # TextBox # ---------------------------------------------------------------------------------------- @@ -2495,6 +2512,27 @@ method naturalHeight(label: Label): int {.locks: "unknown".} = label.getTextLine method `onDraw=`(container: NativeLabel, callback: DrawProc) = raiseError("NativeLabel does not allow onDraw.") +# ---------------------------------------------------------------------------------------- +# ProgressBar +# ---------------------------------------------------------------------------------------- + +proc newProgressBar(): ProgressBar = + result = new NativeProgressBar + result.NativeProgressBar.init() + +proc init(progressBar: ProgressBar) = + progressBar.ControlImpl.init() + progressBar.fWidthMode = WidthMode_Expand + progressBar.height = 15.scaleToDpi + +method value*(progressBar: ProgressBar): float = progressBar.fValue + +method `value=`*(progressBar: ProgressBar, value: float) = + # should be overridden by native control + progressBar.fValue = value + progressBar.forceRedraw() + + # ---------------------------------------------------------------------------------------- # TextBox # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index 61fc8d4..4992f88 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -335,6 +335,9 @@ proc gtk_label_set_ellipsize*(label: pointer, mode: cint) {.importc: "gtk_label_ proc gtk_label_set_xalign*(label: pointer, xalign: cfloat) {.importc: "gtk_label_set_xalign", libgtk3.} proc gtk_label_set_yalign*(label: pointer, yalign: cfloat) {.importc: "gtk_label_set_yalign", libgtk3.} +proc gtk_progress_bar_new*(): pointer {.importc: "gtk_progress_bar_new", libgtk3.} +proc gtk_progress_bar_set_fraction*(pbar: pointer, fraction: cdouble) {.importc: "gtk_progress_bar_set_fraction", libgtk3.} + # proc gtk_box_new*(orientation: GtkOrientation, spacing: cint): pointer {.importc: "gtk_box_new", libgtk3.} proc gtk_box_pack_start*(box, child: pointer, expand, fill: cint, padding: cint) {.importc: "gtk_box_pack_start", libgtk3.} diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index c5a7fdb..8717198 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -1356,6 +1356,21 @@ method naturalWidth(label: NativeLabel): int {.locks: "unknown".} = label.getTex # Override parent method, to make it big enough for the text to fit in. +# ---------------------------------------------------------------------------------------- +# ProgressBar +# ---------------------------------------------------------------------------------------- + +proc init(progressBar: NativeProgressBar) = + progressBar.fHandle = gtk_progress_bar_new() + progressBar.ProgressBar.init() + progressBar.height = 8.scaleToDpi # adjust control height to bar height + +method `value=`(progressBar: NativeProgressBar, value: float) = + procCall progressBar.ProgressBar.`value=`(value) + gtk_progress_bar_set_fraction(progressBar.fHandle, value) + app.processEvents() + + # ---------------------------------------------------------------------------------------- # TextBox # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/gtk3/platform_types2.nim b/src/nigui/private/gtk3/platform_types2.nim index 12cf897..a9b5674 100755 --- a/src/nigui/private/gtk3/platform_types2.nim +++ b/src/nigui/private/gtk3/platform_types2.nim @@ -15,4 +15,6 @@ type NativeLabel* = ref object of Label + NativeProgressBar* = ref object of ProgressBar + NativeTextBox* = ref object of TextBox diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index c1f9790..2876448 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -1475,6 +1475,23 @@ method `text=`(label: NativeLabel, text: string) = pSetWindowText(label.fHandle, text) +# ---------------------------------------------------------------------------------------- +# ProgressBar +# ---------------------------------------------------------------------------------------- + +const pProgressBarMaxValue = 10_000 + +proc init(progressBar: NativeProgressBar) = + progressBar.fHandle = pCreateWindowExWithUserdata("msctls_progress32", WS_CHILD, 0, pDefaultParentWindow, cast[pointer](progressBar)) + discard SendMessageA(progressBar.fHandle, PBM_SETRANGE32, cast[pointer](0), cast[pointer](pProgressBarMaxValue)) + progressBar.ProgressBar.init() + +method `value=`(progressBar: NativeProgressBar, value: float) = + procCall progressBar.ProgressBar.`value=`(value) + discard SendMessageA(progressBar.fHandle, PBM_SETPOS, cast[pointer]((value * pProgressBarMaxValue).int32), nil) + app.processEvents() + + # ---------------------------------------------------------------------------------------- # TextBox # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/windows/platform_types2.nim b/src/nigui/private/windows/platform_types2.nim index 0dfe32b..986b847 100755 --- a/src/nigui/private/windows/platform_types2.nim +++ b/src/nigui/private/windows/platform_types2.nim @@ -15,4 +15,6 @@ type NativeLabel* = ref object of Label + NativeProgressBar* = ref object of ProgressBar + NativeTextBox* = ref object of TextBox diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index c3a8845..5defd80 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -76,6 +76,8 @@ const IMAGE_ICON* = 1 # LR_LOADFROMFILE* = 16 OBJ_BRUSH* = 2 + PBM_SETPOS* = 1026 + PBM_SETRANGE32* = 1030 PM_REMOVE* = 1 SB_HORZ* = 0 SB_THUMBPOSITION* = 4 -- cgit v1.2.3