summaryrefslogtreecommitdiff
path: root/vcl/qt5/Qt5Frame.cxx
diff options
context:
space:
mode:
authorKatarina Behrens <Katarina.Behrens@cib.de>2018-08-09 17:14:14 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2018-08-12 22:25:54 +0200
commit8d791a9d9657f6573ce27947c0289b36c6eba77c (patch)
tree0a5a788620f7c7ec4404a45f81e8f3b8c5722db2 /vcl/qt5/Qt5Frame.cxx
parent20444972edb1dd49af13902a850a8e343d5a60ec (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.cxx92
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();