Files
libreoffice/vcl/inc/qt5/QtInstanceDrawingArea.hxx

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

57 lines
1.8 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#pragma once
#include "QtInstanceWidget.hxx"
#include <QtWidgets/QLabel>
class QtInstanceDrawingArea : public QtInstanceWidget, public virtual weld::DrawingArea
{
Q_OBJECT
QLabel* m_pLabel;
ScopedVclPtrInstance<VirtualDevice> m_xDevice;
public:
QtInstanceDrawingArea(QLabel* pLabel);
virtual void queue_draw() override;
virtual void queue_draw_area(int x, int y, int width, int height) override;
virtual void enable_drag_source(rtl::Reference<TransferDataContainer>& rTransferable,
sal_uInt8 eDNDConstants) override;
virtual void set_cursor(PointerStyle ePointerStyle) override;
virtual Point get_pointer_position() const override;
virtual void set_input_context(const InputContext& rInputContext) override;
virtual void im_context_set_cursor_location(const tools::Rectangle& rCursorRect,
int nExtTextInputWidth) override;
virtual OutputDevice& get_ref_device() override;
virtual a11yref get_accessible_parent() override;
virtual a11yrelationset get_accessible_relation_set() override;
virtual AbsoluteScreenPixelPoint get_accessible_location_on_screen() override;
tdf#130857 qt weld: Implement simple drawing in QtInstanceDrawingArea Implement simple drawing in QtInstanceDrawingArea by handling the QEvent::Resize and QEvent::Paint events for the QLabel widget. While the QLabel does not emit any signals when these events occur, it's possible to handle them by setting an event filter using QObject::installEventFilter [1]. Install QtInstanceDrawingArea as an event filter for its label, and implement handling of the Resize and Paint event in QtInstanceDrawingArea::eventFilter: On the QEvent::Resize event, adjust the output size of the output device and call the `weld::Widget::m_aSizeAllocateHdl` handler. (See also GtkInstanceDrawingArea::signal_size_allocate and SalInstanceDrawingArea::ResizeHdl to see what the gtk3 and VCL implementations do.) On the QEvent::Paint event, trigger drawing on the output device via the weld::DrawingArea::m_aDrawHdl handler, and get a QPixmap for what's painted on the output device and set that QPixmap for the label if it has changed. With this in place, the GtkDrawingArea in the "Help" -> "Show Tip of the Day" dialog displays the image as expected, and gets updated when moving to the next tip, once support for that dialog has been declared, which will be done in an upcoming commit. For more complex cases, a more performant solution might become necessary and can be investigated once support for these is implemented. For the "Tip of the Day" dialog, the `aRect` passed in QtInstanceDrawingArea::handlePaintEvent is irrelevant as CuiGraphicPreviewWindow::Paint doesn't make use of the passed rectangle. (This might also have to be reconsidered/adjusted in case a dialog actually making use of the rectangle doesn't work as expected.) [1] https://doc.qt.io/qt-6/qobject.html#installEventFilter Change-Id: I651e00043fac04a4c77aae921e6397e8d97cc69c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176173 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2024-11-06 22:42:40 +01:00
virtual bool eventFilter(QObject* pObject, QEvent* pEvent) override;
private:
void handlePaintEvent();
void handleResizeEvent();
private:
virtual void click(const Point&) override;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */