no longer delete and recreate MonitorSection when it is removed/added to a Session
[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/textview.h>
38 #include <gtkmm/treemodel.h>
39 #include <gtkmm/treeview.h>
40
41 #include <boost/shared_ptr.hpp>
42
43 #include <string>
44 #include <list>
45
46 #include "ardour/session_metadata.h"
47
48 class MetadataField;
49 typedef boost::shared_ptr<MetadataField> MetadataPtr;
50
51 /// Wraps a metadata field to be used in a GUI
52 class MetadataField
53 {
54 public:
55         MetadataField (std::string const & field_name);
56         virtual ~MetadataField();
57         virtual MetadataPtr copy () = 0;
58
59         virtual void save_data (ARDOUR::SessionMetadata & data) const = 0;
60         virtual void load_data (ARDOUR::SessionMetadata const & data) = 0;
61
62         virtual std::string name() { return _name; }
63         virtual std::string value() { return _value; }
64
65         /// Get widget containing name of field
66         virtual Gtk::Widget & name_widget () = 0;
67         /// Get label containing value of field
68         virtual Gtk::Widget & value_widget () = 0;
69         /// Get widget for editing value
70         virtual Gtk::Widget & edit_widget () = 0;
71 protected:
72         std::string _name;
73         std::string _value;
74 };
75
76 /// MetadataField that contains text
77 class TextMetadataField : public MetadataField
78 {
79 protected:
80         typedef std::string (ARDOUR::SessionMetadata::*Getter) () const;
81         typedef void (ARDOUR::SessionMetadata::*Setter) (std::string const &);
82 public:
83         TextMetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 50);
84         MetadataPtr copy ();
85
86         void save_data (ARDOUR::SessionMetadata & data) const;
87         void load_data (ARDOUR::SessionMetadata const & data);
88
89         Gtk::Widget & name_widget ();
90         Gtk::Widget & value_widget ();
91         Gtk::Widget & edit_widget ();
92 protected:
93         void update_value ();
94
95         Getter getter;
96         Setter setter;
97
98         Gtk::Label* label;
99         Gtk::Label* value_label;
100         Gtk::Entry* entry;
101
102         guint width;
103 };
104
105 /// MetadataField that contains longform text
106 class LongTextMetadataField : public TextMetadataField
107 {
108 public:
109         LongTextMetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 50);
110         MetadataPtr copy ();
111
112         Gtk::Widget & edit_widget ();
113 private:
114         void update_value ();
115
116         Gtk::TextView* tview;
117 };
118
119 /// MetadataField that accepts only numbers
120 class NumberMetadataField : public MetadataField
121 {
122 private:
123         typedef uint32_t (ARDOUR::SessionMetadata::*Getter) () const;
124         typedef void (ARDOUR::SessionMetadata::*Setter) (uint32_t);
125 public:
126         NumberMetadataField (Getter getter, Setter setter, std::string const & field_name, guint numbers, guint width = 50);
127         MetadataPtr copy ();
128
129         void save_data (ARDOUR::SessionMetadata & data) const;
130         void load_data (ARDOUR::SessionMetadata const & data);
131
132         Gtk::Widget & name_widget ();
133         Gtk::Widget & value_widget ();
134         Gtk::Widget & edit_widget ();
135 private:
136         void update_value ();
137         std::string uint_to_str (uint32_t i) const;
138         uint32_t str_to_uint (std::string const & str) const;
139
140         Getter getter;
141         Setter setter;
142
143         Gtk::Label* label;
144         Gtk::Label* value_label;
145         Gtk::Entry* entry;
146
147         guint numbers;
148         guint width;
149 };
150
151 /// MetadataField that accepts EAN-13 data only
152 class EAN13MetadataField : public MetadataField
153 {
154 private:
155         typedef std::string (ARDOUR::SessionMetadata::*Getter) () const;
156         typedef void (ARDOUR::SessionMetadata::*Setter) (std::string const &);
157 public:
158         EAN13MetadataField (Getter getter, Setter setter, std::string const & field_name, guint width = 13);
159         MetadataPtr copy ();
160
161         void save_data (ARDOUR::SessionMetadata & data) const;
162         void load_data (ARDOUR::SessionMetadata const & data);
163
164         Gtk::Widget & name_widget ();
165         Gtk::Widget & value_widget ();
166         Gtk::Widget & edit_widget ();
167
168         Gtk::Label* status_label;
169         void update_status ();
170 private:
171         void update_value ();
172         std::string numeric_string (std::string const & str) const;
173
174         Getter getter;
175         Setter setter;
176
177         Gtk::Label* label;
178         Gtk::Label* value_label;
179         Gtk::Entry* entry;
180
181         guint width;
182 };
183
184 /// Interface for MetadataFields
185 class SessionMetadataSet : public ARDOUR::SessionHandlePtr
186 {
187 public:
188         SessionMetadataSet (std::string const & name);
189         virtual ~SessionMetadataSet () {};
190
191         void add_data_field (MetadataPtr field);
192
193         /// allows loading extra data into data sets (for importing etc.)
194         virtual void load_extra_data (ARDOUR::SessionMetadata const & /*data*/) { }
195         /// Saves data to session
196         virtual void save_data () = 0;
197
198         virtual Gtk::Widget & get_widget () = 0;
199         virtual Gtk::Widget & get_tab_widget () = 0;
200
201 protected:
202         typedef std::list<MetadataPtr> DataList;
203         DataList list;
204         std::string name;
205 };
206
207 /// Contains MetadataFields for editing
208 class SessionMetadataSetEditable : public SessionMetadataSet
209 {
210 public:
211         SessionMetadataSetEditable (std::string const & name);
212
213         Gtk::Widget & get_widget () { return vbox; }
214         Gtk::Widget & get_tab_widget ();
215
216         /// Sets session and loads data
217         void set_session (ARDOUR::Session * s);
218         /// Saves from MetadataFields into data
219         void save_data ();
220
221 private:
222         Gtk::VBox vbox;
223         Gtk::Table table;
224         Gtk::Label tab_widget;
225 };
226
227 /// Contains MetadataFields for importing
228 class SessionMetadataSetImportable : public SessionMetadataSet
229 {
230 public:
231         SessionMetadataSetImportable (std::string const & name);
232
233         Gtk::Widget & get_widget () { return tree_view; }
234         Gtk::Widget & get_tab_widget ();
235         Gtk::Widget & get_select_all_widget ();
236
237         /// Loads importable data from data
238         void load_extra_data (ARDOUR::SessionMetadata const & data);
239         /// Saves from importable data (see load_data) to session_data
240         void save_data ();
241
242 private:
243         DataList & session_list; // References MetadataSet::list
244         DataList import_list;
245
246         struct Columns : public Gtk::TreeModel::ColumnRecord
247         {
248         public:
249                 Gtk::TreeModelColumn<std::string>     field;
250                 Gtk::TreeModelColumn<std::string>     values;
251                 Gtk::TreeModelColumn<bool>        import;
252                 Gtk::TreeModelColumn<MetadataPtr> data;
253
254                 Columns() { add (field); add (values); add (import); add (data); }
255         };
256
257         Glib::RefPtr<Gtk::ListStore>  tree;
258         Columns                       tree_cols;
259         Gtk::TreeView                 tree_view;
260
261         Gtk::Label                    tab_widget;
262         Gtk::CheckButton              select_all_check;
263
264         void select_all ();
265         void selection_changed (std::string const & path);
266 };
267
268 /// Metadata dialog interface
269 /**
270  * The DataSets are initalized in this class so that all
271  * Dialogs have the same sets of data in the same order.
272  */
273 template <typename DataSet>
274 class SessionMetadataDialog : public ArdourDialog
275 {
276 public:
277         SessionMetadataDialog (std::string const & name);
278
279 protected:
280         void init_data ( bool skip_user = false );
281         void load_extra_data (ARDOUR::SessionMetadata const & data);
282         void save_data ();
283
284         virtual void init_gui () = 0;
285         virtual void save_and_close ();
286         virtual void end_dialog ();
287
288         void warn_user (std::string const & string);
289
290         typedef std::list<Gtk::Widget *> WidgetList;
291         typedef boost::shared_ptr<WidgetList> WidgetListPtr;
292         typedef Gtk::Widget & (DataSet::*WidgetFunc) ();
293
294         /// Returns list of widgets gathered by calling f for each data set
295         WidgetListPtr get_custom_widgets (WidgetFunc f);
296
297         /// Adds a widget to the table (vertical stacking) with automatic spacing
298         void add_widget (Gtk::Widget & widget);
299
300         Gtk::Notebook     notebook;
301
302 private:
303         void init_user_data ();
304         void init_description_data ();
305         void init_track_data ();
306         void init_album_data ();
307         void init_people_data ();
308         void init_school_data ();
309
310         typedef boost::shared_ptr<SessionMetadataSet> DataSetPtr;
311         typedef std::list<DataSetPtr> DataSetList;
312         DataSetList data_list;
313
314         Gtk::Button *     save_button;
315         Gtk::Button *     cancel_button;
316 };
317
318 class SessionMetadataEditor : public SessionMetadataDialog<SessionMetadataSetEditable>
319 {
320 public:
321         SessionMetadataEditor ();
322         ~SessionMetadataEditor ();
323         void run ();
324 private:
325         void init_gui ();
326 };
327
328 class SessionMetadataImporter : public SessionMetadataDialog<SessionMetadataSetImportable> {
329   public:
330         SessionMetadataImporter ();
331         ~SessionMetadataImporter ();
332         void run ();
333
334   private:
335         void init_gui ();
336
337         // Select all from -widget
338         Gtk::HBox    selection_hbox;
339         Gtk::Label   selection_label;
340
341 };
342
343 #endif