mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-12 10:39:08 +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
|
||||
constructor Create(const AParent: QWidgetH); overload;
|
||||
destructor Destroy; override;
|
||||
function getClientOffset: TPoint; override;
|
||||
function EventFilter(Sender: QObjectH; Event: QEventH): Boolean; cdecl; override;
|
||||
procedure AttachEvents; override;
|
||||
procedure DetachEvents; override;
|
||||
function ActiveSubWindow: QMdiSubWindowH;
|
||||
@ -658,6 +660,10 @@ type
|
||||
|
||||
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 setText(const W: WideString); override;
|
||||
procedure setMenuBar(AMenuBar: QMenuBarH);
|
||||
@ -6360,6 +6366,11 @@ begin
|
||||
Palette.ForceColor := False;
|
||||
FSubWindowActivationHook := QMdiArea_hook_create(Widget);
|
||||
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;
|
||||
|
||||
destructor TQtMDIArea.Destroy;
|
||||
@ -6372,6 +6383,14 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
function TQtMDIArea.getClientOffset: TPoint;
|
||||
begin
|
||||
if Assigned(FOwner) then
|
||||
Result := FOwner.getClientOffset
|
||||
else
|
||||
Result := inherited getClientOffset;
|
||||
end;
|
||||
|
||||
procedure TQtMDIArea.AttachEvents;
|
||||
begin
|
||||
inherited AttachEvents;
|
||||
@ -6389,6 +6408,23 @@ begin
|
||||
inherited DetachEvents;
|
||||
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
|
||||
): boolean; cdecl;
|
||||
var
|
||||
@ -6396,30 +6432,105 @@ var
|
||||
Brush: QBrushH;
|
||||
Color: TQColor;
|
||||
Painter: QPainterH;
|
||||
APoint, APos, AOldPos, ANewPos: TQtPoint;
|
||||
AEvent: QEventH;
|
||||
APaintEvent: QPaintEventH;
|
||||
begin
|
||||
Result := False;
|
||||
QEvent_accept(Event);
|
||||
if QEvent_type(Event) = QEventPaint then
|
||||
begin
|
||||
QPaintEvent_rect(QPaintEventH(Event), @R);
|
||||
if CanSendLCLMessage and (LCLObject is TWinControl) then
|
||||
case QEvent_type(Event) of
|
||||
QEventMouseButtonPress, QEventMouseButtonRelease,
|
||||
QEventMouseButtonDblClick:
|
||||
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);
|
||||
// new event with parent coordinates
|
||||
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
|
||||
QPaintEvent_rect(QPaintEventH(Event), @R);
|
||||
QPainter_fillRect(Painter, @R, Brush);
|
||||
QPainter_end(Painter);
|
||||
Result := SlotMouse(Sender, AEvent);
|
||||
finally
|
||||
QBrush_destroy(Brush);
|
||||
QPainter_destroy(Painter);
|
||||
QEvent_destroy(AEvent);
|
||||
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;
|
||||
SlotPaint(Sender, Event);
|
||||
Result := True; // do not paint MDIArea again
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@ -6674,6 +6785,7 @@ begin
|
||||
begin
|
||||
FCentralWidget := QWidget_create(Result);
|
||||
MDIAreaHandle := TQtMDIArea.Create(Result);
|
||||
MDIAreaHandle.FOwner := Self;
|
||||
MDIAreaHandle.LCLObject := LCLObject;
|
||||
MDIAreaHandle.AttachEvents;
|
||||
p := QWidget_palette(FCentralWidget);
|
||||
@ -6944,6 +7056,66 @@ begin
|
||||
{$ENDIF}
|
||||
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);
|
||||
begin
|
||||
if not IsMDIChild and
|
||||
|
Loading…
Reference in New Issue
Block a user