diff --git a/mff/Component.bas b/mff/Component.bas index 89afc06..b4ecd47 100644 --- a/mff/Component.bas +++ b/mff/Component.bas @@ -265,7 +265,7 @@ Namespace My.Sys.ComponentModel 'gdk_window_move(gtk_widget_get_window (widget), iLeft, iTop) 'gdk_window_resize(gtk_widget_get_window (widget), Max(1, iWidth), Max(1, iHeight)) 'If Parent AndAlso Parent->fixedwidget Then gtk_fixed_move(gtk_fixed(Parent->fixedwidget), widget, iLeft, iTop) - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget)))) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget))))) If Parent Then If Parent->layoutwidget AndAlso GTK_IS_LAYOUT(gtk_widget_get_parent(CtrlWidget)) Then 'gtk_widget_size_allocate(IIF(scrolledwidget, scrolledwidget, widget), @allocation) @@ -335,7 +335,7 @@ Namespace My.Sys.ComponentModel FLeft = UnScaleX(iLeft) FTop = UnScaleY(iTop) Else - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget)))) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget))))) If CtrlWidget AndAlso gtk_widget_get_mapped(CtrlWidget) Then Dim allocation As GtkAllocation gtk_widget_get_allocation(CtrlWidget, @allocation) @@ -392,7 +392,7 @@ Namespace My.Sys.ComponentModel FLeft = UnScaleX(iLeft) FTop = UnScaleY(iTop) Else - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget)))) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget))))) If CtrlWidget AndAlso gtk_widget_get_mapped(CtrlWidget) Then Dim allocation As GtkAllocation gtk_widget_get_allocation(CtrlWidget, @allocation) @@ -447,7 +447,7 @@ Namespace My.Sys.ComponentModel gtk_window_get_size(GTK_WINDOW(widget), @iWidth, @iHeight) FWidth = UnScaleX(iWidth) Else - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, widget)) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, widget))) If layoutwidget AndAlso gtk_widget_is_toplevel(widget) Then #ifndef __USE_GTK2__ FWidth = gtk_widget_get_allocated_width(widget) @@ -508,7 +508,7 @@ Namespace My.Sys.ComponentModel gtk_window_get_size(GTK_WINDOW(widget), @iWidth, @iHeight) FHeight = UnScaleY(iHeight + 20) Else - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, widget)) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, widget))) If layoutwidget AndAlso gtk_widget_is_toplevel(widget) Then #ifndef __USE_GTK2__ FHeight = gtk_widget_get_allocated_height(widget) @@ -629,6 +629,14 @@ Namespace My.Sys.ComponentModel #endif box = 0 End If + If GTK_IS_WIDGET(containerwidget) Then + #ifdef __USE_GTK4__ + g_object_unref(containerwidget) + #else + gtk_widget_destroy(containerwidget) + #endif + containerwidget = 0 + End If #endif #elseif defined(__USE_WINAPI__) If FHandle Then diff --git a/mff/Component.bi b/mff/Component.bi index 2e61313..4f961f0 100644 --- a/mff/Component.bi +++ b/mff/Component.bi @@ -39,6 +39,7 @@ Namespace My.Sys.ComponentModel scrolledwidget As GtkWidget Ptr eventboxwidget As GtkWidget Ptr overlaywidget As GtkWidget Ptr + containerwidget As GtkWidget Ptr #elseif defined(__USE_JNI__) FHandle As jobject #elseif defined(__USE_WINAPI__) diff --git a/mff/Control.bas b/mff/Control.bas index 098da07..c5a0c48 100644 --- a/mff/Control.bas +++ b/mff/Control.bas @@ -336,7 +336,7 @@ Namespace My.Sys.Forms #ifndef IsChild_Off Private Property Control.IsChild As Boolean #ifdef __USE_GTK__ - FIsChild = gtk_widget_get_parent(IIf(scrolledwidget, scrolledwidget, IIf(eventboxwidget, eventboxwidget, widget))) <> 0 + FIsChild = gtk_widget_get_parent(IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(eventboxwidget, eventboxwidget, widget)))) <> 0 #elseif defined(__USE_WINAPI__) FIsChild = StyleExists(WS_CHILD) #endif @@ -349,10 +349,10 @@ Namespace My.Sys.Forms If FIsChild <> Value Then If Value Then If Parent AndAlso Parent->layoutwidget Then - gtk_layout_put(GTK_LAYOUT(Parent->layoutwidget), IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget))), FLeft, FTop) + gtk_layout_put(GTK_LAYOUT(Parent->layoutwidget), IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(layoutwidget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget)))), FLeft, FTop) End If Else - Dim As GtkWidget Ptr CtrlWidget = IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget)))) + Dim As GtkWidget Ptr CtrlWidget = IIf(containerwidget, containerwidget, IIf(scrolledwidget, scrolledwidget, IIf(overlaywidget, overlaywidget, IIf(layoutwidget AndAlso gtk_widget_get_parent(layoutwidget) <> widget, layoutwidget, IIf(eventboxwidget, eventboxwidget, widget))))) g_object_ref(G_OBJECT(CtrlWidget)) gtk_widget_unparent(CtrlWidget) End If @@ -887,7 +887,19 @@ Namespace My.Sys.Forms If (Not FDesignMode) OrElse Value Then #ifdef __USE_GTK__ 'If Not gtk_widget_is_toplevel(widget) Then gtk_widget_set_child_visible(widget, Value) - If scrolledwidget Then + If containerwidget Then + If Value Then + #ifdef __USE_GTK4__ + gtk_widget_set_visible(containerwidget, True) + #else + gtk_widget_show_all(containerwidget) + #endif + 'gtk_widget_set_no_show_all(widget, Not Value) + If Value Then gtk_widget_queue_draw(containerwidget) + Else + gtk_widget_set_visible(containerwidget, Value) + End If + ElseIf scrolledwidget Then If Value Then #ifdef __USE_GTK4__ gtk_widget_set_visible(scrolledwidget, True) @@ -2782,7 +2794,7 @@ Namespace My.Sys.Forms Dim As Integer iLeft = This.Left, iTop = This.Top Dim As GtkWidget Ptr CtrlWidget = widget Select Case gtk_widget_get_parent(CtrlWidget) - Case scrolledwidget, overlaywidget, layoutwidget, eventboxwidget + Case containerwidget, scrolledwidget, overlaywidget, layoutwidget, eventboxwidget CtrlWidget = gtk_widget_get_parent(CtrlWidget) End Select g_object_ref(CtrlWidget) @@ -2803,7 +2815,7 @@ Namespace My.Sys.Forms If widget <> This.Parent->Controls[i]->widget Then CtrlWidget = This.Parent->Controls[i]->widget Select Case gtk_widget_get_parent(CtrlWidget) - Case This.Parent->Controls[i]->scrolledwidget, This.Parent->Controls[i]->overlaywidget, This.Parent->Controls[i]->layoutwidget AndAlso gtk_widget_get_parent(This.Parent->Controls[i]->layoutwidget) <> This.Parent->Controls[i]->widget, This.Parent->Controls[i]->eventboxwidget + Case This.Parent->Controls[i]->containerwidget, This.Parent->Controls[i]->scrolledwidget, This.Parent->Controls[i]->overlaywidget, This.Parent->Controls[i]->layoutwidget AndAlso gtk_widget_get_parent(This.Parent->Controls[i]->layoutwidget) <> This.Parent->Controls[i]->widget, This.Parent->Controls[i]->eventboxwidget CtrlWidget = gtk_widget_get_parent(CtrlWidget) End Select iLeft = This.Parent->Controls[i]->Left @@ -2857,7 +2869,7 @@ Namespace My.Sys.Forms 'If Not FDesignMode Then If widget AndAlso GTK_IS_FRAME(widget) Then FrameTop = 20 'End If - Dim As GtkWidget Ptr Ctrlwidget = IIf(Ctrl->scrolledwidget, Ctrl->scrolledwidget, IIf(Ctrl->overlaywidget, Ctrl->overlaywidget, IIf(Ctrl->layoutwidget AndAlso gtk_widget_get_parent(Ctrl->layoutwidget) <> Ctrl->widget, Ctrl->layoutwidget, IIf(Ctrl->eventboxwidget, Ctrl->eventboxwidget, Ctrl->widget)))) + Dim As GtkWidget Ptr Ctrlwidget = IIf(Ctrl->containerwidget, Ctrl->containerwidget, IIf(Ctrl->scrolledwidget, Ctrl->scrolledwidget, IIf(Ctrl->overlaywidget, Ctrl->overlaywidget, IIf(Ctrl->layoutwidget AndAlso gtk_widget_get_parent(Ctrl->layoutwidget) <> Ctrl->widget, Ctrl->layoutwidget, IIf(Ctrl->eventboxwidget, Ctrl->eventboxwidget, Ctrl->widget))))) If GTK_IS_WIDGET(Ctrlwidget) AndAlso Not GTK_IS_WINDOW(Ctrlwidget) Then If layoutwidget Then If gtk_widget_get_parent(Ctrlwidget) <> 0 Then gtk_widget_unparent(Ctrlwidget) @@ -2917,12 +2929,14 @@ Namespace My.Sys.Forms If Ctrl->overlaywidget Then g_object_set_data(G_OBJECT(Ctrl->overlaywidget), "@@@Control2", Ctrl) If Ctrl->widget Then g_object_set_data(G_OBJECT(Ctrl->widget), "@@@Control2", Ctrl) If Ctrl->layoutwidget Then g_object_set_data(G_OBJECT(Ctrl->layoutwidget), "@@@Control2", Ctrl) + If Ctrl->containerwidget Then g_object_set_data(G_OBJECT(Ctrl->containerwidget), "@@@Control2", Ctrl) If CInt(bAdded) AndAlso CInt(CInt(Ctrl->FVisible) OrElse CInt(GTK_IS_NOTEBOOK(gtk_widget_get_parent(Ctrl->widget)))) Then If Ctrl->eventboxwidget Then gtk_widget_show(Ctrl->eventboxwidget) If Ctrl->scrolledwidget Then gtk_widget_show(Ctrl->scrolledwidget) If Ctrl->overlaywidget Then gtk_widget_show(Ctrl->overlaywidget) If Ctrl->widget Then gtk_widget_show(Ctrl->widget) If Ctrl->layoutwidget Then gtk_widget_show(Ctrl->layoutwidget) + If Ctrl->containerwidget Then gtk_widget_show(Ctrl->containerwidget) End If Ctrl->FAnchoredParentWidth = This.FWidth Ctrl->FAnchoredParentHeight = This.FHeight diff --git a/mff/Form.bas b/mff/Form.bas index d4d93ca..5697ff5 100644 --- a/mff/Form.bas +++ b/mff/Form.bas @@ -1485,6 +1485,7 @@ Namespace My.Sys.Forms If Ctrl->scrolledwidget Then gtk_widget_show(Ctrl->scrolledwidget) If Ctrl->eventboxwidget Then gtk_widget_show(Ctrl->eventboxwidget) If Ctrl->layoutwidget Then gtk_widget_show(Ctrl->layoutwidget) + If Ctrl->containerwidget Then gtk_widget_show(Ctrl->containerwidget) #ifdef __USE_GTK4__ If Ctrl->widget Then gtk_widget_show(Ctrl->widget) #else @@ -1504,6 +1505,7 @@ Namespace My.Sys.Forms If Ctrl->scrolledwidget Then gtk_widget_hide(Ctrl->scrolledwidget) If Ctrl->eventboxwidget Then gtk_widget_hide(Ctrl->eventboxwidget) If Ctrl->layoutwidget Then gtk_widget_hide(Ctrl->layoutwidget) + If Ctrl->containerwidget Then gtk_widget_hide(Ctrl->containerwidget) If Ctrl->widget Then gtk_widget_hide(Ctrl->widget) End If For i As Integer = 0 To Ctrl->ControlCount - 1 diff --git a/mff/SearchBar.bas b/mff/SearchBar.bas index 4d3d4e2..c005644 100644 --- a/mff/SearchBar.bas +++ b/mff/SearchBar.bas @@ -164,7 +164,45 @@ Namespace My.Sys.Forms Private Constructor SearchBar With This #ifdef __USE_GTK__ - widget = gtk_search_bar_new() + WidgetEntry = gtk_entry_new() + WidgetTextView = gtk_text_view_new() + gtk_entry_set_activates_default(GTK_ENTRY(WidgetEntry), True) + gtk_entry_set_width_chars(GTK_ENTRY(WidgetEntry), 0) + g_signal_connect(GTK_ENTRY(WidgetEntry), "activate", G_CALLBACK(@Entry_Activate), @This) + g_signal_connect(GTK_ENTRY(WidgetEntry), "changed", G_CALLBACK(@Entry_Changed), @This) + g_signal_connect(GTK_WIDGET(WidgetEntry), "focus-in-event", G_CALLBACK(@Entry_FocusInEvent), @This) + g_signal_connect(GTK_WIDGET(WidgetEntry), "focus-out-event", G_CALLBACK(@Entry_FocusOutEvent), @This) + g_signal_connect(GTK_WIDGET(WidgetEntry), "copy-clipboard", G_CALLBACK(@Entry_CopyClipboard), @This) + g_signal_connect(GTK_WIDGET(WidgetEntry), "cut-clipboard", G_CALLBACK(@Entry_CutClipboard), @This) + g_signal_connect(GTK_WIDGET(WidgetEntry), "paste-clipboard", G_CALLBACK(@Entry_PasteClipboard), @This) + g_signal_connect(GTK_WIDGET(WidgetTextView), "copy-clipboard", G_CALLBACK(@Entry_CopyClipboard), @This) + g_signal_connect(GTK_WIDGET(WidgetTextView), "cut-clipboard", G_CALLBACK(@Entry_CutClipboard), @This) + g_signal_connect(GTK_WIDGET(WidgetTextView), "paste-clipboard", G_CALLBACK(@Entry_PasteClipboard), @This) + #ifdef __USE_GTK3__ + g_signal_connect(gtk_scrollable_get_hadjustment(GTK_SCROLLABLE(WidgetTextView)), "value-changed", G_CALLBACK(@Adjustment_ValueChanged), @This) + g_signal_connect(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(WidgetTextView)), "value-changed", G_CALLBACK(@Adjustment_ValueChanged), @This) + #else + g_signal_connect(GTK_WIDGET(WidgetTextView), "set-scroll-adjustments", G_CALLBACK(@TextView_SetScrollAdjustments), @This) + #endif + g_signal_connect(GTK_TEXT_VIEW(WidgetTextView), "preedit-changed", G_CALLBACK(@Preedit_Changed), @This) + g_signal_connect(GTK_ENTRY(WidgetEntry), "preedit-changed", G_CALLBACK(@Preedit_Changed), @This) + g_signal_connect(gtk_text_view_get_buffer(GTK_TEXT_VIEW(WidgetTextView)), "changed", G_CALLBACK(@TextBuffer_Changed), @This) + #ifndef __USE_GTK3__ + g_signal_connect(GTK_EDITABLE(WidgetEntry), "insert-text", G_CALLBACK(@Entry_InsertText), @This) + #endif + WidgetScrolledWindow = gtk_scrolled_window_new(NULL, NULL) + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(WidgetScrolledWindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC) + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(WidgetScrolledWindow), GTK_SHADOW_OUT) + gtk_container_add(GTK_CONTAINER(WidgetScrolledWindow), WidgetTextView) + scrolledwidget = WidgetScrolledWindow + widget = WidgetTextView + This.RegisterClass "SearchBar", @This + scrolledwidget = 0 + widget = WidgetEntry + This.RegisterClass "SearchBar", @This + containerwidget = gtk_search_bar_new() + gtk_search_bar_connect_entry(GTK_SEARCH_BAR(containerwidget), GTK_ENTRY(widget)) + gtk_container_add(GTK_CONTAINER(containerwidget), widget) #else RegisterClass "SearchBar", "Edit" OnHandleIsAllocated = @HandleIsAllocated diff --git a/mff/TextBox.bi b/mff/TextBox.bi index 9c17199..bfbbb5d 100644 --- a/mff/TextBox.bi +++ b/mff/TextBox.bi @@ -27,6 +27,7 @@ Namespace My.Sys.Forms 'Displays information entered at design time by the user, or in code at run time. Private Type TextBox Extends Control Private: + Protected: #ifdef __USE_GTK__ Declare Static Sub Entry_Activate(entry As GtkEntry Ptr, user_data As Any Ptr) Declare Static Sub Entry_Changed(entry As GtkEntry Ptr, user_data As Any Ptr) @@ -43,7 +44,6 @@ Namespace My.Sys.Forms #else Declare Static Sub HandleIsAllocated(ByRef Sender As Control) #endif - Protected: FTopLine As Integer FSelStart As Integer FSelLength As Integer