kwave  18.07.70
MenuRoot.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  MenuRoot.cpp - root node of a menu structure
3  -------------------
4  begin : Mon Jan 10 2000
5  copyright : (C) 2000 by Thomas Eschenbacher
6  email : Thomas.Eschenbacher@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "config.h"
19 
20 #include <new>
21 
22 #include <QListIterator>
23 
24 #include <KLocalizedString>
25 #include <QMenuBar>
26 
27 #include "libkwave/String.h"
28 
29 #include "libgui/MenuItem.h"
30 #include "libgui/MenuRoot.h"
31 #include "libgui/MenuSub.h"
32 
33 //***************************************************************************
35 QList<Kwave::MenuNode *> Kwave::MenuRoot::m_garbage;
36 
37 //***************************************************************************
39  :Kwave::MenuNode(Q_NULLPTR, _("(root)"), QString(), 0, QString()),
40  m_menu_bar(bar), m_group_list()
41 {
42 }
43 
44 //***************************************************************************
46 {
47  clear();
48 }
49 
50 //***************************************************************************
51 QHash<QString, Kwave::MenuGroup *> &Kwave::MenuRoot::groupList()
52 {
53  return m_group_list;
54 }
55 
56 //*****************************************************************************
57 void Kwave::MenuRoot::insertNode(const QString &name,
58  const QString &position,
59  const QString &command,
60  const QKeySequence &shortcut,
61  const QString &uid)
62 {
63  Kwave::MenuNode::insertNode(name, position, command, shortcut, uid);
64 
65  // now delete all leafs that have been converted to branches
66  while (!m_garbage.isEmpty()) {
67  Kwave::MenuNode *node = m_garbage.takeFirst();
68  if (node) delete node;
69  }
70 }
71 
72 //***************************************************************************
74  const QString &command,
75  const QKeySequence &shortcut,
76  const QString &uid)
77 {
78  QMenu *menu = m_menu_bar.addMenu(name);
79  Q_ASSERT(menu);
80  if (!menu) return Q_NULLPTR;
81 
82  Kwave::MenuSub *sub = new(std::nothrow)
83  Kwave::MenuSub(this, menu, name, command, shortcut, uid);
84  Q_ASSERT(sub);
85  if (!sub) return Q_NULLPTR;
86 
87  insertChild(sub, Q_NULLPTR);
88 
89  return sub;
90 }
91 
92 //***************************************************************************
94  const QString &command,
95  const QKeySequence &shortcut,
96  const QString &uid)
97 {
98  Kwave::MenuItem *item = new(std::nothrow)
99  Kwave::MenuItem(this, name, command, shortcut, uid);
100  Q_ASSERT(item);
101  if (!item) return Q_NULLPTR;
102 
103  insertChild(item, Q_NULLPTR);
104  m_menu_bar.addAction(item->action());
105 
106  return item;
107 }
108 
109 //***************************************************************************
111 {
112  Q_ASSERT(child);
113  if (!child) return;
114  if (!m_children.contains(child)) return;
115  if (groupList().contains(child->name())) return;
116 
117  QAction *action = child->action();
118  if (action) m_menu_bar.removeAction(action);
119 }
120 
121 //***************************************************************************
123 {
124  Q_ASSERT(child);
125  if (!child) return;
126  if (!m_children.contains(child)) return;
127  if (groupList().contains(child->name())) return;
128 
129  // find the menu bar entry after which we can insert
130  QAction *action_before = Q_NULLPTR;
131  QListIterator<Kwave::MenuNode *> it(m_children);
132  it.toBack();
133  while (it.hasPrevious()) {
134  Kwave::MenuNode *c = it.previous();
135  if (c == child) break;
136  if (c) action_before = c->action();
137  }
138 
139  if (action_before)
140  m_menu_bar.insertMenu(action_before, child->menu());
141  else
142  m_menu_bar.addMenu(child->menu());
143 }
144 
145 //***************************************************************************
147 {
148  Q_ASSERT(child);
149  if (!child) return;
150  if (!m_children.contains(child)) return;
151 
152  QHash<QString, Kwave::MenuGroup *> &group_list = groupList();
153  if (!group_list.contains(child->name())) {
154  // only remove what has been added to the menu bar,
155  // but not menu groups
156  QAction *action = child->action();
157  if (action) m_menu_bar.removeAction(action);
158  }
160 }
161 
162 //***************************************************************************
164 {
165  Q_ASSERT(command.length());
166  if (!command.length()) return false;
167 
168  if (command == _("#separator")) {
169  m_menu_bar.addSeparator();
170  return true;
171  }
172 
173  return Kwave::MenuNode::specialCommand(command);
174 }
175 
176 //***************************************************************************
178 {
179  if (node) m_garbage.append(node);
180 }
181 
182 //***************************************************************************
183 //***************************************************************************
virtual bool specialCommand(const QString &command) Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:163
Definition: App.h:33
virtual void removeChild(Kwave::MenuNode *child) Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:146
virtual void insertNode(const QString &name, const QString &position, const QString &command, const QKeySequence &shortcut, const QString &uid) Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:57
static QList< Kwave::MenuNode * > m_garbage
Definition: MenuRoot.h:158
virtual QHash< QString, Kwave::MenuGroup * > & groupList() Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:51
const QKeySequence & shortcut() const
Definition: MenuNode.h:95
virtual void removeChild(Kwave::MenuNode *child)
Definition: MenuNode.cpp:223
virtual void insertChild(Kwave::MenuNode *node, Kwave::MenuNode *before)
Definition: MenuNode.cpp:181
virtual void clear()
Definition: MenuNode.cpp:93
virtual bool specialCommand(const QString &command)
Definition: MenuNode.cpp:421
const QString & name() const
Definition: MenuNode.h:74
const QString & command() const
Definition: MenuNode.h:77
virtual ~MenuRoot() Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:45
virtual QMenu * menu()
Definition: MenuSub.h:150
QHash< QString, Kwave::MenuGroup * > m_group_list
Definition: MenuRoot.h:155
virtual Kwave::MenuNode * insertLeaf(const QString &name, const QString &command, const QKeySequence &shortcut, const QString &uid) Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:93
static void deleteLater(Kwave::MenuNode *node)
Definition: MenuRoot.cpp:177
QList< Kwave::MenuNode * > m_children
Definition: MenuNode.h:317
virtual QAction * action() Q_DECL_OVERRIDE
Definition: MenuSub.h:102
#define _(m)
Definition: memcpy.c:66
const QString & uid() const
Definition: MenuNode.h:85
void hideChild(Kwave::MenuSub *child)
Definition: MenuRoot.cpp:110
QMenuBar & m_menu_bar
Definition: MenuRoot.h:152
virtual QAction * action() Q_DECL_OVERRIDE
Definition: MenuItem.h:122
virtual Kwave::MenuSub * insertBranch(const QString &name, const QString &command, const QKeySequence &shortcut, const QString &uid) Q_DECL_OVERRIDE
Definition: MenuRoot.cpp:73
void showChild(Kwave::MenuSub *child)
Definition: MenuRoot.cpp:122
MenuRoot(QMenuBar &bar)
Definition: MenuRoot.cpp:38
virtual void insertNode(const QString &name, const QString &position, const QString &command, const QKeySequence &shortcut, const QString &uid)
Definition: MenuNode.cpp:256
virtual QAction * action()
Definition: MenuNode.h:80