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:
zeljko 2011-10-30 12:11:43 +00:00
parent 73f2164806
commit b2cfc29c58
3 changed files with 96 additions and 2 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;