From 286b7bbbfcf6745d08e8e211cac70ad4865af689 Mon Sep 17 00:00:00 2001 From: Philipp Doerner Date: Sat, 14 Oct 2023 18:32:01 +0100 Subject: [PATCH 01/15] Move gtk.nim into bindings dir --- book/internals/hooks/after_build_hook.nim | 2 +- book/internals/hooks/before_build_hook.nim | 2 +- book/internals/hooks/build_hook.nim | 2 +- book/internals/hooks/event_hooks.nim | 4 +++- book/internals/hooks/read_hook.nim | 3 ++- owlkettle.nim | 3 ++- owlkettle/adw.nim | 3 ++- owlkettle/{ => bindings}/gtk.nim | 2 +- owlkettle/mainloop.nim | 3 ++- owlkettle/widgetdef.nim | 3 ++- owlkettle/widgets.nim | 3 ++- owlkettle/widgetutils.nim | 3 ++- 12 files changed, 21 insertions(+), 12 deletions(-) rename owlkettle/{ => bindings}/gtk.nim (99%) diff --git a/book/internals/hooks/after_build_hook.nim b/book/internals/hooks/after_build_hook.nim index bfb93441..5422e943 100644 --- a/book/internals/hooks/after_build_hook.nim +++ b/book/internals/hooks/after_build_hook.nim @@ -15,7 +15,7 @@ Let's return to our earlier renderable example and write it so that the parent-w nbCode: import owlkettle - import owlkettle/gtk + import owlkettle/bindings/gtk import std/json renderable MyRenderable: diff --git a/book/internals/hooks/before_build_hook.nim b/book/internals/hooks/before_build_hook.nim index fb5e227a..e484e2cc 100644 --- a/book/internals/hooks/before_build_hook.nim +++ b/book/internals/hooks/before_build_hook.nim @@ -14,7 +14,7 @@ Here a simple code-example for writing a `beforeBuild` hook: nbCode: import owlkettle - import owlkettle/gtk + import owlkettle/bindings/gtk import std/json renderable MyRenderable: diff --git a/book/internals/hooks/build_hook.nim b/book/internals/hooks/build_hook.nim index 27043151..1e830854 100644 --- a/book/internals/hooks/build_hook.nim +++ b/book/internals/hooks/build_hook.nim @@ -27,7 +27,7 @@ nbCode: # main.nim import std/json import owlkettle - import owlkettle/gtk + import owlkettle/bindings/gtk type Config = object name: string diff --git a/book/internals/hooks/event_hooks.nim b/book/internals/hooks/event_hooks.nim index b7dd2f69..b73adbf3 100644 --- a/book/internals/hooks/event_hooks.nim +++ b/book/internals/hooks/event_hooks.nim @@ -14,7 +14,9 @@ Here a minimal example of a custom button widget that provides a `clicked` event nbCode: import owlkettle import std/tables - import owlkettle/[widgetutils, gtk] + import owlkettle/widgetutils + import owlkettle/bindings/gtk + renderable MyButton of BaseWidget: proc clicked() diff --git a/book/internals/hooks/read_hook.nim b/book/internals/hooks/read_hook.nim index 2a674e5d..07b130b9 100644 --- a/book/internals/hooks/read_hook.nim +++ b/book/internals/hooks/read_hook.nim @@ -12,7 +12,8 @@ Let's look at a minimal example from the `ColorChooserDialog` widget: nbCode: import owlkettle - import owlkettle/[gtk, widgetdef] + import owlkettle/widgetdef + import owlkettle/bindings/gtk # The custom widget renderable MyColorChooserDialog of BuiltinDialog: diff --git a/owlkettle.nim b/owlkettle.nim index 27fd82d3..725f76b2 100644 --- a/owlkettle.nim +++ b/owlkettle.nim @@ -20,7 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import owlkettle/[gtk, widgetutils, widgetdef, widgets, guidsl, mainloop] +import owlkettle/[widgetutils, widgetdef, widgets, guidsl, mainloop] +import owlkettle/bindings/gtk export widgetdef except build_bin, update_bin export widgets, guidsl export Align diff --git a/owlkettle/adw.nim b/owlkettle/adw.nim index c951b5b2..0b0c53a4 100644 --- a/owlkettle/adw.nim +++ b/owlkettle/adw.nim @@ -24,7 +24,8 @@ when defined(nimPreviewSlimSystem): import std/assertions -import gtk, widgetdef, widgets, mainloop, widgetutils +import widgetdef, widgets, mainloop, widgetutils +import bindings/gtk when defined(owlkettleDocs) and isMainModule: echo "# Libadwaita Widgets\n\n" diff --git a/owlkettle/gtk.nim b/owlkettle/bindings/gtk.nim similarity index 99% rename from owlkettle/gtk.nim rename to owlkettle/bindings/gtk.nim index 9d1c58e8..70428368 100644 --- a/owlkettle/gtk.nim +++ b/owlkettle/bindings/gtk.nim @@ -23,7 +23,7 @@ # Bindings for GTK 4 import std/[os] -import ./common +import ../common import std/strutils as strutils diff --git a/owlkettle/mainloop.nim b/owlkettle/mainloop.nim index 21947994..bb286650 100644 --- a/owlkettle/mainloop.nim +++ b/owlkettle/mainloop.nim @@ -20,7 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import gtk, widgetdef, common +import widgetdef, common +import bindings/gtk type StylesheetObj = object diff --git a/owlkettle/widgetdef.nim b/owlkettle/widgetdef.nim index 6c230f8e..e9245371 100644 --- a/owlkettle/widgetdef.nim +++ b/owlkettle/widgetdef.nim @@ -25,7 +25,8 @@ import std/[macros, strutils, tables] when defined(nimPreviewSlimSystem): import std/assertions -import gtk, common +import common +import bindings/gtk type Widget* = ref object of RootObj diff --git a/owlkettle/widgets.nim b/owlkettle/widgets.nim index 99376747..2edef4cf 100644 --- a/owlkettle/widgets.nim +++ b/owlkettle/widgets.nim @@ -25,7 +25,8 @@ import std/[unicode, sets, tables, options, asyncfutures, hashes, times] when defined(nimPreviewSlimSystem): import std/assertions -import gtk, widgetdef, cairo, widgetutils, common +import widgetdef, cairo, widgetutils, common +import bindings/gtk customPragmas() when defined(owlkettleDocs) and isMainModule: diff --git a/owlkettle/widgetutils.nim b/owlkettle/widgetutils.nim index 48839e2b..68b2874c 100644 --- a/owlkettle/widgetutils.nim +++ b/owlkettle/widgetutils.nim @@ -23,7 +23,8 @@ # Utilities for wrapping widgets import std/[sets] -import gtk, widgetdef, common +import widgetdef, common +import bindings/gtk customPragmas() From 95d7138061598312b1510e24663d0a8fdd7d6e16 Mon Sep 17 00:00:00 2001 From: Philipp Doerner Date: Sat, 14 Oct 2023 18:39:26 +0100 Subject: [PATCH 02/15] Refactor adwaita bindings into a binding module --- owlkettle/adw.nim | 144 +------------------------------------ owlkettle/bindings/adw.nim | 141 ++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 143 deletions(-) create mode 100644 owlkettle/bindings/adw.nim diff --git a/owlkettle/adw.nim b/owlkettle/adw.nim index 0b0c53a4..e7120b29 100644 --- a/owlkettle/adw.nim +++ b/owlkettle/adw.nim @@ -25,156 +25,14 @@ when defined(nimPreviewSlimSystem): import std/assertions import widgetdef, widgets, mainloop, widgetutils -import bindings/gtk +import ./bindings/[adw, gtk] when defined(owlkettleDocs) and isMainModule: echo "# Libadwaita Widgets\n\n" -const AdwMajor {.intdefine: "adwmajor".}: int = 1 ## Specifies the minimum Adwaita major version required to run an application. Overwriteable via `-d:adwmajor=X`. Defaults to 1. -const AdwMinor {.intdefine: "adwminor".}: int = 0 ## Specifies the minimum Adwaita minor version required to run an application. Overwriteable via `-d:adwinor=X`. Defaults to 0. -const AdwVersion = (AdwMajor, AdwMinor) - -{.passl: "-ladwaita-1".} - -type - StyleManager = distinct pointer - - ColorScheme* = enum - ColorSchemeDefault, - ColorSchemeForceLight, - ColorSchemeForceDark, - ColorSchemePreferDark, - ColorSchemePreferLight - - FlapFoldPolicy* = enum - FlapFoldNever, - FlapFoldAlways, - FlapFoldAuto - - FoldThresholdPolicy* = enum - FoldThresholdMinimum, - FoldThresholdNatural - - FlapTransitionType* = enum - FlapTransitionOver - FlapTransitionUnder - FlapTransitionSlide - -{.push importc, cdecl.} -# Adw -proc adw_init() - -# Adw.StyleManager -proc adw_style_manager_get_default(): StyleManager -proc adw_style_manager_set_color_scheme(manager: StyleManager, colorScheme: ColorScheme) - -# Adw.Window -proc adw_window_new(): GtkWidget -proc adw_window_set_content(window, content: GtkWidget) - -# Adw.WindowTitle -proc adw_window_title_new(title, subtitle: cstring): GtkWidget -proc adw_window_title_set_title(widget: GtkWidget, title: cstring) -proc adw_window_title_set_subtitle(widget: GtkWidget, subtitle: cstring) - -# Adw.Avatar -proc adw_avatar_new(size: cint, text: cstring, showInitials: cbool): GtkWidget -proc adw_avatar_set_show_initials(avatar: GtkWidget, value: cbool) -proc adw_avatar_set_size(avatar: GtkWidget, size: cint) -proc adw_avatar_set_text(avatar: GtkWidget, text: cstring) -proc adw_avatar_set_icon_name(avatar: GtkWidget, iconName: cstring) - -# Adw.Clamp -proc adw_clamp_new(): GtkWidget -proc adw_clamp_set_child(clamp, child: GtkWidget) -proc adw_clamp_set_maximum_size(clamp: GtkWidget, size: cint) - -# Adw.PreferencesGroup -proc adw_preferences_group_new(): GtkWidget -proc adw_preferences_group_add(group, child: GtkWidget) -proc adw_preferences_group_remove(group, child: GtkWidget) -proc adw_preferences_group_set_header_suffix(group, child: GtkWidget) -proc adw_preferences_group_set_description(group: GtkWidget, descr: cstring) -proc adw_preferences_group_set_title(group: GtkWidget, title: cstring) - -# Adw.PreferencesRow -proc adw_preferences_row_new(): GtkWidget -proc adw_preferences_row_set_title(row: GtkWidget, title: cstring) - -# Adw.ActionRow -proc adw_action_row_new(): GtkWidget -proc adw_action_row_set_subtitle(row: GtkWidget, subtitle: cstring) -proc adw_action_row_add_prefix(row, child: GtkWidget) -proc adw_action_row_add_suffix(row, child: GtkWidget) -proc adw_action_row_remove(row, child: GtkWidget) -proc adw_action_row_set_activatable_widget(row, child: GtkWidget) - -# Adw.ExpanderRow -proc adw_expander_row_new(): GtkWidget -proc adw_expander_row_set_subtitle(row: GtkWidget, subtitle: cstring) -proc adw_expander_row_add_action(row, child: GtkWidget) -proc adw_expander_row_add_prefix(row, child: GtkWidget) -proc adw_expander_row_add_row(expanderRow, row: GtkWidget) -proc adw_expander_row_remove(row, child: GtkWidget) - -# Adw.ComboRow -proc adw_combo_row_new(): GtkWidget -proc adw_combo_row_set_model*(comboRow: GtkWidget, model: GListModel) -proc adw_combo_row_set_selected*(comboRow: GtkWidget, selected: cuint) -proc adw_combo_row_get_selected*(comboRow: GtkWidget): cuint - -when AdwVersion >= (1, 2): - # Adw.EntryRow - proc adw_entry_row_new(): GtkWidget - proc adw_entry_row_add_suffix(row, child: GtkWidget) - proc adw_entry_row_remove(row, child: GtkWidget) - -# Adw.Flap -proc adw_flap_new(): GtkWidget -proc adw_flap_set_content(flap, content: GtkWidget) -proc adw_flap_set_flap(flap, child: GtkWidget) -proc adw_flap_set_separator(flap, child: GtkWidget) -proc adw_flap_set_fold_policy(flap: GtkWidget, foldPolicy: FlapFoldPolicy) -proc adw_flap_set_fold_threshold_policy(flap: GtkWidget, foldThresholdPolicy: FoldThresholdPolicy) -proc adw_flap_set_transition_type(flap: GtkWidget, transitionType: FlapTransitionType) -proc adw_flap_set_reveal_flap(flap: GtkWidget, revealed: cbool) -proc adw_flap_set_modal(flap: GtkWidget, modal: cbool) -proc adw_flap_set_locked(flap: GtkWidget, locked: cbool) -proc adw_flap_set_swipe_to_open(flap: GtkWidget, swipe: cbool) -proc adw_flap_set_swipe_to_close(flap: GtkWidget, swipe: cbool) -proc adw_flap_get_reveal_flap(flap: GtkWidget): cbool -proc adw_flap_get_folded(flap: GtkWidget): cbool - -# Adw.SplitButton -proc adw_split_button_new(): GtkWidget -proc adw_split_button_set_child(button, child: GtkWidget) -proc adw_split_button_set_popover(button, child: GtkWidget) - -# Adw.StatusPage -proc adw_status_page_new(): GtkWidget -proc adw_status_page_set_child(self: GtkWidget, child: GtkWidget) -proc adw_status_page_set_description(self: GtkWidget, description: cstring) -proc adw_status_page_set_icon_name(self: GtkWidget, icon_name: cstring) -proc adw_status_page_set_paintable(self: GtkWidget, paintable: GtkWidget) -proc adw_status_page_set_title(self: GtkWidget, title: cstring) - -when AdwVersion >= (1, 2): - # Adw.AboutWindow - proc adw_about_window_new(): GtkWidget - proc adw_about_window_set_application_name(window: GtkWidget, value: cstring) - proc adw_about_window_set_developer_name(window: GtkWidget, value: cstring) - proc adw_about_window_set_version(window: GtkWidget, value: cstring) - proc adw_about_window_set_support_url(window: GtkWidget, value: cstring) - proc adw_about_window_set_issue_url(window: GtkWidget, value: cstring) - proc adw_about_window_set_website(window: GtkWidget, value: cstring) - proc adw_about_window_set_copyright(window: GtkWidget, value: cstring) - proc adw_about_window_set_license(window: GtkWidget, value: cstring) -{.pop.} - renderable WindowSurface of BaseWindow: ## A Window that does not have a title bar. ## A WindowSurface is equivalent to an `Adw.Window`. - content: Widget hooks: diff --git a/owlkettle/bindings/adw.nim b/owlkettle/bindings/adw.nim new file mode 100644 index 00000000..6cac1224 --- /dev/null +++ b/owlkettle/bindings/adw.nim @@ -0,0 +1,141 @@ +import ./gtk + +const AdwMajor {.intdefine: "adwmajor".}: int = 1 ## Specifies the minimum Adwaita major version required to run an application. Overwriteable via `-d:adwmajor=X`. Defaults to 1. +const AdwMinor {.intdefine: "adwminor".}: int = 0 ## Specifies the minimum Adwaita minor version required to run an application. Overwriteable via `-d:adwinor=X`. Defaults to 0. +const AdwVersion* = (AdwMajor, AdwMinor) + +{.passl: "-ladwaita-1".} + +type + StyleManager* = distinct pointer + + ColorScheme* = enum + ColorSchemeDefault, + ColorSchemeForceLight, + ColorSchemeForceDark, + ColorSchemePreferDark, + ColorSchemePreferLight + + FlapFoldPolicy* = enum + FlapFoldNever, + FlapFoldAlways, + FlapFoldAuto + + FoldThresholdPolicy* = enum + FoldThresholdMinimum, + FoldThresholdNatural + + FlapTransitionType* = enum + FlapTransitionOver + FlapTransitionUnder + FlapTransitionSlide + +{.push importc, cdecl.} +# Adw +proc adw_init*() + +# Adw.StyleManager +proc adw_style_manager_get_default*(): StyleManager +proc adw_style_manager_set_color_scheme*(manager: StyleManager, colorScheme: ColorScheme) + +# Adw.Window +proc adw_window_new*(): GtkWidget +proc adw_window_set_content*(window, content: GtkWidget) + +# Adw.WindowTitle +proc adw_window_title_new*(title, subtitle: cstring): GtkWidget +proc adw_window_title_set_title*(widget: GtkWidget, title: cstring) +proc adw_window_title_set_subtitle*(widget: GtkWidget, subtitle: cstring) + +# Adw.Avatar +proc adw_avatar_new*(size: cint, text: cstring, showInitials: cbool): GtkWidget +proc adw_avatar_set_show_initials*(avatar: GtkWidget, value: cbool) +proc adw_avatar_set_size*(avatar: GtkWidget, size: cint) +proc adw_avatar_set_text*(avatar: GtkWidget, text: cstring) +proc adw_avatar_set_icon_name*(avatar: GtkWidget, iconName: cstring) + +# Adw.Clamp +proc adw_clamp_new*(): GtkWidget +proc adw_clamp_set_child*(clamp, child: GtkWidget) +proc adw_clamp_set_maximum_size*(clamp: GtkWidget, size: cint) + +# Adw.PreferencesGroup +proc adw_preferences_group_new*(): GtkWidget +proc adw_preferences_group_add*(group, child: GtkWidget) +proc adw_preferences_group_remove*(group, child: GtkWidget) +proc adw_preferences_group_set_header_suffix*(group, child: GtkWidget) +proc adw_preferences_group_set_description*(group: GtkWidget, descr: cstring) +proc adw_preferences_group_set_title*(group: GtkWidget, title: cstring) + +# Adw.PreferencesRow +proc adw_preferences_row_new*(): GtkWidget +proc adw_preferences_row_set_title*(row: GtkWidget, title: cstring) + +# Adw.ActionRow +proc adw_action_row_new*(): GtkWidget +proc adw_action_row_set_subtitle*(row: GtkWidget, subtitle: cstring) +proc adw_action_row_add_prefix*(row, child: GtkWidget) +proc adw_action_row_add_suffix*(row, child: GtkWidget) +proc adw_action_row_remove*(row, child: GtkWidget) +proc adw_action_row_set_activatable_widget*(row, child: GtkWidget) + +# Adw.ExpanderRow +proc adw_expander_row_new*(): GtkWidget +proc adw_expander_row_set_subtitle*(row: GtkWidget, subtitle: cstring) +proc adw_expander_row_add_action*(row, child: GtkWidget) +proc adw_expander_row_add_prefix*(row, child: GtkWidget) +proc adw_expander_row_add_row*(expanderRow, row: GtkWidget) +proc adw_expander_row_remove*(row, child: GtkWidget) + +# Adw.ComboRow +proc adw_combo_row_new*(): GtkWidget +proc adw_combo_row_set_model*(comboRow: GtkWidget, model: GListModel) +proc adw_combo_row_set_selected*(comboRow: GtkWidget, selected: cuint) +proc adw_combo_row_get_selected*(comboRow: GtkWidget): cuint + +when AdwVersion >= (1, 2): + # Adw.EntryRow + proc adw_entry_row_new*(): GtkWidget + proc adw_entry_row_add_suffix*(row, child: GtkWidget) + proc adw_entry_row_remove*(row, child: GtkWidget) + +# Adw.Flap +proc adw_flap_new*(): GtkWidget +proc adw_flap_set_content*(flap, content: GtkWidget) +proc adw_flap_set_flap*(flap, child: GtkWidget) +proc adw_flap_set_separator*(flap, child: GtkWidget) +proc adw_flap_set_fold_policy*(flap: GtkWidget, foldPolicy: FlapFoldPolicy) +proc adw_flap_set_fold_threshold_policy*(flap: GtkWidget, foldThresholdPolicy: FoldThresholdPolicy) +proc adw_flap_set_transition_type*(flap: GtkWidget, transitionType: FlapTransitionType) +proc adw_flap_set_reveal_flap*(flap: GtkWidget, revealed: cbool) +proc adw_flap_set_modal*(flap: GtkWidget, modal: cbool) +proc adw_flap_set_locked*(flap: GtkWidget, locked: cbool) +proc adw_flap_set_swipe_to_open*(flap: GtkWidget, swipe: cbool) +proc adw_flap_set_swipe_to_close*(flap: GtkWidget, swipe: cbool) +proc adw_flap_get_reveal_flap*(flap: GtkWidget): cbool +proc adw_flap_get_folded*(flap: GtkWidget): cbool + +# Adw.SplitButton +proc adw_split_button_new*(): GtkWidget +proc adw_split_button_set_child*(button, child: GtkWidget) +proc adw_split_button_set_popover*(button, child: GtkWidget) + +# Adw.StatusPage +proc adw_status_page_new*(): GtkWidget +proc adw_status_page_set_child*(self: GtkWidget, child: GtkWidget) +proc adw_status_page_set_description*(self: GtkWidget, description: cstring) +proc adw_status_page_set_icon_name*(self: GtkWidget, icon_name: cstring) +proc adw_status_page_set_paintable*(self: GtkWidget, paintable: GtkWidget) +proc adw_status_page_set_title*(self: GtkWidget, title: cstring) + +when AdwVersion >= (1, 2): + # Adw.AboutWindow + proc adw_about_window_new*(): GtkWidget + proc adw_about_window_set_application_name*(window: GtkWidget, value: cstring) + proc adw_about_window_set_developer_name*(window: GtkWidget, value: cstring) + proc adw_about_window_set_version*(window: GtkWidget, value: cstring) + proc adw_about_window_set_support_url*(window: GtkWidget, value: cstring) + proc adw_about_window_set_issue_url*(window: GtkWidget, value: cstring) + proc adw_about_window_set_website*(window: GtkWidget, value: cstring) + proc adw_about_window_set_copyright*(window: GtkWidget, value: cstring) + proc adw_about_window_set_license*(window: GtkWidget, value: cstring) From b260c079f3831d3c6449813109c3f7fad3886b9f Mon Sep 17 00:00:00 2001 From: Philipp Doerner Date: Sat, 14 Oct 2023 18:46:55 +0100 Subject: [PATCH 03/15] Re export bound enums --- owlkettle/adw.nim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/owlkettle/adw.nim b/owlkettle/adw.nim index e7120b29..3cd444a3 100644 --- a/owlkettle/adw.nim +++ b/owlkettle/adw.nim @@ -27,6 +27,12 @@ when defined(nimPreviewSlimSystem): import widgetdef, widgets, mainloop, widgetutils import ./bindings/[adw, gtk] +export adw.StyleManager +export adw.ColorScheme +export adw.FlapFoldPolicy +export adw.FoldThresholdPolicy +export adw.FlapTransitionType + when defined(owlkettleDocs) and isMainModule: echo "# Libadwaita Widgets\n\n" From 6dda78ad58ceb091255d5fcc4c3c6b5d1ed6a577 Mon Sep 17 00:00:00 2001 From: PhilippMDoerner Date: Tue, 17 Oct 2023 19:03:53 +0100 Subject: [PATCH 04/15] Add SearchEntry widget * Add Search Entry Widget * Add text field to searchEntry widget * Add missing text hook * Improve search entry example * Further improve example * Refine which fields you shouldn't have access to * Add activity to when you stop a search * Add activity to when you stop a search * Fix search entry displaying weird spacing * Unify GtkMinor into a single constant * Debug change Attempt to cat out the gtk.nim file to see how the hell it is getting the impression that GtkMinor is defined twice. * Move GtkMInor before the passL flag is passed? Maybe this fixes the problem with the pipeline sudenly thinking that value was defined twice. * Unto test-pipeline debug change * Comment out unsupported search thingy * Minor tweaks - Removed searchstring parameter from callbacks - made sure only changed callback can modify search value - Updated example - Moved example to far nicer looking ListBox * Remove unnecessary Box * Update examples/widgets/search_entry.nim Co-authored-by: Can Lehmann <85876381+can-lehmann@users.noreply.github.com> --------- Co-authored-by: Can Lehmann <85876381+can-lehmann@users.noreply.github.com> --- docs/assets/examples/search_entry.png | Bin 0 -> 32560 bytes docs/widgets.md | 23 +++++++ examples/README.md | 4 ++ examples/widgets/search_entry.nim | 90 ++++++++++++++++++++++++++ owlkettle/bindings/gtk.nim | 10 ++- owlkettle/widgets.nim | 64 +++++++++++++++++- 6 files changed, 188 insertions(+), 3 deletions(-) create mode 100644 docs/assets/examples/search_entry.png create mode 100644 examples/widgets/search_entry.nim diff --git a/docs/assets/examples/search_entry.png b/docs/assets/examples/search_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..7f54b47a7c0c31e24c67997f6967b1499fb6d400 GIT binary patch literal 32560 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 Scale Widget + + Search Entry + Search Entry Widget + Text View Text View diff --git a/examples/widgets/search_entry.nim b/examples/widgets/search_entry.nim new file mode 100644 index 00000000..6d3d1a98 --- /dev/null +++ b/examples/widgets/search_entry.nim @@ -0,0 +1,90 @@ +# MIT License +# +# Copyright (c) 2023 Can Joshua Lehmann +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE + +import owlkettle, owlkettle/[playground, adw, dataentries] +import std/[strutils, sets, sequtils] + +viewable App: + searchDelay: uint = 100 + text: string = "" + placeholderText: string = "Search List" + sensitive: bool = true + tooltip: string = "" + sizeRequest: tuple[x, y: int] = (-1, -1) + + items: seq[string] = mapIt(0..<100, "Item " & $it) + filteredItems: seq[string] = mapIt(0..<100, "Item " & $it) + selected: int = 0 + +method view(app: AppState): Widget = + let isInActiveSearch = app.text != "" + result = gui: + Window(): + defaultSize = (600, 400) + HeaderBar() {.addTitlebar.}: + insert(app.toAutoFormMenu(ignoreFields = @["filteredItems"])) {.addRight.} + + SearchEntry() {.addTitle, expand: true.}: + margin = Margin(top:0, left: 48, bottom:0, right: 48) + text = app.text + searchDelay = app.searchDelay + placeholderText = app.placeholderText + sensitive = app.sensitive + tooltip = app.tooltip + sizeRequest = app.sizeRequest + + proc nextMatch() = + if app.selected < app.filteredItems.high: + app.selected += 1 + + proc previousMatch() = + if app.selected > 0: + app.selected -= 1 + + proc activate() = + echo "activated search for entry: ": $app.filteredItems[app.selected] + + proc changed(searchString: string) = + app.text = searchString + app.selected = 0 + app.filteredItems = app.items.filterIt(searchString in it) + + proc stopSearch() = + echo "Search Stopped" + app.text = "" + app.filteredItems = app.items + + ScrolledWindow: + ListBox: + selected = [app.selected].toHashSet() + selectionMode = SelectionSingle + + proc select(rows: Hashset[int]) = + for num in rows: + app.selected = num + + for index, item in app.filteredItems: + Box(): + Label(text = item, margin = 6) {.hAlign: AlignStart, expand: false.} + + +adw.brew(gui(App())) \ No newline at end of file diff --git a/owlkettle/bindings/gtk.nim b/owlkettle/bindings/gtk.nim index af753e33..6ab2ed52 100644 --- a/owlkettle/bindings/gtk.nim +++ b/owlkettle/bindings/gtk.nim @@ -27,7 +27,7 @@ import ../common import std/strutils as strutils -const GtkMinor {.intdefine: "gtkminor".}: int = 0 ## Specifies the minimum GTK4 minor version required to run an application. Overwriteable via `-d:gtkminor=X`. Defaults to 0. +const GtkMinor* {.intdefine: "gtkminor".}: int = 0 ## Specifies the minimum GTK4 minor version required to run an application. Overwriteable via `-d:gtkminor=X`. Defaults to 0. {.passl: strutils.strip(gorge("pkg-config --libs gtk4")).} @@ -881,6 +881,14 @@ proc gtk_progress_bar_set_pulse_step*(widget: GtkWidget, fraction: cdouble) proc gtk_progress_bar_set_show_text*(widget: GtkWidget, show_text: cbool) proc gtk_progress_bar_set_text*(widget: GtkWidget, text: cstring) +# Gtk.SearchEntry +proc gtk_search_entry_new*(): GtkWidget +proc gtk_search_entry_set_key_capture_widget*(widget: GtkWidget, captureWidget: GtkWidget) +when GtkMinor >= 8: + proc gtk_search_entry_set_search_delay*(widget: GtkWidget, delay: cuint) +when GtkMinor >= 10: + proc gtk_search_entry_set_placeholder_text*(widget: GtkWidget, text: cstring) + # Gtk.Stack proc gtk_stack_add_named*(stack, child: GtkWidget, name: cstring) proc gtk_stack_remove*(stack, child: GtkWidget) diff --git a/owlkettle/widgets.nim b/owlkettle/widgets.nim index 9cf8b819..5f3cf227 100644 --- a/owlkettle/widgets.nim +++ b/owlkettle/widgets.nim @@ -32,8 +32,6 @@ customPragmas() when defined(owlkettleDocs) and isMainModule: echo "# Widgets" -const GtkMinor {.intdefine: "gtkminor".}: int = 0 ## Specifies the minimum GTK4 minor version required to run an application. Overwriteable via `-d:gtkminor=X`. Defaults to 0. - type Margin* = object top*, bottom*, left*, right*: int @@ -2068,6 +2066,67 @@ renderable ModelButton of BaseWidget: proc clicked() = echo "Clicked " & $it +renderable SearchEntry of BaseWidget: + text: string + # child: GtkWidget # This is currently not supported + searchDelay: uint = 100 ## Determines the minimum time after a `searchChanged` event occurred before the next can be emitted. Only available when compiling for gtk 4.8 + placeholderText: string = "Search" ## Only available when compiling for gtk 4.10 + + proc activate() ## Triggered when the user "activated" the search e.g. by hitting "enter" key while SearchEntry is in focus. + proc nextMatch() ## Triggered when the user hits the "next entry" keybinding while the search entry is in focus, which is Ctrl-g by default. + proc previousMatch() ## Triggered when the user hits the "previous entry" keybinding while the search entry is in focus, which is Ctrl-Shift-g by default. + proc changed(searchString: string) ## Triggered when the user types in the SearchEntry. + # proc searchStarted() # Currently not supported + proc stopSearch() ## Triggered when the user "stops" a search, e.g. by hitting the "Esc" key while SearchEntry is in focus. + + hooks: + beforeBuild: + state.internalWidget = gtk_search_entry_new() + connectEvents: + proc changedCallback(widget: GtkWidget, data: ptr EventObj[proc(searchString: string)]) = + let searchString = $gtk_editable_get_text(widget) + SearchEntryState(data[].widget).text = searchString + data[].callback(searchString) + data[].redraw() + + state.connect(state.activate, "activate", eventCallback) + state.connect(state.nextMatch, "next-match", eventCallback) + state.connect(state.previousMatch, "previous-match", eventCallback) + state.connect(state.changed, "search-changed", changedCallback) + # state.connect(state.searchStarted, "search-changed", eventCallback) # Currently not supported + state.connect(state.stopSearch, "stop-search", eventCallback) + disconnectEvents: + state.internalWidget.disconnect(state.activate) + state.internalWidget.disconnect(state.nextMatch) + state.internalWidget.disconnect(state.previousMatch) + state.internalWidget.disconnect(state.changed) + # state.internalWidget.disconnect(state.searchStarted) # Currently not supported + state.internalWidget.disconnect(state.stopSearch) + + # hooks child: + # property: + # gtk_search_entry_set_key_capture_widget(state.internalWidget, state.child.pointer) + + hooks text: + property: + gtk_editable_set_text(state.internalWidget, state.text.cstring) + read: + state.text = $gtk_editable_get_text(state.internalWidget) + + hooks searchDelay: + property: + when GtkMinor >= 8: + gtk_search_entry_set_search_delay(state.internalWidget, state.searchDelay.cuint) + else: + discard + + hooks placeholderText: + property: + when GtkMinor >= 10: + gtk_search_entry_set_placeholder_text(state.internalWidget, state.placeholderText.cstring) + else: + discard + renderable Separator of BaseWidget: ## A separator line. @@ -4049,6 +4108,7 @@ export AboutDialog, AboutDialogState export buildState, updateState, assignAppEvents export Scale export Expander +export SearchEntry export Video export ProgressBar export EmojiChooser From 7a0ce6c914ffab8afbd6f615e9349c67e10e29de Mon Sep 17 00:00:00 2001 From: PhilippMDoerner Date: Tue, 17 Oct 2023 19:14:24 +0100 Subject: [PATCH 05/15] Add PasswordEntry widget * Add core of password entry widget * Add bindings for menu model I do not plan to act on them yet but I'd like to at least already add them so I don't have to make the effort later * Update password entry docs * Improve gitignore * Use unsafeAddr for nim version 1.0 * Fix GValue being let instead of var * Add text field to password entry * Ensure activateEventCallback also updates state * Add missing text hook * Add way to demonstrate 2 way binding * Remove unnecessary pragma ping pong * Removed password from activate callback parameters --- .gitignore | 4 ++ docs/assets/examples/password_entry.png | Bin 0 -> 38010 bytes docs/widgets.md | 20 +++++++ examples/README.md | 4 ++ examples/widgets/password_entry.nim | 69 ++++++++++++++++++++++++ owlkettle/bindings/gtk.nim | 20 ++++++- owlkettle/widgets.nim | 55 ++++++++++++++++++- 7 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 docs/assets/examples/password_entry.png create mode 100644 examples/widgets/password_entry.nim diff --git a/.gitignore b/.gitignore index 99e74a49..5276b7b9 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,7 @@ nimbledeps .vscode examples/widgets/adw/status_page owlkettle.out +examples/widgets/emoji_chooser +examples/widgets/expander +examples/widgets/password_entry +examples/widgets/progress_bar diff --git a/docs/assets/examples/password_entry.png b/docs/assets/examples/password_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..5327c11f79039be89d24c25aec55bebd742f92b9 GIT binary patch literal 38010 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 Grid + + Password Entry + Password Entry + Picture Picture diff --git a/examples/widgets/password_entry.nim b/examples/widgets/password_entry.nim new file mode 100644 index 00000000..b759d87e --- /dev/null +++ b/examples/widgets/password_entry.nim @@ -0,0 +1,69 @@ +# MIT License +# +# Copyright (c) 2022 Can Joshua Lehmann +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +import std/[sequtils] +import owlkettle, owlkettle/[dataentries, playground, adw] + +viewable App: + activatesDefault: bool = true + placeholderText: string = "Password" + showPeekIcon: bool = true + sensitive: bool = true + tooltip: string = "" + text: string = "" + sizeRequest: tuple[x, y: int] = (-1, -1) + +method view(app: AppState): Widget = + result = gui: + Window(): + defaultSize = (600, 150) + HeaderBar() {.addTitlebar.}: + WindowTitle {.addTitle.}: + title = "Password Entry Example" + subtitle = "Password length: " & $app.text.len() + + insert(app.toAutoFormMenu()) {.addRight.} + + Button {.addLeft.}: + style = [ButtonFlat] + text = "Reset" + proc clicked() = app.text = "" + + Box(orient = OrientY): + Label(text = "Enter a Password") {.expand: false.} + PasswordEntry{.expand: false.}: + activatesDefault = app.activatesDefault + placeholderText = app.placeholderText + showPeekIcon = app.showPeekIcon + sensitive = app.sensitive + tooltip = app.tooltip + sizeRequest = app.sizeRequest + text = app.text + + proc activate() = + echo "User confirmed new password" + + proc changed(pw: string) = + echo "Change in Password: ", pw + app.text = pw + +adw.brew(gui(App())) diff --git a/owlkettle/bindings/gtk.nim b/owlkettle/bindings/gtk.nim index 6ab2ed52..59a71131 100644 --- a/owlkettle/bindings/gtk.nim +++ b/owlkettle/bindings/gtk.nim @@ -323,7 +323,8 @@ type GNotification* = distinct pointer GListModel* = distinct pointer - + GMenuModel* = distinct pointer + GMenuItem* = distinct pointer GApplicationFlags = distinct cuint proc isNil*(obj: GResource): bool {.borrow.} @@ -346,7 +347,7 @@ const G_TYPE_STRING* = GType(16 shl 2) G_TYPE_POINTER* = GType(17 shl 2) G_TYPE_OBJECT* = GType(20 shl 2) - + {.push importc, cdecl.} # GObject proc g_signal_handler_disconnect*(widget: pointer, @@ -436,6 +437,16 @@ proc g_quark_from_string*(value: cstring): GQuark proc g_resource_load*(path: cstring, err: ptr GError): GResource proc g_resources_register*(res: GResource) +# Gio.GMenu +proc g_menu_new*(): GMenuModel +proc g_menu_append*(menu: GMenuModel, label: cstring, detailed_action: cstring) +proc g_menu_append_item*(menu: GMenuModel, item: GMenuItem) +proc g_menu_append_section*(menu: GMenuModel, label: cstring, section: GMenuModel) +proc g_menu_append_submenu*(menu: GMenuModel, label: cstring, submenu: GMenuModel) +proc g_menu_freeze*(menu: GMenuModel) +proc g_menu_remove*(menu: GMenuModel, position: cint) +proc g_menu_remove_all*(menu: GMenuModel) + # Gio.Icon proc g_icon_new_for_string*(name: cstring, err: ptr GError): GIcon @@ -855,6 +866,11 @@ proc gtk_check_button_set_active*(widget: GtkWidget, state: cbool) proc gtk_check_button_get_active*(widget: GtkWidget): cbool proc gtk_check_button_set_group*(widget, group: GtkWidget) +# Gtk.PasswordEntry +proc gtk_password_entry_new*(): GtkWidget +# proc gtk_password_entry_set_extra_menu*(widget: GtkWidget, model: GMenuModel) +proc gtk_password_entry_set_show_peek_icon*(widget: GtkWidget, show_peek_icon: cbool) + # Gtk.Popover proc gtk_popover_new*(relativeTo: GtkWidget): GtkWidget proc gtk_popover_popup*(popover: GtkWidget) diff --git a/owlkettle/widgets.nim b/owlkettle/widgets.nim index 5f3cf227..3738b931 100644 --- a/owlkettle/widgets.nim +++ b/owlkettle/widgets.nim @@ -3896,7 +3896,59 @@ renderable Expander of BaseWidget: widget.hasLabelWidget = true widget.valLabelWidget = child - + +renderable PasswordEntry of BaseWidget: + text: string + # menuModel: GtkMenuModel # Not yet supported + activatesDefault: bool = true + placeholderText: string = "Password" + showPeekIcon: bool = true + + proc activate() ## Triggered when the user "activated" the entry e.g. by hitting "enter" key while PasswordEntry is in focus. + proc changed(password: string) ## Triggered when the user types in the PasswordEntry. + + hooks: + beforeBuild: + state.internalWidget = gtk_password_entry_new() + connectEvents: + proc changedEventCallback( + widget: GtkWidget, + data: ptr EventObj[proc(password: string)] + ) {.cdecl.} = + let password: string = $gtk_editable_get_text(widget) + PasswordEntryState(data[].widget).text = password + data[].callback(password) + data[].redraw() + + state.connect(state.activate, "activate", eventCallback) + state.connect(state.changed, "changed", changedEventCallback) + disconnectEvents: + disconnect(state.internalWidget, state.activate) + disconnect(state.internalWidget, state.changed) + + hooks text: + property: + gtk_editable_set_text(state.internalWidget, state.text.cstring) + read: + state.text = $gtk_editable_get_text(state.internalWidget) + + hooks activatesDefault: + property: + var value = g_value_new(state.activatesDefault) + g_object_set_property(state.internalWidget.pointer, "activates-default", value.addr) + g_value_unset(value.addr) + + hooks placeholderText: + property: + var value = g_value_new(state.placeholderText) + g_object_set_property(state.internalWidget.pointer, "placeholder-text", value.addr) + g_value_unset(value.addr) + + hooks showPeekIcon: + property: + gtk_password_entry_set_show_peek_icon(state.internalWidget, state.showPeekIcon.cbool) + + renderable ProgressBar of BaseWidget: ## A progress bar widget to show progress being made on a long-lasting task ellipsize: EllipsizeMode = EllipsizeEnd ## Determines how the `text` gets ellipsized if `showText = true` and `text` overflows. @@ -4112,5 +4164,6 @@ export SearchEntry export Video export ProgressBar export EmojiChooser +export PasswordEntry export CenterBox export ListView From 161600d2e85205ca17d4d5e4983667c24be9a37a Mon Sep 17 00:00:00 2001 From: PhilippMDoerner Date: Tue, 17 Oct 2023 19:21:15 +0100 Subject: [PATCH 06/15] Add ActionBar widget * Make Centerbox orientable * Add Action Bar Widget and docs * Minor refinement to the action bar example It now actually "deletes" the contents of the label. There's also a button to reset its value. * Improve example button styling --- docs/assets/examples/action_bar.png | Bin 0 -> 38183 bytes docs/widgets.md | 25 ++++++++++ examples/README.md | 4 ++ examples/widgets/action_bar.nim | 72 ++++++++++++++++++++++++++++ examples/widgets/center_box.nim | 8 ++-- owlkettle/bindings/gtk.nim | 9 ++++ owlkettle/widgets.nim | 46 ++++++++++++++++++ 7 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 docs/assets/examples/action_bar.png create mode 100644 examples/widgets/action_bar.nim diff --git a/docs/assets/examples/action_bar.png b/docs/assets/examples/action_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..601dce1794ed5a17c64f804e4933813a58ef69e8 GIT binary patch literal 38183 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