diff options
| author | trustable-code <krauter.simon@arcor.de> | 2017-09-12 21:25:30 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2017-09-12 21:25:30 +0200 |
| commit | bc342d98102bea5ff6e2d2f41684c87d75a164bb (patch) | |
| tree | 2981c613b2f121c32bcc70d03f38e3b49b734bca /src/nigui/private/gtk3/platform_impl.nim | |
| parent | 360f88fd25d197c2956c1fccc635646646fbf751 (diff) | |
| download | NiGui-bc342d98102bea5ff6e2d2f41684c87d75a164bb.tar.gz NiGui-bc342d98102bea5ff6e2d2f41684c87d75a164bb.zip | |
Improvements for Button/TextBox/TextArea
* TextArea is now inherited from TextBox (A TextArea can do anything
that a TextBox can do.)
* Better handling of keyboard events
* New properties for TextBox/TextArea: "editable", "cursorPos",
"selectionStart" and "selectionEnd"
* New properties for Button: "enabled"
Diffstat (limited to 'src/nigui/private/gtk3/platform_impl.nim')
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 173 |
1 files changed, 87 insertions, 86 deletions
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index 405a3a3..508373c 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -61,70 +61,7 @@ proc pWindowConfigureSignal(windowHandle, event, data: pointer): bool {.cdecl.} window.triggerRelayout() proc pKeyvalToKey(keyval: cint): Key = - case keyval - of 48: Key_Number0 - of 49: Key_Number1 - of 50: Key_Number2 - of 51: Key_Number3 - of 52: Key_Number4 - of 53: Key_Number5 - of 54: Key_Number6 - of 55: Key_Number7 - of 56: Key_Number8 - of 57: Key_Number9 - of 65: Key_A - of 66: Key_B - of 67: Key_C - of 68: Key_D - of 69: Key_E - of 70: Key_F - of 71: Key_G - of 72: Key_H - of 73: Key_I - of 74: Key_J - of 75: Key_K - of 76: Key_L - of 77: Key_M - of 78: Key_N - of 79: Key_O - of 80: Key_P - of 81: Key_Q - of 82: Key_R - of 83: Key_S - of 84: Key_T - of 85: Key_U - of 86: Key_V - of 87: Key_W - of 88: Key_X - of 89: Key_Y - of 90: Key_Z - of 97: Key_A - of 98: Key_B - of 99: Key_C - of 100: Key_D - of 101: Key_E - of 102: Key_F - of 103: Key_G - of 104: Key_H - of 105: Key_I - of 106: Key_J - of 107: Key_K - of 108: Key_L - of 109: Key_M - of 110: Key_N - of 111: Key_O - of 112: Key_P - of 113: Key_Q - of 114: Key_R - of 115: Key_S - of 116: Key_T - of 117: Key_U - of 118: Key_V - of 119: Key_W - of 120: Key_X - of 121: Key_Y - of 122: Key_Z - of 32: Key_Space + result = case keyval of 65289: Key_Tab of 65293: Key_Return of 65307: Key_Escape @@ -139,7 +76,7 @@ proc pKeyvalToKey(keyval: cint): Key = of 65367: Key_End of 65365: Key_PageUp of 65366: Key_PageDown - else: Key_None + else: cast[Key](keyval.unicodeToUpper) proc pWindowKeyPressSignal(widget: pointer, event: var GdkEventKey, data: pointer): bool {.cdecl.} = # echo "window keyPressCallback" @@ -1092,6 +1029,10 @@ method pAddButtonPressEvent(control: NativeButton) = gtk_widget_add_events(control.fHandle, GDK_BUTTON_PRESS_MASK) discard g_signal_connect_data(control.fHandle, "button-press-event", pDefaultControlButtonPressSignal, cast[pointer](control)) +method `enabled=`(button: NativeButton, enabled: bool) = + button.fEnabled = enabled + gtk_widget_set_sensitive(button.fHandle, enabled) + # ---------------------------------------------------------------------------------------- # Label @@ -1129,12 +1070,8 @@ proc pTextBoxKeyPressSignal(widget: pointer, event: var GdkEventKey, data: point let modifiers = gtk_accelerator_get_default_mod_mask() if event.keyval == 'c'.ord and (event.state and modifiers) == GDK_CONTROL_MASK: let textBox = cast[NativeTextBox](data) - var startPos: cint - var endPos: cint - discard gtk_editable_get_selection_bounds(textBox.fHandle, startPos, endPos) - if startPos != endPos: - app.clipboardText = $gtk_editable_get_chars(textBox.fHandle, startPos, endPos) - return true # prevent default "copy to clipboard" + app.clipboardText = textBox.selectedText + return true # prevent default "copy to clipboard" proc init(textBox: NativeTextBox) = textBox.fHandle = gtk_entry_new() @@ -1158,25 +1095,42 @@ method pAddButtonPressEvent(control: NativeTextBox) = gtk_widget_add_events(control.fHandle, GDK_BUTTON_PRESS_MASK) discard g_signal_connect_data(control.fHandle, "button-press-event", pDefaultControlButtonPressSignal, cast[pointer](control)) +method `editable=`(textBox: NativeTextBox, editable: bool) = + textBox.fEditable = editable + gtk_editable_set_editable(textBox.fHandle, editable) + +method cursorPos(textBox: NativeTextBox): int = + result = gtk_editable_get_position(textBox.fHandle) + +method `cursorPos=`(textBox: NativeTextBox, cursorPos: int) = + # side effect: clears selection + gtk_editable_set_position(textBox.fHandle, cursorPos.cint) + +method selectionStart(textBox: NativeTextBox): int = + var startPos: cint + var endPos: cint + discard gtk_editable_get_selection_bounds(textBox.fHandle, startPos, endPos) + result = startPos + +method selectionEnd(textBox: NativeTextBox): int = + var startPos: cint + var endPos: cint + discard gtk_editable_get_selection_bounds(textBox.fHandle, startPos, endPos) + result = endPos + +method `selectionStart=`(textBox: NativeTextBox, selectionStart: int) = + gtk_editable_select_region(textBox.fHandle, selectionStart.cint, textBox.selectionEnd.cint) + # side effect: sets cursor to end of selection + +method `selectionEnd=`(textBox: NativeTextBox, selectionEnd: int) = + gtk_editable_select_region(textBox.fHandle, textBox.selectionStart.cint, selectionEnd.cint) + # side effect: sets cursor to end of selection + # ---------------------------------------------------------------------------------------- # TextArea # ---------------------------------------------------------------------------------------- -proc pTextAreaKeyPressSignal(widget: pointer, event: var GdkEventKey, data: pointer): bool {.cdecl.} = - result = pControlKeyPressSignal(widget, event, data) - - # Implement own "copy to clipboard", because by default the clipboard is non-persistent - if not result: - let modifiers = gtk_accelerator_get_default_mod_mask() - if event.keyval == 'c'.ord and (event.state and modifiers) == GDK_CONTROL_MASK: - let textArea = cast[NativeTextArea](data) - var startIter: GtkTextIter - var endIter: GtkTextIter - discard gtk_text_buffer_get_selection_bounds(textArea.fBufferHandle, startIter, endIter) - app.clipboardText = $gtk_text_buffer_get_text(textArea.fBufferHandle, startIter, endIter, true) - return true # prevent default "copy to clipboard" - proc init(textArea: NativeTextArea) = textArea.fHandle = gtk_scrolled_window_new(nil, nil) # gtk_scrolled_window_set_policy(textArea.fHandle, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC) @@ -1188,11 +1142,15 @@ proc init(textArea: NativeTextArea) = gtk_text_view_set_bottom_margin(textArea.fTextViewHandle, 5) gtk_container_add(textArea.fHandle, textArea.fTextViewHandle) gtk_widget_show(textArea.fTextViewHandle) - discard g_signal_connect_data(textArea.fTextViewHandle, "key-press-event", pTextAreaKeyPressSignal, cast[pointer](textArea)) + discard g_signal_connect_data(textArea.fTextViewHandle, "key-press-event", pTextBoxKeyPressSignal, cast[pointer](textArea)) textArea.fBufferHandle = gtk_text_view_get_buffer(textArea.fTextViewHandle) discard g_signal_connect_data(textArea.fBufferHandle, "changed", pControlChangedSignal, cast[pointer](textArea)) textArea.TextArea.init() +method setSize(textBox: NativeTextArea, width, height: int) = + # Need to override method of NativeTextBox + procCall textBox.ControlImpl.setSize(width, height) + method text(textArea: NativeTextArea): string = var startIter, endIter: GtkTextIter gtk_text_buffer_get_start_iter(textArea.fBufferHandle, startIter) @@ -1227,3 +1185,46 @@ method `wrap=`(textArea: NativeTextArea, wrap: bool) = else: gtk_text_view_set_wrap_mode(textArea.fTextViewHandle, GTK_WRAP_NONE) +method `editable=`(textArea: NativeTextArea, editable: bool) = + textArea.fEditable = editable + gtk_text_view_set_editable(textArea.fTextViewHandle, editable) + +method cursorPos(textArea: NativeTextArea): int = + let mark = gtk_text_buffer_get_insert(textArea.fBufferHandle) + var iter: GtkTextIter + gtk_text_buffer_get_iter_at_mark(textArea.fBufferHandle, iter, mark) + result = gtk_text_iter_get_offset(iter) + +method `cursorPos=`(textArea: NativeTextArea, cursorPos: int) = + # side effect: clears selection + var iter: GtkTextIter + gtk_text_buffer_get_iter_at_offset(textArea.fBufferHandle, iter, cursorPos.cint) + gtk_text_buffer_select_range(textArea.fBufferHandle, iter, iter) + +method selectionStart(textArea: NativeTextArea): int = + var startIter: GtkTextIter + var endIter: GtkTextIter + discard gtk_text_buffer_get_selection_bounds(textArea.fBufferHandle, startIter, endIter) + result = gtk_text_iter_get_offset(startIter) + +method selectionEnd(textArea: NativeTextArea): int = + var startIter: GtkTextIter + var endIter: GtkTextIter + discard gtk_text_buffer_get_selection_bounds(textArea.fBufferHandle, startIter, endIter) + result = gtk_text_iter_get_offset(endIter) + +method `selectionStart=`(textArea: NativeTextArea, selectionStart: int) = + var startIter: GtkTextIter + var endIter: GtkTextIter + gtk_text_buffer_get_iter_at_offset(textArea.fBufferHandle, startIter, selectionStart.cint) + gtk_text_buffer_get_iter_at_offset(textArea.fBufferHandle, endIter, textArea.selectionEnd.cint) + gtk_text_buffer_select_range(textArea.fBufferHandle, startIter, endIter) + # side effect: sets cursor to start of selection + +method `selectionEnd=`(textArea: NativeTextArea, selectionEnd: int) = + var startIter: GtkTextIter + var endIter: GtkTextIter + gtk_text_buffer_get_iter_at_offset(textArea.fBufferHandle, startIter, textArea.selectionStart.cint) + gtk_text_buffer_get_iter_at_offset(textArea.fBufferHandle, endIter, selectionEnd.cint) + gtk_text_buffer_select_range(textArea.fBufferHandle, startIter, endIter) + # side effect: sets cursor to start of selection |
