use Bindings API for binding replacement
[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 (name);
62                                 add (binding);
63                                 add (path);
64                                 add (bindable);
65                                 add (action);
66                         }
67                         Gtk::TreeModelColumn<std::string> name;
68                         Gtk::TreeModelColumn<std::string> binding;
69                         Gtk::TreeModelColumn<std::string> path;
70                         Gtk::TreeModelColumn<bool> bindable;
71                         Gtk::TreeModelColumn<Glib::RefPtr<Gtk::Action> > action;
72                 };
73                 
74                 Gtk::VBox vpacker;
75                 /* give KeyEditor full access to these. This is just a helper
76                    class with no special semantics
77                 */
78                 
79                 KeyEditor& owner;
80                 std::string name;
81                 Gtkmm2ext::Bindings* bindings;
82                 Gtk::ScrolledWindow scroller;
83                 Gtk::TreeView view;
84                 Glib::RefPtr<Gtk::TreeStore> model;
85                 KeyEditorColumns columns;
86         };
87
88         friend class Tab;
89         
90         Gtk::VBox vpacker;
91         Gtk::Notebook notebook;
92         Gtk::Button unbind_button;
93         Gtk::HButtonBox unbind_box;
94         Gtk::HBox reset_box;
95         Gtk::Button reset_button;
96         Gtk::Label reset_label;
97         guint last_keyval;
98
99         typedef std::vector<Tab*> Tabs;
100
101         Tabs tabs;
102         Tab* current_tab();
103
104         void unbind ();
105         void reset ();
106         void page_change (GtkNotebookPage*, guint);
107 };
108
109 #endif /* __ardour_gtk_key_editor_h__ */