2017-10-21 13:50:30 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* 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/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
|
|
|
|
2018-06-01 15:28:26 +02:00
|
|
|
#include <Qt5Frame.hxx>
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-06-01 15:28:26 +02:00
|
|
|
#include <Qt5Tools.hxx>
|
|
|
|
#include <Qt5Instance.hxx>
|
|
|
|
#include <Qt5Graphics.hxx>
|
|
|
|
#include <Qt5Widget.hxx>
|
2018-08-09 17:14:14 +02:00
|
|
|
#include <Qt5MainWindow.hxx>
|
2018-06-01 15:28:26 +02:00
|
|
|
#include <Qt5Data.hxx>
|
2018-05-15 16:29:15 +02:00
|
|
|
#include <Qt5Menu.hxx>
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <QtCore/QPoint>
|
|
|
|
#include <QtCore/QSize>
|
|
|
|
#include <QtGui/QIcon>
|
2017-10-27 13:15:37 +02:00
|
|
|
#include <QtGui/QWindow>
|
2017-10-30 19:44:40 +01:00
|
|
|
#include <QtGui/QScreen>
|
2018-08-09 14:51:41 +02:00
|
|
|
#include <QtWidgets/QStyle>
|
|
|
|
#include <QtWidgets/QToolTip>
|
2017-10-30 19:55:18 +01:00
|
|
|
#include <QtWidgets/QApplication>
|
2018-08-29 14:04:56 +02:00
|
|
|
#include <QtWidgets/QDesktopWidget>
|
2018-08-09 14:51:41 +02:00
|
|
|
#include <QtWidgets/QMenuBar>
|
2018-08-09 17:14:14 +02:00
|
|
|
#include <QtWidgets/QMainWindow>
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <saldatabasic.hxx>
|
2017-11-14 00:10:58 +02:00
|
|
|
#include <window.h>
|
2017-10-30 19:44:40 +01:00
|
|
|
#include <vcl/layout.hxx>
|
2017-10-30 18:33:06 +01:00
|
|
|
#include <vcl/syswin.hxx>
|
|
|
|
|
2017-10-24 19:49:45 +02:00
|
|
|
#include <cairo.h>
|
|
|
|
#include <headless/svpgdi.hxx>
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
static void SvpDamageHandler(void* handle, sal_Int32 nExtentsX, sal_Int32 nExtentsY,
|
|
|
|
sal_Int32 nExtentsWidth, sal_Int32 nExtentsHeight)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Frame* pThis = static_cast<Qt5Frame*>(handle);
|
|
|
|
pThis->Damage(nExtentsX, nExtentsY, nExtentsWidth, nExtentsHeight);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Frame::Qt5Frame(Qt5Frame* pParent, SalFrameStyleFlags nStyle, bool bUseCairo)
|
2018-08-09 17:14:14 +02:00
|
|
|
: m_pTopLevel(nullptr)
|
|
|
|
, m_bUseCairo(bUseCairo)
|
|
|
|
, m_pSvpGraphics(nullptr)
|
2018-09-04 09:17:11 +02:00
|
|
|
, m_bNullRegion(true)
|
2017-11-08 11:28:04 +01:00
|
|
|
, m_bGraphicsInUse(false)
|
|
|
|
, m_ePointerStyle(PointerStyle::Arrow)
|
|
|
|
, m_bDefaultSize(true)
|
|
|
|
, m_bDefaultPos(true)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->insertFrame(this);
|
2017-10-27 13:15:37 +02:00
|
|
|
|
2017-10-24 19:49:45 +02:00
|
|
|
m_aDamageHandler.handle = this;
|
|
|
|
m_aDamageHandler.damaged = ::SvpDamageHandler;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nStyle & SalFrameStyleFlags::DEFAULT) // ensure default style
|
2017-10-27 13:15:37 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
nStyle |= SalFrameStyleFlags::MOVEABLE | SalFrameStyleFlags::SIZEABLE
|
|
|
|
| SalFrameStyleFlags::CLOSEABLE;
|
2017-10-27 13:15:37 +02:00
|
|
|
nStyle &= ~SalFrameStyleFlags::FLOAT;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_nStyle = nStyle;
|
|
|
|
m_pParent = pParent;
|
|
|
|
|
|
|
|
Qt::WindowFlags aWinFlags;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!(nStyle & SalFrameStyleFlags::SYSTEMCHILD))
|
2017-10-27 13:15:37 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nStyle & SalFrameStyleFlags::INTRO)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::SplashScreen;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & (SalFrameStyleFlags::FLOAT | SalFrameStyleFlags::TOOLTIP))
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::ToolTip;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if ((nStyle & SalFrameStyleFlags::FLOAT)
|
|
|
|
&& !(nStyle & SalFrameStyleFlags::OWNERDRAWDECORATION))
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Popup;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & SalFrameStyleFlags::DIALOG && pParent)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Dialog;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (nStyle & SalFrameStyleFlags::TOOLWINDOW)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Tool;
|
2018-01-08 09:40:37 +02:00
|
|
|
else if (nStyle & SalFrameStyleFlags::OWNERDRAWDECORATION)
|
2017-10-27 13:15:37 +02:00
|
|
|
aWinFlags |= Qt::Window | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus;
|
|
|
|
else
|
|
|
|
aWinFlags |= Qt::Window;
|
|
|
|
}
|
|
|
|
|
2018-08-09 17:14:14 +02:00
|
|
|
if (!pParent && (aWinFlags == Qt::Window))
|
|
|
|
{
|
|
|
|
m_pTopLevel = new Qt5MainWindow(*this, nullptr, aWinFlags);
|
2018-08-10 18:29:10 +02:00
|
|
|
m_pQWidget = new Qt5Widget(*this, aWinFlags);
|
2018-08-09 17:14:14 +02:00
|
|
|
m_pTopLevel->setCentralWidget(m_pQWidget);
|
|
|
|
}
|
2018-07-17 15:57:41 +02:00
|
|
|
else
|
2018-08-10 18:29:10 +02:00
|
|
|
m_pQWidget = new Qt5Widget(*this, aWinFlags);
|
2017-10-27 13:15:37 +02:00
|
|
|
|
|
|
|
if (pParent && !(pParent->m_nStyle & SalFrameStyleFlags::PLUG))
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWindow* pParentWindow = pParent->GetQWidget()->window()->windowHandle();
|
|
|
|
QWindow* pChildWindow = m_pQWidget->window()->windowHandle();
|
|
|
|
if (pParentWindow != pChildWindow)
|
|
|
|
pChildWindow->setTransientParent(pParentWindow);
|
2017-10-27 13:15:37 +02:00
|
|
|
}
|
2017-12-08 11:37:18 +00:00
|
|
|
|
|
|
|
// fake an initial geometry, gets updated via configure event or SetPosSize
|
|
|
|
if (m_bDefaultPos || m_bDefaultSize)
|
|
|
|
{
|
2018-08-29 14:04:56 +02:00
|
|
|
Size aDefSize = CalcDefaultSize();
|
2017-12-08 11:37:18 +00:00
|
|
|
maGeometry.nX = -1;
|
|
|
|
maGeometry.nY = -1;
|
|
|
|
maGeometry.nWidth = aDefSize.Width();
|
|
|
|
maGeometry.nHeight = aDefSize.Height();
|
|
|
|
maGeometry.nTopDecoration = 0;
|
|
|
|
maGeometry.nBottomDecoration = 0;
|
|
|
|
maGeometry.nLeftDecoration = 0;
|
|
|
|
maGeometry.nRightDecoration = 0;
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
Qt5Frame::~Qt5Frame()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->eraseFrame(this);
|
2018-08-09 17:14:14 +02:00
|
|
|
if (m_pTopLevel)
|
|
|
|
delete m_pTopLevel;
|
|
|
|
else
|
|
|
|
delete m_pQWidget;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::Damage(sal_Int32 nExtentsX, sal_Int32 nExtentsY, sal_Int32 nExtentsWidth,
|
|
|
|
sal_Int32 nExtentsHeight) const
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->update(nExtentsX, nExtentsY, nExtentsWidth, nExtentsHeight);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
void Qt5Frame::TriggerPaintEvent()
|
2017-10-31 01:07:06 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QSize aSize(m_pQWidget->size());
|
|
|
|
SalPaintEvent aPaintEvt(0, 0, aSize.width(), aSize.height(), true);
|
|
|
|
CallCallback(SalEvent::Paint, &aPaintEvt);
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::TriggerPaintEvent(QRect aRect)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
SalPaintEvent aPaintEvt(aRect.x(), aRect.y(), aRect.width(), aRect.height(), true);
|
|
|
|
CallCallback(SalEvent::Paint, &aPaintEvt);
|
2017-10-31 01:07:06 +01:00
|
|
|
}
|
|
|
|
|
2018-05-31 12:14:55 +02:00
|
|
|
void Qt5Frame::InitSvpSalGraphics(SvpSalGraphics* pSvpSalGraphics)
|
2018-04-19 14:20:27 +02:00
|
|
|
{
|
2018-08-29 14:04:56 +02:00
|
|
|
int width = 640;
|
|
|
|
int height = 480;
|
2018-04-19 14:20:27 +02:00
|
|
|
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));
|
2018-05-31 12:14:55 +02:00
|
|
|
cairo_surface_set_user_data(m_pSurface.get(), SvpSalGraphics::getDamageKey(), &m_aDamageHandler,
|
|
|
|
nullptr);
|
2018-04-19 14:20:27 +02:00
|
|
|
TriggerPaintEvent();
|
|
|
|
}
|
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
SalGraphics* Qt5Frame::AcquireGraphics()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_bGraphicsInUse)
|
2017-10-31 01:07:06 +01:00
|
|
|
return nullptr;
|
|
|
|
|
|
|
|
m_bGraphicsInUse = true;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_bUseCairo)
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2018-04-19 14:20:27 +02:00
|
|
|
if (!m_pOurSvpGraphics.get())
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2018-05-31 12:14:55 +02:00
|
|
|
m_pOurSvpGraphics.reset(new SvpSalGraphics());
|
|
|
|
InitSvpSalGraphics(m_pOurSvpGraphics.get());
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
2018-04-19 14:20:27 +02:00
|
|
|
return m_pOurSvpGraphics.get();
|
2017-10-24 19:49:45 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!m_pQt5Graphics.get())
|
2017-10-24 19:49:45 +02:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQt5Graphics.reset(new Qt5Graphics(this));
|
|
|
|
m_pQImage.reset(new QImage(m_pQWidget->size(), Qt5_DefaultFormat32));
|
|
|
|
m_pQt5Graphics->ChangeQImage(m_pQImage.get());
|
2017-10-24 19:49:45 +02:00
|
|
|
TriggerPaintEvent();
|
|
|
|
}
|
|
|
|
return m_pQt5Graphics.get();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::ReleaseGraphics(SalGraphics* pSalGraph)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
(void)pSalGraph;
|
|
|
|
if (m_bUseCairo)
|
2018-04-19 14:20:27 +02:00
|
|
|
assert(pSalGraph == m_pOurSvpGraphics.get());
|
2017-10-24 19:49:45 +02:00
|
|
|
else
|
2017-11-08 11:28:04 +01:00
|
|
|
assert(pSalGraph == m_pQt5Graphics.get());
|
2017-10-31 01:07:06 +01:00
|
|
|
m_bGraphicsInUse = false;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
bool Qt5Frame::PostEvent(ImplSVEvent* pData)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
Qt5Instance* pInst = static_cast<Qt5Instance*>(GetSalData()->m_pInstance);
|
|
|
|
pInst->PostEvent(this, pData, SalEvent::UserEvent);
|
2017-10-31 01:07:06 +01:00
|
|
|
return true;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-08-09 17:14:14 +02:00
|
|
|
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()
|
2018-08-29 14:04:56 +02:00
|
|
|
{
|
2018-09-04 09:17:11 +02:00
|
|
|
QWindow* const pWindow = windowHandle();
|
|
|
|
if (pWindow)
|
|
|
|
return pWindow->screen();
|
2018-08-29 14:04:56 +02:00
|
|
|
else
|
2018-09-04 09:17:11 +02:00
|
|
|
return nullptr;
|
2018-08-29 14:04:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt5Frame::isMinimized()
|
2018-08-09 17:14:14 +02:00
|
|
|
{
|
|
|
|
if (m_pTopLevel)
|
2018-08-29 14:04:56 +02:00
|
|
|
return m_pTopLevel->isMinimized();
|
2018-08-09 17:14:14 +02:00
|
|
|
else
|
2018-08-29 14:04:56 +02:00
|
|
|
return m_pQWidget->isMinimized();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt5Frame::isMaximized()
|
|
|
|
{
|
|
|
|
if (m_pTopLevel)
|
|
|
|
return m_pTopLevel->isMaximized();
|
|
|
|
else
|
|
|
|
return m_pQWidget->isMaximized();
|
2018-08-09 17:14:14 +02:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetTitle(const OUString& rTitle)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->window()->setWindowTitle(toQString(rTitle));
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetIcon(sal_uInt16 nIcon)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-13 09:08:30 +01:00
|
|
|
if (m_nStyle
|
|
|
|
& (SalFrameStyleFlags::PLUG | SalFrameStyleFlags::SYSTEMCHILD
|
|
|
|
| SalFrameStyleFlags::FLOAT | SalFrameStyleFlags::INTRO
|
|
|
|
| SalFrameStyleFlags::OWNERDRAWDECORATION)
|
2018-08-09 17:14:14 +02:00
|
|
|
|| !isWindow())
|
2017-10-30 18:33:06 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const char* appicon;
|
2017-10-30 18:33:06 +01:00
|
|
|
|
|
|
|
if (nIcon == SV_ICON_ID_TEXT)
|
|
|
|
appicon = "libreoffice-writer";
|
|
|
|
else if (nIcon == SV_ICON_ID_SPREADSHEET)
|
|
|
|
appicon = "libreoffice-calc";
|
|
|
|
else if (nIcon == SV_ICON_ID_DRAWING)
|
|
|
|
appicon = "libreoffice-draw";
|
|
|
|
else if (nIcon == SV_ICON_ID_PRESENTATION)
|
|
|
|
appicon = "libreoffice-impress";
|
|
|
|
else if (nIcon == SV_ICON_ID_DATABASE)
|
|
|
|
appicon = "libreoffice-base";
|
|
|
|
else if (nIcon == SV_ICON_ID_FORMULA)
|
|
|
|
appicon = "libreoffice-math";
|
|
|
|
else
|
|
|
|
appicon = "libreoffice-startcenter";
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
QIcon aIcon = QIcon::fromTheme(appicon);
|
|
|
|
m_pQWidget->window()->setWindowIcon(aIcon);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-05-31 12:14:55 +02:00
|
|
|
void Qt5Frame::SetMenu(SalMenu* pMenu) { m_pSalMenu = static_cast<Qt5Menu*>(pMenu); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::DrawMenuBar() { /* not needed */}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SetExtendedFrameStyle(SalExtStyle /*nExtStyle*/) { /* not needed */}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
void Qt5Frame::Show(bool bVisible, bool /*bNoActivate*/)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
assert(m_pQWidget);
|
2018-08-29 14:04:56 +02:00
|
|
|
|
|
|
|
if (m_bDefaultSize)
|
|
|
|
SetDefaultSize();
|
|
|
|
|
2018-08-09 17:14:14 +02:00
|
|
|
if (m_pTopLevel)
|
|
|
|
m_pTopLevel->setVisible(bVisible);
|
|
|
|
else
|
|
|
|
m_pQWidget->setVisible(bVisible);
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetMinClientSize(long nWidth, long nHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!isChild())
|
2018-09-04 21:05:03 +02:00
|
|
|
{
|
|
|
|
if (m_pTopLevel)
|
|
|
|
m_pTopLevel->setMinimumSize(nWidth, nHeight);
|
|
|
|
else
|
|
|
|
m_pQWidget->setMinimumSize(nWidth, nHeight);
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetMaxClientSize(long nWidth, long nHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!isChild())
|
2018-09-04 21:05:03 +02:00
|
|
|
{
|
|
|
|
if (m_pTopLevel)
|
|
|
|
m_pTopLevel->setMaximumSize(nWidth, nHeight);
|
|
|
|
else
|
|
|
|
m_pQWidget->setMaximumSize(nWidth, nHeight);
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-10-30 19:44:40 +01:00
|
|
|
void Qt5Frame::Center()
|
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWidget* pWindow = m_pParent->GetQWidget()->window();
|
|
|
|
m_pQWidget->move(pWindow->frameGeometry().topLeft() + pWindow->rect().center()
|
|
|
|
- m_pQWidget->rect().center());
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Size Qt5Frame::CalcDefaultSize()
|
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
assert(isWindow());
|
2018-08-29 14:04:56 +02:00
|
|
|
QSize qSize(0, 0);
|
2018-08-09 17:14:14 +02:00
|
|
|
QScreen* pScreen = screen();
|
2018-08-29 14:04:56 +02:00
|
|
|
if (pScreen)
|
|
|
|
qSize = pScreen->size();
|
|
|
|
else
|
|
|
|
qSize = QApplication::desktop()->screenGeometry(0).size();
|
|
|
|
|
|
|
|
return bestmaxFrameSizeForScreenSize(toSize(qSize));
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt5Frame::SetDefaultSize()
|
|
|
|
{
|
|
|
|
Size aDefSize = CalcDefaultSize();
|
2017-11-08 11:28:04 +01:00
|
|
|
SetPosSize(0, 0, aDefSize.Width(), aDefSize.Height(),
|
|
|
|
SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetPosSize(long nX, long nY, long nWidth, long nHeight, sal_uInt16 nFlags)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
if (!isWindow() || isChild(true, false))
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if ((nFlags & (SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT))
|
|
|
|
&& (nWidth > 0 && nHeight > 0) // sometimes stupid things happen
|
2017-11-13 09:08:30 +01:00
|
|
|
)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
|
|
|
m_bDefaultSize = false;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (isChild(false) || !m_pQWidget->isMaximized())
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2018-08-29 14:04:56 +02:00
|
|
|
if (m_pTopLevel)
|
|
|
|
m_pTopLevel->resize(nWidth, nHeight);
|
|
|
|
else
|
|
|
|
m_pQWidget->resize(nWidth, nHeight);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_bDefaultSize)
|
2017-10-30 19:44:40 +01:00
|
|
|
SetDefaultSize();
|
|
|
|
|
|
|
|
m_bDefaultSize = false;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if (nFlags & (SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y))
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
QRect aRect;
|
|
|
|
if (m_pParent->GetTopLevelWindow())
|
|
|
|
aRect = m_pParent->GetTopLevelWindow()->geometry();
|
|
|
|
else
|
|
|
|
aRect = m_pParent->GetQWidget()->geometry();
|
|
|
|
|
2017-10-30 19:44:40 +01:00
|
|
|
nX += aRect.x();
|
|
|
|
nY += aRect.y();
|
|
|
|
}
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
maGeometry.nX = nX;
|
|
|
|
maGeometry.nY = nY;
|
|
|
|
|
2017-10-30 19:44:40 +01:00
|
|
|
m_bDefaultPos = false;
|
2017-11-08 11:28:04 +01:00
|
|
|
m_pQWidget->move(nX, nY);
|
2017-10-30 19:44:40 +01:00
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_bDefaultPos)
|
2017-10-30 19:44:40 +01:00
|
|
|
Center();
|
|
|
|
|
|
|
|
m_bDefaultPos = false;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-04-07 11:45:13 +02:00
|
|
|
void Qt5Frame::GetClientSize(long& rWidth, long& rHeight)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-31 01:07:06 +01:00
|
|
|
rWidth = m_pQWidget->width();
|
|
|
|
rHeight = m_pQWidget->height();
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::GetWorkArea(tools::Rectangle& rRect)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
if (!isWindow())
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
2018-08-09 17:14:14 +02:00
|
|
|
QScreen* pScreen = screen();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (!pScreen)
|
2017-10-30 19:44:40 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
QSize aSize = pScreen->availableVirtualSize();
|
2017-11-08 11:28:04 +01:00
|
|
|
rRect = tools::Rectangle(0, 0, aSize.width(), aSize.height());
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
SalFrame* Qt5Frame::GetParent() const { return m_pParent; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-06-27 10:41:03 +02:00
|
|
|
void Qt5Frame::SetModal(bool bModal)
|
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
if (isWindow())
|
2018-06-27 10:41:03 +02:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
if (m_pTopLevel)
|
|
|
|
m_pTopLevel->setVisible(true);
|
2018-06-27 10:41:03 +02:00
|
|
|
// modality change is only effective if the window is hidden
|
2018-08-09 17:14:14 +02:00
|
|
|
windowHandle()->hide();
|
|
|
|
windowHandle()->setModality(bModal ? Qt::WindowModal : Qt::NonModal);
|
2018-06-27 10:41:03 +02:00
|
|
|
// and shown again
|
2018-08-09 17:14:14 +02:00
|
|
|
windowHandle()->show();
|
2018-06-27 10:41:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetWindowState(const SalFrameState* pState)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
if (!isWindow() || !pState || isChild(true, false))
|
2017-10-30 18:33:06 +01:00
|
|
|
return;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const WindowStateMask nMaxGeometryMask
|
|
|
|
= WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width | WindowStateMask::Height
|
|
|
|
| WindowStateMask::MaximizedX | WindowStateMask::MaximizedY
|
|
|
|
| WindowStateMask::MaximizedWidth | WindowStateMask::MaximizedHeight;
|
2017-10-30 18:33:06 +01:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
if ((pState->mnMask & WindowStateMask::State) && (pState->mnState & WindowStateState::Maximized)
|
2018-08-29 14:04:56 +02:00
|
|
|
&& !isMaximized() && (pState->mnMask & nMaxGeometryMask) == nMaxGeometryMask)
|
2017-10-30 18:33:06 +01:00
|
|
|
m_pQWidget->showMaximized();
|
2017-11-13 09:08:30 +01:00
|
|
|
else if (pState->mnMask
|
|
|
|
& (WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width
|
|
|
|
| WindowStateMask::Height))
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
2017-10-30 19:44:40 +01:00
|
|
|
sal_uInt16 nPosSizeFlags = 0;
|
|
|
|
QPoint aPos = m_pQWidget->pos();
|
|
|
|
QPoint aParentPos;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (m_pParent)
|
2017-10-30 19:44:40 +01:00
|
|
|
aParentPos = m_pParent->GetQWidget()->window()->pos();
|
|
|
|
long nX = pState->mnX - aParentPos.x();
|
|
|
|
long nY = pState->mnY - aParentPos.y();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::X)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_X;
|
|
|
|
else
|
|
|
|
nX = aPos.x() - aParentPos.x();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Y)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_Y;
|
|
|
|
else
|
|
|
|
nY = aPos.y() - aParentPos.y();
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Width)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_WIDTH;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (pState->mnMask & WindowStateMask::Height)
|
2017-10-30 19:44:40 +01:00
|
|
|
nPosSizeFlags |= SAL_FRAME_POSSIZE_HEIGHT;
|
2017-11-08 11:28:04 +01:00
|
|
|
SetPosSize(nX, nY, pState->mnWidth, pState->mnHeight, nPosSizeFlags);
|
2017-10-30 18:33:06 +01:00
|
|
|
}
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (pState->mnMask & WindowStateMask::State && !isChild())
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
2018-08-29 14:04:56 +02:00
|
|
|
if (pState->mnState & WindowStateState::Maximized && m_pTopLevel)
|
|
|
|
{
|
|
|
|
m_pTopLevel->showMaximized();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-08-09 17:14:14 +02:00
|
|
|
if ((pState->mnState & WindowStateState::Minimized) && isWindow())
|
2017-10-30 18:33:06 +01:00
|
|
|
m_pQWidget->showMinimized();
|
|
|
|
else
|
|
|
|
m_pQWidget->showNormal();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
bool Qt5Frame::GetWindowState(SalFrameState* pState)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-30 18:33:06 +01:00
|
|
|
pState->mnState = WindowStateState::Normal;
|
2017-11-08 11:28:04 +01:00
|
|
|
pState->mnMask = WindowStateMask::State;
|
2018-08-29 14:04:56 +02:00
|
|
|
if (isMinimized() /*|| !windowHandle()*/)
|
2017-10-30 18:33:06 +01:00
|
|
|
pState->mnState |= WindowStateState::Minimized;
|
2017-11-08 11:28:04 +01:00
|
|
|
else if (m_pQWidget->isMaximized())
|
2017-10-30 18:33:06 +01:00
|
|
|
{
|
|
|
|
pState->mnState |= WindowStateState::Maximized;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-08-09 17:14:14 +02:00
|
|
|
QRect rect = m_pTopLevel ? m_pTopLevel->geometry() : m_pQWidget->geometry();
|
2017-10-30 18:33:06 +01:00
|
|
|
pState->mnX = rect.x();
|
|
|
|
pState->mnY = rect.y();
|
|
|
|
pState->mnWidth = rect.width();
|
|
|
|
pState->mnHeight = rect.height();
|
2017-11-08 11:28:04 +01:00
|
|
|
pState->mnMask |= WindowStateMask::X | WindowStateMask::Y | WindowStateMask::Width
|
|
|
|
| WindowStateMask::Height;
|
2017-10-30 18:33:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::ShowFullScreen(bool bFullScreen, sal_Int32 nScreen)
|
|
|
|
{
|
|
|
|
assert(m_pTopLevel);
|
|
|
|
|
|
|
|
if (isWindow())
|
|
|
|
{
|
|
|
|
QWidget* const pWidget = m_pTopLevel ? m_pTopLevel : m_pQWidget;
|
|
|
|
pWidget->show();
|
|
|
|
|
|
|
|
// do that before going fullscreen
|
|
|
|
SetScreenNumber(nScreen);
|
|
|
|
bFullScreen ? windowHandle()->showFullScreen() : windowHandle()->showNormal();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt5Frame::StartPresentation(bool)
|
|
|
|
{
|
|
|
|
// meh - so there's no Qt platform independent solution - defer to
|
|
|
|
// KDE5 impl. For everyone else:
|
|
|
|
// https://forum.qt.io/topic/38504/solved-qdialog-in-fullscreen-disable-os-screensaver
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SetAlwaysOnTop(bool bOnTop)
|
|
|
|
{
|
|
|
|
QWidget* const pWidget = m_pTopLevel ? m_pTopLevel : m_pQWidget;
|
|
|
|
const Qt::WindowFlags flags = pWidget->windowFlags();
|
|
|
|
if (bOnTop)
|
|
|
|
pWidget->setWindowFlags(flags | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint);
|
|
|
|
else
|
|
|
|
pWidget->setWindowFlags(flags & ~(Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint));
|
|
|
|
pWidget->show();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::ToTop(SalFrameToTop nFlags)
|
|
|
|
{
|
|
|
|
QWidget* const pWidget = m_pTopLevel ? m_pTopLevel : m_pQWidget;
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
if (isWindow() && !(nFlags & SalFrameToTop::GrabFocusOnly))
|
|
|
|
pWidget->raise();
|
2018-09-04 22:37:27 +02:00
|
|
|
pWidget->setFocus();
|
2018-09-04 09:17:11 +02:00
|
|
|
pWidget->activateWindow();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetPointer(PointerStyle ePointerStyle)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-11-08 11:28:04 +01:00
|
|
|
QWindow* pWindow = m_pQWidget->window()->windowHandle();
|
|
|
|
if (!pWindow)
|
2017-10-30 19:32:45 +01:00
|
|
|
return;
|
2017-11-08 11:28:04 +01:00
|
|
|
if (ePointerStyle == m_ePointerStyle)
|
2017-10-30 19:32:45 +01:00
|
|
|
return;
|
|
|
|
m_ePointerStyle = ePointerStyle;
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
pWindow->setCursor(static_cast<Qt5Data*>(GetSalData())->getCursor(ePointerStyle));
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::CaptureMouse(bool bMouse)
|
|
|
|
{
|
2018-09-04 21:05:03 +02:00
|
|
|
static const char* pEnv = getenv("SAL_NO_MOUSEGRABS");
|
|
|
|
if (pEnv && *pEnv)
|
|
|
|
return;
|
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
if (bMouse)
|
2018-09-04 21:05:03 +02:00
|
|
|
m_pQWidget->grabMouse();
|
2018-09-04 09:17:11 +02:00
|
|
|
else
|
2018-09-04 21:05:03 +02:00
|
|
|
m_pQWidget->releaseMouse();
|
2018-09-04 09:17:11 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt5Frame::SetPointerPos(long nX, long nY)
|
|
|
|
{
|
2018-09-04 21:05:03 +02:00
|
|
|
QCursor aCursor = m_pQWidget->cursor();
|
2018-09-05 09:01:02 +02:00
|
|
|
QCursor::setPos(m_pQWidget->mapToGlobal(QPoint(nX, nY)));
|
2018-09-04 21:05:03 +02:00
|
|
|
m_pQWidget->setCursor(aCursor);
|
2018-09-04 09:17:11 +02:00
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::Flush()
|
|
|
|
{
|
|
|
|
QGuiApplication::sync();
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
// unclear if we need to also flush cairo surface - gtk3 backend
|
|
|
|
// does not do it. QPainter in Qt5Widget::paintEvent() is
|
|
|
|
// destroyed, so that state should be safely flushed.
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
// do we even need it? void Qt5Frame::Flush(const tools::Rectangle& /*rRect*/) {}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SetInputContext(SalInputContext* /*pContext*/)
|
|
|
|
{
|
|
|
|
// TODO some IM handler setup
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::EndExtTextInput(EndExtTextInputFlags /*nFlags*/)
|
|
|
|
{
|
|
|
|
// TODO fwd to IM handler
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
OUString Qt5Frame::GetKeyName(sal_uInt16 /*nKeyCode*/)
|
|
|
|
{
|
|
|
|
// TODO retrieve key cap / modifier names
|
|
|
|
return OUString();
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-01-08 09:38:24 +02:00
|
|
|
bool Qt5Frame::MapUnicodeToKeyCode(sal_Unicode /*aUnicode*/, LanguageType /*aLangType*/,
|
|
|
|
vcl::KeyCode& /*rKeyCode*/)
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2018-09-04 09:17:11 +02:00
|
|
|
// not supported yet
|
2017-10-21 13:50:30 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
LanguageType Qt5Frame::GetInputLanguage()
|
|
|
|
{
|
|
|
|
// fallback
|
|
|
|
return LANGUAGE_DONTKNOW;
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-08-09 14:51:41 +02:00
|
|
|
static Color toColor(const QColor& rColor)
|
|
|
|
{
|
|
|
|
return Color(rColor.red(), rColor.green(), rColor.blue());
|
|
|
|
}
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
void Qt5Frame::UpdateSettings(AllSettings& rSettings)
|
|
|
|
{
|
2018-08-09 14:45:49 +02:00
|
|
|
if (Qt5Data::noNativeControls())
|
|
|
|
return;
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
StyleSettings style(rSettings.GetStyleSettings());
|
|
|
|
|
2018-08-09 14:51:41 +02:00
|
|
|
// General settings
|
|
|
|
QPalette pal = QApplication::palette();
|
|
|
|
|
|
|
|
style.SetToolbarIconSize(ToolbarIconSize::Large);
|
|
|
|
|
|
|
|
style.SetActiveColor(toColor(pal.color(QPalette::Active, QPalette::Window)));
|
|
|
|
style.SetDeactiveColor(toColor(pal.color(QPalette::Inactive, QPalette::Window)));
|
|
|
|
|
|
|
|
style.SetActiveTextColor(toColor(pal.color(QPalette::Active, QPalette::WindowText)));
|
|
|
|
style.SetDeactiveTextColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText)));
|
|
|
|
|
|
|
|
Color aFore = toColor(pal.color(QPalette::Active, QPalette::WindowText));
|
|
|
|
Color aBack = toColor(pal.color(QPalette::Active, QPalette::Window));
|
|
|
|
Color aText = toColor(pal.color(QPalette::Active, QPalette::Text));
|
|
|
|
Color aBase = toColor(pal.color(QPalette::Active, QPalette::Base));
|
|
|
|
Color aButn = toColor(pal.color(QPalette::Active, QPalette::ButtonText));
|
|
|
|
Color aMid = toColor(pal.color(QPalette::Active, QPalette::Mid));
|
|
|
|
Color aHigh = toColor(pal.color(QPalette::Active, QPalette::Highlight));
|
|
|
|
Color aHighText = toColor(pal.color(QPalette::Active, QPalette::HighlightedText));
|
|
|
|
|
|
|
|
style.SetSkipDisabledInMenus(true);
|
|
|
|
|
|
|
|
// Foreground
|
|
|
|
style.SetRadioCheckTextColor(aFore);
|
|
|
|
style.SetLabelTextColor(aFore);
|
|
|
|
style.SetDialogTextColor(aFore);
|
|
|
|
style.SetGroupTextColor(aFore);
|
|
|
|
|
|
|
|
// Text
|
|
|
|
style.SetFieldTextColor(aText);
|
|
|
|
style.SetFieldRolloverTextColor(aText);
|
|
|
|
style.SetWindowTextColor(aText);
|
|
|
|
style.SetToolTextColor(aText);
|
|
|
|
|
|
|
|
// Base
|
|
|
|
style.SetFieldColor(aBase);
|
|
|
|
style.SetWindowColor(aBase);
|
|
|
|
style.SetActiveTabColor(aBase);
|
|
|
|
|
|
|
|
// Buttons
|
|
|
|
style.SetButtonTextColor(aButn);
|
|
|
|
style.SetButtonRolloverTextColor(aButn);
|
|
|
|
style.SetButtonPressedRolloverTextColor(aButn);
|
|
|
|
|
|
|
|
// Tabs
|
|
|
|
style.SetTabTextColor(aButn);
|
|
|
|
style.SetTabRolloverTextColor(aButn);
|
|
|
|
style.SetTabHighlightTextColor(aButn);
|
|
|
|
|
|
|
|
// Disable color
|
|
|
|
style.SetDisableColor(toColor(pal.color(QPalette::Disabled, QPalette::WindowText)));
|
|
|
|
|
|
|
|
// Background
|
|
|
|
style.BatchSetBackgrounds(aBack);
|
|
|
|
style.SetInactiveTabColor(aBack);
|
|
|
|
|
|
|
|
// Workspace
|
|
|
|
style.SetWorkspaceColor(aMid);
|
|
|
|
|
|
|
|
// Selection
|
|
|
|
style.SetHighlightColor(aHigh);
|
|
|
|
style.SetHighlightTextColor(aHighText);
|
|
|
|
|
|
|
|
// Tooltip
|
|
|
|
style.SetHelpColor(toColor(QToolTip::palette().color(QPalette::Active, QPalette::ToolTipBase)));
|
|
|
|
style.SetHelpTextColor(
|
|
|
|
toColor(QToolTip::palette().color(QPalette::Active, QPalette::ToolTipText)));
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
const int flash_time = QApplication::cursorFlashTime();
|
|
|
|
style.SetCursorBlinkTime(flash_time != 0 ? flash_time / 2 : STYLE_CURSOR_NOBLINKTIME);
|
|
|
|
|
2018-08-09 14:51:41 +02:00
|
|
|
// Menu
|
|
|
|
std::unique_ptr<QMenuBar> pMenuBar = std::unique_ptr<QMenuBar>(new QMenuBar());
|
|
|
|
QPalette qMenuCG = pMenuBar->palette();
|
|
|
|
|
|
|
|
// Menu text and background color, theme specific
|
|
|
|
Color aMenuFore = toColor(qMenuCG.color(QPalette::WindowText));
|
|
|
|
Color aMenuBack = toColor(qMenuCG.color(QPalette::Window));
|
|
|
|
|
|
|
|
style.SetMenuTextColor(aMenuFore);
|
|
|
|
style.SetMenuBarTextColor(style.GetPersonaMenuBarTextColor().get_value_or(aMenuFore));
|
|
|
|
style.SetMenuColor(aMenuBack);
|
|
|
|
style.SetMenuBarColor(aMenuBack);
|
|
|
|
style.SetMenuHighlightColor(toColor(qMenuCG.color(QPalette::Highlight)));
|
|
|
|
style.SetMenuHighlightTextColor(toColor(qMenuCG.color(QPalette::HighlightedText)));
|
|
|
|
|
|
|
|
// set special menubar highlight text color
|
|
|
|
if (QApplication::style()->inherits("HighContrastStyle"))
|
|
|
|
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor
|
|
|
|
= toColor(qMenuCG.color(QPalette::HighlightedText));
|
|
|
|
else
|
|
|
|
ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore;
|
|
|
|
|
|
|
|
// set menubar rollover color
|
|
|
|
if (pMenuBar->style()->styleHint(QStyle::SH_MenuBar_MouseTracking))
|
|
|
|
{
|
|
|
|
style.SetMenuBarRolloverColor(toColor(qMenuCG.color(QPalette::Highlight)));
|
|
|
|
style.SetMenuBarRolloverTextColor(ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
style.SetMenuBarRolloverColor(aMenuBack);
|
|
|
|
style.SetMenuBarRolloverTextColor(aMenuFore);
|
|
|
|
}
|
|
|
|
style.SetMenuBarHighlightTextColor(style.GetMenuHighlightTextColor());
|
|
|
|
|
|
|
|
// Scroll bar size
|
|
|
|
style.SetScrollBarSize(QApplication::style()->pixelMetric(QStyle::PM_ScrollBarExtent));
|
|
|
|
style.SetMinThumbSize(QApplication::style()->pixelMetric(QStyle::PM_ScrollBarSliderMin));
|
|
|
|
|
|
|
|
// These colors are used for the ruler text and marks
|
|
|
|
style.SetShadowColor(toColor(pal.color(QPalette::Disabled, QPalette::WindowText)));
|
|
|
|
style.SetDarkShadowColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText)));
|
|
|
|
|
2017-12-08 11:37:18 +00:00
|
|
|
rSettings.SetStyleSettings(style);
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::Beep() { QApplication::beep(); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
const SystemEnvData* Qt5Frame::GetSystemData() const { return nullptr; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-10-30 18:45:46 +01:00
|
|
|
SalFrame::SalPointerState Qt5Frame::GetPointerState()
|
2017-10-21 13:50:30 +00:00
|
|
|
{
|
2017-10-30 19:55:18 +01:00
|
|
|
SalPointerState aState;
|
|
|
|
QPoint pos = QCursor::pos();
|
2017-11-08 11:28:04 +01:00
|
|
|
aState.maPos = Point(pos.x(), pos.y());
|
2018-01-08 09:40:00 +02:00
|
|
|
aState.mnState = GetMouseModCode(QGuiApplication::mouseButtons())
|
|
|
|
| GetKeyModCode(QGuiApplication::keyboardModifiers());
|
2017-10-30 19:55:18 +01:00
|
|
|
return aState;
|
2017-10-21 13:50:30 +00:00
|
|
|
}
|
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
KeyIndicatorState Qt5Frame::GetIndicatorState() { return KeyIndicatorState(); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SimulateKeyPress(sal_uInt16 nKeyCode)
|
|
|
|
{
|
|
|
|
SAL_WARN("vcl.kde5", "missing simulate keypress " << nKeyCode);
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2017-11-08 11:28:04 +01:00
|
|
|
void Qt5Frame::SetParent(SalFrame* pNewParent) { m_pParent = static_cast<Qt5Frame*>(pNewParent); }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
bool Qt5Frame::SetPluginParent(SystemParentData* /*pNewParent*/)
|
|
|
|
{
|
|
|
|
//FIXME: no SetPluginParent impl. for kde5
|
|
|
|
return false;
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::ResetClipRegion() { m_bNullRegion = true; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::BeginSetClipRegion(sal_uLong)
|
|
|
|
{
|
|
|
|
m_aRegion = QRegion(QRect(QPoint(0, 0), m_pQWidget->size()));
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::UnionClipRegion(long nX, long nY, long nWidth, long nHeight)
|
|
|
|
{
|
2018-09-05 08:58:27 +02:00
|
|
|
m_aRegion = m_aRegion.united(QRegion(nX, nY, nWidth, nHeight));
|
2018-09-04 09:17:11 +02:00
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::EndSetClipRegion() { m_bNullRegion = false; }
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SetScreenNumber(unsigned int nScreen)
|
|
|
|
{
|
|
|
|
if (isWindow())
|
|
|
|
{
|
|
|
|
QWindow* const pWindow = windowHandle();
|
|
|
|
if (pWindow)
|
|
|
|
pWindow->setScreen(QApplication::screens()[nScreen]);
|
|
|
|
}
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
2018-09-04 09:17:11 +02:00
|
|
|
void Qt5Frame::SetApplicationID(const OUString&)
|
|
|
|
{
|
|
|
|
// So the hope is that QGuiApplication deals with this properly..
|
|
|
|
}
|
2017-10-21 13:50:30 +00:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|