From cc4e6da36bf592432801b196bbf0c1b0e3d3d36f Mon Sep 17 00:00:00 2001 From: zeljan1 Date: Sat, 25 Jan 2025 23:15:00 +0100 Subject: [PATCH] Gtk3: implemented listview ItemDisplayRect --- lcl/interfaces/gtk3/gtk3widgets.pas | 37 +++++++++++++++++++++++++-- lcl/interfaces/gtk3/gtk3wscomctrls.pp | 6 +++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/lcl/interfaces/gtk3/gtk3widgets.pas b/lcl/interfaces/gtk3/gtk3widgets.pas index 9c8b582f76..644b3798ca 100644 --- a/lcl/interfaces/gtk3/gtk3widgets.pas +++ b/lcl/interfaces/gtk3/gtk3widgets.pas @@ -641,6 +641,7 @@ type procedure UpdateItem(AIndex:integer;AItem: TListItem); procedure ItemDelete(AIndex: Integer); + function ItemDisplayRect(AIndex: Integer; ASubItem: integer; ACode: TDisplayCode): TRect; procedure ItemInsert(AIndex: Integer; AItem: TListItem); procedure ItemSetText(AIndex, ASubIndex: Integer; AItem: TListItem; const AText: String); procedure ItemSetImage(AIndex, ASubIndex: Integer; AItem: TListItem); @@ -2079,6 +2080,7 @@ begin gtk_grab_add(GetContainerWidget); end; + function TGtk3Widget.GtkEventKey(Sender: PGtkWidget; Event: PGdkEvent; AKeyPress: Boolean): Boolean; cdecl; const @@ -2117,15 +2119,16 @@ begin else writeln('GtkEventKey: Gtk3Widget ',dbgsName(TGtk3Widget(TempWidget))); {$ENDIF} + if gdk_keyval_is_lower(AEvent.keyval) then KeyValue := Word(gdk_keyval_to_upper(AEvent.keyval)) else KeyValue := Word(AEvent.keyval); - // state=16 = numlock= on. LCLModifiers := GtkModifierStateToShiftState(AEvent.state, True); + if length(AEventString) = 0 then begin if KeyValue = GDK_KEY_Alt_L then @@ -2155,7 +2158,7 @@ begin if AKeyPress and (ACharCode = VK_TAB) then begin if Sender^.is_focus then - Self.LCLObject.SelectNext(Self.LCLObject,true,true); + Self.LCLObject.SelectNext(Self.LCLObject,true,true); exit; end; @@ -7232,6 +7235,36 @@ begin gtk_list_store_remove(PGtkListStore(AModel), @Iter); end; +function TGtk3ListView.ItemDisplayRect(AIndex: Integer; ASubItem: integer; + ACode: TDisplayCode): TRect; +var + AModel: PGtkTreeModel; + Iter: TGtkTreeIter; + Column: PGtkTreeViewColumn; + Path: PGtkTreePath; + ItemRect: TGdkRectangle; + cell: PGtkCellRenderer; + y, x: gint; +begin + Result := Rect(0, 0, 0, 0); + if IsTreeView then + AModel := PGtkTreeView(getContainerWidget)^.get_model + else + AModel := PGtkIconView(getContainerWidget)^.get_model; + Path := gtk_tree_path_new_from_indices(AIndex, [-1]); + try + if Self.IsTreeView then + begin + Column := gtk_tree_view_get_column(PGtkTreeView(GetContainerWidget), ASubItem); + gtk_tree_view_get_cell_area(PGtkTreeView(GetContainerWidget), Path, Column, @ItemRect); + end else + gtk_icon_view_get_cell_rect(PGtkIconView(getContainerWidget), Path, nil, @ItemRect); + Result := RectFromGdkRect(ItemRect); + finally + gtk_tree_path_free(Path); + end; +end; + procedure TGtk3ListView.ItemInsert(AIndex: Integer; AItem: TListItem); var AModel: PGtkTreeModel; diff --git a/lcl/interfaces/gtk3/gtk3wscomctrls.pp b/lcl/interfaces/gtk3/gtk3wscomctrls.pp index 8f826ca10c..0ff598634b 100644 --- a/lcl/interfaces/gtk3/gtk3wscomctrls.pp +++ b/lcl/interfaces/gtk3/gtk3wscomctrls.pp @@ -636,8 +636,10 @@ class function TGtk3WSCustomListView.ItemDisplayRect( const ALV: TCustomListView; const AIndex, ASubItem: Integer; ACode: TDisplayCode): TRect; begin - DebugLn('TGtk3WSCustomListView.ItemDisplayRect '); - Result := Rect(0, 0, 0, 0); + //DebugLn('TGtk3WSCustomListView.ItemDisplayRect '); + if not WSCheckHandleAllocated(ALV, 'ItemDisplayRect') then + Exit; + Result := TGtk3ListView(ALV.Handle).ItemDisplayRect(AIndex, ASubItem, ACode); end; class procedure TGtk3WSCustomListView.ItemExchange(const ALV: TCustomListView;