diff widgets/SubdividingMenu.h @ 151:8f51db2434dc

* Pull alphabetical categorisation code out into a SubdividingMenu class
author Chris Cannam
date Mon, 25 Sep 2006 11:21:12 +0000
parents
children 6a3f3c13173f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/widgets/SubdividingMenu.h	Mon Sep 25 11:21:12 2006 +0000
@@ -0,0 +1,63 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#ifndef _SUBDIVIDING_MENU_H_
+#define _SUBDIVIDING_MENU_H_
+
+#include <QMenu>
+
+#include <QString>
+#include <set>
+#include <map>
+
+/**
+ * A menu that divides its entries into submenus, alphabetically.  For
+ * menus that may contain a very large or small number of named items
+ * (e.g. plugins).
+ *
+ * The menu needs to be told, before any of the actions are added,
+ * what the set of entry strings will be, so it can determine a
+ * reasonable categorisation.  Do this by calling the setEntries()
+ * method.
+ */
+
+class SubdividingMenu : public QMenu
+{
+public:
+    SubdividingMenu(QWidget *parent = 0);
+    SubdividingMenu(const QString &title, QWidget *parent = 0);
+    virtual ~SubdividingMenu();
+
+    void setEntries(const std::set<QString> &entries);
+
+    // Action names and strings passed to addAction and addMenu must
+    // appear in the set previously given to setEntries.  If you want
+    // to use a different string, use the two-argument method and pass
+    // the entry string (used to determine which submenu the action
+    // ends up on) as the first argument.
+
+    virtual void addAction(QAction *);
+    virtual QAction *addAction(const QString &);
+    virtual void addAction(const QString &entry, QAction *);
+    
+    virtual void addMenu(QMenu *);
+    virtual QMenu *addMenu(const QString &);
+    virtual void addMenu(const QString &entry, QMenu *);
+
+protected:
+    std::map<QString, QMenu *> m_nameToChunkMenuMap;
+};
+
+#endif
+