Merged with trunk R1612.
[ardour.git] / gtk2_ardour / marker_time_axis.cc
1 /*
2     Copyright (C) 2003 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 <string>
21
22 #include <pbd/error.h>
23
24 #include <gtkmm/menu.h>
25
26 #include <gtkmm2ext/utils.h>
27
28 #include <ardour/session.h>
29 #include <ardour/utils.h>
30
31 #include "ardour_ui.h"
32 #include "public_editor.h"
33 #include "imageframe_time_axis.h"
34 #include "selection.h"
35 #include "imageframe_time_axis_view.h"
36 #include "marker_time_axis_view.h"
37 #include "imageframe_view.h"
38 #include "marker_time_axis.h"
39 #include "canvas_impl.h"
40
41 #include "i18n.h"
42
43 using namespace ARDOUR;
44 using namespace PBD;
45 using namespace sigc;
46 using namespace Gtk;
47
48 //---------------------------------------------------------------------------------------//
49 // Constructor / Desctructor
50
51 /**
52  * Constructs a new MarkerTimeAxis
53  *
54  * @param ed the PublicEditor
55  * @param sess the current session
56  * @param canvas the parent canvas item
57  * @param name the name/id of this time axis
58  * @param tav the associated track view that this MarkerTimeAxis is marking up
59  */
60 MarkerTimeAxis::MarkerTimeAxis (PublicEditor& ed, ARDOUR::Session& sess, Canvas& canvas, const string & name, TimeAxisView* tav)
61         : AxisView(sess),
62           VisualTimeAxis(name, ed, sess, canvas)
63 {
64         /* the TimeAxisView these markers are associated with */
65         marked_time_axis = tav ;
66         
67         _color = unique_random_color() ;
68         time_axis_name = name ;
69
70         selection_group = new Group (*canvas_display);
71         selection_group->hide();
72
73         // intialize our data items
74         marker_menu = 0 ;
75
76         y_position = -1 ;
77
78         /* create our new marker time axis strip view */
79         view = new MarkerTimeAxisView(*this) ;
80
81         // set the initial time axis text label
82         label_view() ;
83                 
84         // set the initial height of this time axis
85         set_height(Small) ;
86 }
87
88 /**
89  * Destructor
90  * Responsible for destroying any marker items upon this time axis
91  */
92 MarkerTimeAxis::~MarkerTimeAxis()
93 {
94         GoingAway() ; /* EMIT_SIGNAL */
95
96         // destroy the view helper
97         // this handles removing and destroying individual marker items
98
99         if(view) {
100                 delete view ;
101                 view = 0 ;
102         }
103 }
104
105
106 //---------------------------------------------------------------------------------------//
107 // ui methods & data
108         
109 /**
110  * Sets the height of this TrackView to one of the defined TrackHeights
111  *
112  * @param h the TrackHeight value to set
113  */     
114 void
115 MarkerTimeAxis::set_height (TrackHeight h)
116 {
117         VisualTimeAxis::set_height(h) ;
118         
119         // tell out view helper of the change too
120         if (view != 0)
121         {
122                 view->set_height((double) height) ;
123         }
124         
125         // tell those interested that we have had our height changed
126          gui_changed("track_height",(void*)0) ; /* EMIT_SIGNAL */
127 }
128
129 /**
130  * Sets the number of samples per unit that are used.
131  * This is used to determine the sizes of items upon this time axis
132  *
133  * @param spu the number of samples per unit
134  */
135 void
136 MarkerTimeAxis::set_samples_per_unit(double spu)
137 {
138         TimeAxisView::set_samples_per_unit (editor.get_current_zoom());
139
140         if (view) {
141                 view->set_samples_per_unit(spu) ;
142         }
143 }
144
145 /**
146  * Show the popup edit menu
147  *
148  * @param button the mouse button pressed
149  * @param time when to show the popup
150  * @param clicked_mv the MarkerView that the event ocured upon, or 0 if none
151  * @param with_item true if an item has been selected upon the time axis, used to set context menu
152  */
153 void
154 MarkerTimeAxis::popup_marker_time_axis_edit_menu(int button, int32_t time, MarkerView* clicked_mv, bool with_item)
155 {
156         if (!marker_menu)
157         {
158                 build_marker_menu() ;
159         }
160
161         if (with_item)
162         {
163                 marker_item_menu->set_sensitive(true) ;
164         }
165         else
166         {
167                 marker_item_menu->set_sensitive(false) ;
168         }
169         
170         marker_menu->popup(button,time) ;
171 }
172
173
174 /**
175  * convenience method to select a new track color and apply it to the view and view items
176  *
177  */
178 void
179 MarkerTimeAxis::select_track_color()
180 {
181         if(VisualTimeAxis::choose_time_axis_color())
182         {
183                 if(view)
184                 {
185                         view->apply_color(_color) ;
186                 }
187         }
188 }
189
190 /**
191  * Handles the building of the popup menu
192  */
193 void
194 MarkerTimeAxis::build_display_menu()
195 {
196         using namespace Menu_Helpers;
197
198         /* get the size menu ready */
199         build_size_menu() ;
200
201         /* prepare it */
202         TimeAxisView::build_display_menu();
203
204         /* now fill it with our stuff */
205         MenuList& items = display_menu->items();
206
207         items.push_back(MenuElem (_("Rename"), mem_fun(*this, &VisualTimeAxis::start_time_axis_rename)));
208
209         items.push_back(SeparatorElem()) ;
210         items.push_back(MenuElem (_("Height"), *size_menu));
211         items.push_back(MenuElem (_("Color"), mem_fun(*this, &MarkerTimeAxis::select_track_color)));
212         items.push_back(SeparatorElem()) ;
213         
214         items.push_back(MenuElem (_("Remove"), bind(mem_fun(*this, &MarkerTimeAxis::remove_this_time_axis), (void*)this)));
215 }
216
217 /**
218  * handles the building of the MarkerView sub menu
219  */
220 void
221 MarkerTimeAxis::build_marker_menu()
222 {
223         using namespace Menu_Helpers;
224         using Gtk::Menu;
225
226         marker_menu = manage(new Menu) ;
227         marker_menu->set_name ("ArdourContextMenu");
228         MenuList& items = marker_menu->items();
229         
230         marker_item_menu = manage(new Menu) ;
231         marker_item_menu->set_name ("ArdourContextMenu");
232         MenuList& marker_sub_items = marker_item_menu->items() ;
233
234         /* duration menu */
235         Menu* duration_menu = manage(new Menu) ;
236         duration_menu->set_name ("ArdourContextMenu");
237         MenuList& duration_items = duration_menu->items() ;
238         
239         if(view)
240         {
241                 duration_items.push_back(MenuElem (_("1 seconds"), bind (mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 1.0))) ;
242                 duration_items.push_back(MenuElem (_("1.5 seconds"), bind (mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 1.5))) ;
243                 duration_items.push_back(MenuElem (_("2 seconds"), bind (mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 2.0))) ;
244                 duration_items.push_back(MenuElem (_("2.5 seconds"), bind (mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 2.5))) ;
245                 duration_items.push_back(MenuElem (_("3 seconds"), bind (mem_fun (view, &MarkerTimeAxisView::set_marker_duration_sec), 3.0))) ;
246         }
247         //duration_items.push_back(SeparatorElem()) ;
248         //duration_items.push_back(MenuElem (_("custom"), mem_fun(*this, &ImageFrameTimeAxis::set_marker_duration_custom))) ;
249
250         marker_sub_items.push_back(MenuElem(_("Duration (sec)"), *duration_menu)) ;
251
252         marker_sub_items.push_back(SeparatorElem()) ;
253         marker_sub_items.push_back(MenuElem (_("Remove Marker"), bind(mem_fun(view, &MarkerTimeAxisView::remove_selected_marker_view),(void*)this))) ;
254         
255         items.push_back(MenuElem(_("Marker"), *marker_item_menu)) ;
256         items.push_back(MenuElem (_("Rename Track"), mem_fun(*this,&MarkerTimeAxis::start_time_axis_rename))) ;
257
258         marker_menu->show_all() ;
259 }
260
261
262
263 /**
264  * Returns the view helper of this TimeAxis
265  *
266  * @return the view helper of this TimeAxis
267  */
268 MarkerTimeAxisView*
269 MarkerTimeAxis::get_view()
270 {
271         return(view) ;
272 }
273
274 /**
275  * Returns the TimeAxisView that this markerTimeAxis is marking up
276  *
277  * @return the TimeAXisView that this MarkerTimeAxis is marking
278  */
279 TimeAxisView*
280 MarkerTimeAxis::get_marked_time_axis()
281 {
282         return(marked_time_axis) ;
283 }
284
285
286
287