diff options
Diffstat (limited to 'src/nigui/private/gtk3')
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 16 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 173 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_types2.nim | 4 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_types3.nim | 8 |
4 files changed, 108 insertions, 93 deletions
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index eff2a94..3e83f62 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -245,6 +245,7 @@ proc gtk_widget_grab_focus*(widget: pointer) {.importc: "gtk_widget_grab_focus", proc gtk_widget_is_focus*(widget: pointer): bool {.importc: "gtk_widget_is_focus", libgtk3.} proc gtk_widget_realize*(widget: pointer) {.importc: "gtk_widget_realize", libgtk3.} proc gtk_widget_draw*(widget, cr: pointer) {.importc: "gtk_widget_draw", libgtk3.} +proc gtk_widget_set_sensitive*(widget: pointer, sensitive: bool) {.importc: "gtk_widget_set_sensitive", libgtk3.} proc gtk_container_add*(container, widget: pointer) {.importc: "gtk_container_add", libgtk3.} proc gtk_container_remove*(container, widget: pointer) {.importc: "gtk_container_remove", libgtk3.} @@ -303,6 +304,10 @@ proc gtk_entry_get_text*(entry: pointer): cstring {.importc: "gtk_entry_get_text proc gtk_entry_set_width_chars*(entry: pointer, n_chars: cint) {.importc: "gtk_entry_set_width_chars", libgtk3.} proc gtk_editable_get_selection_bounds*(editable: pointer, start_pos, end_pos: var cint): bool {.importc: "gtk_editable_get_selection_bounds", libgtk3.} proc gtk_editable_get_chars*(editable: pointer, start_pos, end_pos: cint): cstring {.importc: "gtk_editable_get_chars", libgtk3.} +proc gtk_editable_select_region*(editable: pointer, start_pos, end_pos: cint) {.importc: "gtk_editable_select_region", libgtk3.} +proc gtk_editable_get_position*(editable: pointer): cint {.importc: "gtk_editable_get_position", libgtk3.} +proc gtk_editable_set_position*(editable: pointer, position: cint) {.importc: "gtk_editable_set_position", libgtk3.} +proc gtk_editable_set_editable*(editable: pointer, is_editable: bool) {.importc: "gtk_editable_set_editable", libgtk3.} proc gtk_text_view_new*(): pointer {.importc: "gtk_text_view_new", libgtk3.} proc gtk_text_view_set_buffer*(text_view, buffer: pointer) {.importc: "gtk_text_view_set_buffer", libgtk3.} @@ -315,8 +320,7 @@ proc gtk_text_view_set_bottom_margin*(text_view: pointer, margin: cint) {.import proc gtk_text_view_scroll_to_iter*(text_view: pointer, iter: var GtkTextIter, within_margin: cfloat, use_align: bool, xalign, yalign: cfloat) {.importc: "gtk_text_view_scroll_to_iter", libgtk3.} # proc gtk_text_view_scroll_to_mark*(text_view, mark: pointer, within_margin: cfloat, use_align: bool, xalign, yalign: cfloat) {.importc: "gtk_text_view_scroll_to_mark", libgtk3.} # proc gtk_text_view_place_cursor_onscreen*(text_view: pointer): bool {.importc: "gtk_text_view_place_cursor_onscreen", libgtk3.} - -# proc gtk_text_mark_new*(name: cstring, left_gravity: bool): pointer {.importc: "gtk_text_mark_new", libgtk3.} +proc gtk_text_view_set_editable*(text_view: pointer, setting: bool) {.importc: "gtk_text_view_set_editable", libgtk3.} # proc gtk_text_buffer_new*(table: pointer): pointer {.importc: "gtk_text_buffer_new", libgtk3.} proc gtk_text_buffer_set_text*(text_buffer: pointer, text: cstring, len: cint) {.importc: "gtk_text_buffer_set_text", libgtk3.} @@ -324,10 +328,16 @@ proc gtk_text_buffer_get_text*(text_buffer: pointer, start, `end`: var GtkTextIt proc gtk_text_buffer_get_start_iter*(text_buffer: pointer, iter: var GtkTextIter) {.importc: "gtk_text_buffer_get_start_iter", libgtk3.} proc gtk_text_buffer_get_end_iter*(text_buffer: pointer, iter: var GtkTextIter) {.importc: "gtk_text_buffer_get_end_iter", libgtk3.} # proc gtk_text_buffer_add_mark*(buffer, mark: pointer, where: var GtkTextIter) {.importc: "gtk_text_buffer_add_mark", libgtk3.} -# proc gtk_text_buffer_get_insert*(buffer: pointer): pointer {.importc: "gtk_text_buffer_get_insert", libgtk3.} +proc gtk_text_buffer_get_insert*(buffer: pointer): pointer {.importc: "gtk_text_buffer_get_insert", libgtk3.} # proc gtk_text_buffer_get_iter_at_line*(buffer: pointer, iter: var GtkTextIter, line_number: cint) {.importc: "gtk_text_buffer_get_iter_at_line", libgtk3.} proc gtk_text_buffer_insert*(buffer: pointer, iter: var GtkTextIter, text: cstring, len: cint) {.importc: "gtk_text_buffer_insert", libgtk3.} proc gtk_text_buffer_get_selection_bounds*(buffer: pointer, start, `end`: var GtkTextIter): bool {.importc: "gtk_text_buffer_get_selection_bounds", libgtk3.} +proc gtk_text_buffer_select_range*(buffer: pointer, ins, bound: var GtkTextIter) {.importc: "gtk_text_buffer_select_range", libgtk3.} +proc gtk_text_buffer_get_iter_at_offset*(buffer: pointer, iter: var GtkTextIter, char_offset: cint) {.importc: "gtk_text_buffer_get_iter_at_offset", libgtk3.} +proc gtk_text_buffer_get_iter_at_mark*(buffer: pointer, iter: var GtkTextIter, mark: pointer) {.importc: "gtk_text_buffer_get_iter_at_mark", libgtk3.} + +proc gtk_text_iter_get_offset*(iter: var GtkTextIter): cint {.importc: "gtk_text_iter_get_offset", libgtk3.} +# proc gtk_text_mark_new*(name: cstring, left_gravity: bool): pointer {.importc: "gtk_text_mark_new", libgtk3.} proc gtk_scrolled_window_new*(hadjustment, vadjustment: pointer): pointer {.importc: "gtk_scrolled_window_new", libgtk3.} proc gtk_scrolled_window_set_policy*(scrolled_window: pointer, hscrollbar_policy, vscrollbar_policy: cint) {.importc: "gtk_scrolled_window_set_policy", libgtk3.} 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 diff --git a/src/nigui/private/gtk3/platform_types2.nim b/src/nigui/private/gtk3/platform_types2.nim index c176ffc..5faa8b6 100755 --- a/src/nigui/private/gtk3/platform_types2.nim +++ b/src/nigui/private/gtk3/platform_types2.nim @@ -14,7 +14,3 @@ type NativeLabel* = ref object of Label NativeTextBox* = ref object of TextBox - - NativeTextArea* = ref object of TextArea - fTextViewHandle: pointer - fBufferHandle: pointer diff --git a/src/nigui/private/gtk3/platform_types3.nim b/src/nigui/private/gtk3/platform_types3.nim new file mode 100755 index 0000000..d424f3b --- /dev/null +++ b/src/nigui/private/gtk3/platform_types3.nim @@ -0,0 +1,8 @@ +# NiGui - GTK+ 3 platform-specific code - part 3 + +# This file will be included in "nigui.nim". + +type + NativeTextArea* = ref object of TextArea + fTextViewHandle: pointer + fBufferHandle: pointer |
