From d88398cd3a9ec527001b3b1b44c857119484527f Mon Sep 17 00:00:00 2001 From: zeljan1 Date: Wed, 5 Feb 2025 16:06:16 +0100 Subject: [PATCH] Gtk3: better handling of TCustomListView.ShowColumnHeader when ViewStyle=vsReport. --- lcl/interfaces/gtk3/gtk3widgets.pas | 19 ++++++++++++------- lcl/interfaces/gtk3/gtk3wscomctrls.pp | 5 ++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lcl/interfaces/gtk3/gtk3widgets.pas b/lcl/interfaces/gtk3/gtk3widgets.pas index 3161875941..2696224f54 100644 --- a/lcl/interfaces/gtk3/gtk3widgets.pas +++ b/lcl/interfaces/gtk3/gtk3widgets.pas @@ -6812,9 +6812,12 @@ begin end; end; +type + TCustomListViewHack = class(TCustomListView); + function TGtk3ListView.CreateWidget(const Params: TCreateParams): PGtkWidget; var - AListView: TCustomListView; + AListView: TCustomListViewHack; AScrollStyle: TGtkScrollStyle; PtrType: GType; TreeModel: PGtkTreeModel; @@ -6825,12 +6828,12 @@ begin FImages := nil; FPreselectedIndices := nil; FWidgetType := FWidgetType + [wtTreeModel, wtListView, wtScrollingWin]; - AListView := TCustomListView(LCLObject); + AListView := TCustomListViewHack(LCLObject); Result := PGtkScrolledWindow(TGtkScrolledWindow.new(nil, nil)); PtrType := G_TYPE_POINTER; - if TListView(AListView).ViewStyle in [vsIcon,vsSmallIcon] then + if AListView.ViewStyle in [vsIcon,vsSmallIcon] then begin TreeModel := PGtkTreeModel(gtk_list_store_new(3, [ G_TYPE_POINTER, // ListItem pointer @@ -6848,7 +6851,7 @@ begin FCentralWidget := TGtkTreeView.new_with_model(TreeModel); end; - FIsTreeView := not (TListView(AListView).ViewStyle in [vsIcon,vsSmallIcon]); + FIsTreeView := not (AListView.ViewStyle in [vsIcon,vsSmallIcon]); FCentralWidget^.set_has_window(True); FCentralWidget^.show; @@ -6856,7 +6859,7 @@ begin PGtkScrolledWindow(Result)^.add(FCentralWidget); //PGtkScrolledWindow(Result)^.set_focus_child(FCentralWidget); - AScrollStyle := Gtk3TranslateScrollStyle(TListView(AListView).ScrollBars); + AScrollStyle := Gtk3TranslateScrollStyle(AListView.ScrollBars); // gtk3 scrolled window hates GTK_POLICY_NONE PGtkScrolledWindow(Result)^.set_policy(AScrollStyle.Horizontal, AScrollStyle.Vertical); PGtkScrolledWindow(Result)^.set_shadow_type(BorderStyleShadowMap[AListView.BorderStyle]); @@ -6870,13 +6873,15 @@ begin gtk_tree_selection_set_select_function(PGtkTreeView(FCentralWidget)^.get_selection, TGtkTreeSelectionFunc(@Gtk3WS_ListViewItemPreSelected), Self, nil); g_signal_connect_data(PGtkTreeView(FCentralWidget)^.get_selection, 'changed', TGCallback(@Gtk3WS_ListViewItemSelected), Self, nil, G_CONNECT_DEFAULT); + + PGtkTreeView(FCentralWidget)^.set_headers_visible(AListView.ShowColumnHeaders and (AListView.ViewStyle = vsReport)); + PGtkTreeView(FCentralWidget)^.resize_children; + end else begin g_signal_connect_data (PGtkIconView(FCentralWidget), 'selection-changed', TGCallback(@Tgtk3ListView.selection_changed), Self, nil, G_CONNECT_DEFAULT); end; - // if FIsTreeView then - // PGtkTreeView(FCentralWidget)^.set_search_column(0); end; class function TGtk3ListView.selection_changed(ctl:TGtk3ListView):gboolean;cdecl; diff --git a/lcl/interfaces/gtk3/gtk3wscomctrls.pp b/lcl/interfaces/gtk3/gtk3wscomctrls.pp index 88b8e53b8e..67d5d419e2 100644 --- a/lcl/interfaces/gtk3/gtk3wscomctrls.pp +++ b/lcl/interfaces/gtk3/gtk3wscomctrls.pp @@ -638,11 +638,10 @@ begin end; lvpShowColumnHeaders: begin - // allow only column modifications when in report mode - if not (TListView(ALV).ViewStyle in [vsList, vsReport]) then Exit; if TGtk3ListView(ALV.Handle).IsTreeView then begin - PGtkTreeView(TGtk3ListView(ALV.Handle).GetContainerWidget)^.set_headers_visible(AIsSet and (TListView(ALV).ViewStyle = vsReport)); + //Delphi docs: To use columns in a list view, the ViewStyle property must be set to vsReport. + PGtkTreeView(TGtk3ListView(ALV.Handle).GetContainerWidget)^.set_headers_visible(AIsSet and (TLVHack(ALV).ViewStyle = vsReport)); PGtkTreeView(TGtk3ListView(ALV.Handle).GetContainerWidget)^.resize_children; end; end;