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, LMessages, LCLProc, LCLIntf, LCLType, DynHashArray, GraphType, GraphMath,
Graphics, Menus, Themes, WSLCLClasses, Graphics, Menus, Themes, WSLCLClasses,
Buttons, StdCtrls, PairSplitter, Buttons, StdCtrls, CheckLst, PairSplitter,
ComCtrls, Calendar, Arrow, Spin, ComCtrls, Calendar, Arrow, Spin,
ExtCtrls, FileCtrl, LResources, ExtCtrls, FileCtrl, LResources,
@ -349,6 +349,7 @@ type
function Find(const S: String; var Index: Integer): Boolean; function Find(const S: String; var Index: Integer): Boolean;
function IndexOf(const S: String): Integer; override; function IndexOf(const S: String): Integer; override;
procedure Insert(Index: Integer; const S: String); override; procedure Insert(Index: Integer; const S: String); override;
procedure Move(CurIndex, NewIndex: Integer); override;
procedure Sort; procedure Sort;
function IsEqual(List: TStrings): Boolean; function IsEqual(List: TStrings): Boolean;
procedure BeginUpdate; procedure BeginUpdate;
@ -378,6 +379,7 @@ uses
Gtk2WSFactory, Gtk2WSFactory,
Gtk2WSStdCtrls, Gtk2WSStdCtrls,
Gtk2WSControls, Gtk2WSControls,
Gtk2WSCheckLst,
Gtk2WSPrivate, Gtk2WSPrivate,
Gtk2Themes, Gtk2Themes,
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
@ -904,6 +906,21 @@ begin
end; end;
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} {$I gtk2listsl.inc}
// Gtk2FileDialogUtils // Gtk2FileDialogUtils

View File

@ -76,6 +76,7 @@ type
procedure Assign(Source: TPersistent); override; procedure Assign(Source: TPersistent); override;
procedure Clear; override; procedure Clear; override;
procedure Delete(Index: Integer); override; procedure Delete(Index: Integer); override;
procedure Move(CurIndex, NewIndex: Integer); override;
procedure Sort; override; procedure Sort; override;
procedure Exchange(AIndex1, AIndex2: Integer); override; procedure Exchange(AIndex1, AIndex2: Integer); override;
public public
@ -616,6 +617,33 @@ begin
FOwner.removeItem(Index); FOwner.removeItem(Index);
end; 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; procedure TQtListStrings.Sort;
var var
I: Integer; I: Integer;

View File

@ -1109,7 +1109,9 @@ type
FItemTextChangedHook: QListWidget_hookH; FItemTextChangedHook: QListWidget_hookH;
FDontPassSelChange: Boolean; FDontPassSelChange: Boolean;
function getItemCount: Integer; function getItemCount: Integer;
function GetSelected(AIndex: Integer): Boolean;
procedure setItemCount(const AValue: Integer); procedure setItemCount(const AValue: Integer);
procedure SetSelected(AIndex: Integer; AValue: Boolean);
protected protected
function CreateWidget(const AParams: TCreateParams):QWidgetH; override; function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
procedure OwnerDataNeeded(ARect: TRect); override; procedure OwnerDataNeeded(ARect: TRect); override;
@ -1157,6 +1159,7 @@ type
procedure ExchangeItems(const AIndex1, AIndex2: Integer); procedure ExchangeItems(const AIndex1, AIndex2: Integer);
procedure MoveItem(const AFromIndex, AToIndex: Integer); procedure MoveItem(const AFromIndex, AToIndex: Integer);
property ItemCount: Integer read getItemCount write setItemCount; property ItemCount: Integer read getItemCount write setItemCount;
property Selected[AIndex: Integer]: Boolean read GetSelected write SetSelected;
end; end;
{ TQtCheckListBox } { TQtCheckListBox }
@ -1164,6 +1167,8 @@ type
TQtCheckListBox = class (TQtListWidget) TQtCheckListBox = class (TQtListWidget)
private private
FItemChangedHook: QListWidget_hookH; FItemChangedHook: QListWidget_hookH;
function GetItemCheckState(AIndex: Integer): QtCheckState;
procedure SetItemCheckState(AIndex: Integer; AValue: QtCheckState);
protected protected
function CreateWidget(const AParams: TCreateParams):QWidgetH; override; function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
public public
@ -1176,6 +1181,7 @@ type
procedure signalItemClicked(item: QListWidgetItemH); cdecl; override; procedure signalItemClicked(item: QListWidgetItemH); cdecl; override;
procedure signalSelectionChanged(); cdecl; override; procedure signalSelectionChanged(); cdecl; override;
procedure signalItemChanged(item: QListWidgetItemH); cdecl; procedure signalItemChanged(item: QListWidgetItemH); cdecl;
property ItemCheckState[AIndex: Integer]: QtCheckState read GetItemCheckState write SetItemCheckState;
end; end;
{ TQtHeaderView } { TQtHeaderView }
@ -9058,6 +9064,16 @@ begin
Result := QListWidget_count(QListWidgetH(Widget)); Result := QListWidget_count(QListWidgetH(Widget));
end; 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); procedure TQtListWidget.setItemCount(const AValue: Integer);
var var
i: Integer; i: Integer;
@ -9080,6 +9096,12 @@ begin
end; end;
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; function TQtListWidget.CreateWidget(const AParams: TCreateParams): QWidgetH;
var var
Parent: QWidgetH; Parent: QWidgetH;
@ -9663,7 +9685,10 @@ end;
function TQtListWidget.getItem(AIndex: Integer): QListWidgetItemH; function TQtListWidget.getItem(AIndex: Integer): QListWidgetItemH;
begin begin
Result := QListWidget_item(QListWidgetH(Widget), AIndex); if (AIndex >= 0) and (AIndex < rowCount) then
Result := QListWidget_item(QListWidgetH(Widget), AIndex)
else
Result := nil;
end; end;
function TQtListWidget.getItemSelected(AItem: QListWidgetItemH): Boolean; function TQtListWidget.getItemSelected(AItem: QListWidgetItemH): Boolean;
@ -10016,6 +10041,30 @@ begin
DeliverMessage(Msg); DeliverMessage(Msg);
end; 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 } { TQtHeaderView }
function TQtHeaderView.getClickable: Boolean; function TQtHeaderView.getClickable: Boolean;