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:
virtual void SetAccelerator(unsigned nPos, SalMenuItem* pSalMenuItem,
const vcl::KeyCode& rKeyCode, const OUString& rKeyName) override;
virtual void GetSystemMenuData(SystemMenuData* pData) override;
virtual void ShowCloseButton(bool bShow) override;
void SetMenu(Menu* pMenu) { mpVCLMenu = pMenu; }
Menu* GetMenu() { return mpVCLMenu; }
......@@ -77,6 +78,7 @@ private slots:
static void slotMenuTriggered(Qt5MenuItem* pQItem);
static void slotMenuAboutToShow(Qt5MenuItem* pQItem);
static void slotMenuAboutToHide(Qt5MenuItem* pQItem);
void slotCloseDocument();
};
class Qt5MenuItem : public SalMenuItem
......
......@@ -34,6 +34,9 @@
#include <memory>
class Image;
class QImage;
inline OUString toOUString(const QString& s)
{
// QString stores UTF16, just like OUString
......@@ -136,4 +139,6 @@ typedef std::unique_ptr<cairo_surface_t, CairoDeleter> UniqueCairoSurface;
sal_uInt16 GetKeyModCode(Qt::KeyboardModifiers eKeyModifiers);
sal_uInt16 GetMouseModCode(Qt::MouseButtons eButtons);
QImage toQImage(const Image& rImage);
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -7,19 +7,21 @@
* 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.moc>
#include <Qt5Frame.hxx>
#include <Qt5Instance.hxx>
#include <Qt5MainWindow.hxx>
#include <QtWidgets/QtWidgets>
#include <QtWidgets/QMenuBar>
#include <QtWidgets/QPushButton>
#include <vcl/svapp.hxx>
#include <sal/log.hxx>
#include <vcl/pngwrite.hxx>
#include <tools/stream.hxx>
#include <strings.hrc>
#include <bitmaps.hlst>
Qt5Menu::Qt5Menu(bool bMenuBar)
: mpVCLMenu(nullptr)
......@@ -421,6 +423,7 @@ void Qt5Menu::DoFullMenuUpdate(Menu* pMenuBar)
{
// clear action groups since menu is rebuilt
ResetAllActionGroups();
ShowCloseButton(false);
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)
if (!pAction)
return;
QImage aImage;
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));
pAction->setIcon(QPixmap::fromImage(toQImage(rImage)));
}
void Qt5Menu::SetAccelerator(unsigned, SalMenuItem* pItem, const vcl::KeyCode&,
......@@ -607,6 +596,49 @@ void Qt5Menu::NativeItemText(OUString& rItemText)
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)
: mpParentMenu(nullptr)
, mpSubMenu(nullptr)
......
......@@ -21,7 +21,12 @@
#include <cairo.h>
#include <tools/stream.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); }
......@@ -89,4 +94,19 @@ Qt::DropAction getPreferredDropAction(sal_Int8 dragOperation)
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: */
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