gtk4: implement some more of the menu requirements

just give each radiobutton its own group

Change-Id: I0239a3f1364cde91a668fe890a4178e4ce73f78b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116864
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
Caolán McNamara
2021-06-09 10:15:17 +02:00
parent 80f37b8fdc
commit 49dfd2245b
2 changed files with 48 additions and 36 deletions
+44 -18
View File
@@ -9419,9 +9419,6 @@ private:
{
clear_actions();
m_aActionEntries.push_back({"action", action_activated, "s", nullptr, nullptr, {}});
m_aInsertedActions.insert("action");
GtkPopover* pPopover = gtk_menu_button_get_popover(m_pMenuButton);
if (GMenuModel* pMenuModel = GTK_IS_POPOVER_MENU(pPopover) ?
gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(pPopover)) :
@@ -9442,7 +9439,10 @@ private:
{
// the const char* arg isn't copied by anything so it must continue to exist for the life time of
// the action group
m_aActionEntries.push_back({res.first->getStr(), action_activated, "s", "'none'", nullptr, {}});
if (sAction.startsWith("radio."))
m_aActionEntries.push_back({res.first->getStr(), action_activated, "s", "'none'", nullptr, {}});
else
m_aActionEntries.push_back({res.first->getStr(), action_activated, "s", nullptr, nullptr, {}});
}
g_free(id);
@@ -9606,9 +9606,28 @@ public:
#if !GTK_CHECK_VERSION(4, 0, 0)
MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSurface, eCheckRadioFalse);
#else
// TODO see g_menu_item_set_action_and_target
(void)pos; (void)rId; (void) rStr; (void)pIconName; (void)pImageSurface; (void)eCheckRadioFalse;
std::abort();
(void)pIconName; (void)pImageSurface;
GtkPopover* pPopover = gtk_menu_button_get_popover(m_pMenuButton);
if (GMenuModel* pMenuModel = GTK_IS_POPOVER_MENU(pPopover) ?
gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(pPopover)) :
nullptr)
{
GMenu* pMenu = G_MENU(pMenuModel);
// action with a target value ... the action name and target value are separated by a double
// colon ... For example: "app.action::target"
OUString sActionAndTarget;
if (eCheckRadioFalse == TRISTATE_INDET)
sActionAndTarget = "menu.normal." + rId + "::" + rId;
else
sActionAndTarget = "menu.radio." + rId + "::" + rId;
g_menu_insert(pMenu, pos, MapToGtkAccelerator(rStr).getStr(), sActionAndTarget.toUtf8().getStr());
assert(eCheckRadioFalse == TRISTATE_INDET); // come back to this later
// TODO not redo entire group
update_action_group_from_popover_model();
}
#endif
}
@@ -9617,8 +9636,17 @@ public:
#if !GTK_CHECK_VERSION(4, 0, 0)
MenuHelper::insert_separator(pos, rId);
#else
(void)pos; (void)rId;
std::abort();
(void)rId;
GtkPopover* pPopover = gtk_menu_button_get_popover(m_pMenuButton);
if (GMenuModel* pMenuModel = GTK_IS_POPOVER_MENU(pPopover) ?
gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(pPopover)) :
nullptr)
{
GMenu* pMenu = G_MENU(pMenuModel);
g_menu_insert(pMenu, pos, "SEPARATOR", "menu.action");
}
#endif
}
@@ -9651,12 +9679,8 @@ public:
virtual void set_item_active(const OString& rIdent, bool bActive) override
{
#if GTK_CHECK_VERSION(4, 0, 0)
if (bActive)
{
g_action_group_change_action_state(m_pActionGroup, m_aIdToAction[rIdent].getStr(),
g_variant_new_string(rIdent.getStr()));
}
// TODO checkboxes vs radiobuttons
g_action_group_change_action_state(m_pActionGroup, m_aIdToAction[rIdent].getStr(),
g_variant_new_string(bActive ? rIdent.getStr() : "'none'"));
#else
MenuHelper::set_item_active(rIdent, bActive);
#endif
@@ -9665,7 +9689,7 @@ public:
virtual void set_item_sensitive(const OString& rIdent, bool bSensitive) override
{
#if GTK_CHECK_VERSION(4, 0, 0)
GAction* pAction = g_action_map_lookup_action(G_ACTION_MAP(m_pActionGroup), rIdent.getStr());
GAction* pAction = g_action_map_lookup_action(G_ACTION_MAP(m_pActionGroup), m_aIdToAction[rIdent].getStr());
g_simple_action_set_enabled(G_SIMPLE_ACTION(pAction), bSensitive);
#else
MenuHelper::set_item_sensitive(rIdent, bSensitive);
@@ -9699,8 +9723,9 @@ public:
#if !GTK_CHECK_VERSION(4, 0, 0)
MenuHelper::set_item_visible(rIdent, bVisible);
#else
(void)rIdent; (void)bVisible;
std::abort();
// TODO visibility vs sensitivity
GAction* pAction = g_action_map_lookup_action(G_ACTION_MAP(m_pActionGroup), m_aIdToAction[rIdent].getStr());
g_simple_action_set_enabled(G_SIMPLE_ACTION(pAction), bVisible);
#endif
}
@@ -22051,6 +22076,7 @@ weld::Builder* GtkInstance::CreateBuilder(weld::Widget* pParent, const OUString&
rUIFile != "sfx/ui/documentfontspage.ui" &&
rUIFile != "sfx/ui/documentinfopage.ui" &&
rUIFile != "sfx/ui/documentpropertiesdialog.ui" &&
rUIFile != "sfx/ui/inputdialog.ui" &&
rUIFile != "sfx/ui/querysavedialog.ui" &&
rUIFile != "sfx/ui/licensedialog.ui" &&
rUIFile != "sfx/ui/linefragment.ui" &&
+4 -18
View File
@@ -127,13 +127,10 @@ void AddBorderAsMargins(const css::uno::Reference<css::xml::dom::XNode>& xNode,
struct MenuEntry
{
bool m_bDrawAsRadio;
OUString m_sRadioGroup;
css::uno::Reference<css::xml::dom::XNode> m_xPropertyLabel;
MenuEntry(bool bDrawAsRadio, const OUString& rRadioGroup,
const css::uno::Reference<css::xml::dom::XNode>& rPropertyLabel)
MenuEntry(bool bDrawAsRadio, const css::uno::Reference<css::xml::dom::XNode>& rPropertyLabel)
: m_bDrawAsRadio(bDrawAsRadio)
, m_sRadioGroup(rRadioGroup)
, m_xPropertyLabel(rPropertyLabel)
{
}
@@ -143,7 +140,6 @@ MenuEntry ConvertMenu(const css::uno::Reference<css::xml::dom::XNode>& xMenu,
const css::uno::Reference<css::xml::dom::XNode>& xNode)
{
bool bDrawAsRadio = false;
OUString sRadioGroup;
css::uno::Reference<css::xml::dom::XNode> xPropertyLabel;
css::uno::Reference<css::xml::dom::XNode> xChild = xNode->getFirstChild();
@@ -163,22 +159,16 @@ MenuEntry ConvertMenu(const css::uno::Reference<css::xml::dom::XNode>& xMenu,
{
bDrawAsRadio = toBool(xChild->getFirstChild()->getNodeValue());
}
else if (sName == "group")
{
sRadioGroup = xChild->getFirstChild()->getNodeValue();
}
}
auto xNextChild = xChild->getNextSibling();
bool bChildDrawAsRadio = false;
OUString sChildRadioGroup;
css::uno::Reference<css::xml::dom::XNode> xChildPropertyLabel;
if (xChild->hasChildNodes())
{
MenuEntry aEntry = ConvertMenu(xMenu, xChild);
bChildDrawAsRadio = aEntry.m_bDrawAsRadio;
sChildRadioGroup = aEntry.m_sRadioGroup;
xChildPropertyLabel = aEntry.m_xPropertyLabel;
}
@@ -236,13 +226,9 @@ MenuEntry ConvertMenu(const css::uno::Reference<css::xml::dom::XNode>& xMenu,
xActionName->setValue("action");
xActionAttr->setAttributeNode(xActionName);
if (bChildDrawAsRadio)
{
if (sChildRadioGroup.isEmpty())
sChildRadioGroup = sId;
xActionAttr->appendChild(xDoc->createTextNode("menu." + sChildRadioGroup));
}
xActionAttr->appendChild(xDoc->createTextNode("menu.radio." + sId));
else
xActionAttr->appendChild(xDoc->createTextNode("menu.action"));
xActionAttr->appendChild(xDoc->createTextNode("menu.normal." + sId));
xItem->appendChild(xActionAttr);
css::uno::Reference<css::xml::dom::XElement> xTargetAttr
@@ -259,7 +245,7 @@ MenuEntry ConvertMenu(const css::uno::Reference<css::xml::dom::XNode>& xMenu,
xChild = xNextChild;
}
return MenuEntry(bDrawAsRadio, sRadioGroup, xPropertyLabel);
return MenuEntry(bDrawAsRadio, xPropertyLabel);
}
struct ConvertResult