mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-14 00:40:03 +02:00
Qt: proxy all QMdiArea events to centralwidget.Now all TGraphicControls are correct if they're inside QMdiArea.
git-svn-id: trunk@51648 -
This commit is contained in:
parent
fd3ff3b9c5
commit
1f33db1190
@ -594,6 +594,8 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(const AParent: QWidgetH); overload;
|
constructor Create(const AParent: QWidgetH); overload;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
function getClientOffset: TPoint; override;
|
||||||
|
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
|
||||||
procedure AttachEvents; override;
|
procedure AttachEvents; override;
|
||||||
procedure DetachEvents; override;
|
procedure DetachEvents; override;
|
||||||
function ActiveSubWindow: QMdiSubWindowH;
|
function ActiveSubWindow: QMdiSubWindowH;
|
||||||
@ -658,6 +660,10 @@ type
|
|||||||
|
|
||||||
function MapToGlobal(APt: TPoint; const AWithScrollOffset: Boolean = False): TPoint; override;
|
function MapToGlobal(APt: TPoint; const AWithScrollOffset: Boolean = False): TPoint; override;
|
||||||
|
|
||||||
|
procedure Update(ARect: PRect = nil); override;
|
||||||
|
procedure UpdateRegion(ARgn: QRegionH); override;
|
||||||
|
procedure Repaint(ARect: PRect = nil); override;
|
||||||
|
|
||||||
procedure Resize(ANewWidth, ANewHeight: Integer); override;
|
procedure Resize(ANewWidth, ANewHeight: Integer); override;
|
||||||
procedure setText(const W: WideString); override;
|
procedure setText(const W: WideString); override;
|
||||||
procedure setMenuBar(AMenuBar: QMenuBarH);
|
procedure setMenuBar(AMenuBar: QMenuBarH);
|
||||||
@ -6360,6 +6366,11 @@ begin
|
|||||||
Palette.ForceColor := False;
|
Palette.ForceColor := False;
|
||||||
FSubWindowActivationHook := QMdiArea_hook_create(Widget);
|
FSubWindowActivationHook := QMdiArea_hook_create(Widget);
|
||||||
QMdiArea_hook_hook_subWindowActivated(FSubWindowActivationHook, @SubWindowActivated);
|
QMdiArea_hook_hook_subWindowActivated(FSubWindowActivationHook, @SubWindowActivated);
|
||||||
|
QWidget_setMouseTracking(Widget, True);
|
||||||
|
FillChar(FPaintData, sizeOf(FPaintData), 0);
|
||||||
|
setProperty(Widget, 'lclwidget', Int64(PtrUInt(Self)));
|
||||||
|
setProperty(viewportWidget, 'lclwidget', Int64(PtrUInt(Self)));
|
||||||
|
QtWidgetSet.AddHandle(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TQtMDIArea.Destroy;
|
destructor TQtMDIArea.Destroy;
|
||||||
@ -6372,6 +6383,14 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtMDIArea.getClientOffset: TPoint;
|
||||||
|
begin
|
||||||
|
if Assigned(FOwner) then
|
||||||
|
Result := FOwner.getClientOffset
|
||||||
|
else
|
||||||
|
Result := inherited getClientOffset;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TQtMDIArea.AttachEvents;
|
procedure TQtMDIArea.AttachEvents;
|
||||||
begin
|
begin
|
||||||
inherited AttachEvents;
|
inherited AttachEvents;
|
||||||
@ -6389,6 +6408,23 @@ begin
|
|||||||
inherited DetachEvents;
|
inherited DetachEvents;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TQtMDIArea.EventFilter(Sender: QObjectH; Event: QEventH): Boolean;
|
||||||
|
cdecl;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
QEvent_accept(Event);
|
||||||
|
case QEvent_type(Event) of
|
||||||
|
QEventPaint: ;
|
||||||
|
QEventMouseButtonPress, QEventMouseButtonRelease,
|
||||||
|
QEventMouseButtonDblClick: ;
|
||||||
|
QEventMouseMove, QEventWheel: ;
|
||||||
|
QEventEnter,
|
||||||
|
QEventLeave: Result := SlotMouseEnter(Sender, Event);
|
||||||
|
else
|
||||||
|
Result:=inherited EventFilter(Sender, Event);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TQtMDIArea.ScrollViewEventFilter(Sender: QObjectH; Event: QEventH
|
function TQtMDIArea.ScrollViewEventFilter(Sender: QObjectH; Event: QEventH
|
||||||
): boolean; cdecl;
|
): boolean; cdecl;
|
||||||
var
|
var
|
||||||
@ -6396,30 +6432,105 @@ var
|
|||||||
Brush: QBrushH;
|
Brush: QBrushH;
|
||||||
Color: TQColor;
|
Color: TQColor;
|
||||||
Painter: QPainterH;
|
Painter: QPainterH;
|
||||||
|
APoint, APos, AOldPos, ANewPos: TQtPoint;
|
||||||
|
AEvent: QEventH;
|
||||||
|
APaintEvent: QPaintEventH;
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
QEvent_accept(Event);
|
QEvent_accept(Event);
|
||||||
if QEvent_type(Event) = QEventPaint then
|
case QEvent_type(Event) of
|
||||||
begin
|
QEventMouseButtonPress, QEventMouseButtonRelease,
|
||||||
QPaintEvent_rect(QPaintEventH(Event), @R);
|
QEventMouseButtonDblClick:
|
||||||
if CanSendLCLMessage and (LCLObject is TWinControl) then
|
|
||||||
begin
|
begin
|
||||||
Brush := QBrush_create;
|
// new event with parent coordinates
|
||||||
QMdiArea_background(QMDIAreaH(Widget), Brush);
|
APos := QMouseEvent_pos(QMouseEventH(Event))^;
|
||||||
Color := QBrush_color(Brush)^;
|
QWidget_mapToParent(Widget, @APoint, @APos);
|
||||||
QBrush_destroy(Brush);
|
AEvent := QMouseEvent_create(QEvent_type(Event), @APoint, QMouseEvent_globalPos(QMouseEventH(Event)),
|
||||||
Painter := QPainter_create(QWidget_to_QPaintDevice(QWidgetH(Sender)));
|
QMouseEvent_button(QMouseEventH(Event)), QMouseEvent_buttons(QMouseEventH(Event)), QInputEvent_modifiers(QInputEventH(Event)));
|
||||||
Brush := QBrush_create(@Color, QtSolidPattern);
|
|
||||||
try
|
try
|
||||||
QPaintEvent_rect(QPaintEventH(Event), @R);
|
Result := SlotMouse(Sender, AEvent);
|
||||||
QPainter_fillRect(Painter, @R, Brush);
|
|
||||||
QPainter_end(Painter);
|
|
||||||
finally
|
finally
|
||||||
QBrush_destroy(Brush);
|
QEvent_destroy(AEvent);
|
||||||
QPainter_destroy(Painter);
|
end;
|
||||||
|
end;
|
||||||
|
QEventMouseMove:
|
||||||
|
begin
|
||||||
|
AOldPos := QMouseEvent_globalPos(QMouseEventH(Event))^;
|
||||||
|
APos := QMouseEvent_pos(QMouseEventH(Event))^;
|
||||||
|
QWidget_mapToParent(Widget, @APoint, @APos);
|
||||||
|
AEvent := QMouseEvent_create(QEvent_type(Event), @APoint, QMouseEvent_globalPos(QMouseEventH(Event)),
|
||||||
|
QMouseEvent_button(QMouseEventH(Event)), QMouseEvent_buttons(QMouseEventH(Event)), QInputEvent_modifiers(QInputEventH(Event)));
|
||||||
|
try
|
||||||
|
Result := SlotMouseMove(Sender, AEvent);
|
||||||
|
finally
|
||||||
|
QEvent_destroy(AEvent);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
QEventWheel:
|
||||||
|
begin
|
||||||
|
APos := QWheelEvent_pos(QWheelEventH(Event))^;
|
||||||
|
QWidget_mapToParent(Widget, @APoint, @APos);
|
||||||
|
AEvent := QWheelEvent_create(@APoint, QWheelEvent_delta(QWheelEventH(Event)), QWheelEvent_buttons(QWheelEventH(Event)),
|
||||||
|
QInputEvent_modifiers(QInputEventH(Event)), QWheelEvent_orientation(QWheelEventH(Event)));
|
||||||
|
try
|
||||||
|
Result := SlotMouseWheel(Sender, AEvent);
|
||||||
|
finally
|
||||||
|
QEvent_destroy(AEvent);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
QEventEnter,
|
||||||
|
QEventLeave: Result := SlotMouseEnter(Sender, Event);
|
||||||
|
QEventHoverEnter,
|
||||||
|
QEventHoverLeave,
|
||||||
|
QEventHoverMove:
|
||||||
|
begin
|
||||||
|
APos := QHoverEvent_pos(QHoverEventH(Event))^;
|
||||||
|
AOldPos := QHoverEvent_oldPos(QHoverEventH(Event))^;
|
||||||
|
QWidget_mapToParent(Widget, @APoint, @APos);
|
||||||
|
QWidget_mapToParent(Widget, @ANewPos, @AOldPos);
|
||||||
|
QHoverEvent_create(QEvent_type(Event), @APoint, @ANewPos);
|
||||||
|
try
|
||||||
|
Result := SlotHover(Sender, AEvent);
|
||||||
|
finally
|
||||||
|
QEvent_destroy(AEvent);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
QEventPaint:
|
||||||
|
begin
|
||||||
|
QPaintEvent_rect(QPaintEventH(Event), @R);
|
||||||
|
if CanSendLCLMessage and (LCLObject is TWinControl) then
|
||||||
|
begin
|
||||||
|
Brush := QBrush_create;
|
||||||
|
QMdiArea_background(QMDIAreaH(Widget), Brush);
|
||||||
|
Color := QBrush_color(Brush)^;
|
||||||
|
QBrush_destroy(Brush);
|
||||||
|
Painter := QPainter_create(QWidget_to_QPaintDevice(QWidgetH(Sender)));
|
||||||
|
Brush := QBrush_create(@Color, QtSolidPattern);
|
||||||
|
try
|
||||||
|
QPaintEvent_rect(QPaintEventH(Event), @R);
|
||||||
|
QPainter_fillRect(Painter, @R, Brush);
|
||||||
|
QPainter_end(Painter);
|
||||||
|
finally
|
||||||
|
QBrush_destroy(Brush);
|
||||||
|
QPainter_destroy(Painter);
|
||||||
|
end;
|
||||||
|
APos.X := 0;
|
||||||
|
APos.Y := 0;
|
||||||
|
QWidget_mapToParent(Widget, @APoint, @APos);
|
||||||
|
FScrollX := -APoint.x;
|
||||||
|
FScrollY := -APoint.Y;
|
||||||
|
APaintEvent := QPaintEvent_create(PRect(@R));
|
||||||
|
try
|
||||||
|
SlotPaint(Sender, Event);
|
||||||
|
finally
|
||||||
|
FScrollX := 0;
|
||||||
|
FScrollY := 0;
|
||||||
|
QPaintEvent_destroy(APaintEvent);
|
||||||
|
end;
|
||||||
|
Result := True; // do not paint MDIArea again
|
||||||
end;
|
end;
|
||||||
SlotPaint(Sender, Event);
|
|
||||||
Result := True; // do not paint MDIArea again
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -6674,6 +6785,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
FCentralWidget := QWidget_create(Result);
|
FCentralWidget := QWidget_create(Result);
|
||||||
MDIAreaHandle := TQtMDIArea.Create(Result);
|
MDIAreaHandle := TQtMDIArea.Create(Result);
|
||||||
|
MDIAreaHandle.FOwner := Self;
|
||||||
MDIAreaHandle.LCLObject := LCLObject;
|
MDIAreaHandle.LCLObject := LCLObject;
|
||||||
MDIAreaHandle.AttachEvents;
|
MDIAreaHandle.AttachEvents;
|
||||||
p := QWidget_palette(FCentralWidget);
|
p := QWidget_palette(FCentralWidget);
|
||||||
@ -6944,6 +7056,66 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtMainWindow.Update(ARect: PRect);
|
||||||
|
var
|
||||||
|
R,R1: TRect;
|
||||||
|
begin
|
||||||
|
if Assigned(MDIAreaHandle) and not IsMDIChild then
|
||||||
|
begin
|
||||||
|
if ARect = nil then
|
||||||
|
QWidget_update(MDIAreaHandle.viewportWidget)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
R1 := ARect^;
|
||||||
|
QWidget_geometry(MDIAreaHandle.Widget, @R);
|
||||||
|
OffsetRect(R1, -R.Left, -R.Top);
|
||||||
|
QWidget_update(MDIAreaHandle.viewportWidget, @R1);
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
inherited Update(ARect);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtMainWindow.UpdateRegion(ARgn: QRegionH);
|
||||||
|
var
|
||||||
|
R1, R: TRect;
|
||||||
|
ANewRgn: QRegionH;
|
||||||
|
begin
|
||||||
|
if Assigned(MDIAreaHandle) and not IsMDIChild then
|
||||||
|
begin
|
||||||
|
if ARgn = nil then
|
||||||
|
QWidget_update(MDIAreaHandle.viewportWidget)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
QRegion_boundingRect(ARgn, @R1);
|
||||||
|
QWidget_geometry(MDIAreaHandle.Widget, @R);
|
||||||
|
OffsetRect(R1, -R.Left, -R.Top);
|
||||||
|
ANewRgn := QRegion_create(PRect(@R1));
|
||||||
|
QWidget_update(MDIAreaHandle.viewportWidget, ANewRgn);
|
||||||
|
QRegion_destroy(ANewRgn);
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
inherited UpdateRegion(ARgn);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtMainWindow.Repaint(ARect: PRect);
|
||||||
|
var
|
||||||
|
R, R1: TRect;
|
||||||
|
begin
|
||||||
|
if Assigned(MDIAreaHandle) and not IsMDIChild then
|
||||||
|
begin
|
||||||
|
if ARect = nil then
|
||||||
|
QWidget_repaint(MDIAreaHandle.viewportWidget)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
R1 := ARect^;
|
||||||
|
QWidget_geometry(MDIAreaHandle.Widget, @R);
|
||||||
|
OffsetRect(R1, -R.Left, -R.Top);
|
||||||
|
QWidget_repaint(MDIAreaHandle.viewportWidget, @R1);
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
inherited Repaint(ARect);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TQtMainWindow.Resize(ANewWidth, ANewHeight: Integer);
|
procedure TQtMainWindow.Resize(ANewWidth, ANewHeight: Integer);
|
||||||
begin
|
begin
|
||||||
if not IsMDIChild and
|
if not IsMDIChild and
|
||||||
|
Loading…
Reference in New Issue
Block a user