From fa717236dccf4dd2a403dd1800c476664e883965 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 26 Nov 2009 08:12:37 +0000 Subject: [PATCH] gtk2: virtual listview support git-svn-id: trunk@22789 - --- lcl/interfaces/gtk2/gtk2cellrenderer.pas | 4 +- lcl/interfaces/gtk2/gtk2wscomctrls.pp | 1 + lcl/interfaces/gtk2/gtk2wscustomlistview.inc | 61 +++++++++++++++++--- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/lcl/interfaces/gtk2/gtk2cellrenderer.pas b/lcl/interfaces/gtk2/gtk2cellrenderer.pas index f888574640..a6595a740e 100644 --- a/lcl/interfaces/gtk2/gtk2cellrenderer.pas +++ b/lcl/interfaces/gtk2/gtk2cellrenderer.pas @@ -373,8 +373,10 @@ begin if (WidgetInfo <> nil) and (WidgetInfo^.LCLObject.InheritsFrom(TCustomListView)) then begin gtk_tree_model_get(tree_model, iter, [0, @ListItem, -1]); + if (ListItem = nil) and TCustomListView(WidgetInfo^.LCLObject).OwnerData then + ListItem := TCustomListView(WidgetInfo^.LCLObject).Items[LCLCellRenderer^.Index]; if ListItem = nil then - exit; + Exit; ListColumn := TListColumn(g_object_get_data(G_OBJECT(cell_layout), 'TListColumn')); if ListColumn = nil then LCLCellRenderer^.ColumnIndex := -1 diff --git a/lcl/interfaces/gtk2/gtk2wscomctrls.pp b/lcl/interfaces/gtk2/gtk2wscomctrls.pp index b2fb6d6ed8..1b2c4eb216 100644 --- a/lcl/interfaces/gtk2/gtk2wscomctrls.pp +++ b/lcl/interfaces/gtk2/gtk2wscomctrls.pp @@ -149,6 +149,7 @@ type class procedure SetHoverTime(const ALV: TCustomListView; const AValue: Integer); override; // class procedure SetIconOptions(const ALV: TCustomListView; const AValue: TIconOptions); override; class procedure SetImageList(const ALV: TCustomListView; const AList: TListViewImageList; const AValue: TCustomImageList); override; + class procedure SetItemsCount(const ALV: TCustomListView; const Avalue: Integer); override; class procedure SetProperty(const ALV: TCustomListView; const AProp: TListViewProperty; const AIsSet: Boolean); override; class procedure SetProperties(const ALV: TCustomListView; const AProps: TListViewProperties); override; class procedure SetScrollBars(const ALV: TCustomListView; const AValue: TScrollStyle); override; diff --git a/lcl/interfaces/gtk2/gtk2wscustomlistview.inc b/lcl/interfaces/gtk2/gtk2wscustomlistview.inc index 5137238e20..eb26f56538 100644 --- a/lcl/interfaces/gtk2/gtk2wscustomlistview.inc +++ b/lcl/interfaces/gtk2/gtk2wscustomlistview.inc @@ -29,13 +29,13 @@ procedure Gtk2_ItemCheckedChanged(renderer: PGtkCellRendererToggle; PathStr: Pgc var LV: TLVHack; Index: Integer; - LI: TLVItemHack; + ListItem: TLVItemHack; begin LV := TLVHack(WidgetInfo^.LCLObject); Index := StrToInt(PathStr); - LI := TLVItemHack(LV.Items.Item[Index]); - if LI <> nil then - LI.Checked := not LI.GetCheckedInternal; + ListItem := TLVItemHack(LV.Items.Item[Index]); + if ListItem <> nil then + ListItem.Checked := not ListItem.GetCheckedInternal; end; procedure Gtk2_ItemFocusChanged(treeview: PGtkTreeView; WidgetInfo: PWidgetInfo);cdecl; @@ -225,10 +225,19 @@ end; procedure Gtk2WSLV_ListViewGetCheckedDataFunc(tree_column: PGtkTreeViewColumn; cell: PGtkCellRenderer; tree_model: PGtkTreeModel; iter: PGtkTreeIter; WidgetInfo: PWidgetInfo); cdecl; var + APath: PGtkTreePath; ListItem: TLVItemHack; begin gtk_tree_model_get(tree_model, iter, [0, @ListItem, -1]); - if ListITem = nil then + + if (ListItem = nil) and TCustomListView(WidgetInfo^.LCLObject).OwnerData then + begin + APath := gtk_tree_model_get_path(tree_model,iter); + ListItem := TLVItemHack(TCustomListView(WidgetInfo^.LCLObject).Items[gtk_tree_path_get_indices(APath)^]); + gtk_tree_path_free(APath); + end; + + if ListItem = nil then Exit; gtk_cell_renderer_toggle_set_active(PGtkCellRendererToggle(cell), ListItem.GetCheckedInternal); end; @@ -243,6 +252,7 @@ var ListColumn: TListColumn; ImageIndex: Integer; ColumnIndex: Integer; + APath: PGtkTreePath; begin PGtkCellRendererPixbuf(cell)^.pixbuf := nil; Widgets := PTVWidgets(WidgetInfo^.UserData); @@ -252,12 +262,23 @@ begin if ListColumn = nil then Exit; ColumnIndex := ListColumn.Index; - Images := Widgets^.Images; + Images := Widgets^.Images; if Images = nil then Exit; ImageIndex := -1; + + if (ListItem = nil) and TCustomListView(WidgetInfo^.LCLObject).OwnerData then + begin + APath := gtk_tree_model_get_path(tree_model,iter); + ListItem := TCustomListView(WidgetInfo^.LCLObject).Items[gtk_tree_path_get_indices(APath)^]; + gtk_tree_path_free(APath); + end; + + if ListItem = nil then + Exit; + if ColumnIndex = 0 then - ImageIndex := ListITem.ImageIndex + ImageIndex := ListItem.ImageIndex else if ColumnIndex -1 <= ListItem.SubItems.Count-1 then ImageIndex := ListItem.SubItemImages[ColumnIndex-1]; @@ -529,9 +550,9 @@ begin // add renderers pixrenderer := gtk_cell_renderer_pixbuf_new(); - textrenderer := LCLIntfCellRenderer_New;;//gtk_cell_renderer_text_new(); + textrenderer := LCLIntfCellRenderer_New;//gtk_cell_renderer_text_new(); - gtk_tree_view_column_pack_start(column, pixrenderer, FALSE); + gtk_tree_view_column_pack_start(column, pixrenderer, False); //gtk_tree_view_column_set_attributes(column, pixrenderer,['pixbuf', RealIndex, nil]); gtk_tree_view_column_pack_start(column, textrenderer, True); //gtk_tree_view_column_set_attributes(column, textrenderer, ['text', 0, nil]); @@ -1405,6 +1426,28 @@ begin end; end; +class procedure TGtk2WSCustomListView.SetItemsCount(const ALV: TCustomListView; + const Avalue: Integer); +var + Widgets: PTVWidgets; + Iter: TGtkTreeIter; + Index: Integer; +begin + if not WSCheckHandleAllocated(ALV, 'SetItemsCount') + then Exit; + + GetCommonTreeViewWidgets(PGtkWidget(ALV.Handle), Widgets); + + with Widgets^ do + begin + if ItemCache = nil then + ItemCache := TStringList.Create; + gtk_list_store_clear(PGtkListStore(TreeModel)); + for Index := 0 to AValue - 1 do + gtk_list_store_insert_with_values(PGtkListStore(TreeModel), @Iter, Index, 0, nil, -1); + end; +end; + class procedure TGtk2WSCustomListView.SetProperty(const ALV: TCustomListView; const AProp: TListViewProperty; const AIsSet: Boolean); var