mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-02 17:43:41 +02:00
Qt, Gtk2: fixes checkbox state when doing Items.Move() from checklstbox.part of issue #20589
git-svn-id: trunk@33171 -
This commit is contained in:
parent
73f2164806
commit
b2cfc29c58
@ -51,7 +51,7 @@ uses
|
||||
LMessages, LCLProc, LCLIntf, LCLType, DynHashArray, GraphType, GraphMath,
|
||||
Graphics, Menus, Themes, WSLCLClasses,
|
||||
|
||||
Buttons, StdCtrls, PairSplitter,
|
||||
Buttons, StdCtrls, CheckLst, PairSplitter,
|
||||
ComCtrls, Calendar, Arrow, Spin,
|
||||
ExtCtrls, FileCtrl, LResources,
|
||||
|
||||
@ -349,6 +349,7 @@ type
|
||||
function Find(const S: String; var Index: Integer): Boolean;
|
||||
function IndexOf(const S: String): Integer; override;
|
||||
procedure Insert(Index: Integer; const S: String); override;
|
||||
procedure Move(CurIndex, NewIndex: Integer); override;
|
||||
procedure Sort;
|
||||
function IsEqual(List: TStrings): Boolean;
|
||||
procedure BeginUpdate;
|
||||
@ -378,6 +379,7 @@ uses
|
||||
Gtk2WSFactory,
|
||||
Gtk2WSStdCtrls,
|
||||
Gtk2WSControls,
|
||||
Gtk2WSCheckLst,
|
||||
Gtk2WSPrivate,
|
||||
Gtk2Themes,
|
||||
////////////////////////////////////////////////////
|
||||
@ -904,6 +906,21 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TGtkListStoreStringList.Move(CurIndex, NewIndex: Integer);
|
||||
const
|
||||
AState: Array[Boolean] of TCheckBoxState = (cbUnchecked, cbChecked);
|
||||
var
|
||||
AItemChecked: Boolean;
|
||||
begin
|
||||
if FOwner is TCheckListBox then
|
||||
AItemChecked := TCheckListBox(FOwner).Checked[CurIndex];
|
||||
inherited Move(CurIndex, NewIndex);
|
||||
if FOwner is TCheckListBox then
|
||||
TGtk2WSCustomCheckListBox.SetState(TCustomCheckListBox(FOwner),
|
||||
NewIndex, AState[AItemChecked]);
|
||||
|
||||
end;
|
||||
|
||||
{$I gtk2listsl.inc}
|
||||
|
||||
// Gtk2FileDialogUtils
|
||||
|
@ -76,6 +76,7 @@ type
|
||||
procedure Assign(Source: TPersistent); override;
|
||||
procedure Clear; override;
|
||||
procedure Delete(Index: Integer); override;
|
||||
procedure Move(CurIndex, NewIndex: Integer); override;
|
||||
procedure Sort; override;
|
||||
procedure Exchange(AIndex1, AIndex2: Integer); override;
|
||||
public
|
||||
@ -616,6 +617,33 @@ begin
|
||||
FOwner.removeItem(Index);
|
||||
end;
|
||||
|
||||
procedure TQtListStrings.Move(CurIndex, NewIndex: Integer);
|
||||
var
|
||||
CheckState: QtCheckState;
|
||||
Selected: Boolean;
|
||||
begin
|
||||
{move is calling delete, and then insert.
|
||||
we must save our item checkstate and selection}
|
||||
if Assigned(FWinControl) and (FWinControl.HandleAllocated) and
|
||||
(FOwner is TQtCheckListBox) then
|
||||
begin
|
||||
CheckState := TQtCheckListBox(FOwner).ItemCheckState[CurIndex];
|
||||
Selected := TQtCheckListBox(FOwner).Selected[CurIndex];
|
||||
end;
|
||||
|
||||
inherited Move(CurIndex, NewIndex);
|
||||
|
||||
{return check state to newindex}
|
||||
if Assigned(FWinControl) and (FWinControl.HandleAllocated) and
|
||||
(FOwner is TQtCheckListBox) then
|
||||
begin
|
||||
FOwner.BeginUpdate;
|
||||
TQtCheckListBox(FOwner).ItemCheckState[NewIndex] := CheckState;
|
||||
FOwner.Selected[NewIndex] := Selected;
|
||||
FOwner.EndUpdate;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtListStrings.Sort;
|
||||
var
|
||||
I: Integer;
|
||||
|
@ -1109,7 +1109,9 @@ type
|
||||
FItemTextChangedHook: QListWidget_hookH;
|
||||
FDontPassSelChange: Boolean;
|
||||
function getItemCount: Integer;
|
||||
function GetSelected(AIndex: Integer): Boolean;
|
||||
procedure setItemCount(const AValue: Integer);
|
||||
procedure SetSelected(AIndex: Integer; AValue: Boolean);
|
||||
protected
|
||||
function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
|
||||
procedure OwnerDataNeeded(ARect: TRect); override;
|
||||
@ -1157,6 +1159,7 @@ type
|
||||
procedure ExchangeItems(const AIndex1, AIndex2: Integer);
|
||||
procedure MoveItem(const AFromIndex, AToIndex: Integer);
|
||||
property ItemCount: Integer read getItemCount write setItemCount;
|
||||
property Selected[AIndex: Integer]: Boolean read GetSelected write SetSelected;
|
||||
end;
|
||||
|
||||
{ TQtCheckListBox }
|
||||
@ -1164,6 +1167,8 @@ type
|
||||
TQtCheckListBox = class (TQtListWidget)
|
||||
private
|
||||
FItemChangedHook: QListWidget_hookH;
|
||||
function GetItemCheckState(AIndex: Integer): QtCheckState;
|
||||
procedure SetItemCheckState(AIndex: Integer; AValue: QtCheckState);
|
||||
protected
|
||||
function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
|
||||
public
|
||||
@ -1176,6 +1181,7 @@ type
|
||||
procedure signalItemClicked(item: QListWidgetItemH); cdecl; override;
|
||||
procedure signalSelectionChanged(); cdecl; override;
|
||||
procedure signalItemChanged(item: QListWidgetItemH); cdecl;
|
||||
property ItemCheckState[AIndex: Integer]: QtCheckState read GetItemCheckState write SetItemCheckState;
|
||||
end;
|
||||
|
||||
{ TQtHeaderView }
|
||||
@ -9058,6 +9064,16 @@ begin
|
||||
Result := QListWidget_count(QListWidgetH(Widget));
|
||||
end;
|
||||
|
||||
function TQtListWidget.GetSelected(AIndex: Integer): Boolean;
|
||||
var
|
||||
AItem: QListWidgetItemH;
|
||||
begin
|
||||
Result := False;
|
||||
AItem := getItem(AIndex);
|
||||
if Assigned(AItem) then
|
||||
Result := getItemSelected(AItem);
|
||||
end;
|
||||
|
||||
procedure TQtListWidget.setItemCount(const AValue: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
@ -9080,6 +9096,12 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtListWidget.SetSelected(AIndex: Integer; AValue: Boolean);
|
||||
begin
|
||||
if (AIndex >= 0) and (AIndex < RowCount) then
|
||||
setItemSelected(getItem(AIndex), AValue);
|
||||
end;
|
||||
|
||||
function TQtListWidget.CreateWidget(const AParams: TCreateParams): QWidgetH;
|
||||
var
|
||||
Parent: QWidgetH;
|
||||
@ -9663,7 +9685,10 @@ end;
|
||||
|
||||
function TQtListWidget.getItem(AIndex: Integer): QListWidgetItemH;
|
||||
begin
|
||||
Result := QListWidget_item(QListWidgetH(Widget), AIndex);
|
||||
if (AIndex >= 0) and (AIndex < rowCount) then
|
||||
Result := QListWidget_item(QListWidgetH(Widget), AIndex)
|
||||
else
|
||||
Result := nil;
|
||||
end;
|
||||
|
||||
function TQtListWidget.getItemSelected(AItem: QListWidgetItemH): Boolean;
|
||||
@ -10016,6 +10041,30 @@ begin
|
||||
DeliverMessage(Msg);
|
||||
end;
|
||||
|
||||
function TQtCheckListBox.GetItemCheckState(AIndex: Integer): QtCheckState;
|
||||
var
|
||||
AItem: QListWidgetItemH;
|
||||
begin
|
||||
Result := QtUnChecked;
|
||||
if (AIndex >= 0) and (AIndex < rowCount) then
|
||||
begin
|
||||
AItem := QListWidget_item(QListWidgetH(Widget), AIndex);
|
||||
Result := QListWidgetItem_checkState(AItem);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtCheckListBox.SetItemCheckState(AIndex: Integer;
|
||||
AValue: QtCheckState);
|
||||
var
|
||||
AItem: QListWidgetItemH;
|
||||
begin
|
||||
if (AIndex >= 0) and (AIndex < rowCount) then
|
||||
begin
|
||||
AItem := QListWidget_item(QListWidgetH(Widget), AIndex);
|
||||
QListWidgetItem_setCheckState(AItem, AValue);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TQtHeaderView }
|
||||
|
||||
function TQtHeaderView.getClickable: Boolean;
|
||||
|
Loading…
Reference in New Issue
Block a user