diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2017-10-30 19:44:40 +0100 |
---|---|---|
committer | Thorsten Behrens <Thorsten.Behrens@CIB.de> | 2017-11-06 12:05:32 +0100 |
commit | 843ec5e37f290dca79f8f1245a18d67112f4427f (patch) | |
tree | 9e2ea0cef8188c8ac5b5353bd703fec530870e93 /vcl/qt5 | |
parent | 173c460c26eaec9d81dc9eae6d5a73116cb3ac41 (diff) |
QT5 port more of the gtk3 positioning code
Change-Id: I36631c332ddffbca73768cdc4a596213e0b026ef
Diffstat (limited to 'vcl/qt5')
-rw-r--r-- | vcl/qt5/Qt5Frame.cxx | 105 | ||||
-rw-r--r-- | vcl/qt5/Qt5Frame.hxx | 7 |
2 files changed, 102 insertions, 10 deletions
diff --git a/vcl/qt5/Qt5Frame.cxx b/vcl/qt5/Qt5Frame.cxx index 0eb1a6e6bc05..683f35146e2e 100644 --- a/vcl/qt5/Qt5Frame.cxx +++ b/vcl/qt5/Qt5Frame.cxx @@ -29,8 +29,10 @@ #include <QtCore/QSize> #include <QtGui/QIcon> #include <QtGui/QWindow> +#include <QtGui/QScreen> #include <saldatabasic.hxx> +#include <vcl/layout.hxx> #include <vcl/syswin.hxx> #include <cairo.h> @@ -48,6 +50,8 @@ Qt5Frame::Qt5Frame( Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo : m_bUseCairo( bUseCairo ) , m_bGraphicsInUse( false ) , m_ePointerStyle( PointerStyle::Arrow ) + , m_bDefaultSize( true ) + , m_bDefaultPos( true ) { Qt5Instance *pInst = static_cast<Qt5Instance*>( GetSalData()->m_pInstance ); pInst->insertFrame( this ); @@ -240,8 +244,70 @@ void Qt5Frame::SetMaxClientSize( long nWidth, long nHeight ) m_pQWidget->setMaximumSize( nWidth, nHeight ); } +void Qt5Frame::Center() +{ + if ( m_pParent ) + { + QWidget *pWindow = m_pParent->GetQWidget()->window(); + m_pQWidget->move( + pWindow->frameGeometry().topLeft() + + pWindow->rect().center() - m_pQWidget->rect().center() ); + } +} + +Size Qt5Frame::CalcDefaultSize() +{ + assert( m_pQWidget->isWindow() ); + QScreen *pScreen = m_pQWidget->windowHandle()->screen(); + if( !pScreen ) + return Size(); + return bestmaxFrameSizeForScreenSize( toSize( pScreen->size() ) ); +} + +void Qt5Frame::SetDefaultSize() +{ + Size aDefSize = CalcDefaultSize(); + SetPosSize( 0, 0, aDefSize.Width(), aDefSize.Height(), + SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT ); +} + void Qt5Frame::SetPosSize( long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags ) { + if( !m_pQWidget->isWindow() || isChild( true, false ) ) + return; + + + if( (nFlags & ( SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT )) && + (nWidth > 0 && nHeight > 0 ) // sometimes stupid things happen + ) + { + m_bDefaultSize = false; + if( isChild( false ) || !m_pQWidget->isMaximized() ) + { + m_pQWidget->resize( nWidth, nHeight ); + } + } + else if( m_bDefaultSize ) + SetDefaultSize(); + + m_bDefaultSize = false; + + if( nFlags & ( SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y ) ) + { + if( m_pParent ) + { + QRect aRect = m_pParent->GetQWidget()->geometry(); + nX += aRect.x(); + nY += aRect.y(); + } + + m_bDefaultPos = false; + m_pQWidget->move( nX, nY ); + } + else if( m_bDefaultPos ) + Center(); + + m_bDefaultPos = false; } void Qt5Frame::GetClientSize( long& rWidth, long& rHeight ) @@ -252,6 +318,14 @@ void Qt5Frame::GetClientSize( long& rWidth, long& rHeight ) void Qt5Frame::GetWorkArea( tools::Rectangle& rRect ) { + if( !m_pQWidget->isWindow() ) + return; + QScreen *pScreen = m_pQWidget->windowHandle()->screen(); + if( !pScreen ) + return; + + QSize aSize = pScreen->availableVirtualSize(); + rRect = tools::Rectangle( 0, 0, aSize.width(), aSize.height() ); } SalFrame* Qt5Frame::GetParent() const @@ -277,16 +351,26 @@ void Qt5Frame::SetWindowState( const SalFrameState* pState ) else if( pState->mnMask & (WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width | WindowStateMask::Height ) ) { - QRect rect = m_pQWidget->geometry(); - if ( pState->mnMask & WindowStateMask::X ) - rect.setX( pState->mnX ); - if ( pState->mnMask & WindowStateMask::Y ) - rect.setY( pState->mnY ); - if ( pState->mnMask & WindowStateMask::Width ) - rect.setWidth( pState->mnWidth ); - if ( pState->mnMask & WindowStateMask::Height ) - rect.setHeight( pState->mnHeight ); - m_pQWidget->setGeometry( rect ); + 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 ); } else if( pState->mnMask & WindowStateMask::State && ! isChild() ) { @@ -320,6 +404,7 @@ bool Qt5Frame::GetWindowState( SalFrameState* pState ) WindowStateMask::Height; } + return true; } diff --git a/vcl/qt5/Qt5Frame.hxx b/vcl/qt5/Qt5Frame.hxx index 1d736bfb280f..5863c925a83b 100644 --- a/vcl/qt5/Qt5Frame.hxx +++ b/vcl/qt5/Qt5Frame.hxx @@ -52,6 +52,13 @@ class Qt5Frame Qt5Frame *m_pParent; PointerStyle m_ePointerStyle; + bool m_bDefaultSize; + bool m_bDefaultPos; + + void Center(); + Size CalcDefaultSize(); + void SetDefaultSize(); + bool isChild( bool bPlug = true, bool bSysChild = true ) { SalFrameStyleFlags nMask = SalFrameStyleFlags::NONE; |