summaryrefslogtreecommitdiff
path: root/vcl/qt5/Qt5Frame.cxx
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2019-06-21 04:09:02 +0000
committerJan-Marek Glogowski <glogow@fbihome.de>2019-06-22 16:22:37 +0200
commit337b592a721bef2c54cbe8c4927e5cc5a68c2138 (patch)
treef4878058be0fb6839f56b346defa07d6c00dfeb6 /vcl/qt5/Qt5Frame.cxx
parent1795adce52b614cc6f12ea313f1c377fefbf2351 (diff)
tdf#123779 Qt5 correctly fill Qt5Frame::maGeometry
The tooltip in the bug is actually not one, but the VCL implementation of Gtk's popover widget triggered by SalFrame::ShowPopover. This has no Qt equivalent, so we currently rely on the crude VCL version. But for this maGeometry must contain the correct information, AKA the absolute, unmirrored, paintable system geometry of the frame. Then the window can be positioned correctly. The patch gets rid of most of the code initially copied from gtk, when this VCL backend was in a very early state. Change-Id: Id44e4dc2aac41f1f01d51c4d8107892e644ef243 Reviewed-on: https://gerrit.libreoffice.org/74546 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl/qt5/Qt5Frame.cxx')
-rw-r--r--vcl/qt5/Qt5Frame.cxx83
1 files changed, 50 insertions, 33 deletions
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx
index 0e0b9efae5b1..dbdc51ea9465 100644
--- a/vcl/qt5/Qt5Frame.cxx
+++ b/vcl/qt5/Qt5Frame.cxx
@@ -171,8 +171,8 @@ Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo)
{
maGeometry.nDisplayScreenNumber = 0;
Size aDefSize = CalcDefaultSize();
- maGeometry.nX = -1;
- maGeometry.nY = -1;
+ maGeometry.nX = 0;
+ maGeometry.nY = 0;
maGeometry.nWidth = aDefSize.Width();
maGeometry.nHeight = aDefSize.Height();
maGeometry.nTopDecoration = 0;
@@ -372,8 +372,7 @@ void Qt5Frame::Show(bool bVisible, bool /*bNoActivate*/)
{
assert(m_pQWidget);
- if (m_bDefaultSize)
- SetDefaultSize();
+ SetDefaultSize();
auto* pSalInst(static_cast<Qt5Instance*>(GetSalData()->m_pInstance));
assert(pSalInst);
@@ -431,9 +430,13 @@ Size Qt5Frame::CalcDefaultSize()
void Qt5Frame::SetDefaultSize()
{
+ if (!m_bDefaultSize)
+ return;
+
Size aDefSize = CalcDefaultSize();
SetPosSize(0, 0, aDefSize.Width(), aDefSize.Height(),
SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT);
+ assert(!m_bDefaultSize);
}
void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags)
@@ -441,38 +444,57 @@ void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt1
if (!isWindow() || isChild(true, false))
return;
- if ((nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT))
- && (nWidth > 0 && nHeight > 0) // sometimes stupid things happen
- )
+ if (nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT))
{
m_bDefaultSize = false;
if (isChild(false) || !m_pQWidget->isMaximized())
{
- if (m_nStyle & SalFrameStyleFlags::SIZEABLE)
- asChild()->resize(nWidth, nHeight);
- else
- asChild()->setFixedSize(nWidth, nHeight);
+ if (!(nFlags & SAL_FRAME_POSSIZE_WIDTH))
+ nWidth = maGeometry.nWidth;
+ else if (!(nFlags & SAL_FRAME_POSSIZE_HEIGHT))
+ nHeight = maGeometry.nHeight;
+ assert(nWidth > 0 && nHeight > 0);
+
+ if (nWidth > 0 && nHeight > 0)
+ {
+ if (m_nStyle & SalFrameStyleFlags::SIZEABLE)
+ asChild()->resize(nWidth, nHeight);
+ else
+ asChild()->setFixedSize(nWidth, nHeight);
+
+ // assume the resize happened
+ // needed for calculations and will eventuall be corrected by events
+ maGeometry.nWidth = nWidth;
+ maGeometry.nHeight = nHeight;
+ }
}
}
- else if (m_bDefaultSize)
+ else
SetDefaultSize();
- m_bDefaultSize = false;
-
if (nFlags & (SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y))
{
if (m_pParent)
{
- QRect aRect;
- if (m_pParent->GetTopLevelWindow())
- aRect = m_pParent->GetTopLevelWindow()->geometry();
+ const SalFrameGeometry& aParentGeometry = m_pParent->maGeometry;
+ if (QGuiApplication::isRightToLeft())
+ nX = aParentGeometry.nX + aParentGeometry.nWidth - nX - maGeometry.nWidth - 1;
else
- aRect = m_pParent->GetQWidget()->geometry();
+ nX += aParentGeometry.nX;
+ nY += aParentGeometry.nY;
- nX += aRect.x();
- nY += aRect.y();
+ Qt5MainWindow* pTopLevel = m_pParent->GetTopLevelWindow();
+ if (pTopLevel && pTopLevel->menuBar() && pTopLevel->menuBar()->isVisible())
+ nY += pTopLevel->menuBar()->geometry().height();
}
+ if (!(nFlags & SAL_FRAME_POSSIZE_X))
+ nX = maGeometry.nX;
+ else if (!(nFlags & SAL_FRAME_POSSIZE_Y))
+ nY = maGeometry.nY;
+
+ // assume the reposition happened
+ // needed for calculations and will eventually be corrected by events later
maGeometry.nX = nX;
maGeometry.nY = nY;
@@ -553,25 +575,15 @@ void Qt5Frame::SetWindowState(const SalFrameState* pState)
| WindowStateMask::Height))
{
sal_uInt16 nPosSizeFlags = 0;
- QPoint aPos = m_pQWidget->pos();
- QPoint aParentPos;
- if (m_pParent)
- aParentPos = m_pParent->GetQWidget()->window()->pos();
- long nX = pState->mnX - aParentPos.x();
- long nY = pState->mnY - aParentPos.y();
if (pState->mnMask & WindowStateMask::X)
nPosSizeFlags |= SAL_FRAME_POSSIZE_X;
- else
- nX = aPos.x() - aParentPos.x();
if (pState->mnMask & WindowStateMask::Y)
nPosSizeFlags |= SAL_FRAME_POSSIZE_Y;
- else
- nY = aPos.y() - aParentPos.y();
if (pState->mnMask & WindowStateMask::Width)
nPosSizeFlags |= SAL_FRAME_POSSIZE_WIDTH;
if (pState->mnMask & WindowStateMask::Height)
nPosSizeFlags |= SAL_FRAME_POSSIZE_HEIGHT;
- SetPosSize(nX, nY, pState->mnWidth, pState->mnHeight, nPosSizeFlags);
+ SetPosSize(pState->mnX, pState->mnY, pState->mnWidth, pState->mnHeight, nPosSizeFlags);
}
else if (pState->mnMask & WindowStateMask::State && !isChild())
{
@@ -596,11 +608,18 @@ bool Qt5Frame::GetWindowState(SalFrameState* pState)
}
else
{
+ // geometry() is the drawable area, which is wanted here
QRect rect = asChild()->geometry();
pState->mnX = rect.x();
pState->mnY = rect.y();
pState->mnWidth = rect.width();
pState->mnHeight = rect.height();
+ // the menubar is drawn natively, adjust for that
+ if (maGeometry.nTopDecoration)
+ {
+ pState->mnY += maGeometry.nTopDecoration;
+ pState->mnHeight -= maGeometry.nTopDecoration;
+ }
pState->mnMask |= WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width
| WindowStateMask::Height;
}
@@ -730,8 +749,6 @@ bool Qt5Frame::ShowTooltip(const OUString& rText, const tools::Rectangle& /*rHel
return true;
}
-// do we even need it? void Qt5Frame::Flush(const tools::Rectangle& /*rRect*/) {}
-
void Qt5Frame::SetInputContext(SalInputContext* pContext)
{
if (!pContext)