diff options
author | Katarina Behrens <Katarina.Behrens@cib.de> | 2018-08-09 17:14:14 +0200 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2018-08-12 22:25:54 +0200 |
commit | 8d791a9d9657f6573ce27947c0289b36c6eba77c (patch) | |
tree | 0a5a788620f7c7ec4404a45f81e8f3b8c5722db2 /vcl/qt5/Qt5Frame.cxx | |
parent | 20444972edb1dd49af13902a850a8e343d5a60ec (diff) |
Set Qt5Widget to be a central widget of QMainWindow
this is meant to solve the problem of native menu bar overlapping
w/ non-native, as well as the inability to place an object or select
text dragging the mouse cursor w/ LMB pressed
Change-Id: I29f590ebf79d1ecc7e17b402125384cf13774bf3
Reviewed-on: https://gerrit.libreoffice.org/58171
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Diffstat (limited to 'vcl/qt5/Qt5Frame.cxx')
-rw-r--r-- | vcl/qt5/Qt5Frame.cxx | 92 |
1 files changed, 69 insertions, 23 deletions
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index 1a66799d2548..ab8d51fdb336 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -23,6 +23,7 @@ #include <Qt5Instance.hxx> #include <Qt5Graphics.hxx> #include <Qt5Widget.hxx> +#include <Qt5MainWindow.hxx> #include <Qt5Data.hxx> #include <Qt5Menu.hxx> @@ -35,6 +36,7 @@ #include <QtWidgets/QToolTip> #include <QtWidgets/QApplication> #include <QtWidgets/QMenuBar> +#include <QtWidgets/QMainWindow> #include <saldatabasic.hxx> #include <window.h> @@ -52,7 +54,9 @@ static void SvpDamageHandler(void* handle, sal_Int32 nExtentsX, sal_Int32 nExten } Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) - : m_bUseCairo(bUseCairo) + : m_pTopLevel(nullptr) + , m_bUseCairo(bUseCairo) + , m_pSvpGraphics(nullptr) , m_bGraphicsInUse(false) , m_ePointerStyle(PointerStyle::Arrow) , m_bDefaultSize(true) @@ -94,10 +98,14 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) aWinFlags |= Qt::Window; } - if (pParent) - m_pQWidget.reset(createQt5Widget(*this, aWinFlags)); + if (!pParent && (aWinFlags == Qt::Window)) + { + m_pTopLevel = new Qt5MainWindow(*this, nullptr, aWinFlags); + m_pQWidget = createQt5Widget(*this, aWinFlags); + m_pTopLevel->setCentralWidget(m_pQWidget); + } else - m_pQWidget.reset(createQMainWindow(*this, aWinFlags)); + m_pQWidget = createQt5Widget(*this, aWinFlags); if (pParent && !(pParent->m_nStyle & SalFrameStyleFlags::PLUG)) { @@ -110,7 +118,7 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo) // fake an initial geometry, gets updated via configure event or SetPosSize if (m_bDefaultPos || m_bDefaultSize) { - Size aDefSize = CalcDefaultSize(); + Size aDefSize = Size(0, 0); // CalcDefaultSize(); maGeometry.nX = -1; maGeometry.nY = -1; maGeometry.nWidth = aDefSize.Width(); @@ -126,6 +134,10 @@ Qt5Frame::~Qt5Frame() { Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance); pInst->eraseFrame(this); + if (m_pTopLevel) + delete m_pTopLevel; + else + delete m_pQWidget; } void Qt5Frame::Damage(sal_Int32 nExtentsX, sal_Int32 nExtentsY, sal_Int32 nExtentsWidth, @@ -149,8 +161,8 @@ void Qt5Frame::TriggerPaintEvent(QRect aRect) void Qt5Frame::InitSvpSalGraphics(SvpSalGraphics* pSvpSalGraphics) { - int width = m_pQWidget->size().width(); - int height = m_pQWidget->size().height(); + int width = 100; + int height = 100; m_pSvpGraphics = pSvpSalGraphics; m_pSurface.reset(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height)); m_pSvpGraphics->setSurface(m_pSurface.get(), basegfx::B2IVector(width, height)); @@ -205,6 +217,30 @@ bool Qt5Frame::PostEvent(ImplSVEvent* pData) return true; } +bool Qt5Frame::isWindow() +{ + if (m_pTopLevel) + return m_pTopLevel->isWindow(); + else + return m_pQWidget->isWindow(); +} + +QWindow* Qt5Frame::windowHandle() +{ + if (m_pTopLevel) + return m_pTopLevel->windowHandle(); + else + return m_pQWidget->windowHandle(); +} + +QScreen* Qt5Frame::screen() +{ + if (m_pTopLevel) + return m_pTopLevel->windowHandle()->screen(); + else + return m_pQWidget->windowHandle()->screen(); +} + void Qt5Frame::SetTitle(const OUString& rTitle) { m_pQWidget->window()->setWindowTitle(toQString(rTitle)); @@ -216,7 +252,7 @@ void Qt5Frame::SetIcon(sal_uInt16 nIcon) & (SalFrameStyleFlags::PLUG | SalFrameStyleFlags::SYSTEMCHILD | SalFrameStyleFlags::FLOAT | SalFrameStyleFlags::INTRO | SalFrameStyleFlags::OWNERDRAWDECORATION) - || !m_pQWidget->isWindow()) + || !isWindow()) return; const char* appicon; @@ -248,8 +284,11 @@ void Qt5Frame::SetExtendedFrameStyle(SalExtStyle /*nExtStyle*/) {} void Qt5Frame::Show(bool bVisible, bool /*bNoActivate*/) { - assert(m_pQWidget.get()); - m_pQWidget->setVisible(bVisible); + assert(m_pQWidget); + if (m_pTopLevel) + m_pTopLevel->setVisible(bVisible); + else + m_pQWidget->setVisible(bVisible); } void Qt5Frame::SetMinClientSize(long nWidth, long nHeight) @@ -276,8 +315,8 @@ void Qt5Frame::Center() Size Qt5Frame::CalcDefaultSize() { - assert(m_pQWidget->isWindow()); - QScreen* pScreen = m_pQWidget->windowHandle()->screen(); + assert(isWindow()); + QScreen* pScreen = screen(); if (!pScreen) return Size(); return bestmaxFrameSizeForScreenSize(toSize(pScreen->size())); @@ -292,7 +331,7 @@ void Qt5Frame::SetDefaultSize() void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags) { - if (!m_pQWidget->isWindow() || isChild(true, false)) + if (!isWindow() || isChild(true, false)) return; if ((nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT)) @@ -314,7 +353,12 @@ void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt1 { if (m_pParent) { - QRect aRect = m_pParent->GetQWidget()->geometry(); + QRect aRect; + if (m_pParent->GetTopLevelWindow()) + aRect = m_pParent->GetTopLevelWindow()->geometry(); + else + aRect = m_pParent->GetQWidget()->geometry(); + nX += aRect.x(); nY += aRect.y(); } @@ -339,9 +383,9 @@ void Qt5Frame::GetClientSize(long& rWidth, long& rHeight) void Qt5Frame::GetWorkArea(tools::Rectangle& rRect) { - if (!m_pQWidget->isWindow()) + if (!isWindow()) return; - QScreen* pScreen = m_pQWidget->windowHandle()->screen(); + QScreen* pScreen = screen(); if (!pScreen) return; @@ -353,19 +397,21 @@ SalFrame* Qt5Frame::GetParent() const { return m_pParent; } void Qt5Frame::SetModal(bool bModal) { - if (m_pQWidget->isWindow()) + if (isWindow()) { + if (m_pTopLevel) + m_pTopLevel->setVisible(true); // modality change is only effective if the window is hidden - m_pQWidget->windowHandle()->hide(); - m_pQWidget->windowHandle()->setModality(bModal ? Qt::WindowModal : Qt::NonModal); + windowHandle()->hide(); + windowHandle()->setModality(bModal ? Qt::WindowModal : Qt::NonModal); // and shown again - m_pQWidget->windowHandle()->show(); + windowHandle()->show(); } } void Qt5Frame::SetWindowState(const SalFrameState* pState) { - if (!m_pQWidget->isWindow() || !pState || isChild(true, false)) + if (!isWindow() || !pState || isChild(true, false)) return; const WindowStateMask nMaxGeometryMask @@ -403,7 +449,7 @@ void Qt5Frame::SetWindowState(const SalFrameState* pState) } else if (pState->mnMask & WindowStateMask::State && !isChild()) { - if ((pState->mnState & WindowStateState::Minimized) && m_pQWidget->isWindow()) + if ((pState->mnState & WindowStateState::Minimized) && isWindow()) m_pQWidget->showMinimized(); else m_pQWidget->showNormal(); @@ -422,7 +468,7 @@ bool Qt5Frame::GetWindowState(SalFrameState* pState) } else { - QRect rect = m_pQWidget->geometry(); + QRect rect = m_pTopLevel ? m_pTopLevel->geometry() : m_pQWidget->geometry(); pState->mnX = rect.x(); pState->mnY = rect.y(); pState->mnWidth = rect.width(); |