Only show user-presets in favorite sidebar
[ardour.git] / gtk2_ardour / actions.cc
1 /*
2     Copyright (C) 2005 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 #include <cstring>
21 #include <string>
22 #include <list>
23
24 #include <gtk/gtkaccelmap.h>
25 #include <gtk/gtkuimanager.h>
26 #include <gtk/gtkactiongroup.h>
27
28 #include <gtkmm/accelmap.h>
29 #include <gtkmm/uimanager.h>
30
31 #include "pbd/error.h"
32 #include "pbd/file_utils.h"
33
34 #include "ardour/filesystem_paths.h"
35 #include "ardour/rc_configuration.h"
36
37 #include "gtkmm2ext/actions.h"
38
39 #include "actions.h"
40 #include "pbd/i18n.h"
41
42 using namespace std;
43 using namespace Gtk;
44 using namespace Glib;
45 using namespace PBD;
46 using namespace ARDOUR;
47
48 typedef std::vector<RefPtr<Gtk::Action> > RelatedActions;
49
50 RelatedActions ActionManager::session_sensitive_actions;
51 RelatedActions ActionManager::write_sensitive_actions;
52 RelatedActions ActionManager::region_list_selection_sensitive_actions;
53 RelatedActions ActionManager::plugin_selection_sensitive_actions;
54 RelatedActions ActionManager::track_selection_sensitive_actions;
55 RelatedActions ActionManager::stripable_selection_sensitive_actions;
56 RelatedActions ActionManager::route_selection_sensitive_actions;
57 RelatedActions ActionManager::bus_selection_sensitive_actions;
58 RelatedActions ActionManager::vca_selection_sensitive_actions;
59 RelatedActions ActionManager::point_selection_sensitive_actions;
60 RelatedActions ActionManager::time_selection_sensitive_actions;
61 RelatedActions ActionManager::line_selection_sensitive_actions;
62 RelatedActions ActionManager::playlist_selection_sensitive_actions;
63 RelatedActions ActionManager::mouse_edit_point_requires_canvas_actions;
64 RelatedActions ActionManager::range_sensitive_actions;
65 RelatedActions ActionManager::engine_sensitive_actions;
66 RelatedActions ActionManager::engine_opposite_sensitive_actions;
67 RelatedActions ActionManager::transport_sensitive_actions;
68 RelatedActions ActionManager::edit_point_in_region_sensitive_actions;
69 RelatedActions ActionManager::rec_sensitive_actions;
70
71 void
72 ActionManager::load_menus (const string& menus_file)
73 {
74         std::string ui_file;
75
76         find_file (ardour_config_search_path(), menus_file, ui_file);
77
78         bool loaded = false;
79
80         try {
81                 ui_manager->add_ui_from_file (ui_file);
82                 info << string_compose (_("Loading menus from %1"), ui_file) << endmsg;
83                 loaded = true;
84         } catch (Glib::MarkupError& err) {
85                 error << string_compose (_("badly formatted menu definition file: %1"), err.what()) << endmsg;
86                 cerr << string_compose (_("badly formatted menu definition file: %1"), err.what()) << endl;
87         } catch (...) {
88                 error << string_compose (_("%1 menu definition file not found"), PROGRAM_NAME) << endmsg;
89         }
90
91         if (!loaded) {
92                 cerr << string_compose (_("%1 will not work without a valid menu definition file"), PROGRAM_NAME) << endl;
93                 error << string_compose (_("%1 will not work without a valid menu definition file"), PROGRAM_NAME) << endmsg;
94                 exit(1);
95         }
96 }
97
98 /** Examine the state of a Configuration setting and a toggle action, and toggle the Configuration
99  * setting if its state doesn't match the toggle action.
100  * @param group Action group.
101  * @param action Action name.
102  * @param Method to set the state of the Configuration setting.
103  * @param Method to get the state of the Configuration setting.
104  */
105 void
106 ActionManager::toggle_config_state (const char* group, const char* action, bool (RCConfiguration::*set)(bool), bool (RCConfiguration::*get)(void) const)
107 {
108         Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
109
110         if (act) {
111                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
112
113                 if (tact) {
114                         bool x = (Config->*get)();
115
116                         if (x != tact->get_active()) {
117                                 (Config->*set) (!x);
118                         }
119                 }
120         }
121 }
122
123 /** Examine the state of a Configuration setting and a toggle action, and toggle the Configuration
124  * setting if its state doesn't match the toggle action.
125  * @param group Action group.
126  * @param action Action name.
127  * @param Method to set the state of the Configuration setting.
128  * @param Method to get the state of the Configuration setting.
129  */
130 void
131 ActionManager::toggle_config_state (const char* group, const char* action, bool (UIConfiguration::*set)(bool), bool (UIConfiguration::*get)(void) const)
132 {
133         Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
134
135         if (act) {
136                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
137
138                 if (tact) {
139                         bool x = (UIConfiguration::instance().*get)();
140
141                         if (x != tact->get_active()) {
142                                 (UIConfiguration::instance().*set) (!x);
143                         }
144                 }
145         }
146 }
147
148 void
149 ActionManager::toggle_config_state_foo (const char* group, const char* action, sigc::slot<bool, bool> set, sigc::slot<bool> get)
150 {
151         Glib::RefPtr<Action> act = ActionManager::get_action (group, action);
152
153         if (act) {
154                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
155
156                 if (tact) {
157                         bool const x = get ();
158
159                         if (x != tact->get_active ()) {
160                                 set (!x);
161                         }
162                 }
163         }
164 }
165
166
167 /** Set the state of a ToggleAction using a particular Configuration get() method
168  * @param group Action group.
169  * @param action Action name.
170  * @param get Method to obtain the state that the ToggleAction should have.
171  */
172 void
173 ActionManager::map_some_state (const char* group, const char* action, bool (RCConfiguration::*get)() const)
174 {
175         Glib::RefPtr<Action> act = ActionManager::get_action (group, action, false);
176         if (act) {
177                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
178
179                 if (tact) {
180
181                         bool x = (Config->*get)();
182
183                         if (tact->get_active() != x) {
184                                 tact->set_active (x);
185                         }
186                 }
187         }
188 }
189
190 /** Set the state of a ToggleAction using a particular Configuration get() method
191  * @param group Action group.
192  * @param action Action name.
193  * @param get Method to obtain the state that the ToggleAction should have.
194  */
195 void
196 ActionManager::map_some_state (const char* group, const char* action, bool (UIConfiguration::*get)() const)
197 {
198         Glib::RefPtr<Action> act = ActionManager::get_action (group, action, false);
199         if (act) {
200                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
201
202                 if (tact) {
203
204                         bool x = (UIConfiguration::instance().*get)();
205
206                         if (tact->get_active() != x) {
207                                 tact->set_active (x);
208                         }
209                 }
210         }
211 }
212
213 void
214 ActionManager::map_some_state (const char* group, const char* action, sigc::slot<bool> get)
215 {
216         Glib::RefPtr<Action> act = ActionManager::get_action (group, action, false);
217         if (act) {
218                 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
219
220                 if (tact) {
221
222                         bool const x = get ();
223
224                         if (tact->get_active() != x) {
225                                 tact->set_active (x);
226                         }
227                 }
228         }
229 }
230