Skip to content

Commit

Permalink
Improved: SearchBar in Linux
Browse files Browse the repository at this point in the history
  • Loading branch information
XusinboyBekchanov committed May 22, 2024
1 parent 2bd2a8a commit 143659a
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 14 deletions.
18 changes: 13 additions & 5 deletions mff/Component.bas
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions mff/Component.bi
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down
28 changes: 21 additions & 7 deletions mff/Control.bas
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions mff/Form.bas
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
40 changes: 39 additions & 1 deletion mff/SearchBar.bas
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion mff/TextBox.bi
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down

0 comments on commit 143659a

Please sign in to comment.