mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-11 08:40:41 +01:00
Qt: TQtListWidget items sort rework, fixed AV introduced by previous TQtListWidget patch.
git-svn-id: trunk@22179 -
This commit is contained in:
parent
27b929c2a5
commit
89e1df3d7f
@ -954,8 +954,10 @@ type
|
|||||||
procedure resizeSection(ASection: Integer; ASize: Integer);
|
procedure resizeSection(ASection: Integer; ASize: Integer);
|
||||||
procedure setHighlightSections(AValue: Boolean);
|
procedure setHighlightSections(AValue: Boolean);
|
||||||
procedure setDefaultSectionSize(AValue: Integer);
|
procedure setDefaultSectionSize(AValue: Integer);
|
||||||
|
function SortIndicatorOrder: QtSortOrder;
|
||||||
|
procedure SetSortIndicator(const AColumn: Integer; const AOrder: QtSortOrder);
|
||||||
|
procedure SetSortIndicatorVisible(AVisible: Boolean);
|
||||||
procedure setStretchLastSection(AValue: Boolean);
|
procedure setStretchLastSection(AValue: Boolean);
|
||||||
function sortIndicatorOrder: QtSortOrder;
|
|
||||||
property Clickable: Boolean read getClickable write setClickable;
|
property Clickable: Boolean read getClickable write setClickable;
|
||||||
property MinSectionSize: Integer read getMinSectionSize write setMinSectionSize;
|
property MinSectionSize: Integer read getMinSectionSize write setMinSectionSize;
|
||||||
end;
|
end;
|
||||||
@ -983,8 +985,10 @@ type
|
|||||||
TQtTreeWidget = class(TQtTreeView)
|
TQtTreeWidget = class(TQtTreeView)
|
||||||
private
|
private
|
||||||
FSyncingItems: Boolean;
|
FSyncingItems: Boolean;
|
||||||
|
FSorting: Boolean;
|
||||||
FHeader: TQtHeaderView;
|
FHeader: TQtHeaderView;
|
||||||
FSectionClicked: QHeaderView_hookH;
|
FSectionClicked: QHeaderView_hookH;
|
||||||
|
FSortChanged: QHeaderView_hookH;
|
||||||
FHeaderEventFilterHook: QObject_hookH;
|
FHeaderEventFilterHook: QObject_hookH;
|
||||||
FCurrentItemChangedHook: QTreeWidget_hookH;
|
FCurrentItemChangedHook: QTreeWidget_hookH;
|
||||||
FItemDoubleClickedHook: QTreeWidget_hookH;
|
FItemDoubleClickedHook: QTreeWidget_hookH;
|
||||||
@ -1040,6 +1044,7 @@ type
|
|||||||
procedure SignalitemExpanded(item: QTreeWidgetItemH) cdecl;
|
procedure SignalitemExpanded(item: QTreeWidgetItemH) cdecl;
|
||||||
procedure SignalItemCollapsed(item: QTreeWidgetItemH) cdecl;
|
procedure SignalItemCollapsed(item: QTreeWidgetItemH) cdecl;
|
||||||
procedure SignalCurrentItemChanged(current: QTreeWidgetItemH; previous: QTreeWidgetItemH) cdecl;
|
procedure SignalCurrentItemChanged(current: QTreeWidgetItemH; previous: QTreeWidgetItemH) cdecl;
|
||||||
|
procedure SignalSortIndicatorChanged(ALogicalIndex: Integer; AOrder: QtSortOrder) cdecl;
|
||||||
|
|
||||||
property ColCount: Integer read getColCount write setColCount;
|
property ColCount: Integer read getColCount write setColCount;
|
||||||
property ItemCount: Integer read getItemCount;
|
property ItemCount: Integer read getItemCount;
|
||||||
@ -7149,6 +7154,11 @@ begin
|
|||||||
Result := QHeaderView_minimumSectionSize(QHeaderViewH(Widget));
|
Result := QHeaderView_minimumSectionSize(QHeaderViewH(Widget));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtHeaderView.SortIndicatorOrder: QtSortOrder;
|
||||||
|
begin
|
||||||
|
Result := QHeaderView_sortIndicatorOrder(QHeaderViewH(Widget));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TQtHeaderView.setClickable(const AValue: Boolean);
|
procedure TQtHeaderView.setClickable(const AValue: Boolean);
|
||||||
begin
|
begin
|
||||||
QHeaderView_setClickable(QHeaderViewH(Widget), AValue);
|
QHeaderView_setClickable(QHeaderViewH(Widget), AValue);
|
||||||
@ -7159,6 +7169,17 @@ begin
|
|||||||
QHeaderView_setMinimumSectionSize(QHeaderViewH(Widget), AValue);
|
QHeaderView_setMinimumSectionSize(QHeaderViewH(Widget), AValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtHeaderView.SetSortIndicator(const AColumn: Integer;
|
||||||
|
const AOrder: QtSortOrder);
|
||||||
|
begin
|
||||||
|
QHeaderView_setSortIndicator(QHeaderViewH(Widget), AColumn, AOrder);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtHeaderView.SetSortIndicatorVisible(AVisible: Boolean);
|
||||||
|
begin
|
||||||
|
QHeaderView_setSortIndicatorShown(QHeaderViewH(Widget), AVisible);
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
Function: TQtHeaderView.CreateWidget
|
Function: TQtHeaderView.CreateWidget
|
||||||
Params: None
|
Params: None
|
||||||
@ -7255,11 +7276,6 @@ begin
|
|||||||
QHeaderView_setStretchLastSection(QHeaderViewH(Widget), AValue);
|
QHeaderView_setStretchLastSection(QHeaderViewH(Widget), AValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TQtHeaderView.sortIndicatorOrder: QtSortOrder;
|
|
||||||
begin
|
|
||||||
Result := QHeaderView_sortIndicatorOrder(QHeaderViewH(Widget));
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TQtTreeView }
|
{ TQtTreeView }
|
||||||
|
|
||||||
function TQtTreeView.getColVisible(AIndex: Integer): Boolean;
|
function TQtTreeView.getColVisible(AIndex: Integer): Boolean;
|
||||||
@ -7325,6 +7341,7 @@ begin
|
|||||||
WriteLn('TQtTreeWidget.Create');
|
WriteLn('TQtTreeWidget.Create');
|
||||||
{$endif}
|
{$endif}
|
||||||
FSyncingItems := False;
|
FSyncingItems := False;
|
||||||
|
FSorting := False;
|
||||||
Result := QTreeWidget_create();
|
Result := QTreeWidget_create();
|
||||||
FHeader := nil;
|
FHeader := nil;
|
||||||
QWidget_setAttribute(Result, QtWA_NoMousePropagation);
|
QWidget_setAttribute(Result, QtWA_NoMousePropagation);
|
||||||
@ -7357,7 +7374,11 @@ begin
|
|||||||
QObject_hook_hook_events(FHeaderEventFilterHook, @headerViewEventFilter);
|
QObject_hook_hook_events(FHeaderEventFilterHook, @headerViewEventFilter);
|
||||||
|
|
||||||
FSectionClicked := QHeaderView_hook_create(FHeader.Widget);
|
FSectionClicked := QHeaderView_hook_create(FHeader.Widget);
|
||||||
QHeaderView_hook_hook_sectionClicked(FSectionClicked, @FHeader.SignalSectionClicked);
|
QHeaderView_hook_hook_sectionClicked(FSectionClicked,
|
||||||
|
@FHeader.SignalSectionClicked);
|
||||||
|
FSortChanged := QHeaderView_hook_create(FHeader.Widget);
|
||||||
|
QHeaderView_hook_hook_sortIndicatorChanged(FSortChanged,
|
||||||
|
@SignalSortIndicatorChanged);
|
||||||
end;
|
end;
|
||||||
Result := FHeader;
|
Result := FHeader;
|
||||||
end;
|
end;
|
||||||
@ -7622,6 +7643,8 @@ begin
|
|||||||
QObject_hook_destroy(FHeaderEventFilterHook);
|
QObject_hook_destroy(FHeaderEventFilterHook);
|
||||||
if FSectionClicked <> nil then
|
if FSectionClicked <> nil then
|
||||||
QHeaderView_hook_destroy(FSectionClicked);
|
QHeaderView_hook_destroy(FSectionClicked);
|
||||||
|
if FSortChanged <> nil then
|
||||||
|
QHeaderView_hook_destroy(FSortChanged);
|
||||||
|
|
||||||
inherited DetachEvents;
|
inherited DetachEvents;
|
||||||
end;
|
end;
|
||||||
@ -7895,6 +7918,21 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtTreeWidget.SignalSortIndicatorChanged(ALogicalIndex: Integer;
|
||||||
|
AOrder: QtSortOrder)cdecl;
|
||||||
|
begin
|
||||||
|
if FSorting or not Assigned(LCLObject) or not
|
||||||
|
QHeaderView_isSortIndicatorShown(QHeaderViewH(Header.Widget)) then
|
||||||
|
exit;
|
||||||
|
FSorting := True;
|
||||||
|
try
|
||||||
|
if ALogicalIndex >= 0 then
|
||||||
|
sortItems(ALogicalIndex, AOrder);
|
||||||
|
finally
|
||||||
|
FSorting := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{TQtTableView}
|
{TQtTableView}
|
||||||
|
|
||||||
function TQtTableView.CreateWidget(const Params: TCreateParams): QWidgetH;
|
function TQtTableView.CreateWidget(const Params: TCreateParams): QWidgetH;
|
||||||
|
|||||||
@ -1120,7 +1120,7 @@ begin
|
|||||||
for i := 0 to AItem.SubItems.Count - 1 do
|
for i := 0 to AItem.SubItems.Count - 1 do
|
||||||
begin
|
begin
|
||||||
AAlignment := QtAlignLeft;
|
AAlignment := QtAlignLeft;
|
||||||
if TListView(ALV).Columns.Count > 0 then
|
if (TListView(ALV).Columns.Count > 0) and (i + 1 < TListView(ALV).Columns.Count) then
|
||||||
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[i + 1].Alignment];
|
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[i + 1].Alignment];
|
||||||
Str := GetUtf8String(AItem.Subitems.Strings[i]);
|
Str := GetUtf8String(AItem.Subitems.Strings[i]);
|
||||||
QtTreeWidget.setItemText(TWI, i + 1, Str, AAlignment);
|
QtTreeWidget.setItemText(TWI, i + 1, Str, AAlignment);
|
||||||
@ -1152,7 +1152,7 @@ begin
|
|||||||
if TWI <> NiL then
|
if TWI <> NiL then
|
||||||
begin
|
begin
|
||||||
AAlignment := QtAlignLeft;
|
AAlignment := QtAlignLeft;
|
||||||
if TListView(ALV).Columns.Count > 0 then
|
if (TListView(ALV).Columns.Count > 0) and (ASubIndex < TListView(ALV).Columns.Count) then
|
||||||
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[ASubIndex].Alignment];
|
AAlignment := AlignmentToQtAlignmentMap[ALV.Column[ASubIndex].Alignment];
|
||||||
QtTreeWidget.setItemText(TWI, ASubIndex, Str, AAlignment);
|
QtTreeWidget.setItemText(TWI, ASubIndex, Str, AAlignment);
|
||||||
end;
|
end;
|
||||||
@ -1297,17 +1297,15 @@ begin
|
|||||||
QtTreeWidget := TQtTreeWidget(ALV.Handle);
|
QtTreeWidget := TQtTreeWidget(ALV.Handle);
|
||||||
|
|
||||||
if AType = stNone then
|
if AType = stNone then
|
||||||
QtTreeWidget.SortEnabled := False
|
QtTreeWidget.Header.SetSortIndicatorVisible(False)
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
QtTreeWidget.SortEnabled := True;
|
with QtTreeWidget.Header do
|
||||||
{$note for proper implementation of all TSortType
|
begin
|
||||||
we have to implement item sorting roles.
|
SetSortIndicatorVisible(True);
|
||||||
if QtTreeWidget.Header.sortIndicatorOrder = QtDescendingOrder then
|
if (AColumn >= 0) and (AColumn < QtTreeWidget.ColCount) then
|
||||||
QtTreeWidget.sortItems(AColumn, QtAscendingOrder)
|
SetSortIndicator(AColumn, QtAscendingOrder);
|
||||||
else
|
end;
|
||||||
QtTreeWidget.sortItems(AColumn, QtDescendingOrder);
|
|
||||||
}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user