Kaydet (Commit) 8ea988f5 authored tarafından Jan-Marek Glogowski's avatar Jan-Marek Glogowski

tdf#123549 Qt5 implement Qt5Menu::ShowCloseButton

This includes some not-so-nice lifetime handling of the button
"clicked" connection handling. I decided to keep the code in
one place, simply always forcing a disconnect on show, instead
of a more "optimized" code version in SetFrame.

First we try to get the icon from the system theme, but use LO's
own icon theme as a fallback.

Change-Id: Ic0459623ec907b9a54bef4670bf65cf587cd47ea
Reviewed-on: https://gerrit.libreoffice.org/71784Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarJan-Marek Glogowski <glogow@fbihome.de>
üst eef7b7c4
...@@ -67,6 +67,7 @@ public: ...@@ -67,6 +67,7 @@ public:
virtual void SetAccelerator(unsigned nPos, SalMenuItem* pSalMenuItem, virtual void SetAccelerator(unsigned nPos, SalMenuItem* pSalMenuItem,
const vcl::KeyCode& rKeyCode, const OUString& rKeyName) override; const vcl::KeyCode& rKeyCode, const OUString& rKeyName) override;
virtual void GetSystemMenuData(SystemMenuData* pData) override; virtual void GetSystemMenuData(SystemMenuData* pData) override;
virtual void ShowCloseButton(bool bShow) override;
void SetMenu(Menu* pMenu) { mpVCLMenu = pMenu; } void SetMenu(Menu* pMenu) { mpVCLMenu = pMenu; }
Menu* GetMenu() { return mpVCLMenu; } Menu* GetMenu() { return mpVCLMenu; }
...@@ -77,6 +78,7 @@ private slots: ...@@ -77,6 +78,7 @@ private slots:
static void slotMenuTriggered(Qt5MenuItem* pQItem); static void slotMenuTriggered(Qt5MenuItem* pQItem);
static void slotMenuAboutToShow(Qt5MenuItem* pQItem); static void slotMenuAboutToShow(Qt5MenuItem* pQItem);
static void slotMenuAboutToHide(Qt5MenuItem* pQItem); static void slotMenuAboutToHide(Qt5MenuItem* pQItem);
void slotCloseDocument();
}; };
class Qt5MenuItem : public SalMenuItem class Qt5MenuItem : public SalMenuItem
......
...@@ -34,6 +34,9 @@ ...@@ -34,6 +34,9 @@
#include <memory> #include <memory>
class Image;
class QImage;
inline OUString toOUString(const QString& s) inline OUString toOUString(const QString& s)
{ {
// QString stores UTF16, just like OUString // QString stores UTF16, just like OUString
...@@ -136,4 +139,6 @@ typedef std::unique_ptr<cairo_surface_t, CairoDeleter> UniqueCairoSurface; ...@@ -136,4 +139,6 @@ typedef std::unique_ptr<cairo_surface_t, CairoDeleter> UniqueCairoSurface;
sal_uInt16 GetKeyModCode(Qt::KeyboardModifiers eKeyModifiers); sal_uInt16 GetKeyModCode(Qt::KeyboardModifiers eKeyModifiers);
sal_uInt16 GetMouseModCode(Qt::MouseButtons eButtons); sal_uInt16 GetMouseModCode(Qt::MouseButtons eButtons);
QImage toQImage(const Image& rImage);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -7,19 +7,21 @@ ...@@ -7,19 +7,21 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
#include <Qt5Frame.hxx>
#include <Qt5MainWindow.hxx>
#include <Qt5Bitmap.hxx>
#include <Qt5Menu.hxx> #include <Qt5Menu.hxx>
#include <Qt5Menu.moc> #include <Qt5Menu.moc>
#include <Qt5Frame.hxx>
#include <Qt5Instance.hxx> #include <Qt5Instance.hxx>
#include <Qt5MainWindow.hxx>
#include <QtWidgets/QtWidgets> #include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <vcl/svapp.hxx> #include <vcl/svapp.hxx>
#include <sal/log.hxx> #include <sal/log.hxx>
#include <vcl/pngwrite.hxx>
#include <tools/stream.hxx> #include <strings.hrc>
#include <bitmaps.hlst>
Qt5Menu::Qt5Menu(bool bMenuBar) Qt5Menu::Qt5Menu(bool bMenuBar)
: mpVCLMenu(nullptr) : mpVCLMenu(nullptr)
...@@ -421,6 +423,7 @@ void Qt5Menu::DoFullMenuUpdate(Menu* pMenuBar) ...@@ -421,6 +423,7 @@ void Qt5Menu::DoFullMenuUpdate(Menu* pMenuBar)
{ {
// clear action groups since menu is rebuilt // clear action groups since menu is rebuilt
ResetAllActionGroups(); ResetAllActionGroups();
ShowCloseButton(false);
for (sal_Int32 nItem = 0; nItem < static_cast<sal_Int32>(GetItemCount()); nItem++) for (sal_Int32 nItem = 0; nItem < static_cast<sal_Int32>(GetItemCount()); nItem++)
{ {
...@@ -507,21 +510,7 @@ void Qt5Menu::SetItemImage(unsigned, SalMenuItem* pItem, const Image& rImage) ...@@ -507,21 +510,7 @@ void Qt5Menu::SetItemImage(unsigned, SalMenuItem* pItem, const Image& rImage)
if (!pAction) if (!pAction)
return; return;
QImage aImage; pAction->setIcon(QPixmap::fromImage(toQImage(rImage)));
if (!!rImage)
{
SvMemoryStream aMemStm;
vcl::PNGWriter aWriter(rImage.GetBitmapEx());
aWriter.Write(aMemStm);
if (!aImage.loadFromData(static_cast<const uchar*>(aMemStm.GetData()), aMemStm.TellEnd()))
{
return;
}
}
pAction->setIcon(QPixmap::fromImage(aImage));
} }
void Qt5Menu::SetAccelerator(unsigned, SalMenuItem* pItem, const vcl::KeyCode&, void Qt5Menu::SetAccelerator(unsigned, SalMenuItem* pItem, const vcl::KeyCode&,
...@@ -607,6 +596,49 @@ void Qt5Menu::NativeItemText(OUString& rItemText) ...@@ -607,6 +596,49 @@ void Qt5Menu::NativeItemText(OUString& rItemText)
rItemText = rItemText.replace('~', '&'); rItemText = rItemText.replace('~', '&');
} }
void Qt5Menu::slotCloseDocument()
{
MenuBar* pVclMenuBar = static_cast<MenuBar*>(mpVCLMenu.get());
if (pVclMenuBar)
Application::PostUserEvent(pVclMenuBar->GetCloseButtonClickHdl());
}
void Qt5Menu::ShowCloseButton(bool bShow)
{
if (!mpQMenuBar)
return;
QPushButton* pButton = static_cast<QPushButton*>(mpQMenuBar->cornerWidget(Qt::TopRightCorner));
if (!pButton)
{
QIcon aIcon;
if (QIcon::hasThemeIcon("window-close-symbolic"))
aIcon = QIcon::fromTheme("window-close-symbolic");
else
aIcon = QIcon(
QPixmap::fromImage((toQImage(Image(StockImage::Yes, SV_RESID_BITMAP_CLOSEDOC)))));
pButton = new QPushButton(mpQMenuBar);
pButton->setIcon(aIcon);
pButton->setFlat(true);
pButton->setToolTip(toQString(VclResId(SV_HELPTEXT_CLOSEDOCUMENT)));
mpQMenuBar->setCornerWidget(pButton, Qt::TopRightCorner);
}
if (bShow)
{
// The mpQMenuBar is used in multiple Qt5Menu. If one Qt5Menu is deleted, the clicked button
// connection is severed. The reconnect could be handled in SetFrame, but ShowCloseButton is
// called so seldomly, that I decided to keep the reconnect in this function in one place. As
// we don't know the connection state, we unconditionally remove it, so slotCloseDocument
// isn't called multiple times on click.
pButton->disconnect(SIGNAL(clicked(bool)));
connect(pButton, &QPushButton::clicked, this, &Qt5Menu::slotCloseDocument);
pButton->show();
}
else
pButton->hide();
}
Qt5MenuItem::Qt5MenuItem(const SalItemParams* pItemData) Qt5MenuItem::Qt5MenuItem(const SalItemParams* pItemData)
: mpParentMenu(nullptr) : mpParentMenu(nullptr)
, mpSubMenu(nullptr) , mpSubMenu(nullptr)
......
...@@ -21,7 +21,12 @@ ...@@ -21,7 +21,12 @@
#include <cairo.h> #include <cairo.h>
#include <tools/stream.hxx>
#include <vcl/event.hxx> #include <vcl/event.hxx>
#include <vcl/image.hxx>
#include <vcl/pngwrite.hxx>
#include <QtGui/QImage>
void CairoDeleter::operator()(cairo_surface_t* pSurface) const { cairo_surface_destroy(pSurface); } void CairoDeleter::operator()(cairo_surface_t* pSurface) const { cairo_surface_destroy(pSurface); }
...@@ -89,4 +94,19 @@ Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation) ...@@ -89,4 +94,19 @@ Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation)
return eAct; return eAct;
} }
QImage toQImage(const Image& rImage)
{
QImage aImage;
if (!!rImage)
{
SvMemoryStream aMemStm;
vcl::PNGWriter aWriter(rImage.GetBitmapEx());
aWriter.Write(aMemStm);
aImage.loadFromData(static_cast<const uchar*>(aMemStm.GetData()), aMemStm.TellEnd());
}
return aImage;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment