redesign key editor to work with tabbed notebook, one tab per set of bindings
[ardour.git] / gtk2_ardour / keyeditor.h
1 /*
2     Copyright (C) 2012 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_gtk_key_editor_h__
21 #define __ardour_gtk_key_editor_h__
22
23 #include <string>
24
25 #include <gtkmm/buttonbox.h>
26 #include <gtkmm/notebook.h>
27 #include <gtkmm/scrolledwindow.h>
28 #include <gtkmm/treeview.h>
29 #include <gtkmm/treestore.h>
30
31 #include "ardour_window.h"
32
33 namespace Gtkmm2ext {
34         class Bindings;
35 }
36
37 class KeyEditor : public ArdourWindow
38 {
39   public:
40         KeyEditor ();
41
42         void add_tab (std::string const &name, Gtkmm2ext::Bindings&);
43         
44   protected:
45         bool on_key_press_event (GdkEventKey*);
46         bool on_key_release_event (GdkEventKey*);
47
48   private:
49         class Tab : public Gtk::VBox
50         {
51            public:
52                 Tab (KeyEditor&, std::string const &name, Gtkmm2ext::Bindings*);
53                 
54                 void populate ();
55                 void unbind ();
56                 void bind (GdkEventKey* release_event, guint pressed_key);
57                 void action_selected ();
58                 
59                 struct KeyEditorColumns : public Gtk::TreeModel::ColumnRecord {
60                         KeyEditorColumns () {
61                                 add (action);
62                                 add (binding);
63                                 add (path);
64                                 add (bindable);
65                         }
66                         Gtk::TreeModelColumn<std::string> action;
67                         Gtk::TreeModelColumn<std::string> binding;
68                         Gtk::TreeModelColumn<std::string> path;
69                         Gtk::TreeModelColumn<bool> bindable;
70                 };
71                 
72                 Gtk::VBox vpacker;
73                 /* give KeyEditor full access to these. This is just a helper
74                    class with no special semantics
75                 */
76                 
77                 KeyEditor& owner;
78                 std::string name;
79                 Gtkmm2ext::Bindings* bindings;
80                 Gtk::ScrolledWindow scroller;
81                 Gtk::TreeView view;
82                 Glib::RefPtr<Gtk::TreeStore> model;
83                 KeyEditorColumns columns;
84         };
85
86         friend class Tab;
87         
88         Gtk::VBox vpacker;
89         Gtk::Notebook notebook;
90         Gtk::Button unbind_button;
91         Gtk::HButtonBox unbind_box;
92         Gtk::HBox reset_box;
93         Gtk::Button reset_button;
94         Gtk::Label reset_label;
95         guint last_keyval;
96
97         typedef std::vector<Tab*> Tabs;
98
99         Tabs tabs;
100         Tab* current_tab();
101
102         void unbind ();
103         void reset ();
104         void page_change (GtkNotebookPage*, guint);
105 };
106
107 #endif /* __ardour_gtk_key_editor_h__ */