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:
void ReinitializeActionGroup(unsigned nPos);
void ResetAllActionGroups();
void UpdateActionGroupItem(Qt5MenuItem* pSalMenuItem);
public:
Qt5Menu(bool bMenuBar);
......@@ -54,6 +55,7 @@ public:
virtual void SetFrame(const SalFrame* pFrame) override;
const Qt5Frame* GetFrame() const;
Qt5Menu* GetTopLevel();
virtual void SetItemBits(unsigned nPos, MenuItemBits nBits) override;
virtual void CheckItem(unsigned nPos, bool bCheck) override;
virtual void EnableItem(unsigned nPos, bool bEnable) override;
virtual void ShowItem(unsigned nPos, bool bShow) override;
......
......@@ -68,6 +68,7 @@ public:
virtual void RemoveItem( unsigned nPos ) = 0;
virtual void SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned nPos ) = 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 EnableItem( unsigned nPos, bool bEnable ) = 0;
virtual void SetItemText( unsigned nPos, SalMenuItem* pSalMenuItem, const OUString& rText )= 0;
......
......@@ -40,8 +40,6 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos)
OUString aText = mpVCLMenu->GetItemText(nId);
NativeItemText(aText);
vcl::KeyCode nAccelKey = mpVCLMenu->GetAccelKey(nId);
bool bChecked = mpVCLMenu->IsItemChecked(nId);
MenuItemBits itemBits = mpVCLMenu->GetItemBits(nId);
pSalMenuItem->mpAction.reset();
pSalMenuItem->mpMenu.reset();
......@@ -138,24 +136,9 @@ QMenu* Qt5Menu::InsertMenuItem(Qt5MenuItem* pSalMenuItem, unsigned nPos)
ReinitializeActionGroup(nPos);
pAction->setShortcut(toQString(nAccelKey.GetName(GetFrame()->GetWindow())));
if (itemBits & MenuItemBits::CHECKABLE)
{
pAction->setCheckable(true);
pAction->setChecked(bChecked);
}
else if (itemBits & MenuItemBits::RADIOCHECK)
{
pAction->setCheckable(true);
UpdateActionGroupItem(pSalMenuItem);
if (pSalMenuItem->mpActionGroup)
{
pSalMenuItem->mpActionGroup->addAction(pAction);
}
pAction->setChecked(bChecked);
}
pAction->setShortcut(toQString(nAccelKey.GetName(GetFrame()->GetWindow())));
connect(pAction, &QAction::triggered, this,
[pSalMenuItem] { slotMenuTriggered(pSalMenuItem); });
......@@ -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)
{
SolarMutexGuard aGuard;
......@@ -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;
Qt5MenuItem* pItem = static_cast<Qt5MenuItem*>(pSalMenuItem);
Qt5Menu* pQSubMenu = static_cast<Qt5Menu*>(pSubMenu);
if (pQSubMenu == nullptr)
return;
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;
pItem->mpSubMenu = pQSubMenu;
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;
}
InsertMenuItem(pItem, nPos);
}
void Qt5Menu::SetFrame(const SalFrame* pFrame)
......@@ -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)
{
if (nPos < maItems.size())
......
......@@ -695,9 +695,17 @@ OString Menu::GetItemIdent(sal_uInt16 nId) const
void Menu::SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits )
{
MenuItemData* pData = pItemList->GetData( nItemId );
if ( pData )
size_t nPos;
MenuItemData* pData = pItemList->GetData(nItemId, nPos);
if (pData && (pData->nBits != nBits))
{
pData->nBits = nBits;
// update native menu
if (ImplGetSalMenu())
ImplGetSalMenu()->SetItemBits(nPos, nBits);
}
}
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