Allow configuration of shortcuts for platforms other than KDE
[quassel.git] / src / qtui / settingspages / shortcutsmodel.h
1 /***************************************************************************
2  *   Copyright (C) 2010 by the Quassel Project                             *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) version 3.                                           *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #ifndef SHORTCUTSMODEL_H
22 #define SHORTCUTSMODEL_H
23
24 #include <QAbstractItemModel>
25 #include <QKeySequence>
26
27 class Action;
28 class ActionCollection;
29
30 //! Model that exposes the actions from one or more ActionCollections
31 /** This model takes one or more ActionCollections and exposes their actions as model items.
32  *  Note that the ShortcutsModel will not react to changes in the ActionCollection (e.g. adding,
33  *  removing actions), because it is supposed to be used after all actions being defined.
34  */
35 class ShortcutsModel : public QAbstractItemModel {
36   Q_OBJECT
37 public:
38   enum Role {
39     ActionRole = Qt::UserRole,
40     DefaultShortcutRole,
41     ActiveShortcutRole,
42     IsConfigurableRole
43   };
44
45   ShortcutsModel(const QHash<QString, ActionCollection *> &actionCollections, QObject *parent = 0);
46   ~ShortcutsModel();
47
48   QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
49   QModelIndex parent(const QModelIndex &child) const;
50   int columnCount(const QModelIndex &parent = QModelIndex()) const;
51   int rowCount(const QModelIndex &parent = QModelIndex()) const;
52   QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
53   QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
54   bool setData(const QModelIndex &index, const QVariant &value, int role = ActiveShortcutRole);
55
56 public slots:
57   //! Load shortcuts from the ActionCollections
58   /** Note that this will not rebuild the internal structure of the model, as we assume the
59    *  ActionCollections to be static during the lifetime of the settingspage. This will merely
60    *  re-read the shortcuts currently set in Quassel.
61    */
62   void load();
63
64   //! Load default shortcuts from the ActionCollections
65   /** Note that this will not rebuild the internal structure of the model, as we assume the
66    *  ActionCollections to be static during the lifetime of the settingspage. This will update
67    *  the model's state from the ActionCollections' defaults.
68    */
69   void defaults();
70
71   //! Commit the model changes to the ActionCollections
72   void commit();
73
74   inline bool hasChanged() const { return _changedCount; }
75
76 signals:
77   //! Reflects the difference between model contents and the ActionCollections we loaded this from
78   void hasChanged(bool changed);
79
80 private:
81   struct Item {
82     inline Item() { parentItem = 0; collection = 0; action = 0; }
83     inline ~Item() { qDeleteAll(actionItems); }
84     int row;
85     Item *parentItem;
86     ActionCollection *collection;
87     Action *action;
88     QKeySequence shortcut;
89     QList<Item *> actionItems;
90   };
91
92   QList<Item *> _categoryItems;
93   int _changedCount;
94 };
95
96 #endif // SHORTCUTSMODEL_H