vcl/inc/qt5/Qt5Menu.hxx | 2 + vcl/inc/qt5/Qt5Tools.hxx | 5 +++ vcl/qt5/Qt5Menu.cxx | 74 +++++++++++++++++++++++++++++++++-------------- vcl/qt5/Qt5Tools.cxx | 20 ++++++++++++ 4 files changed, 80 insertions(+), 21 deletions(-)
New commits: commit 8ea988f585db72da88994d29d006f1976007789d Author: Jan-Marek Glogowski <glo...@fbihome.de> AuthorDate: Sat May 4 00:03:15 2019 +0000 Commit: Jan-Marek Glogowski <glo...@fbihome.de> CommitDate: Tue May 7 17:42:32 2019 +0200 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/71784 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Jan-Marek Glogowski <glo...@fbihome.de> diff --git a/vcl/inc/qt5/Qt5Menu.hxx b/vcl/inc/qt5/Qt5Menu.hxx index f3807abb0bf6..76d865b263ff 100644 --- a/vcl/inc/qt5/Qt5Menu.hxx +++ b/vcl/inc/qt5/Qt5Menu.hxx @@ -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 diff --git a/vcl/inc/qt5/Qt5Tools.hxx b/vcl/inc/qt5/Qt5Tools.hxx index 8863e2496687..6b1fb1adcc7e 100644 --- a/vcl/inc/qt5/Qt5Tools.hxx +++ b/vcl/inc/qt5/Qt5Tools.hxx @@ -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: */ diff --git a/vcl/qt5/Qt5Menu.cxx b/vcl/qt5/Qt5Menu.cxx index d119c71010b9..5bfaefa9b931 100644 --- a/vcl/qt5/Qt5Menu.cxx +++ b/vcl/qt5/Qt5Menu.cxx @@ -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) diff --git a/vcl/qt5/Qt5Tools.cxx b/vcl/qt5/Qt5Tools.cxx index 94bb03d1797f..cff661ba8a34 100644 --- a/vcl/qt5/Qt5Tools.cxx +++ b/vcl/qt5/Qt5Tools.cxx @@ -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: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits