summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2024-12-20 22:03:45 +0100
committerMichael Weghorn <m.weghorn@posteo.de>2024-12-21 09:29:58 +0100
commit3d96c29132f06ddcd6292654be233b8d17895e3e (patch)
tree8b045cb3aa8f8af58239e02b20a2eac08cb6530d
parentb8ca64234f2b35b0d984999f36414bb20cf192b7 (diff)
tdf#130857 qt weld: Implement basic menu logic
Implement basic logic related to menus: * Creating menus and simple menu items in QtBuilder. * Setting and retrieving misc properties for menu items in QtInstanceMenu. Use the QObject::objectName property [1] to hold the ID for menus and menu items. Introduce a PROPERTY_ACTION_NAME to hold the action name/command name for menu items. This property gets set for the corresponding QAction objects. [1] https://doc.qt.io/qt-6/qobject.html#objectName-prop Change-Id: Ic866377e42202bde6d1f8bd215829ff99a4b682a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178968 Reviewed-by: Michael Weghorn <m.weghorn@posteo.de> Tested-by: Jenkins
-rw-r--r--vcl/inc/qt5/QtBuilder.hxx2
-rw-r--r--vcl/inc/qt5/QtInstanceMenu.hxx8
-rw-r--r--vcl/qt5/QtBuilder.cxx29
-rw-r--r--vcl/qt5/QtInstanceMenu.cxx131
4 files changed, 141 insertions, 29 deletions
diff --git a/vcl/inc/qt5/QtBuilder.hxx b/vcl/inc/qt5/QtBuilder.hxx
index d962a26c983b..0aefd50cd5ab 100644
--- a/vcl/inc/qt5/QtBuilder.hxx
+++ b/vcl/inc/qt5/QtBuilder.hxx
@@ -84,7 +84,7 @@ public:
virtual bool isHorizontalTabControl(QObject* pObject) override;
- virtual QMenu* createMenu(const OUString& rID) override;
+ virtual QMenu* createMenu(const OUString& rId) override;
virtual void insertMenuObject(QMenu* pParent, QMenu* pSubMenu, const OUString& rClass,
const OUString& rID, stringmap& rProps, stringmap& rAtkProps,
accelmap& rAccels) override;
diff --git a/vcl/inc/qt5/QtInstanceMenu.hxx b/vcl/inc/qt5/QtInstanceMenu.hxx
index 3133351cf005..a4194a159edd 100644
--- a/vcl/inc/qt5/QtInstanceMenu.hxx
+++ b/vcl/inc/qt5/QtInstanceMenu.hxx
@@ -47,7 +47,13 @@ public:
virtual int n_children() const override;
- virtual OUString get_id(int pos) const override;
+ virtual OUString get_id(int nPos) const override;
+
+ static void setActionName(QAction& rAction, const OUString& rActionName);
+
+private:
+ // get action with the given ID
+ QAction* getAction(const OUString& rIdent) const;
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx
index b03bd8a9646c..d56c96168eb6 100644
--- a/vcl/qt5/QtBuilder.cxx
+++ b/vcl/qt5/QtBuilder.cxx
@@ -12,6 +12,7 @@
#include <QtDoubleSpinBox.hxx>
#include <QtExpander.hxx>
#include <QtInstanceLinkButton.hxx>
+#include <QtInstanceMenu.hxx>
#include <QtInstanceMessageDialog.hxx>
#include <QtInstanceNotebook.hxx>
#include <QtTools.hxx>
@@ -568,16 +569,32 @@ bool QtBuilder::isHorizontalTabControl(QObject* pObject)
|| ePosition == QTabWidget::TabPosition::South;
}
-QMenu* QtBuilder::createMenu(const OUString&)
+QMenu* QtBuilder::createMenu(const OUString& rId)
{
- assert(false && "Not implemented yet");
- return nullptr;
+ QMenu* pMenu = new QMenu;
+ pMenu->setObjectName(toQString(rId));
+ return pMenu;
}
-void QtBuilder::insertMenuObject(QMenu*, QMenu*, const OUString&, const OUString&, stringmap&,
- stringmap&, accelmap&)
+void QtBuilder::insertMenuObject(QMenu* pParent, QMenu* pSubMenu, const OUString& rClass,
+ const OUString& rID, stringmap& rProps, stringmap&, accelmap&)
{
- assert(false && "Not implemented yet");
+ assert(!pSubMenu && "Handling not implemented yet");
+ (void)pSubMenu;
+
+ if (rClass == "GtkMenuItem")
+ {
+ const OUString sLabel = extractLabel(rProps);
+ QAction* pAction = pParent->addAction(toQString(sLabel));
+ pAction->setObjectName(toQString(rID));
+
+ const OUString sActionName(extractActionName(rProps));
+ QtInstanceMenu::setActionName(*pAction, sActionName);
+ }
+ else
+ {
+ assert(false && "Not implemented yet");
+ }
}
void QtBuilder::applyAtkProperties(QObject* pObject, const stringmap& rProperties, bool)
diff --git a/vcl/qt5/QtInstanceMenu.cxx b/vcl/qt5/QtInstanceMenu.cxx
index c998342aab1d..1effb5913667 100644
--- a/vcl/qt5/QtInstanceMenu.cxx
+++ b/vcl/qt5/QtInstanceMenu.cxx
@@ -11,8 +11,13 @@
#include <QtInstanceMenu.moc>
#include <QtInstance.hxx>
+#include <QtTools.hxx>
#include <vcl/svapp.hxx>
+#include <vcl/qt/QtUtils.hxx>
+
+// Property for storing an action name in a menu item
+const char* const PROPERTY_ACTION_NAME = "action-name";
QtInstanceMenu::QtInstanceMenu(QMenu* pMenu)
: m_pMenu(pMenu)
@@ -26,37 +31,84 @@ OUString QtInstanceMenu::popup_at_rect(weld::Widget*, const tools::Rectangle&, w
return OUString();
}
-void QtInstanceMenu::set_sensitive(const OUString&, bool)
+void QtInstanceMenu::set_sensitive(const OUString& rIdent, bool bSensitive)
{
- assert(false && "Not implemented yet");
+ SolarMutexGuard g;
+
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ pAction->setEnabled(bSensitive);
+ });
}
-bool QtInstanceMenu::get_sensitive(const OUString&) const
+bool QtInstanceMenu::get_sensitive(const OUString& rIdent) const
{
- assert(false && "Not implemented yet");
- return false;
+ SolarMutexGuard g;
+
+ bool bSensitive = false;
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ bSensitive = pAction->isEnabled();
+ });
+
+ return bSensitive;
}
-void QtInstanceMenu::set_label(const OUString&, const OUString&)
+void QtInstanceMenu::set_label(const OUString& rIdent, const OUString& rLabel)
{
- assert(false && "Not implemented yet");
+ SolarMutexGuard g;
+
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ pAction->setText(toQString(rLabel));
+ });
}
-OUString QtInstanceMenu::get_label(const OUString&) const
+OUString QtInstanceMenu::get_label(const OUString& rIdent) const
{
- assert(false && "Not implemented yet");
- return OUString();
+ SolarMutexGuard g;
+
+ OUString sLabel;
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ sLabel = toOUString(pAction->text());
+ });
+
+ return sLabel;
}
-void QtInstanceMenu::set_active(const OUString&, bool) { assert(false && "Not implemented yet"); }
+void QtInstanceMenu::set_active(const OUString& rIdent, bool bActive)
+{
+ SolarMutexGuard g;
+
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ pAction->setChecked(bActive);
+ });
+}
-bool QtInstanceMenu::get_active(const OUString&) const
+bool QtInstanceMenu::get_active(const OUString& rIdent) const
{
- assert(false && "Not implemented yet");
- return false;
+ SolarMutexGuard g;
+
+ bool bActive = false;
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ bActive = pAction->isChecked();
+ });
+
+ return bActive;
}
-void QtInstanceMenu::set_visible(const OUString&, bool) { assert(false && "Not implemented yet"); }
+void QtInstanceMenu::set_visible(const OUString& rIdent, bool bVisible)
+{
+ SolarMutexGuard g;
+
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rIdent))
+ pAction->setVisible(bVisible);
+ });
+}
void QtInstanceMenu::insert(int, const OUString&, const OUString&, const OUString*, VirtualDevice*,
const css::uno::Reference<css::graphic::XGraphic>&, TriState)
@@ -69,7 +121,15 @@ void QtInstanceMenu::set_item_help_id(const OUString&, const OUString&)
assert(false && "Not implemented yet");
}
-void QtInstanceMenu::remove(const OUString&) { assert(false && "Not implemented yet"); }
+void QtInstanceMenu::remove(const OUString& rId)
+{
+ SolarMutexGuard g;
+
+ GetQtInstance().RunInMainThread([&] {
+ if (QAction* pAction = getAction(rId))
+ m_pMenu->removeAction(pAction);
+ });
+}
void QtInstanceMenu::clear()
{
@@ -84,14 +144,43 @@ void QtInstanceMenu::insert_separator(int, const OUString&)
int QtInstanceMenu::n_children() const
{
- assert(false && "Not implemented yet");
- return 0;
+ SolarMutexGuard g;
+
+ int nChildCount = 0;
+ GetQtInstance().RunInMainThread([&] { nChildCount = m_pMenu->actions().size(); });
+
+ return nChildCount;
}
-OUString QtInstanceMenu::get_id(int) const
+OUString QtInstanceMenu::get_id(int nPos) const
{
- assert(false && "Not implemented yet");
- return OUString();
+ SolarMutexGuard g;
+
+ OUString sId;
+ GetQtInstance().RunInMainThread([&] {
+ QList<QAction*> aActions = m_pMenu->actions();
+ if (nPos < aActions.size())
+ sId = toOUString(aActions.at(nPos)->objectName());
+ });
+
+ return sId;
+}
+
+void QtInstanceMenu::setActionName(QAction& rAction, const OUString& rActionName)
+{
+ rAction.setProperty(PROPERTY_ACTION_NAME, toQString(rActionName));
+}
+
+QAction* QtInstanceMenu::getAction(const OUString& rIdent) const
+{
+ QList<QAction*> aActions = m_pMenu->actions();
+ for (QAction* pAction : aActions)
+ {
+ if (pAction && pAction->objectName() == toQString(rIdent))
+ return pAction;
+ }
+
+ return nullptr;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */