refs #720, remove highlight DB data menu (we use the DB icon instead)

* removed menu item
* fixed menu action, so parents submenus are searched upwards
This commit is contained in:
Klaus Basan
2016-08-10 15:30:13 +02:00
committed by Mathew Sutcliffe
parent 009bfc3ed1
commit a8834d0511
7 changed files with 42 additions and 45 deletions

View File

@@ -293,18 +293,25 @@ namespace BlackGui
void CMenuActions::toQMenu(QMenu &menu, bool separateGroups) const void CMenuActions::toQMenu(QMenu &menu, bool separateGroups) const
{ {
if (this->m_actions.isEmpty()) { return; } if (this->m_actions.isEmpty()) { return; }
const QStringList keys(this->m_actions.uniqueKeys()); const QStringList keys(this->m_actions.uniqueKeys()); // Sorted ascending
QMap<QString, QMenu *> subMenus; QMap<QString, QMenu *> subMenus; // all sub menus
for (const QString &key : keys) for (const QString &key : keys)
{ {
bool addedSeparator = false; bool addedSeparator = false;
const int pd = pathDepth(key); const int pathDepth = CMenuActions::pathDepth(key);
QList<CMenuAction> actions; QList<CMenuAction> actions;
QList<CMenuAction> menus; QList<CMenuAction> menus;
this->splitSubMenus(key, actions, menus); this->splitSubMenus(key, actions, menus);
if (actions.isEmpty()) { continue; } if (actions.isEmpty())
{
// uncomment this if a subdir shall be displayed, even if there are no actions
// if (!menus.isEmpty()) { currentMenuForAction(menu, menus.fi, menus, subMenus, key, pathDepth); }
// No actions directly for that level
continue;
}
if (!menu.isEmpty() && separateGroups) if (!menu.isEmpty() && separateGroups)
{ {
menu.addSeparator(); menu.addSeparator();
@@ -314,13 +321,13 @@ namespace BlackGui
int noActionsWithoutPath = 0; int noActionsWithoutPath = 0;
QMenu *currentMenu = nullptr; QMenu *currentMenu = nullptr;
// reverse iteration because same key values are inserted and havve reverse order // reverse iteration because same key values are inserted and have reverse order
for (const CMenuAction &menuAction : actions) for (const CMenuAction &menuAction : actions)
{ {
// create submenu if required // create submenu if required
if (!currentMenu) if (!currentMenu)
{ {
currentMenu = currentMenuForAction(menu, menuAction, menus, subMenus, key, pd); currentMenu = currentMenuForAction(menu, menuAction, menus, subMenus, key, pathDepth);
} }
Q_ASSERT_X(currentMenu, Q_FUNC_INFO, "Missing menu"); Q_ASSERT_X(currentMenu, Q_FUNC_INFO, "Missing menu");
Q_ASSERT_X(!menuAction.isSubMenu() && menuAction.getQAction(), Q_FUNC_INFO, "Wrong menu type"); Q_ASSERT_X(!menuAction.isSubMenu() && menuAction.getQAction(), Q_FUNC_INFO, "Wrong menu type");
@@ -409,16 +416,16 @@ namespace BlackGui
return this->addMenu(CIcons::appModels16(), "Model set", CMenuAction::pathModelSet()); return this->addMenu(CIcons::appModels16(), "Model set", CMenuAction::pathModelSet());
} }
QMenu *CMenuActions::currentMenuForAction(QMenu &menu, const CMenuAction &menuAction, const QList<CMenuAction> &menus, QMap<QString, QMenu *> &subMenus, const QString &key, int pd) QMenu *CMenuActions::currentMenuForAction(QMenu &menu, const CMenuAction &menuAction, const QList<CMenuAction> &menus, QMap<QString, QMenu *> &subMenus, const QString &key, int pathDepth)
{ {
if (pd < 1) { return &menu; } if (pathDepth < 1) { return &menu; }
QMenu *parentMenu = &menu; QMenu *parentMenu = &menu;
if (pd > 1) if (pathDepth > 1)
{ {
const QString pk(parentPathKey(key)); // find the corresponding submenu. If this is empty the next higher level will be choosen
parentMenu = subMenus.value(pk); // if not found at all, use top level menu
BLACK_VERIFY_X(parentMenu, Q_FUNC_INFO, "Missing sub menu"); parentMenu = findUpwardsInMenus(key, subMenus);
if (!parentMenu) { parentMenu = &menu; } if (!parentMenu) { parentMenu = &menu; }
} }
@@ -436,7 +443,7 @@ namespace BlackGui
Q_ASSERT_X(subMenu, Q_FUNC_INFO, "Could not create sub menu"); Q_ASSERT_X(subMenu, Q_FUNC_INFO, "Could not create sub menu");
subMenu->setParent(parentMenu); subMenu->setParent(parentMenu);
if (pd > 0 && subMenu) if (pathDepth > 0 && subMenu)
{ {
subMenus.insert(key, subMenu); subMenus.insert(key, subMenu);
} }
@@ -450,11 +457,25 @@ namespace BlackGui
return c > 0 ? c : 0; return c > 0 ? c : 0;
} }
QString CMenuActions::parentPathKey(const QString &currentPath) QString CMenuActions::parentPath(const QString &currentPath)
{ {
if (!currentPath.contains('/')) { return ""; } if (!currentPath.contains('/')) { return ""; }
const int i = currentPath.lastIndexOf('/'); const int i = currentPath.lastIndexOf('/');
return currentPath.left(i); return currentPath.left(i);
} }
QMenu *CMenuActions::findUpwardsInMenus(const QString &key, const QMap<QString, QMenu *> &menus)
{
QString k = key;
while (!k.isEmpty() && !menus.isEmpty())
{
if (menus.contains(k))
{
return menus[key];
}
k = parentPath(k);
}
return nullptr;
}
} // ns } // ns
} // ns } // ns

View File

@@ -318,7 +318,8 @@ namespace BlackGui
static int pathDepth(const QString &path); static int pathDepth(const QString &path);
static QMenu *currentMenuForAction(QMenu &menu, const CMenuAction &menuAction, const QList<CMenuAction> &menus, QMap<QString, QMenu *> &subMenus, const QString &key, int pd); static QMenu *currentMenuForAction(QMenu &menu, const CMenuAction &menuAction, const QList<CMenuAction> &menus, QMap<QString, QMenu *> &subMenus, const QString &key, int pd);
static QString parentPathKey(const QString &cuurentPath); static QString parentPath(const QString &cuurentPath);
static QMenu *findUpwardsInMenus(const QString &key, const QMap<QString, QMenu *> &menus);
}; };
} // ns } // ns
} // ns } // ns

View File

@@ -67,7 +67,7 @@ namespace BlackGui
switch (mode) switch (mode)
{ {
case CAircraftModelListModel::StashModel: case CAircraftModelListModel::StashModel:
this->m_menus = MenuDefaultNoClear | MenuHighlightDbData; this->m_menus = MenuDefaultNoClear;
break; break;
case CAircraftModelListModel::Database: case CAircraftModelListModel::Database:
this->m_menus = MenuDefaultDbViews; this->m_menus = MenuDefaultDbViews;
@@ -76,11 +76,11 @@ namespace BlackGui
this->m_menus = MenuDefaultNoClear | MenuStashing; this->m_menus = MenuDefaultNoClear | MenuStashing;
break; break;
case CAircraftModelListModel::OwnSimulatorModelMapping: case CAircraftModelListModel::OwnSimulatorModelMapping:
this->m_menus = MenuDefaultNoClear | MenuStashing | MenuHighlightDbData | MenuLoadAndSave; this->m_menus = MenuDefaultNoClear | MenuStashing | MenuLoadAndSave;
break; break;
case CAircraftModelListModel::OwnSimulatorModel: case CAircraftModelListModel::OwnSimulatorModel:
default: default:
this->m_menus = MenuDefaultNoClear | MenuBackend | MenuHighlightDbData; this->m_menus = MenuDefaultNoClear | MenuBackend;
break; break;
} }
} }

View File

@@ -630,7 +630,6 @@ namespace BlackGui
this->m_displayAutomatically = a->isChecked(); this->m_displayAutomatically = a->isChecked();
} }
void CViewBaseNonTemplate::ps_setSingleSelection() void CViewBaseNonTemplate::ps_setSingleSelection()
{ {
if (this->m_originalSelectionMode == ExtendedSelection || this->m_originalSelectionMode == MultiSelection) if (this->m_originalSelectionMode == ExtendedSelection || this->m_originalSelectionMode == MultiSelection)

View File

@@ -119,9 +119,8 @@ namespace BlackGui
MenuDefaultDbViews = MenuToggleSelectionMode | MenuBackend, MenuDefaultDbViews = MenuToggleSelectionMode | MenuBackend,
// special menus, should be in derived classes, but enums cannot be inherited // special menus, should be in derived classes, but enums cannot be inherited
// maybe shifted in the future to elsewhere // maybe shifted in the future to elsewhere
MenuHighlightDbData = 1 << 10, //!< highlight DB data MenuHighlightStashed = 1 << 10, //!< highlight stashed models
MenuHighlightStashed = 1 << 11, //!< highlight stashed models MenuCanStashModels = 1 << 11, //!< stash models
MenuCanStashModels = 1 << 12, //!< stash models
MenuStashing = MenuHighlightStashed | MenuCanStashModels, MenuStashing = MenuHighlightStashed | MenuCanStashModels,
}; };
Q_DECLARE_FLAGS(Menu, MenuFlag) Q_DECLARE_FLAGS(Menu, MenuFlag)

View File

@@ -92,28 +92,9 @@ namespace BlackGui
template <class ModelClass, class ContainerType, class ObjectType, class KeyType> template <class ModelClass, class ContainerType, class ObjectType, class KeyType>
void CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::customMenu(Menus::CMenuActions &menuActions) void CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::customMenu(Menus::CMenuActions &menuActions)
{ {
if (this->m_menus.testFlag(CViewBaseNonTemplate::MenuHighlightDbData))
{
if (!this->m_menuFlagActions.contains(CViewBaseNonTemplate::MenuHighlightDbData))
{
CMenuActions ma;
QAction *added = ma.addAction(CIcons::database16(), "Highlight DB data", CMenuAction::pathViewDatabase(), { this, &CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::ps_toggleHighlightDbData });
added->setCheckable(true);
this->m_menuFlagActions.insert(CViewBaseNonTemplate::MenuHighlightDbData, ma);
}
QAction *a = menuActions.addActions(this->initMenuActions(CViewBaseNonTemplate::MenuHighlightDbData)).first();
a->setChecked(this->derivedModel()->highlightDbData());
}
CViewBase<ModelClass, ContainerType, ObjectType>::customMenu(menuActions); CViewBase<ModelClass, ContainerType, ObjectType>::customMenu(menuActions);
} }
template <class ModelClass, class ContainerType, class ObjectType, class KeyType>
void CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::ps_toggleHighlightDbData()
{
bool h = this->derivedModel()->highlightDbData();
this->derivedModel()->setHighlightDbData(!h);
}
template <class ModelClass, class ContainerType, class ObjectType, class KeyType> template <class ModelClass, class ContainerType, class ObjectType, class KeyType>
COrderableViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::COrderableViewWithDbObjects(QWidget *parent) : COrderableViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::COrderableViewWithDbObjects(QWidget *parent) :
CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::CViewWithDbObjects(parent) CViewWithDbObjects<ModelClass, ContainerType, ObjectType, KeyType>::CViewWithDbObjects(parent)

View File

@@ -69,10 +69,6 @@ namespace BlackGui
//! \copydoc BlackGui::Views::CViewBaseNonTemplate::customMenu //! \copydoc BlackGui::Views::CViewBaseNonTemplate::customMenu
virtual void customMenu(BlackGui::Menus::CMenuActions &menuActions) override; virtual void customMenu(BlackGui::Menus::CMenuActions &menuActions) override;
protected slots:
//! \copydoc BlackGui::Views::CViewBase::ps_toggleHighlightDbData
virtual void ps_toggleHighlightDbData() override;
}; };
//! Base class for views with DB objects also orderable (based on BlackMisc::IOrderableList ) //! Base class for views with DB objects also orderable (based on BlackMisc::IOrderableList )