mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 05:59:19 +02:00
gtk3: Implemented TListView.OnSelectItem
git-svn-id: trunk@42967 -
This commit is contained in:
parent
c92edcbd6b
commit
e6338e1d02
@ -514,11 +514,13 @@ type
|
|||||||
|
|
||||||
TGtk3ListView = class(TGtk3ScrollableWin)
|
TGtk3ListView = class(TGtk3ScrollableWin)
|
||||||
private
|
private
|
||||||
|
FPreselectedIndices: TFPList;
|
||||||
FIsTreeView: Boolean;
|
FIsTreeView: Boolean;
|
||||||
protected
|
protected
|
||||||
function CreateWidget(const Params: TCreateParams):PGtkWidget; override;
|
function CreateWidget(const Params: TCreateParams):PGtkWidget; override;
|
||||||
function EatArrowKeys(const AKey: Word): Boolean; override;
|
function EatArrowKeys(const AKey: Word): Boolean; override;
|
||||||
public
|
public
|
||||||
|
destructor Destroy; override;
|
||||||
{interface implementation}
|
{interface implementation}
|
||||||
function getHorizontalScrollbar: PGtkScrollbar; override;
|
function getHorizontalScrollbar: PGtkScrollbar; override;
|
||||||
function getVerticalScrollbar: PGtkScrollbar; override;
|
function getVerticalScrollbar: PGtkScrollbar; override;
|
||||||
@ -4850,6 +4852,80 @@ end;
|
|||||||
|
|
||||||
{ TGtk3ListView }
|
{ TGtk3ListView }
|
||||||
|
|
||||||
|
function Gtk3WS_ListViewItemPreSelected({%H-}selection: PGtkTreeSelection; {%H-}model: PGtkTreeModel;
|
||||||
|
path: PGtkTreePath; path_is_currently_selected: GBoolean; AData: GPointer): GBoolean; cdecl;
|
||||||
|
begin
|
||||||
|
// DebugLn('Gtk3WS_ListViewItemSelected ,path selected ',dbgs(path_is_currently_selected));
|
||||||
|
// this function is called *before* the item is selected
|
||||||
|
// The result should be True to allow the Item to change selection
|
||||||
|
Result := True;
|
||||||
|
|
||||||
|
if (AData = nil) or TGtk3Widget(AData).InUpdate then
|
||||||
|
exit;
|
||||||
|
|
||||||
|
if not Assigned(TGtk3ListView(AData).FPreselectedIndices) then
|
||||||
|
TGtk3ListView(AData).FPreselectedIndices := TFPList.Create;
|
||||||
|
|
||||||
|
if TGtk3ListView(AData).FPreselectedIndices.IndexOf(Pointer(PtrInt(gtk_tree_path_get_indices(path)^))) = -1 then
|
||||||
|
TGtk3ListView(AData).FPreselectedIndices.Add(Pointer(PtrInt(gtk_tree_path_get_indices(path)^)));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure Gtk3WS_ListViewItemSelected(ASelection: PGtkTreeSelection; AData: GPointer); cdecl;
|
||||||
|
var
|
||||||
|
ATreeView: PGtkTreeView;
|
||||||
|
AList: PGList;
|
||||||
|
Msg: TLMNotify;
|
||||||
|
NM: TNMListView;
|
||||||
|
Path: PGtkTreePath;
|
||||||
|
Indices: Integer;
|
||||||
|
i, j: Integer;
|
||||||
|
B: Boolean;
|
||||||
|
begin
|
||||||
|
if (AData = nil) or TGtk3Widget(AData).InUpdate then
|
||||||
|
exit;
|
||||||
|
if not Assigned(TGtk3ListView(AData).FPreselectedIndices) then
|
||||||
|
exit;
|
||||||
|
ATreeView := gtk_tree_selection_get_tree_view(ASelection);
|
||||||
|
AList := gtk_tree_selection_get_selected_rows(ASelection, nil);
|
||||||
|
TGtk3Widget(AData).BeginUpdate; // dissalow entering Gtk3WS_ListViewItemPreSelected
|
||||||
|
try
|
||||||
|
for i := 0 to TGtk3ListView(AData).FPreselectedIndices.Count - 1 do
|
||||||
|
begin
|
||||||
|
FillChar(Msg{%H-}, SizeOf(Msg), 0);
|
||||||
|
Msg.Msg := CN_NOTIFY;
|
||||||
|
FillChar(NM{%H-}, SizeOf(NM), 0);
|
||||||
|
NM.hdr.hwndfrom := HWND(TGtk3Widget(AData));
|
||||||
|
NM.hdr.code := LVN_ITEMCHANGED;
|
||||||
|
NM.iItem := PtrInt(TGtk3ListView(AData).FPreselectedIndices.Items[i]);
|
||||||
|
NM.iSubItem := 0;
|
||||||
|
B := False;
|
||||||
|
for j := 0 to g_list_length(AList) - 1 do
|
||||||
|
begin
|
||||||
|
Path := g_list_nth_data(AList, guint(j));
|
||||||
|
if Path <> nil then
|
||||||
|
begin
|
||||||
|
Indices := gtk_tree_path_get_indices(Path)^;
|
||||||
|
B := Indices = PtrInt(TGtk3ListView(AData).FPreselectedIndices.Items[i]);
|
||||||
|
if B then
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if not B then
|
||||||
|
NM.uOldState := LVIS_SELECTED
|
||||||
|
else
|
||||||
|
NM.uNewState := LVIS_SELECTED;
|
||||||
|
NM.uChanged := LVIF_STATE;
|
||||||
|
Msg.NMHdr := @NM.hdr;
|
||||||
|
DeliverMessage(TGtk3Widget(AData).LCLObject, Msg);
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
FreeAndNil(TGtk3ListView(AData).FPreselectedIndices);
|
||||||
|
if AList <> nil then
|
||||||
|
g_list_free(AList);
|
||||||
|
TGtk3Widget(AData).EndUpdate;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TGtk3ListView.CreateWidget(const Params: TCreateParams): PGtkWidget;
|
function TGtk3ListView.CreateWidget(const Params: TCreateParams): PGtkWidget;
|
||||||
var
|
var
|
||||||
AListView: TCustomListView;
|
AListView: TCustomListView;
|
||||||
@ -4859,6 +4935,7 @@ var
|
|||||||
begin
|
begin
|
||||||
FScrollX := 0;
|
FScrollX := 0;
|
||||||
FScrollY := 0;
|
FScrollY := 0;
|
||||||
|
FPreselectedIndices := nil;
|
||||||
FWidgetType := FWidgetType + [wtTreeModel, wtListView, wtScrollingWin];
|
FWidgetType := FWidgetType + [wtTreeModel, wtListView, wtScrollingWin];
|
||||||
AListView := TCustomListView(LCLObject);
|
AListView := TCustomListView(LCLObject);
|
||||||
Result := PGtkScrolledWindow(TGtkScrolledWindow.new(nil, nil));
|
Result := PGtkScrolledWindow(TGtkScrolledWindow.new(nil, nil));
|
||||||
@ -4889,6 +4966,12 @@ begin
|
|||||||
g_object_unref (PGObject(TreeModel));
|
g_object_unref (PGObject(TreeModel));
|
||||||
PGtkScrolledWindow(Result)^.set_can_focus(False);
|
PGtkScrolledWindow(Result)^.set_can_focus(False);
|
||||||
PGtkTreeView(FCentralWidget)^.set_can_focus(True);
|
PGtkTreeView(FCentralWidget)^.set_can_focus(True);
|
||||||
|
if FIsTreeView then
|
||||||
|
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, 0);
|
||||||
|
end;
|
||||||
// if FIsTreeView then
|
// if FIsTreeView then
|
||||||
// PGtkTreeView(FCentralWidget)^.set_search_column(0);
|
// PGtkTreeView(FCentralWidget)^.set_search_column(0);
|
||||||
end;
|
end;
|
||||||
@ -4898,6 +4981,12 @@ begin
|
|||||||
Result := False;
|
Result := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
destructor TGtk3ListView.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FPreselectedIndices);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
function TGtk3ListView.getHorizontalScrollbar: PGtkScrollbar;
|
function TGtk3ListView.getHorizontalScrollbar: PGtkScrollbar;
|
||||||
begin
|
begin
|
||||||
Result := nil;
|
Result := nil;
|
||||||
|
Loading…
Reference in New Issue
Block a user