diff options
| author | Tomas Bzatek <tbzatek@redhat.com> | 2025-01-04 20:41:26 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@redhat.com> | 2025-11-27 21:42:57 +0100 |
| commit | 90db8b6652f73ddc335922d3a7c593878d83c45e (patch) | |
| tree | 6b3f8ed57d4dc3358c2965bf41f6e613b8b80bf0 /libgtk_kylix/GTKView.pas | |
| parent | 63ff1bea9bb1e87a7e2643f680d04f2b9c00d072 (diff) | |
| download | tuxcmd-90db8b6652f73ddc335922d3a7c593878d83c45e.tar.xz | |
Basic ListView CSS styling
Diffstat (limited to 'libgtk_kylix/GTKView.pas')
| -rw-r--r-- | libgtk_kylix/GTKView.pas | 457 |
1 files changed, 242 insertions, 215 deletions
diff --git a/libgtk_kylix/GTKView.pas b/libgtk_kylix/GTKView.pas index b971e7d..1ac742b 100644 --- a/libgtk_kylix/GTKView.pas +++ b/libgtk_kylix/GTKView.pas @@ -210,6 +210,7 @@ type function GetSearchColumn: integer; function GetSortColumnID: integer; function GetSortOrder: TGTKTreeViewSortOrder; + function GetFixedHeightMode: boolean; procedure SetSelectionMode(Value: TGTKSelectionMode); procedure SetShowHeaders(Value: boolean); procedure SetRulesHint(Value: boolean); @@ -218,6 +219,7 @@ type procedure SetSearchColumn(Value: integer); procedure SetSortColumnID(Value: integer); procedure SetSortOrder(Value: TGTKTreeViewSortOrder); + procedure SetFixedHeightMode(Value: boolean); protected public FSelection: PGtkTreeSelection; @@ -244,6 +246,7 @@ type property CellDataFunc: TGTKCellDataFunc read FCellDataFunc write FCellDataFunc; property FromSortedCoversionFunc: TGTKSortCoversionFunc read FFromSortedConvFunc write FFromSortedConvFunc; property ToSortedCoversionFunc: TGTKSortCoversionFunc read FToSortedConvFunc write FToSortedConvFunc; + property FixedHeightMode: boolean read GetFixedHeightMode write SetFixedHeightMode; end; (****************************************** TGTKLISTVIEW ************************************************************************) @@ -255,6 +258,9 @@ type FSortable: boolean; FCompareFunc: TGTKTreeViewCompareFunc; FOnColumnsChanged: TNotifyEvent; + FChangedSignalHandlerID: gulong; + FRowActivatedSignalHandlerID: gulong; + FColumnsChangedSignalHandlerID: gulong; protected FListItems: TGTKListItems; procedure Recreate; @@ -291,6 +297,7 @@ begin FOnSelectionChanged := nil; FToSortedConvFunc := nil; FFromSortedConvFunc := nil; + FSelection := nil; end; destructor TGTKView.Destroy; @@ -388,6 +395,16 @@ begin gtk_tree_sortable_set_sort_column_id(PGtkTreeSortable(FTreeModelSort), Value, TGtkSortType(GetSortOrder)); end; +function TGTKView.GetFixedHeightMode: boolean; +begin + Result := gtk_tree_view_get_fixed_height_mode(PGtkTreeView(FWidget)); +end; + +procedure TGTKView.SetFixedHeightMode(Value: boolean); +begin + gtk_tree_view_set_fixed_height_mode(PGtkTreeView(FWidget), Value); +end; + procedure TGTKView.ConvertChildToPath(var Path: PGtkTreePath); var NewPath: PGtkTreePath; begin @@ -471,6 +488,9 @@ end; constructor TGTKListView.Create(AOwner: TComponent); begin inherited Create(AOwner); + FChangedSignalHandlerID := 0; + FRowActivatedSignalHandlerID := 0; + FColumnsChangedSignalHandlerID := 0; FListItems := TGTKListItems.Create(Self); FSortable := False; FCompareFunc := nil; @@ -479,6 +499,9 @@ end; destructor TGTKListView.Destroy; begin +// if FChangedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FSelection), FChangedSignalHandlerID); +// if FRowActivatedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FWidget), FRowActivatedSignalHandlerID); +// if FColumnsChangedSignalHandlerID > 0 then g_signal_handler_disconnect(PGObject(FWidget), FColumnsChangedSignalHandlerID); FListItems.Free; inherited Destroy; end; @@ -517,9 +540,9 @@ begin FWidget := gtk_tree_view_new_with_model(PGtkTreeModel(FTreeModelSort)); end; FSelection := gtk_tree_view_get_selection(PGtkTreeView(FWidget)); - g_signal_connect_data(PGObject(FSelection), 'changed', TGCallback(@TGTKListView_changed), Self, nil, G_CONNECT_DEFAULT); - g_signal_connect_data(PGObject(FWidget), 'row-activated', TGCallback(@TGTKListView_row_activated), Self, nil, G_CONNECT_DEFAULT); - g_signal_connect_data(PGObject(FWidget), 'columns-changed', TGCallback(@TGTKListView_columns_changed), Self, nil, [G_CONNECT_AFTER]); + FChangedSignalHandlerID := g_signal_connect_data(PGObject(FSelection), 'changed', TGCallback(@TGTKListView_changed), Self, nil, G_CONNECT_DEFAULT); + FRowActivatedSignalHandlerID := g_signal_connect_data(PGObject(FWidget), 'row-activated', TGCallback(@TGTKListView_row_activated), Self, nil, G_CONNECT_DEFAULT); + FColumnsChangedSignalHandlerID := g_signal_connect_data(PGObject(FWidget), 'columns-changed', TGCallback(@TGTKListView_columns_changed), Self, nil, [G_CONNECT_AFTER]); FTreeModel := gtk_tree_view_get_model(PGtkTreeView(FWidget)); Show; end; @@ -663,7 +686,7 @@ end; function TGTKListItems.GetItem(Index: longint): TGTKListItem; begin Result := TGTKListItem(FList[Index]); - Result.FIndex := Index; +// Result.FIndex := Index; end; procedure TGTKListItems.SetItem(Index: longint; Value: TGTKListItem); @@ -672,11 +695,12 @@ begin end; function TGTKListItems.Add: TGTKListItem; +var Item: TGTKListItem; begin - Result := TGTKListItem.Create(Self); - Result.FIndex := GetCount; -// Insert(GetCount, Result); - Append(Result); + Item := TGTKListItem.Create(Self); + Item.FIndex := GetCount; + Append(Item); + Result := Item; end; function TGTKListItems.GetCount: longint; @@ -691,16 +715,17 @@ begin end; procedure TGTKListItems.Delete(Index: longint); -var x: pointer; +var x: TGTKListItem; Iter: TGtkTreeIter; begin - x := FList[Index]; + Initialize(Iter); + x := TGTKListItem(FList[Index]); if gtk_tree_model_get_iter_from_string(PGtkTreeModel(FStore), @Iter, PChar(IntToStr(Index))) then begin // (FOwner as TGTKView).CovertSortableIter(Iter); gtk_list_store_remove(FStore, @Iter); - end; + end else writeln(' iter invalid!!!'); FList.Delete(Index); - TObject(x).Free; + x.Free; end; procedure TGTKListItems.Insert(Index: longint; Item: TGTKListItem); @@ -713,12 +738,217 @@ end; procedure TGTKListItems.Append(Item: TGTKListItem); var Iter: TGtkTreeIter; begin + Initialize(Iter); FList.Add(Item); gtk_list_store_append(FStore, @Iter); end; (********************************************************************************************************************************) (********************************************************************************************************************************) +constructor TGTKListItem.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FOwner := AOwner; + FData := nil; +end; + +destructor TGTKListItem.Destroy; +begin + inherited Destroy; +end; + +function TGTKListItem.AsString(Index: longint): string; +var Iter: TGtkTreeIter; + Val: Pgchar; +begin + Result := ''; + Val := nil; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then + begin + gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]); + if Assigned(Val) then Result := String(Val); + end; +end; + +function TGTKListItem.AsInteger(Index: longint): integer; +var Iter: TGtkTreeIter; + Val: glong; +begin + Result := 0; + Val := 0; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then + begin + gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]); + Result := Val; + end; +end; + +function TGTKListItem.AsPointer(Index: longint): pointer; +var Iter: TGtkTreeIter; + Val: Pointer; +begin + Result := nil; + Val := nil; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then + begin + gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]); + Result := Val; + end; +end; + +function TGTKListItem.AsBoolean(Index: longint): boolean; +var Iter: TGtkTreeIter; + Val: gboolean; +begin + Result := False; + Val := False; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then + begin + gtk_tree_model_get(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, [Index, @Val, -1]); + Result := Val; + end; +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: string); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) + then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, PChar(Value), -1]); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: integer); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) + then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, glong(Value), -1]); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: pointer); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) + then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, gpointer(Value), -1]); +end; + +procedure TGTKListItem.SetValue(Index: longint; Value: boolean); +var Iter: TGtkTreeIter; +begin + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) + then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, gboolean(Value), -1]); +end; + +function TGTKListItem.GetSelected: boolean; +var Iter: TGtkTreeIter; +begin + Result := False; + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin +// ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertSortableIter(Iter); + Result := gtk_tree_selection_iter_is_selected(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); + end; +end; + +procedure TGTKListItem.SetSelected(Value: boolean); +var Iter, NewIter: TGtkTreeIter; +begin + try + if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin + if Assigned(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort) then begin + gtk_tree_model_sort_convert_child_iter_to_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort, @NewIter, @Iter); + Iter := NewIter; + end; + if Value then gtk_tree_selection_select_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter) + else gtk_tree_selection_unselect_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); + end; + except end; +end; + +procedure TGTKListItem.SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double); +var Path: PGtkTreePath; + Column: PGtkTreeViewColumn; +// Renderer: PGtkCellRenderer; + i : integer; +begin + Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FColumn; +// Renderer := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FRenderer; + + gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); +// gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); +// gtk_tree_view_set_cursor_on_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, Renderer, StartEditing); + gtk_tree_view_scroll_to_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, UseAlignment, AlignX, AlignY); + + gtk_tree_path_free(Path); +end; + +procedure TGTKListItem.StartEditing(ColumnNo: integer); +var CellEditable: PGtkCellEditable; + Path: PGtkTreePath; + Column: PGtkTreeViewColumn; + BackgroundRect, CellRect: TGdkRectangle; +begin + Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FColumn; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); + gtk_tree_view_get_cell_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @CellRect); + + gtk_tree_view_column_focus_cell(Column, ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer); + CellEditable := gtk_cell_renderer_start_editing(((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer, + nil, ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget, PChar(PChar(IntToStr(FIndex))), + @BackgroundRect, @CellRect, []); + gtk_widget_show(PGtkWidget(CellEditable)); +// gtk_cell_editable_start_editing(CellEditable, nil); + + + gtk_tree_path_free(Path); +end; + +procedure TGTKListItem.RedrawRow; +var Rect, BackgroundRect: TGdkRectangle; + Path: PGtkTreePath; + Column: PGtkTreeViewColumn; +begin +Exit; + Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[0].FColumn; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); + + Rect.x := 0; + Rect.width := gtk_widget_get_allocated_width(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget); + Rect.y := BackgroundRect.y; + Rect.height := BackgroundRect.height; + gdk_window_invalidate_rect(gtk_tree_view_get_bin_window(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget)), @Rect, True); + + gtk_tree_path_free(Path); +end; + +function TGTKListItem.IsVisible: boolean; +var CellRect, VisibleRect: TGdkRectangle; + Path: PGtkTreePath; +begin + Result := False; + Exit; + gtk_tree_view_get_visible_rect(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), @VisibleRect); + Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); + if not Assigned(Path) then Exit; + ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); + if not Assigned(Path) then Exit; + gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, @CellRect); + gtk_tree_path_free(Path); + Result := (CellRect.y > VisibleRect.y) and (CellRect.y + CellRect.height < VisibleRect.y + VisibleRect.height); +end; + +(********************************************************************************************************************************) +(********************************************************************************************************************************) constructor TGTKTreeViewColumns.Create(AOwner: TComponent); begin inherited Create(AOwner); @@ -1108,209 +1338,6 @@ begin g_object_set_property(PGObject(FPixbufRenderer), PChar(AProperty), @AValue); end; -(********************************************************************************************************************************) -(********************************************************************************************************************************) -constructor TGTKListItem.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - FOwner := AOwner; - FData := nil; -end; - -destructor TGTKListItem.Destroy; -begin - inherited Destroy; -end; - -function TGTKListItem.AsString(Index: longint): string; -var Iter: TGtkTreeIter; - AValue: TGValue; -begin - Result := ''; - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then - begin - AValue.g_type := 0; - gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); - Result := String(AValue.data[0].v_pointer); - end; -end; - -function TGTKListItem.AsInteger(Index: longint): integer; -var Iter: TGtkTreeIter; - AValue: TGValue; -begin - Result := 0; - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then - begin - AValue.g_type := 0; - gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); - Result := AValue.data[0].v_long; - end; -end; - -function TGTKListItem.AsPointer(Index: longint): pointer; -var Iter: TGtkTreeIter; - AValue: TGValue; -begin - Result := nil; - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then - begin - AValue.g_type := 0; - gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); - Result := AValue.data[0].v_pointer; - end; -end; - -function TGTKListItem.AsBoolean(Index: longint): boolean; -var Iter: TGtkTreeIter; - AValue: TGValue; -begin - Result := False; - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then - begin - AValue.g_type := 0; - gtk_tree_model_get_value(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, Index, @AValue); - Result := boolean(AValue.data[0].v_int); - end; -end; - -procedure TGTKListItem.SetValue(Index: longint; Value: string); -var Iter: TGtkTreeIter; -begin - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) - then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, PChar(Value), -1]); -end; - -procedure TGTKListItem.SetValue(Index: longint; Value: integer); -var Iter: TGtkTreeIter; -begin - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) - then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]); -end; - -procedure TGTKListItem.SetValue(Index: longint; Value: pointer); -var Iter: TGtkTreeIter; -begin - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) - then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]); -end; - -procedure TGTKListItem.SetValue(Index: longint; Value: boolean); -var Iter: TGtkTreeIter; -begin - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) - then gtk_list_store_set((FOwner as TGTKListItems).FStore, @Iter, [Index, Value, -1]); -end; - -function TGTKListItem.GetSelected: boolean; -var Iter: TGtkTreeIter; -begin - Result := False; - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin -// ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertSortableIter(Iter); - Result := gtk_tree_selection_iter_is_selected(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); - end; -end; - -procedure TGTKListItem.SetSelected(Value: boolean); -var Iter, NewIter: TGtkTreeIter; -begin - try - if gtk_tree_model_get_iter_from_string(PGtkTreeModel((FOwner as TGTKListItems).FStore), @Iter, PChar(IntToStr(FIndex))) then begin - if Assigned(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort) then begin - gtk_tree_model_sort_convert_child_iter_to_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FTreeModelSort, @NewIter, @Iter); - Iter := NewIter; - end; - if Value then gtk_tree_selection_select_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter) - else gtk_tree_selection_unselect_iter(((FOwner as TGTKListItems).FOwner as TGTKView).FSelection, @Iter); - end; - except end; -end; - -procedure TGTKListItem.SetCursor(const FocusColumnNo: integer; const StartEditing, UseAlignment: boolean; const AlignX, AlignY: Double); -var Path: PGtkTreePath; - Column: PGtkTreeViewColumn; -// Renderer: PGtkCellRenderer; - i : integer; -begin - Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); - if not Assigned(Path) then Exit; - ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); - if not Assigned(Path) then Exit; - - Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FColumn; -// Renderer := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[FocusColumnNo].FRenderer; - - for i := 1 to 2 do gtk_main_iteration_do(False); // This ugly piece of code HAVE TO BE HERE due some focus-related problems in GtkTreeView - gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); -// gtk_tree_view_set_cursor(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, StartEditing); -// gtk_tree_view_set_cursor_on_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, Renderer, StartEditing); - gtk_tree_view_scroll_to_cell(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, UseAlignment, AlignX, AlignY); - - gtk_tree_path_free(Path); -end; - -procedure TGTKListItem.StartEditing(ColumnNo: integer); -var CellEditable: PGtkCellEditable; - Path: PGtkTreePath; - Column: PGtkTreeViewColumn; - BackgroundRect, CellRect: TGdkRectangle; -begin - Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); - if not Assigned(Path) then Exit; - ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); - if not Assigned(Path) then Exit; - Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FColumn; - gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); - gtk_tree_view_get_cell_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @CellRect); - - gtk_tree_view_column_focus_cell(Column, ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer); - CellEditable := gtk_cell_renderer_start_editing(((FOwner as TGTKListItems).FOwner as TGTKView).Columns[ColumnNo].FRenderer, - nil, ((FOwner as TGTKListItems).FOwner as TGTKView).FWidget, PChar(PChar(IntToStr(FIndex))), - @BackgroundRect, @CellRect, []); - gtk_widget_show(PGtkWidget(CellEditable)); -// gtk_cell_editable_start_editing(CellEditable, nil); - - - gtk_tree_path_free(Path); -end; - -procedure TGTKListItem.RedrawRow; -var Rect, BackgroundRect: TGdkRectangle; - Path: PGtkTreePath; - Column: PGtkTreeViewColumn; -begin - Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); - if not Assigned(Path) then Exit; - ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); - if not Assigned(Path) then Exit; - Column := ((FOwner as TGTKListItems).FOwner as TGTKView).Columns[0].FColumn; - gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, Column, @BackgroundRect); - - Rect.x := 0; - Rect.width := gtk_widget_get_allocated_width(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget); - Rect.y := BackgroundRect.y; - Rect.height := BackgroundRect.height; - gdk_window_invalidate_rect(gtk_tree_view_get_bin_window(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget)), @Rect, True); - - gtk_tree_path_free(Path); -end; - -function TGTKListItem.IsVisible: boolean; -var CellRect, VisibleRect: TGdkRectangle; - Path: PGtkTreePath; -begin - Result := False; - gtk_tree_view_get_visible_rect(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), @VisibleRect); - Path := gtk_tree_path_new_from_string(PChar(IntToStr(FIndex))); - if not Assigned(Path) then Exit; - ((FOwner as TGTKListItems).FOwner as TGTKView).ConvertChildToPath(Path); - if not Assigned(Path) then Exit; - gtk_tree_view_get_background_area(PGtkTreeView(((FOwner as TGTKListItems).FOwner as TGTKView).FWidget), Path, nil, @CellRect); - gtk_tree_path_free(Path); - Result := (CellRect.y > VisibleRect.y) and (CellRect.y + CellRect.height < VisibleRect.y + VisibleRect.height); -end; - (********************************************************************************************************************************) (********************************************************************************************************************************) |
