Chris@151
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@151
|
2
|
Chris@151
|
3 /*
|
Chris@151
|
4 Sonic Visualiser
|
Chris@151
|
5 An audio file viewer and annotation editor.
|
Chris@151
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@182
|
7 This file copyright 2006 QMUL.
|
Chris@151
|
8
|
Chris@151
|
9 This program is free software; you can redistribute it and/or
|
Chris@151
|
10 modify it under the terms of the GNU General Public License as
|
Chris@151
|
11 published by the Free Software Foundation; either version 2 of the
|
Chris@151
|
12 License, or (at your option) any later version. See the file
|
Chris@151
|
13 COPYING included with this distribution for more information.
|
Chris@151
|
14 */
|
Chris@151
|
15
|
Chris@151
|
16 #ifndef _SUBDIVIDING_MENU_H_
|
Chris@151
|
17 #define _SUBDIVIDING_MENU_H_
|
Chris@151
|
18
|
Chris@151
|
19 #include <QMenu>
|
Chris@151
|
20
|
Chris@151
|
21 #include <QString>
|
Chris@151
|
22 #include <set>
|
Chris@151
|
23 #include <map>
|
Chris@151
|
24
|
Chris@151
|
25 /**
|
Chris@151
|
26 * A menu that divides its entries into submenus, alphabetically. For
|
Chris@151
|
27 * menus that may contain a very large or small number of named items
|
Chris@151
|
28 * (e.g. plugins).
|
Chris@151
|
29 *
|
Chris@151
|
30 * The menu needs to be told, before any of the actions are added,
|
Chris@151
|
31 * what the set of entry strings will be, so it can determine a
|
Chris@151
|
32 * reasonable categorisation. Do this by calling the setEntries()
|
Chris@152
|
33 * method. If it isn't practical to do this in advance, then add the
|
Chris@152
|
34 * entries and call entriesAdded() afterwards instead.
|
Chris@151
|
35 */
|
Chris@151
|
36
|
Chris@151
|
37 class SubdividingMenu : public QMenu
|
Chris@151
|
38 {
|
Chris@151
|
39 public:
|
Chris@152
|
40 SubdividingMenu(size_t lowerLimit = 0, size_t upperLimit = 0,
|
Chris@152
|
41 QWidget *parent = 0);
|
Chris@152
|
42 SubdividingMenu(const QString &title, size_t lowerLimit = 0,
|
Chris@152
|
43 size_t upperLimit = 0, QWidget *parent = 0);
|
Chris@151
|
44 virtual ~SubdividingMenu();
|
Chris@151
|
45
|
Chris@151
|
46 void setEntries(const std::set<QString> &entries);
|
Chris@152
|
47 void entriesAdded();
|
Chris@151
|
48
|
Chris@151
|
49 // Action names and strings passed to addAction and addMenu must
|
Chris@151
|
50 // appear in the set previously given to setEntries. If you want
|
Chris@151
|
51 // to use a different string, use the two-argument method and pass
|
Chris@151
|
52 // the entry string (used to determine which submenu the action
|
Chris@151
|
53 // ends up on) as the first argument.
|
Chris@151
|
54
|
Chris@151
|
55 virtual void addAction(QAction *);
|
Chris@151
|
56 virtual QAction *addAction(const QString &);
|
Chris@151
|
57 virtual void addAction(const QString &entry, QAction *);
|
Chris@151
|
58
|
Chris@151
|
59 virtual void addMenu(QMenu *);
|
Chris@151
|
60 virtual QMenu *addMenu(const QString &);
|
Chris@151
|
61 virtual void addMenu(const QString &entry, QMenu *);
|
Chris@151
|
62
|
Chris@151
|
63 protected:
|
Chris@151
|
64 std::map<QString, QMenu *> m_nameToChunkMenuMap;
|
Chris@152
|
65
|
Chris@152
|
66 size_t m_lowerLimit;
|
Chris@152
|
67 size_t m_upperLimit;
|
Chris@152
|
68
|
Chris@152
|
69 bool m_entriesSet;
|
Chris@152
|
70 std::map<QString, QObject *> m_pendingEntries;
|
Chris@151
|
71 };
|
Chris@151
|
72
|
Chris@151
|
73 #endif
|
Chris@151
|
74
|