OSC: add use groups to GUI
[ardour.git] / gtk2_ardour / session_metadata_dialog.h
1 /*
2     Copyright (C) 2008 Paul Davis
3     Author: Sakari Bergen
4
5     This program is free software; you can redistribute it and/or modify it
6     under the terms of the GNU General Public License as published by the Free
7     Software Foundation; either version 2 of the License, or (at your option)
8     any later version.
9
10     This program is distributed in the hope that it will be useful, but WITHOUT
11     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13     for more details.
14
15     You should have received a copy of the GNU General Public License along
16     with this program; if not, write to the Free Software Foundation, Inc.,
17     675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20 #ifndef __session_metadata_dialog_h__
21 #define __session_metadata_dialog_h__
22
23 #include "ardour_dialog.h"
24
25 #ifdef interface
26 #undef interface
27 #endif
28
29 #include <gtkmm/box.h>
30 #include <gtkmm/button.h>
31 #include <gtkmm/checkbutton.h>
32 #include <gtkmm/entry.h>
33 #include <gtkmm/label.h>
34 #include <gtkmm/liststore.h>
35 #include <gtkmm/notebook.h>
36 #include <gtkmm/table.h>
37 #include <gtkmm/treemodel.h>
38 #include <gtkmm/treeview.h>
39
40 #include <boost/shared_ptr.hpp>
41
42 #include <string>
43 #include <list>
44
45 #include "ardour/session_metadata.h"
46
47 class MetadataField;
48 typedef boost::shared_ptr<MetadataField> MetadataPtr;
49
50 /// Wraps a metadata field to be used in a GUI
51 class MetadataField
52 {
53 public:
54         MetadataField (std::string const & field_name);
55         virtual ~MetadataField();
56         virtual MetadataPtr copy () = 0;
57
58         virtual void save_data (ARDOUR::SessionMetadata & data) const = 0;
59         virtual void load_data (ARDOUR::SessionMetadata const & data) = 0;
60
61         virtual std::string name() { return _name; }
62         virtual std::string value() { return _value; }
63
64         /// Get widget containing name of field
65         virtual Gtk::Widget & name_widget () = 0;
66         /// Get label containing value of field
67         virtual Gtk::Widget & value_widget () = 0;
68         /// Get widget for editing value
69         virtual Gtk::Widget & edit_widget () = 0;
70 protected:
71         std::string _name;
72         std::string _value;
73 };
74
75 /// MetadataField that contains text
76 class TextMetadataField : public MetadataField
77 {
78 private:
79         typedef std::string (ARDOUR::SessionMetadata::*Getter) () const;
80         typedef void (ARDOUR::SessionMetadata::*Setter) (std::string const &);
81 public:
82         TextMetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 50);
83         MetadataPtr copy ();
84
85         void save_data (ARDOUR::SessionMetadata & data) const;
86         void load_data (ARDOUR::SessionMetadata const & data);
87
88         Gtk::Widget & name_widget ();
89         Gtk::Widget & value_widget ();
90         Gtk::Widget & edit_widget ();
91 private:
92         void update_value ();
93
94         Getter getter;
95         Setter setter;
96
97         Gtk::Label* label;
98         Gtk::Label* value_label;
99         Gtk::Entry* entry;
100
101         guint width;
102 };
103
104 /// MetadataField that accepts only numbers
105 class NumberMetadataField : public MetadataField
106 {
107 private:
108         typedef uint32_t (ARDOUR::SessionMetadata::*Getter) () const;
109         typedef void (ARDOUR::SessionMetadata::*Setter) (uint32_t);
110 public:
111         NumberMetadataField (Getter getter, Setter setter, std::string const & field_name, guint numbers, guint width = 50);
112         MetadataPtr copy ();
113
114         void save_data (ARDOUR::SessionMetadata & data) const;
115         void load_data (ARDOUR::SessionMetadata const & data);
116
117         Gtk::Widget & name_widget ();
118         Gtk::Widget & value_widget ();
119         Gtk::Widget & edit_widget ();
120 private:
121         void update_value ();
122         std::string uint_to_str (uint32_t i) const;
123         uint32_t str_to_uint (std::string const & str) const;
124
125         Getter getter;
126         Setter setter;
127
128         Gtk::Label* label;
129         Gtk::Label* value_label;
130         Gtk::Entry* entry;
131
132         guint numbers;
133         guint width;
134 };
135
136 /// MetadataField that accepts EAN-13 data only
137 class EAN13MetadataField : public MetadataField
138 {
139 private:
140         typedef std::string (ARDOUR::SessionMetadata::*Getter) () const;
141         typedef void (ARDOUR::SessionMetadata::*Setter) (std::string const &);
142 public:
143         EAN13MetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 13);
144         MetadataPtr copy ();
145
146         void save_data (ARDOUR::SessionMetadata & data) const;
147         void load_data (ARDOUR::SessionMetadata const & data);
148
149         Gtk::Widget & name_widget ();
150         Gtk::Widget & value_widget ();
151         Gtk::Widget & edit_widget ();
152
153         Gtk::Label* status_label;
154         void update_status ();
155 private:
156         void update_value ();
157         std::string numeric_string (std::string const & str) const;
158
159         Getter getter;
160         Setter setter;
161
162         Gtk::Label* label;
163         Gtk::Label* value_label;
164         Gtk::Entry* entry;
165
166         guint width;
167 };
168
169 /// Interface for MetadataFields
170 class SessionMetadataSet : public ARDOUR::SessionHandlePtr
171 {
172 public:
173         SessionMetadataSet (std::string const & name);
174         virtual ~SessionMetadataSet () {};
175
176         void add_data_field (MetadataPtr field);
177
178         /// allows loading extra data into data sets (for importing etc.)
179         virtual void load_extra_data (ARDOUR::SessionMetadata const & /*data*/) { }
180         /// Saves data to session
181         virtual void save_data () = 0;
182
183         virtual Gtk::Widget & get_widget () = 0;
184         virtual Gtk::Widget & get_tab_widget () = 0;
185
186 protected:
187         typedef std::list<MetadataPtr> DataList;
188         DataList list;
189         std::string name;
190 };
191
192 /// Contains MetadataFields for editing
193 class SessionMetadataSetEditable : public SessionMetadataSet
194 {
195 public:
196         SessionMetadataSetEditable (std::string const & name);
197
198         Gtk::Widget & get_widget () { return vbox; }
199         Gtk::Widget & get_tab_widget ();
200
201         /// Sets session and loads data
202         void set_session (ARDOUR::Session * s);
203         /// Saves from MetadataFields into data
204         void save_data ();
205
206 private:
207         Gtk::VBox vbox;
208         Gtk::Table table;
209         Gtk::Label tab_widget;
210 };
211
212 /// Contains MetadataFields for importing
213 class SessionMetadataSetImportable : public SessionMetadataSet
214 {
215 public:
216         SessionMetadataSetImportable (std::string const & name);
217
218         Gtk::Widget & get_widget () { return tree_view; }
219         Gtk::Widget & get_tab_widget ();
220         Gtk::Widget & get_select_all_widget ();
221
222         /// Loads importable data from data
223         void load_extra_data (ARDOUR::SessionMetadata const & data);
224         /// Saves from importable data (see load_data) to session_data
225         void save_data ();
226
227 private:
228         DataList & session_list; // References MetadataSet::list
229         DataList import_list;
230
231         struct Columns : public Gtk::TreeModel::ColumnRecord
232         {
233         public:
234                 Gtk::TreeModelColumn<std::string>     field;
235                 Gtk::TreeModelColumn<std::string>     values;
236                 Gtk::TreeModelColumn<bool>        import;
237                 Gtk::TreeModelColumn<MetadataPtr> data;
238
239                 Columns() { add (field); add (values); add (import); add (data); }
240         };
241
242         Glib::RefPtr<Gtk::ListStore>  tree;
243         Columns                       tree_cols;
244         Gtk::TreeView                 tree_view;
245
246         Gtk::Label                    tab_widget;
247         Gtk::CheckButton              select_all_check;
248
249         void select_all ();
250         void selection_changed (std::string const & path);
251 };
252
253 /// Metadata dialog interface
254 /**
255  * The DataSets are initalized in this class so that all
256  * Dialogs have the same sets of data in the same order.
257  */
258 template <typename DataSet>
259 class SessionMetadataDialog : public ArdourDialog
260 {
261 public:
262         SessionMetadataDialog (std::string const & name);
263
264 protected:
265         void init_data ( bool skip_user = false );
266         void load_extra_data (ARDOUR::SessionMetadata const & data);
267         void save_data ();
268
269         virtual void init_gui () = 0;
270         virtual void save_and_close ();
271         virtual void end_dialog ();
272
273         void warn_user (std::string const & string);
274
275         typedef std::list<Gtk::Widget *> WidgetList;
276         typedef boost::shared_ptr<WidgetList> WidgetListPtr;
277         typedef Gtk::Widget & (DataSet::*WidgetFunc) ();
278
279         /// Returns list of widgets gathered by calling f for each data set
280         WidgetListPtr get_custom_widgets (WidgetFunc f);
281
282         /// Adds a widget to the table (vertical stacking) with automatic spacing
283         void add_widget (Gtk::Widget & widget);
284
285         Gtk::Notebook     notebook;
286
287 private:
288         void init_user_data ();
289         void init_track_data ();
290         void init_album_data ();
291         void init_people_data ();
292         void init_school_data ();
293
294         typedef boost::shared_ptr<SessionMetadataSet> DataSetPtr;
295         typedef std::list<DataSetPtr> DataSetList;
296         DataSetList data_list;
297
298         Gtk::Button *     save_button;
299         Gtk::Button *     cancel_button;
300 };
301
302 class SessionMetadataEditor : public SessionMetadataDialog<SessionMetadataSetEditable>
303 {
304 public:
305         SessionMetadataEditor ();
306         ~SessionMetadataEditor ();
307         void run ();
308 private:
309         void init_gui ();
310 };
311
312 class SessionMetadataImporter : public SessionMetadataDialog<SessionMetadataSetImportable> {
313   public:
314         SessionMetadataImporter ();
315         ~SessionMetadataImporter ();
316         void run ();
317
318   private:
319         void init_gui ();
320
321         // Select all from -widget
322         Gtk::HBox    selection_hbox;
323         Gtk::Label   selection_label;
324
325 };
326
327 #endif