diff --git a/lcl/interfaces/gtk2/gtk2int.pas b/lcl/interfaces/gtk2/gtk2int.pas index 40588c2856..513da171bc 100644 --- a/lcl/interfaces/gtk2/gtk2int.pas +++ b/lcl/interfaces/gtk2/gtk2int.pas @@ -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 diff --git a/lcl/interfaces/qt/qtprivate.pp b/lcl/interfaces/qt/qtprivate.pp index 9214985c72..1b5114b601 100644 --- a/lcl/interfaces/qt/qtprivate.pp +++ b/lcl/interfaces/qt/qtprivate.pp @@ -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; diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 48eecc0cf3..e0f962139b 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -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;