mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-07 13:20:26 +02:00
Qt: Introduced new class - TQtViewPort. Known problems: Mouse wheel does not work inside some TCustomControls (eg.SynEdit, TTreeView), but works inside eg. TStringGrid.
git-svn-id: trunk@12312 -
This commit is contained in:
parent
b872b7d1f0
commit
913a6539fa
@ -42,6 +42,7 @@ uses
|
||||
type
|
||||
// forward declarations
|
||||
TQtListWidget = class;
|
||||
TQtViewPort = class;
|
||||
|
||||
TByteSet = set of byte;
|
||||
|
||||
@ -107,7 +108,7 @@ type
|
||||
LCLObject: TWinControl;
|
||||
public
|
||||
constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); virtual; reintroduce;
|
||||
constructor CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH);
|
||||
constructor CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH); virtual;
|
||||
procedure InitializeWidget;
|
||||
procedure DeInitializeWidget;
|
||||
procedure RecreateWidget;
|
||||
@ -274,7 +275,7 @@ type
|
||||
TQtAbstractScrollArea = class(TQtFrame)
|
||||
private
|
||||
FCornerWidget: TQtWidget;
|
||||
FViewPortWidget: TQtWidget;
|
||||
FViewPortWidget: TQtViewPort;
|
||||
FHScrollbar: TQtScrollBar;
|
||||
FVScrollbar: TQtScrollbar;
|
||||
protected
|
||||
@ -289,7 +290,7 @@ type
|
||||
function cornerWidget: TQtWidget;
|
||||
function horizontalScrollBar: TQtScrollBar;
|
||||
function verticalScrollBar: TQtScrollBar;
|
||||
function viewport: TQtWidget;
|
||||
function viewport: TQtViewPort;
|
||||
function getClientBounds: TRect; override;
|
||||
procedure grabMouse; override;
|
||||
procedure SetColor(const Value: PQColor); override;
|
||||
@ -303,6 +304,17 @@ type
|
||||
procedure viewportNeeded;
|
||||
end;
|
||||
|
||||
{ TQtViewPort }
|
||||
TQtViewPort = class(TQtWidget)
|
||||
public
|
||||
ParentArea: TQtAbstractScrollArea;
|
||||
constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); override;
|
||||
constructor CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH); override;
|
||||
function getClientBounds: TRect; override;
|
||||
procedure OffsetMousePos(APoint: PQtPoint); override;
|
||||
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
|
||||
end;
|
||||
|
||||
{ TQtGraphicView }
|
||||
|
||||
TQtGraphicsView = class(TQtAbstractScrollArea)
|
||||
@ -6365,6 +6377,47 @@ begin
|
||||
QDialog_setSizeGripEnabled(QDialogH(Widget), AEnabled);
|
||||
end;
|
||||
|
||||
|
||||
{ TQtViewPort }
|
||||
constructor TQtViewPort.Create(const AWinControl: TWinControl; const AParams: TCreateParams);
|
||||
begin
|
||||
inherited Create(AWinControl, AParams);
|
||||
ParentArea := TQtAbstractScrollArea(AWinControl.Handle);
|
||||
end;
|
||||
|
||||
constructor TQtViewPort.CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH);
|
||||
begin
|
||||
inherited CreateFrom(AWinControl, AWidget);
|
||||
ParentArea := TQtAbstractScrollArea(AWinControl.Handle);
|
||||
end;
|
||||
|
||||
function TQtViewPort.getClientBounds: TRect;
|
||||
begin
|
||||
Result := inherited getClientBounds;
|
||||
end;
|
||||
|
||||
procedure TQtViewPort.OffsetMousePos(APoint: PQtPoint);
|
||||
begin
|
||||
inherited OffsetMousePos(APoint);
|
||||
end;
|
||||
|
||||
function TQtViewPort.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
|
||||
var
|
||||
R: TRect;
|
||||
begin
|
||||
case QEvent_type(Event) of
|
||||
QEventResize: Result := False;
|
||||
QEventLayoutRequest:
|
||||
begin
|
||||
{TODO: we'll never catch this place, since layout request comes
|
||||
into scrollarea only. arghhh ?!$Q#$!#!# }
|
||||
Result := False;
|
||||
end;
|
||||
else
|
||||
Result := inherited EventFilter(Sender, Event);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TQtAbstractScrollArea }
|
||||
|
||||
{------------------------------------------------------------------------------
|
||||
@ -6403,18 +6456,29 @@ end;
|
||||
|
||||
function TQtAbstractScrollArea.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
|
||||
begin
|
||||
if QEvent_type(Event) = QEventPaint then
|
||||
Result := False
|
||||
else
|
||||
Result := inherited EventFilter(Sender, Event);
|
||||
case QEvent_type(Event) of
|
||||
QEventPaint,
|
||||
QEventMouseButtonPress,
|
||||
QEventMouseButtonRelease,
|
||||
QEventMouseButtonDblClick: Result := False;
|
||||
QEventLayoutRequest:
|
||||
begin
|
||||
Result := False;
|
||||
{TODO: Check what we can do here with viewport, seem that this
|
||||
comes too late (after few resize events ...) }
|
||||
end;
|
||||
else
|
||||
Result := inherited EventFilter(Sender, Event);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TQtAbstractScrollArea.ViewPortEventFilter(event: QEventH; retval: PBoolean); cdecl;
|
||||
begin
|
||||
{$ifdef VerboseViewPortEventFilter}
|
||||
WriteLn(QEvent_type(Event));
|
||||
WriteLn('ViewPortEventFilter ',QEvent_type(Event));
|
||||
{$endif}
|
||||
retval^ := QLCLAbstractScrollArea_InheritedViewportEvent(QLCLAbstractScrollAreaH(Widget), event);
|
||||
retval^ := false;
|
||||
// QLCLAbstractScrollArea_InheritedViewportEvent(QLCLAbstractScrollAreaH(Widget), event);
|
||||
end;
|
||||
|
||||
procedure TQtAbstractScrollArea.DestroyNotify(AWidget: TQtWidget);
|
||||
@ -6573,7 +6637,7 @@ end;
|
||||
Params: None
|
||||
Returns: viewport widget of QAbstractScrollArea
|
||||
------------------------------------------------------------------------------}
|
||||
function TQtAbstractScrollArea.viewport: TQtWidget;
|
||||
function TQtAbstractScrollArea.viewport: TQtViewport;
|
||||
begin
|
||||
viewportNeeded;
|
||||
Result := FViewPortWidget;
|
||||
@ -6585,7 +6649,7 @@ begin
|
||||
|
||||
if (FVScrollbar <> nil) and (FVScrollbar.getVisible) then
|
||||
dec(Result.Right, FVScrollBar.getWidth);
|
||||
|
||||
|
||||
if (FHScrollbar <> nil) and (FHScrollbar.getVisible) then
|
||||
dec(Result.Bottom, FHScrollBar.getHeight);
|
||||
end;
|
||||
@ -6617,13 +6681,13 @@ begin
|
||||
if AViewPort = nil then
|
||||
begin
|
||||
FillChar(AParams, SizeOf(AParams), #0);
|
||||
FViewPortWidget := TQtWidget.Create(LCLObject, AParams);
|
||||
FViewPortWidget := TQtViewPort.Create(LCLObject, AParams);
|
||||
FViewPortWidget.setFocusProxy(Widget);
|
||||
FViewPortWidget.setBackgroundRole(QPaletteNoRole);
|
||||
FViewPortWidget.setAutoFillBackground(False);
|
||||
end else
|
||||
begin
|
||||
FViewPortWidget := TQtWidget.CreateFrom(LCLObject, AViewPort);
|
||||
FViewPortWidget := TQtViewPort.CreateFrom(LCLObject, AViewPort);
|
||||
end;
|
||||
FViewPortWidget.FOwner := Self;
|
||||
FViewPortWidget.AttachEvents; // some event will be redirected to scroll area
|
||||
|
Loading…
Reference in New Issue
Block a user