diff options
| author | trustable-code <krauter.simon@arcor.de> | 2019-09-23 23:07:18 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2019-09-23 23:07:18 +0200 |
| commit | 9d9babe7491f791545ddb7730a573e9b21cd3fa6 (patch) | |
| tree | 75d42e1e10eccb196127b48c43e455678f690578 /src/nigui/private/gtk3 | |
| parent | 20b7e0cdcbcf571c4bed1dc0460feff73be110e0 (diff) | |
| download | NiGui-9d9babe7491f791545ddb7730a573e9b21cd3fa6.tar.gz NiGui-9d9babe7491f791545ddb7730a573e9b21cd3fa6.zip | |
Extend Checkbox and add Gtk implementation
- Add `checked=` to set the status
- Add `onToggle` event to react on toggle by the user
- Toggling works also by Space and Enter
Diffstat (limited to 'src/nigui/private/gtk3')
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 14 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 46 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_types2.nim | 2 |
3 files changed, 62 insertions, 0 deletions
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index d7d9a1c..bb41873 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -210,6 +210,14 @@ const GDK_WINDOW_STATE_FOCUSED* = 128 GDK_WINDOW_STATE_TILED* = 256 + # GSignalMatchType: + G_SIGNAL_MATCH_ID* = 1 + G_SIGNAL_MATCH_DETAIL* = 2 + G_SIGNAL_MATCH_CLOSURE* = 4 + G_SIGNAL_MATCH_FUNC* = 8 + G_SIGNAL_MATCH_DATA* = 16 + G_SIGNAL_MATCH_UNBLOCKED* = 16 + # ---------------------------------------------------------------------------------------- # General Gtk Procs @@ -228,6 +236,8 @@ proc gtk_main_iteration*(): cint {.importc: "gtk_main_iteration", libgtk3.} proc g_timeout_add*(interval: cint, function, data: pointer): cint {.importc: "g_timeout_add", libgtk3.} proc g_source_remove*(tag: cint): bool {.importc: "g_source_remove", libgtk3.} proc g_signal_connect_data*(instance: pointer, detailed_signal: cstring, c_handler: pointer, data, destroy_data, connect_flags: pointer = nil): pointer {.importc: "g_signal_connect_data", libgtk3.} +proc g_signal_handlers_block_matched*(instance: pointer, mask, signal_id: cint, detail, closure, function, data: pointer = nil) {.importc: "g_signal_handlers_block_matched", libgtk3.} +proc g_signal_handlers_unblock_matched*(instance: pointer, mask, signal_id: cint, detail, closure, function, data: pointer = nil) {.importc: "g_signal_handlers_unblock_matched", libgtk3.} proc gtk_window_new*(`type`: cint): pointer {.importc: "gtk_window_new", libgtk3.} proc gtk_window_set_title*(window: pointer, title: cstring) {.importc: "gtk_window_set_title", libgtk3.} @@ -326,6 +336,10 @@ proc gtk_button_new*(): pointer {.importc: "gtk_button_new", libgtk3.} # proc gtk_button_get_label*(button: pointer): cstring {.importc: "gtk_button_get_label", libgtk3.} proc gtk_button_set_label*(button: pointer, label: cstring) {.importc: "gtk_button_set_label", libgtk3.} +proc gtk_check_button_new*(): pointer {.importc: "gtk_check_button_new", libgtk3.} +proc gtk_toggle_button_set_active*(toggle_button: pointer, is_active: bool) {.importc: "gtk_toggle_button_set_active", libgtk3.} +proc gtk_toggle_button_get_active*(toggle_button: pointer): bool {.importc: "gtk_toggle_button_get_active", libgtk3.} + proc gtk_entry_new*(): pointer {.importc: "gtk_entry_new", libgtk3.} proc gtk_entry_set_text*(entry: pointer, text: cstring) {.importc: "gtk_entry_set_text", libgtk3.} proc gtk_entry_get_text*(entry: pointer): cstring {.importc: "gtk_entry_get_text", libgtk3.} diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index 4aeb4ea..80e7cd0 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -1282,6 +1282,52 @@ method `enabled=`(button: NativeButton, enabled: bool) = # ---------------------------------------------------------------------------------------- +# Checkbox +# ---------------------------------------------------------------------------------------- + +proc pControlToggledSignal(widget: pointer, data: pointer): bool {.cdecl.} = + let control = cast[Checkbox](data) + var evt = new ToggleEvent + evt.control = control + try: + control.handleToggleEvent(evt) + except: + handleException() + +proc init(checkbox: NativeCheckbox) = + checkbox.fHandle = gtk_check_button_new() + discard g_signal_connect_data(checkbox.fHandle, "toggled", pControlToggledSignal, cast[pointer](checkbox)) + checkbox.Checkbox.init() + gtk_widget_show(checkbox.fHandle) + +method `text=`(checkbox: NativeCheckbox, text: string) = + procCall checkbox.Checkbox.`text=`(text) + gtk_button_set_label(checkbox.fHandle, text) + app.processEvents() + +method naturalWidth(checkbox: NativeCheckbox): int = + # Override parent method, to make it big enough for the text to fit in. + var context = gtk_widget_get_style_context(checkbox.fHandle) + var padding: GtkBorder + gtk_style_context_get_padding(context, GTK_STATE_FLAG_NORMAL, padding) + result = checkbox.getTextLineWidth(checkbox.text) + padding.left + padding.right + 25.scaleToDpi + +method `enabled=`(checkbox: NativeCheckbox, enabled: bool) = + checkbox.fEnabled = enabled + gtk_widget_set_sensitive(checkbox.fHandle, enabled) + +method checked(checkbox: NativeCheckbox): bool = + result = gtk_toggle_button_get_active(checkbox.fHandle) + +method `checked=`(checkbox: NativeCheckbox, checked: bool) = + g_signal_handlers_block_matched(checkbox.fHandle, G_SIGNAL_MATCH_FUNC, 0, nil, nil, pControlToggledSignal) + gtk_toggle_button_set_active(checkbox.fHandle, checked) + g_signal_handlers_unblock_matched(checkbox.fHandle, G_SIGNAL_MATCH_FUNC, 0, nil, nil, pControlToggledSignal) + +method pAddButtonPressEvent(checkbox: NativeCheckbox) = discard # don't override default handler + + +# ---------------------------------------------------------------------------------------- # Label # ---------------------------------------------------------------------------------------- diff --git a/src/nigui/private/gtk3/platform_types2.nim b/src/nigui/private/gtk3/platform_types2.nim index 5faa8b6..12cf897 100755 --- a/src/nigui/private/gtk3/platform_types2.nim +++ b/src/nigui/private/gtk3/platform_types2.nim @@ -11,6 +11,8 @@ type NativeButton* = ref object of Button + NativeCheckbox* = ref object of Checkbox + NativeLabel* = ref object of Label NativeTextBox* = ref object of TextBox |
