Kaydet (Commit) f3419218 authored tarafından Aleksei Nikiforov's avatar Aleksei Nikiforov Kaydeden (comit) Thorsten Behrens

tdf#121970 KDE5: Regenerate menu when it's set as submenu

Also add item bits change notification function
for SalMenu to properly convert regenerated menu items
to check or radiocheck items.

Change-Id: I61f16a771b484644bbefd9afaf2776232d38a2f9
Reviewed-on: https://gerrit.libreoffice.org/68438
Tested-by: Jenkins
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 11080306
...@@ -42,6 +42,7 @@ private: ...@@ -42,6 +42,7 @@ private:
void ReinitializeActionGroup(unsigned nPos); void ReinitializeActionGroup(unsigned nPos);
void ResetAllActionGroups(); void ResetAllActionGroups();
void UpdateActionGroupItem(Qt5MenuItem* pSalMenuItem);
public: public:
Qt5Menu(bool bMenuBar); Qt5Menu(bool bMenuBar);
...@@ -54,6 +55,7 @@ public: ...@@ -54,6 +55,7 @@ public:
virtual void SetFrame(const SalFrame* pFrame) override; virtual void SetFrame(const SalFrame* pFrame) override;
const Qt5Frame* GetFrame() const; const Qt5Frame* GetFrame() const;
Qt5Menu* GetTopLevel(); Qt5Menu* GetTopLevel();
virtual void SetItemBits(unsigned nPos, MenuItemBits nBits) override;
virtual void CheckItem(unsigned nPos, bool bCheck) override; virtual void CheckItem(unsigned nPos, bool bCheck) override;
virtual void EnableItem(unsigned nPos, bool bEnable) override; virtual void EnableItem(unsigned nPos, bool bEnable) override;
virtual void ShowItem(unsigned nPos, bool bShow) override; virtual void ShowItem(unsigned nPos, bool bShow) override;
......
...@@ -68,6 +68,7 @@ public: ...@@ -68,6 +68,7 @@ public:
virtual void RemoveItem( unsigned nPos ) = 0; virtual void RemoveItem( unsigned nPos ) = 0;
virtual void SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos ) = 0; virtual void SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos ) = 0;
virtual void SetFrame( const SalFrame* pFrame ) = 0; virtual void SetFrame( const SalFrame* pFrame ) = 0;
virtual void SetItemBits( unsigned /*nPos*/, MenuItemBits /*nBits*/ ) {}
virtual void CheckItem( unsigned nPos, bool bCheck ) = 0; virtual void CheckItem( unsigned nPos, bool bCheck ) = 0;
virtual void EnableItem( unsigned nPos, bool bEnable ) = 0; virtual void EnableItem( unsigned nPos, bool bEnable ) = 0;
virtual void SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const OUString& rText )= 0; virtual void SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const OUString& rText )= 0;
......
...@@ -40,8 +40,6 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos) ...@@ -40,8 +40,6 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos)
OUString aText = mpVCLMenu->GetItemText(nId); OUString aText = mpVCLMenu->GetItemText(nId);
NativeItemText(aText); NativeItemText(aText);
vcl::KeyCode nAccelKey = mpVCLMenu->GetAccelKey(nId); vcl::KeyCode nAccelKey = mpVCLMenu->GetAccelKey(nId);
bool bChecked = mpVCLMenu->IsItemChecked(nId);
MenuItemBits itemBits = mpVCLMenu->GetItemBits(nId);
pSalMenuItem->mpAction.reset(); pSalMenuItem->mpAction.reset();
pSalMenuItem->mpMenu.reset(); pSalMenuItem->mpMenu.reset();
...@@ -138,24 +136,9 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos) ...@@ -138,24 +136,9 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos)
ReinitializeActionGroup(nPos); ReinitializeActionGroup(nPos);
pAction->setShortcut(toQString(nAccelKey.GetName(GetFrame()->GetWindow()))); UpdateActionGroupItem(pSalMenuItem);
if (itemBits & MenuItemBits::CHECKABLE) pAction->setShortcut(toQString(nAccelKey.GetName(GetFrame()->GetWindow())));
{
pAction->setCheckable(true);
pAction->setChecked(bChecked);
}
else if (itemBits & MenuItemBits::RADIOCHECK)
{
pAction->setCheckable(true);
if (pSalMenuItem->mpActionGroup)
{
pSalMenuItem->mpActionGroup->addAction(pAction);
}
pAction->setChecked(bChecked);
}
connect(pAction, &QAction::triggered, this, connect(pAction, &QAction::triggered, this,
[pSalMenuItem] { slotMenuTriggered(pSalMenuItem); }); [pSalMenuItem] { slotMenuTriggered(pSalMenuItem); });
...@@ -297,6 +280,43 @@ void Qt5Menu::ResetAllActionGroups() ...@@ -297,6 +280,43 @@ void Qt5Menu::ResetAllActionGroups()
} }
} }
void Qt5Menu::UpdateActionGroupItem(Qt5MenuItem* pSalMenuItem)
{
QAction* pAction = pSalMenuItem->getAction();
if (!pAction)
return;
bool bChecked = mpVCLMenu->IsItemChecked(pSalMenuItem->mnId);
MenuItemBits itemBits = mpVCLMenu->GetItemBits(pSalMenuItem->mnId);
if (itemBits & MenuItemBits::RADIOCHECK)
{
pAction->setCheckable(true);
if (pSalMenuItem->mpActionGroup)
{
pSalMenuItem->mpActionGroup->addAction(pAction);
}
pAction->setChecked(bChecked);
}
else
{
pAction->setActionGroup(nullptr);
if (itemBits & MenuItemBits::CHECKABLE)
{
pAction->setCheckable(true);
pAction->setChecked(bChecked);
}
else
{
pAction->setChecked(false);
pAction->setCheckable(false);
}
}
}
void Qt5Menu::InsertItem(SalMenuItem* pSalMenuItem, unsigned nPos) void Qt5Menu::InsertItem(SalMenuItem* pSalMenuItem, unsigned nPos)
{ {
SolarMutexGuard aGuard; SolarMutexGuard aGuard;
...@@ -334,17 +354,34 @@ void Qt5Menu::RemoveItem(unsigned nPos) ...@@ -334,17 +354,34 @@ void Qt5Menu::RemoveItem(unsigned nPos)
} }
} }
void Qt5Menu::SetSubMenu(SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned) void Qt5Menu::SetSubMenu(SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos)
{ {
SolarMutexGuard aGuard; SolarMutexGuard aGuard;
Qt5MenuItem* pItem = static_cast<Qt5MenuItem*>(pSalMenuItem); Qt5MenuItem* pItem = static_cast<Qt5MenuItem*>(pSalMenuItem);
Qt5Menu* pQSubMenu = static_cast<Qt5Menu*>(pSubMenu); Qt5Menu* pQSubMenu = static_cast<Qt5Menu*>(pSubMenu);
if (pQSubMenu == nullptr) pItem->mpSubMenu = pQSubMenu;
// at this point the pointer to parent menu may be outdated, update it too
pItem->mpParentMenu = this;
if (pQSubMenu != nullptr)
{
pQSubMenu->mpParentSalMenu = this;
pQSubMenu->mpQMenu = pItem->mpMenu.get();
}
// if it's not a menu bar item, then convert it to corresponding item if type if necessary.
// If submenu is present and it's an action, convert it to menu.
// If submenu is not present and it's a menu, convert it to action.
// It may be fine to proceed in any case, but by skipping other cases
// amount of unneeded actions taken should be reduced.
if (pItem->mpParentMenu->mbMenuBar || (pQSubMenu && pItem->mpMenu)
|| ((!pQSubMenu) && pItem->mpAction))
{
return; return;
}
pQSubMenu->mpParentSalMenu = this; InsertMenuItem(pItem, nPos);
pItem->mpSubMenu = pQSubMenu;
} }
void Qt5Menu::SetFrame(const SalFrame* pFrame) void Qt5Menu::SetFrame(const SalFrame* pFrame)
...@@ -409,6 +446,15 @@ void Qt5Menu::ShowItem(unsigned nPos, bool bShow) ...@@ -409,6 +446,15 @@ void Qt5Menu::ShowItem(unsigned nPos, bool bShow)
} }
} }
void Qt5Menu::SetItemBits(unsigned nPos, MenuItemBits)
{
if (nPos < maItems.size())
{
Qt5MenuItem* pSalMenuItem = GetItemAtPos(nPos);
UpdateActionGroupItem(pSalMenuItem);
}
}
void Qt5Menu::CheckItem(unsigned nPos, bool bChecked) void Qt5Menu::CheckItem(unsigned nPos, bool bChecked)
{ {
if (nPos < maItems.size()) if (nPos < maItems.size())
......
...@@ -695,9 +695,17 @@ OString Menu::GetItemIdent(sal_uInt16 nId) const ...@@ -695,9 +695,17 @@ OString Menu::GetItemIdent(sal_uInt16 nId) const
void Menu::SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits ) void Menu::SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits )
{ {
MenuItemData* pData = pItemList->GetData( nItemId ); size_t nPos;
if ( pData ) MenuItemData* pData = pItemList->GetData(nItemId, nPos);
if (pData && (pData->nBits != nBits))
{
pData->nBits = nBits; pData->nBits = nBits;
// update native menu
if (ImplGetSalMenu())
ImplGetSalMenu()->SetItemBits(nPos, nBits);
}
} }
MenuItemBits Menu::GetItemBits( sal_uInt16 nItemId ) const MenuItemBits Menu::GetItemBits( sal_uInt16 nItemId ) const
......
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