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:
zeljko 2007-10-04 14:26:06 +00:00
parent b872b7d1f0
commit 913a6539fa

View File

@ -42,6 +42,7 @@ uses
type type
// forward declarations // forward declarations
TQtListWidget = class; TQtListWidget = class;
TQtViewPort = class;
TByteSet = set of byte; TByteSet = set of byte;
@ -107,7 +108,7 @@ type
LCLObject: TWinControl; LCLObject: TWinControl;
public public
constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); virtual; reintroduce; 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 InitializeWidget;
procedure DeInitializeWidget; procedure DeInitializeWidget;
procedure RecreateWidget; procedure RecreateWidget;
@ -274,7 +275,7 @@ type
TQtAbstractScrollArea = class(TQtFrame) TQtAbstractScrollArea = class(TQtFrame)
private private
FCornerWidget: TQtWidget; FCornerWidget: TQtWidget;
FViewPortWidget: TQtWidget; FViewPortWidget: TQtViewPort;
FHScrollbar: TQtScrollBar; FHScrollbar: TQtScrollBar;
FVScrollbar: TQtScrollbar; FVScrollbar: TQtScrollbar;
protected protected
@ -289,7 +290,7 @@ type
function cornerWidget: TQtWidget; function cornerWidget: TQtWidget;
function horizontalScrollBar: TQtScrollBar; function horizontalScrollBar: TQtScrollBar;
function verticalScrollBar: TQtScrollBar; function verticalScrollBar: TQtScrollBar;
function viewport: TQtWidget; function viewport: TQtViewPort;
function getClientBounds: TRect; override; function getClientBounds: TRect; override;
procedure grabMouse; override; procedure grabMouse; override;
procedure SetColor(const Value: PQColor); override; procedure SetColor(const Value: PQColor); override;
@ -303,6 +304,17 @@ type
procedure viewportNeeded; procedure viewportNeeded;
end; 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 } { TQtGraphicView }
TQtGraphicsView = class(TQtAbstractScrollArea) TQtGraphicsView = class(TQtAbstractScrollArea)
@ -6365,6 +6377,47 @@ begin
QDialog_setSizeGripEnabled(QDialogH(Widget), AEnabled); QDialog_setSizeGripEnabled(QDialogH(Widget), AEnabled);
end; 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 } { TQtAbstractScrollArea }
{------------------------------------------------------------------------------ {------------------------------------------------------------------------------
@ -6403,18 +6456,29 @@ end;
function TQtAbstractScrollArea.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; function TQtAbstractScrollArea.EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl;
begin begin
if QEvent_type(Event) = QEventPaint then case QEvent_type(Event) of
Result := False QEventPaint,
else QEventMouseButtonPress,
Result := inherited EventFilter(Sender, Event); 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; end;
procedure TQtAbstractScrollArea.ViewPortEventFilter(event: QEventH; retval: PBoolean); cdecl; procedure TQtAbstractScrollArea.ViewPortEventFilter(event: QEventH; retval: PBoolean); cdecl;
begin begin
{$ifdef VerboseViewPortEventFilter} {$ifdef VerboseViewPortEventFilter}
WriteLn(QEvent_type(Event)); WriteLn('ViewPortEventFilter ',QEvent_type(Event));
{$endif} {$endif}
retval^ := QLCLAbstractScrollArea_InheritedViewportEvent(QLCLAbstractScrollAreaH(Widget), event); retval^ := false;
// QLCLAbstractScrollArea_InheritedViewportEvent(QLCLAbstractScrollAreaH(Widget), event);
end; end;
procedure TQtAbstractScrollArea.DestroyNotify(AWidget: TQtWidget); procedure TQtAbstractScrollArea.DestroyNotify(AWidget: TQtWidget);
@ -6573,7 +6637,7 @@ end;
Params: None Params: None
Returns: viewport widget of QAbstractScrollArea Returns: viewport widget of QAbstractScrollArea
------------------------------------------------------------------------------} ------------------------------------------------------------------------------}
function TQtAbstractScrollArea.viewport: TQtWidget; function TQtAbstractScrollArea.viewport: TQtViewport;
begin begin
viewportNeeded; viewportNeeded;
Result := FViewPortWidget; Result := FViewPortWidget;
@ -6585,7 +6649,7 @@ begin
if (FVScrollbar <> nil) and (FVScrollbar.getVisible) then if (FVScrollbar <> nil) and (FVScrollbar.getVisible) then
dec(Result.Right, FVScrollBar.getWidth); dec(Result.Right, FVScrollBar.getWidth);
if (FHScrollbar <> nil) and (FHScrollbar.getVisible) then if (FHScrollbar <> nil) and (FHScrollbar.getVisible) then
dec(Result.Bottom, FHScrollBar.getHeight); dec(Result.Bottom, FHScrollBar.getHeight);
end; end;
@ -6617,13 +6681,13 @@ begin
if AViewPort = nil then if AViewPort = nil then
begin begin
FillChar(AParams, SizeOf(AParams), #0); FillChar(AParams, SizeOf(AParams), #0);
FViewPortWidget := TQtWidget.Create(LCLObject, AParams); FViewPortWidget := TQtViewPort.Create(LCLObject, AParams);
FViewPortWidget.setFocusProxy(Widget); FViewPortWidget.setFocusProxy(Widget);
FViewPortWidget.setBackgroundRole(QPaletteNoRole); FViewPortWidget.setBackgroundRole(QPaletteNoRole);
FViewPortWidget.setAutoFillBackground(False); FViewPortWidget.setAutoFillBackground(False);
end else end else
begin begin
FViewPortWidget := TQtWidget.CreateFrom(LCLObject, AViewPort); FViewPortWidget := TQtViewPort.CreateFrom(LCLObject, AViewPort);
end; end;
FViewPortWidget.FOwner := Self; FViewPortWidget.FOwner := Self;
FViewPortWidget.AttachEvents; // some event will be redirected to scroll area FViewPortWidget.AttachEvents; // some event will be redirected to scroll area