Qt: TListView vsIcon rework, now we use QListWidget for IconView mode.

git-svn-id: trunk@24926 -
This commit is contained in:
zeljko 2010-04-25 18:01:00 +00:00
parent 7a4507e5e8
commit 7e77c94cc6
2 changed files with 682 additions and 175 deletions

View File

@ -191,6 +191,7 @@ type
function getClientBounds: TRect; virtual;
function getClientOffset: TPoint; virtual;
function getEnabled: Boolean;
function getFont: QFontH;
function getFocusPolicy: QtFocusPolicy;
function getFrameGeometry: TRect;
function getGeometry: TRect; virtual;
@ -902,8 +903,10 @@ type
TQtAbstractItemView = class(TQtAbstractScrollArea)
private
FCheckable: boolean;
FHideSelection: Boolean;
FOldDelegate: QAbstractItemDelegateH;
FNewDelegate: QLCLItemDelegateH;
FOwnerData: Boolean;
FSignalActivated: QAbstractItemView_hookH;
FSignalClicked: QAbstractItemView_hookH;
FSignalDoubleClicked: QAbstractItemView_hookH;
@ -911,6 +914,7 @@ type
FSignalPressed: QAbstractItemView_hookH;
FSignalViewportEntered: QAbstractItemView_hookH;
FAbstractItemViewportEventHook: QObject_hookH;
FViewStyle: Integer;
function getIconSize: TSize;
function GetOwnerDrawn: Boolean;
procedure setIconSize(const AValue: TSize);
@ -938,9 +942,13 @@ type
procedure setEditTriggers(ATriggers: QAbstractItemViewEditTriggers);
procedure setSelectionMode(AMode: QAbstractItemViewSelectionMode);
procedure setSelectionBehavior(ABehavior: QAbstractItemViewSelectionBehavior);
procedure setWordWrap(const AValue: Boolean); virtual;
property Checkable: boolean read FCheckable write FCheckable;
property HideSelection: Boolean read FHideSelection write FHideSelection;
property IconSize: TSize read getIconSize write setIconSize;
property OwnerDrawn: Boolean read GetOwnerDrawn write SetOwnerDrawn;
property OwnerData: Boolean read FOwnerData write FOwnerData;
property ViewStyle: Integer read FViewStyle write FViewStyle;
public
procedure ItemDelegateSizeHint(option: QStyleOptionViewItemH; index: QModelIndexH; Size: PSize); cdecl; virtual;
procedure ItemDelegatePaint(painter: QPainterH; option: QStyleOptionViewItemH; index: QModelIndexH); cdecl; virtual;
@ -949,7 +957,23 @@ type
{ TQtListView }
TQtListView = class(TQtAbstractItemView)
private
function getGridSize: TSize;
function getSpacing: Integer;
procedure setSpacing(const AValue: integer);
procedure setGridSize(const AValue: TSize);
public
procedure setLayoutMode(const ALayoutMode: QListViewLayoutMode);
procedure setMovement(const AMovement: QListViewMovement);
procedure setResizeMode(const AResizeMode: QListViewResizeMode);
procedure setUniformItemSizes(const AEnable: Boolean);
procedure setViewFlow(const AFlow: QListViewFlow);
procedure setViewMode(const AMode: QListViewViewMode);
procedure setWordWrap(const AValue: Boolean); override;
procedure setWrapping(const AWrapping: Boolean);
procedure LayoutItems;
property GridSize: TSize read getGridSize write setGridSize;
property Spacing: Integer read getSpacing write setSpacing;
end;
{ TQtListWidget }
@ -960,6 +984,8 @@ type
FItemClickedHook: QListWidget_hookH;
FItemTextChangedHook: QListWidget_hookH;
FDontPassSelChange: Boolean;
function getItemCount: Integer;
procedure setItemCount(const AValue: Integer);
protected
function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
public
@ -977,20 +1003,30 @@ type
public
procedure ClearItems;
function currentRow: Integer;
function currentItem: QListWidgetItemH;
function IndexAt(APoint: PQtPoint): Integer;
procedure insertItem(AIndex: Integer; AText: String); overload;
procedure insertItem(AIndex: Integer; AText: PWideString); overload;
function itemAt(APoint: TPoint): QListWidgetItemH; overload;
function itemAt(x: Integer; y: Integer): QListWidgetItemH; overload;
function getItem(AIndex: Integer): QListWidgetItemH;
function getItemSelected(AItem: QListWidgetItemH): Boolean;
function getItemVisible(AItem: QListWidgetItemH): Boolean;
function getRow(AItem: QListWidgetItemH): integer;
function getSelCount: Integer;
function getVisualItemRect(AItem: QListWidgetItemH): TRect;
function selectedItems: TPtrIntArray;
procedure setCurrentRow(row: Integer);
procedure setItemText(AIndex: Integer; AText: String);
procedure setCurrentItem(AItem: QListWidgetItemH);
procedure setItemText(AIndex: Integer; AText: String); overload;
procedure setItemText(AIndex: Integer; AText: String; AAlignment: Integer); overload;
procedure setItemSelected(AItem: QListWidgetItemH; const ASelect: Boolean);
procedure setItemVisible(AItem: QListWidgetItemH; Const AVisible: Boolean);
procedure scrollToItem(row: integer; hint: QAbstractItemViewScrollHint);
procedure removeItem(AIndex: Integer);
function rowCount: integer;
procedure exchangeItems(AIndex1, AIndex2: Integer);
property ItemCount: Integer read getItemCount write setItemCount;
end;
{ TQtHeaderView }
@ -1038,7 +1074,7 @@ type
function CreateWidget(const AParams: TCreateParams):QWidgetH; override;
public
procedure setAllColumnsShowFocus(AValue: Boolean);
procedure setWordWrap(AValue: Boolean);
procedure setWordWrap(const AValue: Boolean); override;
procedure setRootIsDecorated(AValue: Boolean);
property ColWidth[AIndex: Integer]: Integer read getColWidth write setColWidth;
property ColVisible[AIndex: Integer]: Boolean read getColVisible write setColVisible;
@ -1049,8 +1085,6 @@ type
TQtTreeWidget = class(TQtTreeView)
private
FHideSelection: Boolean;
FOwnerData: Boolean;
FSyncingItems: Boolean;
FSorting: Boolean;
FHeader: TQtHeaderView;
@ -1120,11 +1154,9 @@ type
property ColCount: Integer read getColCount write setColCount;
property Header: TQtHeaderView read getHeader;
property HideSelection: Boolean read FHideSelection write FHideSelection;
property ItemCount: Integer read getItemCount write setItemCount;
property MaxColSize[ACol: Integer]: Integer read getMaxColSize write setMaxColSize;
property MinColSize[ACol: Integer]: Integer read getMinColSize write setMinColSize;
property OwnerData: Boolean read FOwnerData write FOwnerData;
property SortEnabled: Boolean read getSortEnabled write setSortEnabled;
end;
@ -3168,6 +3200,11 @@ begin
Result := QWidget_isEnabled(Widget);
end;
function TQtWidget.getFont: QFontH;
begin
Result := QWidget_font(Widget);
end;
function TQtWidget.getFocusPolicy: QtFocusPolicy;
begin
Result := QWidget_focusPolicy(Widget);
@ -7566,10 +7603,107 @@ begin
DeliverMessage(Msg);
end;
{ TQtListView }
function TQtListView.getGridSize: TSize;
begin
QListView_gridSize(QListViewH(Widget), @Result);
end;
function TQtListView.getSpacing: Integer;
begin
Result := QListView_spacing(QListViewH(Widget));
end;
procedure TQtListView.setGridSize(const AValue: TSize);
begin
QListView_setGridSize(QListViewH(Widget), @AValue);
end;
procedure TQtListView.setLayoutMode(const ALayoutMode: QListViewLayoutMode);
begin
QListView_setLayoutMode(QListViewH(Widget), ALayoutMode);
end;
procedure TQtListView.setMovement(const AMovement: QListViewMovement);
begin
QListView_setMovement(QListViewH(Widget), AMovement);
end;
procedure TQtListView.setResizeMode(const AResizeMode: QListViewResizeMode);
begin
QListView_setResizeMode(QListViewH(Widget), AResizeMode);
end;
procedure TQtListView.setSpacing(const AValue: integer);
begin
QListView_setSpacing(QListViewH(Widget), AValue);
end;
procedure TQtListView.setUniformItemSizes(const AEnable: Boolean);
begin
QListView_setUniformItemSizes(QListViewH(Widget), AEnable);
end;
procedure TQtListView.setViewFlow(const AFlow: QListViewFlow);
begin
QListView_setFlow(QListViewH(Widget), AFlow);
end;
procedure TQtListView.setViewMode(const AMode: QListViewViewMode);
begin
QListView_setViewMode(QListViewH(Widget), AMode);
end;
procedure TQtListView.setWordWrap(const AValue: Boolean);
begin
QListView_setWordWrap(QListViewH(Widget), AValue);
end;
procedure TQtListView.setWrapping(const AWrapping: Boolean);
begin
QListView_setWrapping(QListViewH(Widget), AWrapping);
end;
procedure TQtListView.LayoutItems;
begin
QListView_doItemsLayout(QListViewH(Widget));
end;
{ TQtListWidget }
function TQtListWidget.getItemCount: Integer;
begin
Result := QListWidget_count(QListWidgetH(Widget));
end;
procedure TQtListWidget.setItemCount(const AValue: Integer);
var
i: Integer;
AList: QStringListH;
WStr: WideString;
begin
if AValue = ItemCount then
exit;
BeginUpdate;
try
ClearItems;
AList := QStringList_create();
WStr := '';
for i := 0 to AValue do
QStringList_append(AList, @WStr);
QListWidget_addItems(QListWidgetH(Widget), AList);
QStringList_destroy(AList);
finally
EndUpdate;
end;
end;
function TQtListWidget.CreateWidget(const AParams: TCreateParams): QWidgetH;
var
Parent: QWidgetH;
begin
FViewStyle := 0;
FCheckable := False;
FDontPassSelChange := False;
if AParams.WndParent <> 0 then
@ -7670,7 +7804,7 @@ begin
(QMouseEvent_button(QMouseEventH(Event)) = QtLeftButton) then
begin
MousePos := QMouseEvent_pos(QMouseEventH(Event))^;
Item := QListWidget_itemAt(QListWidgetH(Widget), @MousePos);
Item := itemAt(MousePos.x, MousePos.y);
if (Item <> nil) and
((QListWidgetItem_flags(Item) and QtItemIsUserCheckable) <> 0) then
begin
@ -7811,6 +7945,11 @@ begin
Result := QListWidget_currentRow(QListWidgetH(Widget));
end;
function TQtListWidget.currentItem: QListWidgetItemH;
begin
Result := QListWidget_currentItem(QListWidgetH(Widget));
end;
function TQtListWidget.IndexAt(APoint: PQtPoint): Integer;
var
AModelIndex: QModelIndexH;
@ -7839,6 +7978,16 @@ begin
QListWidget_insertItem(QListWidgetH(Widget), AIndex, Item);
end;
function TQtListWidget.itemAt(APoint: TPoint): QListWidgetItemH;
begin
Result := ItemAt(APoint.X, APoint.Y);
end;
function TQtListWidget.itemAt(x: Integer; y: Integer): QListWidgetItemH;
begin
Result := QListWidget_itemAt(QListWidgetH(Widget), x, y);
end;
function TQtListWidget.getItem(AIndex: Integer): QListWidgetItemH;
begin
Result := QListWidget_item(QListWidgetH(Widget), AIndex);
@ -7852,12 +8001,25 @@ begin
Result := False;
end;
function TQtListWidget.getSelCount: Integer;
var
SItems: TPtrIntArray;
function TQtListWidget.getItemVisible(AItem: QListWidgetItemH): Boolean;
begin
QListWidget_selectedItems(QListWidgetH(Widget), @SItems);
Result := length(SItems);
if AItem = nil then
Result := False
else
Result := not QListWidget_isItemHidden(QListWidgetH(AItem), AItem);
end;
function TQtListWidget.getRow(AItem: QListWidgetItemH): integer;
begin
if AItem = nil then
Result := -1
else
Result := QListWidget_row(QListWidgetH(Widget), AItem);
end;
function TQtListWidget.getSelCount: Integer;
begin
Result := length(selectedItems);
end;
function TQtListWidget.getVisualItemRect(AItem: QListWidgetItemH): TRect;
@ -7867,6 +8029,11 @@ begin
QListWidget_visualItemRect(QListWidgetH(Widget), @Result, AItem);
end;
function TQtListWidget.selectedItems: TPtrIntArray;
begin
QListWidget_selectedItems(QListWidgetH(Widget), @Result);
end;
{------------------------------------------------------------------------------
Function: TQtListWidget.setCurrentRow
Params: None
@ -7884,6 +8051,11 @@ begin
end;
end;
procedure TQtListWidget.setCurrentItem(AItem: QListWidgetItemH);
begin
QListWidget_setCurrentItem(QListWidgetH(Widget), AItem);
end;
procedure TQtListWidget.setItemText(AIndex: Integer; AText: String);
var
Item: QListWidgetItemH;
@ -7905,6 +8077,29 @@ begin
insertItem(AIndex, @Str);
end;
procedure TQtListWidget.setItemText(AIndex: Integer; AText: String;
AAlignment: Integer);
var
Item: QListWidgetItemH;
Str: WideString;
R: TRect;
begin
Str := GetUTF8String(AText);
if (AIndex >= 0) and (AIndex < rowCount) then
begin
Item := getItem(AIndex);
QListWidgetItem_setText(Item, @Str);
QListWidgetItem_setTextAlignment(Item, AAlignment);
{we must update our custom delegate}
if OwnerDrawn then
begin
R := getVisualItemRect(Item);
Update(@R);
end;
end else
insertItem(AIndex, @Str);
end;
procedure TQtListWidget.setItemSelected(AItem: QListWidgetItemH;
const ASelect: Boolean);
begin
@ -7912,6 +8107,13 @@ begin
QListWidget_setItemSelected(QListWidgetH(Widget), AItem, ASelect);
end;
procedure TQtListWidget.setItemVisible(AItem: QListWidgetItemH;
const AVisible: Boolean);
begin
if AItem <> nil then
QListWidget_setItemHidden(QListWidgetH(Widget), AItem, not AVisible);
end;
procedure TQtListWidget.scrollToItem(row: integer;
hint: QAbstractItemViewScrollHint);
var
@ -8162,7 +8364,7 @@ begin
QTreeView_setUniformRowHeights(QTreeViewH(Widget), AValue);
end;
procedure TQtTreeView.setWordWrap(AValue: Boolean);
procedure TQtTreeView.setWordWrap(const AValue: Boolean);
begin
QTreeView_setWordWrap(QTreeViewH(Widget), AValue);
end;
@ -8212,6 +8414,7 @@ begin
{$ifdef VerboseQt}
WriteLn('TQtTreeWidget.Create');
{$endif}
FViewStyle := 0;
FCheckable := False;
FHideSelection := False;
FOwnerData := False;
@ -8551,7 +8754,7 @@ end;
function TQtTreeWidget.itemAt(APoint: TPoint): QTreeWidgetItemH;
begin
Result := QTreeWidget_itemAt(QTreeWidgetH(Widget), APoint.x, APoint.y);
Result := itemAt(APoint.X, APoint.Y);
end;
function TQtTreeWidget.itemAt(x: Integer; y: Integer): QTreeWidgetItemH;
@ -8608,11 +8811,8 @@ begin
end;
function TQtTreeWidget.selCount: Integer;
var
FPInts: TPtrIntArray;
begin
QTreeWidget_selectedItems(QTreeWidgetH(Widget), @FPInts);
Result := length(FPInts);
Result := length(selectedItems);
end;
function TQtTreeWidget.selectedItems: TPtrIntArray;
@ -10883,6 +11083,11 @@ begin
QAbstractItemView_setSelectionBehavior(QAbstractItemViewH(Widget), ABehavior);
end;
procedure TQtAbstractItemView.setWordWrap(const AValue: Boolean);
begin
// override
end;
procedure TQtAbstractItemView.ItemDelegateSizeHint(
option: QStyleOptionViewItemH; index: QModelIndexH; Size: PSize); cdecl;
var

View File

@ -70,6 +70,8 @@ type
{ TQtWSCustomListView }
TQtWSCustomListView = class(TWSCustomListView)
protected
class function IsIconView(const AList: TCustomListView): boolean;
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -113,6 +115,7 @@ type
class function GetBoundingRect(const ALV: TCustomListView): TRect; override;
class procedure SetAllocBy(const ALV: TCustomListView; const AValue: Integer); override;
class procedure SetIconArrangement(const ALV: TCustomListView; const AValue: TIconArrangement); override;
class procedure SetItemsCount(const ALV: TCustomListView; const Avalue: Integer); override;
class procedure SetOwnerData(const ALV: TCustomListView; const AValue: Boolean); override;
@ -248,6 +251,14 @@ const
{taCenter } QtAlignCenter
);
IconArngToQListFlow: array[TIconArrangement] of QListViewFlow =
(
{iaTop} QListViewTopToBottom,
{iaLeft} QListViewLeftToRight
);
IconAutoArToQtResizeMode: array[Boolean] of QListViewResizeMode =
(QListViewFixed, QListViewAdjust);
{ TQtWSToolButton }
@ -607,15 +618,46 @@ end;
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListView.IsIconView(const AList: TCustomListView): boolean;
begin
Result := TListView(AList).ViewStyle = vsIcon;
end;
class function TQtWSCustomListView.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
QtTreeWidget: TQtTreeWidget;
QtListWidget: TQtListWidget;
begin
if IsIconView(TCustomListView(AWinControl)) then
begin
QtListWidget := TQtListWidget.Create(AWinControl, AParams);
QtListWidget.ViewStyle := Ord(vsIcon);
QtListWidget.setViewMode(QListViewIconMode);
// emabarcadero docs says
// vsIcon
// Each item appears as a full-sized icon with a label below it.
// The user can drag the items to any location in the list view window.
QtListWidget.setResizeMode(QListViewAdjust);
QtListWidget.setMovement(QListViewFree);
QtListWidget.Checkable := TCustomListView(AWinControl).Checkboxes;
with TCustomListView(AWinControl) do
begin
QtListWidget.setWrapping(IconOptions.AutoArrange);
QtListWidget.setViewFlow(IconArngToQListFlow[IconOptions.Arrangement]);
QtListWidget.setWordWrap(IconOptions.WrapText);
end;
QtListWidget.AttachEvents;
Result := TLCLIntfHandle(QtListWidget);
end else
begin
QtTreeWidget := TQtTreeWidget.Create(AWinControl, AParams);
QtTreeWidget.ViewStyle := Ord(TListView(AWinControl).ViewStyle);
QtTreeWidget.setRootIsDecorated(False);
QtTreeWidget.AttachEvents;
Result := TLCLIntfHandle(QtTreeWidget);
end;
end;
{------------------------------------------------------------------------------
@ -631,6 +673,11 @@ var
begin
if not WSCheckHandleAllocated(ALV, 'ColumnDelete') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.headerItem;
QTreeWidgetItem_takeChild(TWI, AIndex);
@ -652,6 +699,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnInsert') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
if QtTreeWidget.ColCount <> TListView(ALV).Columns.Count then
@ -686,6 +737,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnGetWidth') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
Result := QtTreeWidget.ColWidth[AIndex];
end;
@ -706,6 +761,10 @@ begin
if (csDesigning in ALV.ComponentState) then
exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.Header.moveSection(AOldIndex, ANewIndex);
end;
@ -725,6 +784,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetAlignment') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.headerItem;
QTreeWidgetItem_setTextAlignment(TWI, AIndex,
@ -757,6 +820,10 @@ begin
if (csDesigning in ALV.ComponentState) then
exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
if AAutoSize then
QtTreeWidget.Header.setResizeMode(AIndex, QHeaderViewResizeToContents)
@ -779,6 +846,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetCaption') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.headerItem;
if TWI <> NiL then
@ -803,6 +874,11 @@ var
begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetImage') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.headerItem;
if TWI <> NiL then
@ -846,6 +922,11 @@ var
begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetMinWidth') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.MinColSize[AIndex] := AMinWidth;
end;
@ -863,6 +944,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetWidth') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.ColWidth[AIndex] := AWidth;
end;
@ -880,6 +965,10 @@ begin
if not WSCheckHandleAllocated(ALV, 'ColumnSetVisible') then
Exit;
// TODO: columns in vsIcon mode
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.ColVisible[AIndex] := AVisible;
end;
@ -896,8 +985,13 @@ var
begin
if not WSCheckHandleAllocated(ALV, 'ItemDelete') then
Exit;
if IsIconView(ALV) then
TQtListWidget(ALV.Handle).removeItem(AIndex)
else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.DeleteItem(AIndex);
end;
end;
{------------------------------------------------------------------------------
@ -910,6 +1004,7 @@ class function TQtWSCustomListView.ItemGetChecked(const ALV: TCustomListView;
var
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
LWI: QListWidgetItemH;
AState: QtCheckState;
begin
if not WSCheckHandleAllocated(ALV, 'ItemGetChecked') then
@ -919,10 +1014,20 @@ begin
if not Result then
exit;
AState := QtUnChecked;
if IsIconView(ALV) then
begin
LWI := TQtListWidget(ALV.Handle).getItem(AIndex);
if LWI <> nil then
AState := QListWidgetItem_checkState(LWI);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
if TWI <> nil then
AState := QTreeWidgetItem_checkState(TWI, 0);
end;
Result := AState = QtChecked;
end;
@ -934,6 +1039,8 @@ end;
class function TQtWSCustomListView.ItemGetPosition(const ALV: TCustomListView;
const AIndex: Integer): TPoint;
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
R: TRect;
@ -941,12 +1048,19 @@ begin
if not WSCheckHandleAllocated(ALV, 'ItemGetPosition') then
Exit;
R := Rect(0, 0, 0, 0);
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
R := QtListWidget.getVisualItemRect(QtListWidget.getItem(AIndex));
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
R := QtTreeWidget.visualItemRect(TWI);
end;
Result.X := R.Left;
Result.Y := R.Top;
end;
{------------------------------------------------------------------------------
@ -958,20 +1072,34 @@ class function TQtWSCustomListView.ItemGetState(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem;
const AState: TListItemState; out AIsSet: Boolean): Boolean;
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
if not WSCheckHandleAllocated(ALV, 'ItemGetState') then
Exit;
AIsSet := False;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
if LWI <> nil then
case AState of
lisFocused: AIsSet := LWI = QtListWidget.currentItem;
lisSelected: AIsSet := QtListWidget.getItemSelected(LWI);
end;
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
AIsSet := False;
if TWI <> nil then
case AState of
lisFocused: AIsSet := TWI = QtTreeWidget.currentItem;
lisSelected: AIsSet := QTreeWidgetItem_isSelected(TWI);
end;
end;
Result := True;
end;
@ -980,6 +1108,8 @@ class procedure TQtWSCustomListView.ItemSetImage(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem; const ASubIndex,
AImageIndex: Integer);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
Bmp: TBitmap;
@ -991,10 +1121,18 @@ begin
if not Assigned(TListView(ALV).LargeImages) and not
Assigned(TListView(ALV).SmallImages) then
exit;
TWI := nil;
LWI := nil;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
if (TWI <> nil) then
end;
if (TWI <> nil) or (LWI <> nil) then
begin
ImgList := TImageList.Create(nil);
try
@ -1012,6 +1150,9 @@ begin
Bmp := TBitmap.Create;
try
ImgList.GetBitmap(AImageIndex, Bmp);
if LWI <> nil then
QListWidgetItem_setIcon(LWI, TQtImage(Bmp.Handle).AsIcon)
else
QTreeWidgetItem_setIcon(TWI, ASubIndex, TQtImage(Bmp.Handle).AsIcon);
finally
Bmp.Free;
@ -1031,6 +1172,8 @@ end;
class procedure TQtWSCustomListView.ItemSetChecked(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem; const AChecked: Boolean);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
@ -1040,12 +1183,23 @@ begin
if not ALV.CheckBoxes then
exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
if AChecked then
QListWidgetItem_setCheckState(LWI, QtChecked)
else
QListWidgetItem_setCheckState(LWI, QtUnChecked);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
if AChecked then
QTreeWidgetItem_setCheckState(TWI, 0, QtChecked)
else
QTreeWidgetItem_setCheckState(TWI, 0, QtUnChecked);
end;
end;
{------------------------------------------------------------------------------
@ -1057,18 +1211,30 @@ class procedure TQtWSCustomListView.ItemSetState(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem;
const AState: TListItemState; const AIsSet: Boolean);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
if not WSCheckHandleAllocated(ALV, 'ItemSetState') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
case AState of
lisFocused: QtListWidget.setCurrentItem(LWI);
lisSelected: QtListWidget.setItemSelected(LWI, AIsSet);
end;
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
case AState of
lisFocused: QtTreeWidget.setCurrentItem(TWI);
lisSelected: QtTreeWidget.setItemSelected(TWI, AIsSet);
end;
end;
end;
@ -1080,6 +1246,8 @@ end;
class procedure TQtWSCustomListView.ItemInsert(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
Str: WideString;
@ -1089,6 +1257,13 @@ begin
if not WSCheckHandleAllocated(ALV, 'ItemInsert') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
QtListWidget.Checkable := ALV.Checkboxes;
QtListWidget.insertItem(AIndex, AItem.Caption);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QTreeWidgetItem_create(QTreeWidgetH(QtTreeWidget.Widget), 0);
if AItem.Caption <> '' then
@ -1123,9 +1298,9 @@ begin
end;
end;
QtTreeWidget.insertTopLevelItem(AIndex, TWI);
end;
end;
{------------------------------------------------------------------------------
Method: TQtWSCustomListView.ItemSetText
Params: None
@ -1135,6 +1310,8 @@ class procedure TQtWSCustomListView.ItemSetText(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem; const ASubIndex: Integer;
const AText: String);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
Str: WideString;
@ -1143,6 +1320,15 @@ begin
if not WSCheckHandleAllocated(ALV, 'ItemSetText') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
AAlignment := QtAlignLeft;
if (TListView(ALV).Columns.Count > 0) and (ASubIndex < TListView(ALV).Columns.Count) then
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[ASubIndex].Alignment];
QtListWidget.setItemText(AIndex, AText, AAlignment);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
Str := GetUtf8String(AText);
TWI := QtTreeWidget.topLevelItem(AIndex);
@ -1153,6 +1339,7 @@ begin
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[ASubIndex].Alignment];
QtTreeWidget.setItemText(TWI, ASubIndex, Str, AAlignment);
end;
end;
end;
{------------------------------------------------------------------------------
@ -1163,15 +1350,24 @@ end;
class procedure TQtWSCustomListView.ItemShow(const ALV: TCustomListView;
const AIndex: Integer; const AItem: TListItem; const PartialOK: Boolean);
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
if not WSCheckHandleAllocated(ALV, 'ItemShow') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
QtListWidget.setItemVisible(LWI, True);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
QtTreeWidget.setItemVisible(TWI, True);
end;
end;
@ -1183,43 +1379,53 @@ end;
class function TQtWSCustomListView.ItemDisplayRect(const ALV: TCustomListView;
const AIndex, ASubItem: Integer; ACode: TDisplayCode): TRect;
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
if not WSCheckHandleAllocated(ALV, 'ItemDisplayRect') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.getItem(AIndex);
Result := QtListWidget.getVisualItemRect(LWI);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.topLevelItem(AIndex);
if QTreeWidgetItem_childCount(TWI) > 0 then
Result := QtTreeWidget.visualItemRect(QTreeWidgetItem_child(TWI, ASubItem))
else
Result := QtTreeWidget.visualItemRect(TWI);
end;
end;
class procedure TQtWSCustomListView.BeginUpdate(const ALV: TCustomListView);
var
QtTreeWidget: TQtTreeWidget;
QtWidget: TQtWidget;
begin
if not WSCheckHandleAllocated(ALV, 'BeginUpdate') then
Exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.BeginUpdate;
QtTreeWidget.setUpdatesEnabled(False);
QtWidget := TQtWidget(ALV.Handle);
QtWidget.BeginUpdate;
QtWidget.setUpdatesEnabled(False);
end;
class procedure TQtWSCustomListView.EndUpdate(const ALV: TCustomListView);
var
QtTreeWidget: TQtTreeWidget;
QtWidget: TQtWidget;
begin
if not WSCheckHandleAllocated(ALV, 'EndUpdate') then
Exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.EndUpdate;
if not QtTreeWidget.InUpdate then
QtWidget := TQtWidget(ALV.Handle);
QtWidget.EndUpdate;
if not QtWidget.InUpdate then
begin
QtTreeWidget.setUpdatesEnabled(True);
QtTreeWidget.Update(nil);
QtWidget.setUpdatesEnabled(True);
QtWidget.Update(nil);
end;
end;
@ -1230,6 +1436,8 @@ end;
------------------------------------------------------------------------------}
class function TQtWSCustomListView.GetFocused(const ALV: TCustomListView): Integer;
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
i: Integer;
@ -1237,6 +1445,16 @@ begin
if not WSCheckHandleAllocated(ALV, 'GetFocused') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.currentItem;
if QtListWidget.getItemSelected(LWI) then
Result := QtListWidget.getRow(LWI)
else
Result := -1;
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.currentItem;
i := QtTreeWidget.indexOfTopLevelItem(TWI);
@ -1244,6 +1462,7 @@ begin
Result := i
else
Result := -1;
end;
end;
{------------------------------------------------------------------------------
@ -1253,14 +1472,24 @@ end;
------------------------------------------------------------------------------}
class function TQtWSCustomListView.GetItemAt(const ALV: TCustomListView; x,y: integer): Integer;
var
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TWI: QTreeWidgetItemH;
begin
if not WSCheckHandleAllocated(ALV, 'GetItemAt') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
LWI := QtListWidget.itemAt(x, y);
Result := QtListWidget.getRow(LWI);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TWI := QtTreeWidget.itemAt(x, y);
Result := QtTreeWidget.indexOfTopLevelItem(TWI);
end;
end;
{------------------------------------------------------------------------------
@ -1269,14 +1498,13 @@ end;
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSCustomListView.GetSelCount(const ALV: TCustomListView): Integer;
var
QtTreeWidget: TQtTreeWidget;
begin
if not WSCheckHandleAllocated(ALV, 'GetSelCount') then
Exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
Result := QtTreeWidget.selCount;
if IsIconView(ALV) then
Result := TQtListWidget(ALV.Handle).getSelCount
else
Result := TQtTreeWidget(ALV.Handle).selCount;
end;
{------------------------------------------------------------------------------
@ -1286,15 +1514,22 @@ end;
------------------------------------------------------------------------------}
class function TQtWSCustomListView.GetSelection(const ALV: TCustomListView): Integer;
var
QtListWidget: TQtListWidget;
QtTreeWidget: TQtTreeWidget;
FPInts: TPtrIntArray;
begin
if not WSCheckHandleAllocated(ALV, 'GetSelection') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
FPInts := QtListWidget.selectedItems;
end else
begin
{implement selection event so we can return Alv.Selected.Index}
QtTreeWidget := TQtTreeWidget(ALV.Handle);
FPInts := QtTreeWidget.selectedItems;
end;
if Length(FPInts)>0 then
Result := FPInts[0]
else
@ -1317,6 +1552,9 @@ begin
if (csDesigning in ALV.ComponentState) then
exit;
if IsIconView(ALV) then
exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
if AType = stNone then
@ -1342,7 +1580,7 @@ class function TQtWSCustomListView.GetBoundingRect(const ALV: TCustomListView):
begin
if not WSCheckHandleAllocated(ALV, 'GetBoundingRect') then
Exit;
Result := TQtTreeWidget(ALV.Handle).getFrameGeometry;
Result := TQtWidget(ALV.Handle).getFrameGeometry;
end;
class procedure TQtWSCustomListView.SetAllocBy(const ALV: TCustomListView;
@ -1356,26 +1594,52 @@ begin
// QtTreeWidget.ItemCount := AValue;
end;
class procedure TQtWSCustomListView.SetIconArrangement(
const ALV: TCustomListView; const AValue: TIconArrangement);
var
QtList: TQtListWidget;
begin
if not WSCheckHandleAllocated(ALV, 'SetIconArrangement') then
Exit;
if IsIconView(ALV) then
begin
// hm...seem that QListView have bug, doesn't want to rearrange items
// in any case when iaTop and AutoArrange=True (then it looks same as
// iaLeft without arrange, so we must set GridSize in that case
{$note set workaround for QListView bug via QtList.GridSize}
QtList := TQtListWidget(ALV.Handle);
QtList.setViewFlow(IconArngToQListFlow[AValue]);
end;
end;
class procedure TQtWSCustomListView.SetItemsCount(const ALV: TCustomListView;
const Avalue: Integer);
var
QtListWidget: TQtListWidget;
QtTreeWidget: TQtTreeWidget;
begin
if not WSCheckHandleAllocated(ALV, 'SetItemsCount') then
Exit;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
QtListWidget.ItemCount := AValue;
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.ItemCount := AValue;
end;
end;
class procedure TQtWSCustomListView.SetOwnerData(const ALV: TCustomListView;
const AValue: Boolean);
var
QtTreeWidget: TQtTreeWidget;
QtItemView: TQtAbstractItemView;
begin
if not WSCheckHandleAllocated(ALV, 'SetOwnerData') then
Exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtTreeWidget.OwnerData := AValue;
QtItemView := TQtAbstractItemView(ALV.Handle);
QtItemView.OwnerData := AValue;
end;
class procedure TQtWSCustomListView.SetProperty(const ALV: TCustomListView;
@ -1399,39 +1663,45 @@ const
var
SavedCheckable: Boolean;
i: Integer;
Item: QTreeWidgetItemH;
NewItem: QTreeWidgetItemH;
ItemFlags: QtItemFlags;
QtItemView: TQtAbstractItemView;
Parent: QWidgetH;
begin
if not WSCheckHandleAllocated(ALV, 'SetProperty')
then Exit;
QtItemView := TQtAbstractItemView(ALV.Handle);
case AProp of
lvpAutoArrange:
begin
if IsIconView(ALV) then
TQtListWidget(ALV.Handle).setWrapping(AIsSet);
end;
lvpCheckboxes:
begin
SavedCheckable := TQtTreeWidget(ALV.Handle).Checkable;
TQtTreeWidget(ALV.Handle).Checkable := AIsSet;
SavedCheckable := QtItemView.Checkable;
QtItemView.Checkable := AIsSet;
if SavedCheckable <> AIsSet then
RecreateWnd(ALV);
end;
lvpMultiSelect:
begin
if (TQtTreeWidget(ALV.Handle).getSelectionMode <> QAbstractItemViewNoSelection) then
TQtTreeWidget(ALV.Handle).setSelectionMode(BoolToSelectionMode[AIsSet]);
if (QtItemView.getSelectionMode <> QAbstractItemViewNoSelection) then
QtItemView.setSelectionMode(BoolToSelectionMode[AIsSet]);
end;
lvpShowColumnHeaders:
begin
if not IsIconView(ALV) then
with TQtTreeWidget(ALV.Handle) do
setHeaderVisible(AIsSet and (TListView(ALV).ViewStyle = vsReport));
end;
lvpReadOnly: TQtTreeWidget(ALV.Handle).setEditTriggers(BoolToEditTriggers[AIsSet]);
lvpReadOnly: QtItemView.setEditTriggers(BoolToEditTriggers[AIsSet]);
lvpRowSelect:
begin
if not IsIconView(ALV) then
TQtTreeWidget(ALV.Handle).setAllColumnsShowFocus(AIsSet);
TQtTreeWidget(ALV.Handle).setSelectionBehavior(BoolToSelectionBehavior[AIsSet]);
QtItemView.setSelectionBehavior(BoolToSelectionBehavior[AIsSet]);
end;
lvpWrapText: TQtTreeWidget(ALV.Handle).setWordWrap(AIsSet);
lvpHideSelection: TQtTreeWidget(ALV.Handle).HideSelection := AIsSet;
lvpWrapText: QtItemView.setWordWrap(AIsSet);
lvpHideSelection: QtItemView.HideSelection := AIsSet;
end;
end;
@ -1449,22 +1719,25 @@ end;
class procedure TQtWSCustomListView.SetScrollBars(const ALV: TCustomListView;
const AValue: TScrollStyle);
var
QtTreeWidget: TQtTreeWidget;
QtItemView: TQtAbstractItemView;
begin
if not WSCheckHandleAllocated(ALV, 'SetScrollBars') then
Exit;
QtTreeWidget := TQtTreeWidget(ALV.Handle);
QtItemView := TQtAbstractItemView(ALV.Handle);
{always reset before applying new TScrollStyle}
QtTreeWidget.setScrollStyle(ssNone);
QtItemView.setScrollStyle(ssNone);
if AValue <> ssNone then
QtTreeWidget.setScrollStyle(AValue);
QtItemView.setScrollStyle(AValue);
end;
class procedure TQtWSCustomListView.SetViewStyle(const ALV: TCustomListView;
const Avalue: TViewStyle);
const AValue: TViewStyle);
var
QtItemView: TQtAbstractItemView;
QtListWidget: TQtListWidget;
LWI: QListWidgetItemH;
QtTreeWidget: TQtTreeWidget;
TreeWidget: QTreeWidgetH;
ItemViewWidget: QAbstractItemViewH;
Item: QTreeWidgetItemH;
Size: TSize;
x: Integer;
@ -1472,15 +1745,31 @@ var
begin
if not WSCheckHandleAllocated(ALV, 'SetViewStyle') then
Exit;
QtItemView := TQtAbstractItemView(ALV.Handle);
if ((QtItemView.ViewStyle = Ord(vsIcon)) or (AValue = vsIcon))
and (QtItemView.ViewStyle <> Ord(AValue)) then
begin
RecreateWnd(ALV);
exit;
end;
if IsIconView(ALV) then
begin
QtListWidget := TQtListWidget(ALV.Handle);
ItemViewWidget := QListWidgetH(QtListWidget.Widget);
end else
begin
QtTreeWidget := TQtTreeWidget(ALV.Handle);
TreeWidget := QTreeWidgetH(QtTreeWidget.Widget);
ItemViewWidget := QTreeWidgetH(QtTreeWidget.Widget);
with QtTreeWidget do
setHeaderVisible(TListView(ALV).ShowColumnHeaders and (AValue = vsReport));
end;
case AValue of
vsIcon:
begin
x := QStyle_pixelMetric(QApplication_style(), QStylePM_IconViewIconSize,
nil, TreeWidget);
nil, ItemViewWidget);
Size.cx := x;
Size.cy := x;
if Assigned(TListView(ALV).LargeImages) then
@ -1492,7 +1781,7 @@ begin
vsSmallIcon:
begin
x := QStyle_pixelMetric(QApplication_style(), QStylePM_ListViewIconSize,
nil, TreeWidget);
nil, ItemViewWidget);
Size.cx := x;
Size.cy := x;
if Assigned(TListView(ALV).SmallImages) then
@ -1504,14 +1793,26 @@ begin
vsList, vsReport:
begin
x := QStyle_pixelMetric(QApplication_style(), QStylePM_ListViewIconSize,
nil, TreeWidget);
nil, ItemViewWidget);
Size.cx := x;
Size.cy := x;
end;
end;
QtTreeWidget.IconSize := Size;
TQtAbstractItemView(ALV.Handle).IconSize := Size;
if IsIconView(ALV) then
begin
LWI := QtListWidget.getItem(0);
if LWI <> nil then
begin
X := Size.CY;
QListWidgetItem_sizeHint(LWI, @Size);
Size.Cy := X;
QListWidgetItem_setSizeHint(LWI, @Size);
end;
end else
begin
Item := QtTreeWidget.topLevelItem(0);
if Item <> nil then
begin
@ -1527,6 +1828,7 @@ begin
end;
end;
QtTreeWidget.UniformRowHeights := True;
end;
end;
end.