From bf7ad8a2f90b6235a258cbffeee6f6bf6e515a77 Mon Sep 17 00:00:00 2001 From: zeljko Date: Wed, 30 Mar 2011 09:53:16 +0000 Subject: [PATCH] Qt: fixed msg providing to LCL when deselection of items occured by mouse click into listview viewport. issue #18972 git-svn-id: trunk@30078 - --- lcl/interfaces/qt/qtwidgets.pas | 43 ++++++++++++++++++++++++++++--- lcl/interfaces/qt/qtwscomctrls.pp | 2 ++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 31ca3d16dd..d0f669358b 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -1086,6 +1086,7 @@ type TQtListWidget = class(TQtListView) private + FSavedSelection: TPtrIntArray; FCurrentItemChangedHook: QListWidget_hookH; FSelectionChangeHook: QListWidget_hookH; FItemClickedHook: QListWidget_hookH; @@ -8692,6 +8693,7 @@ function TQtListWidget.CreateWidget(const AParams: TCreateParams): QWidgetH; var Parent: QWidgetH; begin + SetLength(FSavedSelection, 0); FSavedEvent := nil; FSavedEventTimer := nil; FSavedEventTimerHook := nil; @@ -8899,7 +8901,17 @@ begin if QEvent_type(Event) = QEventMouseButtonRelease then PostponedMouseRelease(Event) else + begin + if (QEvent_type(Event) = QEventMouseButtonPress) then + begin + MousePos := QMouseEvent_pos(QMouseEventH(Event))^; + Item := itemAt(MousePos.x, MousePos.y); + if Item = nil then + FSavedSelection := selectedItems; + end; + Result := inherited itemViewViewportEventFilter(Sender, Event); + end; end else case QEvent_type(Event) of QEventMouseButtonPress, @@ -8952,7 +8964,10 @@ begin NMLV.hdr.hwndfrom := LCLObject.Handle; NMLV.hdr.code := LVN_ITEMCHANGING; - AIndex := getRow(Current); + if Current <> nil then + AIndex := getRow(Current) + else + AIndex := -1; ASubIndex := 0; @@ -9016,6 +9031,8 @@ end; procedure TQtListWidget.signalSelectionChanged(); cdecl; var Msg: TLMessage; + i: Integer; + Item: QListWidgetItemH; begin {$ifdef VerboseQt} WriteLn('TQtListWidget.signalSelectionChange'); @@ -9027,13 +9044,31 @@ begin Exit; end; - if ViewStyle >= 0 then + if (ViewStyle >= 0) and (InUpdate or + (not InUpdate and (length(FSavedSelection) = 0)) ) then exit; FillChar(Msg, SizeOf(Msg), #0); Msg.Msg := LM_SELCHANGE; - if (getSelCount > 0) and (FChildOfComplexWidget <> ccwComboBox) then - DeliverMessage(Msg); + if (FChildOfComplexWidget <> ccwComboBox) then + begin + if (ViewStyle < 0) and (getSelCount > 0) then + DeliverMessage(Msg) + else + if (ViewStyle >= 0) then + begin + if getSelCount = 0 then + begin + for i := 0 to High(FSavedSelection) do + begin + Item := QListWidgetItemH(FSavedSelection[i]); + if (Item <> nil) then + signalItemClicked(Item); + end; + end; + setLength(FSavedSelection, 0); + end; + end; end; procedure TQtListWidget.signalItemTextChanged(ANewText: PWideString); cdecl; diff --git a/lcl/interfaces/qt/qtwscomctrls.pp b/lcl/interfaces/qt/qtwscomctrls.pp index c231abd882..2a5b803f9b 100644 --- a/lcl/interfaces/qt/qtwscomctrls.pp +++ b/lcl/interfaces/qt/qtwscomctrls.pp @@ -1243,10 +1243,12 @@ begin begin QtListWidget := TQtListWidget(ALV.Handle); LWI := QtListWidget.getItem(AIndex); + QtListWidget.BeginUpdate; case AState of lisFocused: QtListWidget.setCurrentItem(LWI); lisSelected: QtListWidget.setItemSelected(LWI, AIsSet); end; + QtListWidget.EndUpdate; end else begin QtTreeWidget := TQtTreeWidget(ALV.Handle);