add editor to Theme Manager for modifiers
[ardour.git] / gtk2_ardour / theme_manager.h
1 /*
2     Copyright (C) 2000-2007 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_color_manager_h__
21 #define __ardour_gtk_color_manager_h__
22
23 #include <gtkmm/treeview.h>
24 #include <gtkmm/treestore.h>
25 #include <gtkmm/scrolledwindow.h>
26 #include <gtkmm/colorselection.h>
27 #include <gtkmm/radiobutton.h>
28 #include <gtkmm/button.h>
29 #include <gtkmm/scale.h>
30 #include <gtkmm/rc.h>
31
32 #include "canvas/types.h"
33 #include "canvas/canvas.h"
34
35 #include "ardour_window.h"
36
37 #include "ui_config.h"
38
39 namespace ArdourCanvas {
40         class Container;
41         class ScrollGroup;
42 }
43
44 class ArdourDialog;
45
46 class ThemeManager : public ArdourWindow
47 {
48   public:
49         ThemeManager();
50         ~ThemeManager();
51
52         int save (std::string path);
53         void reset_canvas_colors();
54
55         void on_dark_theme_button_toggled ();
56         void on_light_theme_button_toggled ();
57         void on_flat_buttons_toggled ();
58         void on_blink_rec_arm_toggled ();
59         void on_region_color_toggled ();
60         void on_show_clip_toggled ();
61         void on_waveform_gradient_depth_change ();
62         void on_timeline_item_gradient_depth_change ();
63         void on_all_dialogs_toggled ();
64         void on_icon_set_changed ();
65
66   private:
67         Gtk::Notebook notebook;
68         
69         struct BasicColorDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
70                 BasicColorDisplayModelColumns() {
71                         add (name);
72                         add (gdkcolor);
73                 }
74                 
75                 Gtk::TreeModelColumn<std::string>  name;
76                 Gtk::TreeModelColumn<Gdk::Color>   gdkcolor;
77         };
78         
79         Gtk::ColorSelectionDialog color_dialog;
80         sigc::connection color_dialog_connection;
81         
82         Gtk::HBox theme_selection_hbox;
83         Gtk::RadioButton dark_button;
84         Gtk::RadioButton light_button;
85         Gtk::Button reset_button;
86         Gtk::CheckButton flat_buttons;
87         Gtk::CheckButton blink_rec_button;
88         Gtk::CheckButton region_color_button;
89         Gtk::CheckButton show_clipping_button;
90         Gtk::HScale waveform_gradient_depth;
91         Gtk::Label waveform_gradient_depth_label;
92         Gtk::HScale timeline_item_gradient_depth;
93         Gtk::Label timeline_item_gradient_depth_label;
94         Gtk::CheckButton all_dialogs;
95         Gtk::CheckButton gradient_waveforms;
96         Gtk::Label icon_set_label;
97         Gtk::ComboBoxText icon_set_dropdown;
98
99         /* handls response from color dialog when it is used to
100            edit a derived color.
101         */
102         void palette_color_response (int, std::string);
103
104         Gtk::ScrolledWindow palette_scroller;
105         ArdourCanvas::GtkCanvasViewport palette_viewport;
106         ArdourCanvas::Container* palette_group;
107         
108         /* these methods create and manage a canvas for use in either the
109            palette tab or in a separate dialog. Different behaviour is
110            accomplished by changing the event handler passed into the 
111            allocation handler. We do it there because we have to rebuild
112            the canvas on allocation events, and during the rebuild, connect
113            each rectangle to the event handler.
114
115            the alternative is one event handler for the canvas and a map
116            of where each color rectangle is. nothing wrong with this
117            but the per-rect event setup is simpler and avoids building
118            and looking up the map information.
119         */
120         ArdourCanvas::Container* initialize_palette_canvas (ArdourCanvas::Canvas& canvas);
121         void build_palette_canvas (ArdourCanvas::Canvas&, ArdourCanvas::Container&, sigc::slot<bool,GdkEvent*,std::string> event_handler);
122         void palette_canvas_allocated (Gtk::Allocation& alloc, ArdourCanvas::Container* group, ArdourCanvas::Canvas* canvas, sigc::slot<bool,GdkEvent*,std::string> event_handler);
123         void palette_size_request (Gtk::Requisition*);
124
125         /* handles events from a palette canvas inside the palette (derived
126            colors) tab
127         */
128         bool palette_event (GdkEvent*, std::string name);
129         /* allows user to edit a named color (e.g. "color 3") after clicking
130            on it inside the palette tab.
131         */
132         void edit_palette_color (std::string);
133         
134         struct ColorAliasModelColumns : public Gtk::TreeModel::ColumnRecord {
135                 ColorAliasModelColumns() {
136                         add (name);
137                         add (alias);
138                         add (color);
139                 }
140                 
141                 Gtk::TreeModelColumn<std::string>  name;
142                 Gtk::TreeModelColumn<std::string>  alias;
143                 Gtk::TreeModelColumn<Gdk::Color>   color;
144         };
145
146         ColorAliasModelColumns       alias_columns;
147         Gtk::TreeView                alias_display;
148         Glib::RefPtr<Gtk::TreeStore> alias_list;
149         Gtk::ScrolledWindow          alias_scroller;
150
151         bool alias_button_press_event (GdkEventButton*);
152
153         ArdourDialog* palette_window;
154         sigc::connection palette_response_connection;
155         
156         void choose_color_from_palette (std::string const &target_name);
157         
158         bool alias_palette_event (GdkEvent*, std::string, std::string);
159         void alias_palette_response (int, std::string, std::string);
160
161         void setup_aliases ();
162         void setup_palette ();
163
164         Gtk::ScrolledWindow modifier_scroller;
165         Gtk::VBox modifier_vbox;
166         
167         void setup_modifiers ();
168         void modifier_edited (Gtk::Range*, std::string);
169         
170         void colors_changed ();
171 };
172
173 #endif /* __ardour_gtk_color_manager_h__ */
174