along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
*/
#include <sigc++/retype.h>
#include <libgnomecanvas/libgnomecanvas.h>
#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/window_title.h>
#include <ardour/location.h>
#include <pbd/memento_command.h>
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
+using namespace Gtkmm2ext;
void
Editor::clear_marker_display ()
void
Editor::mouse_add_new_marker (nframes_t where)
{
+ string markername;
if (session) {
- Location *location = new Location (where, where, "mark", Location::IsMark);
+ session->locations()->next_available_name(markername,"mark");
+ Location *location = new Location (where, where, markername, Location::IsMark);
session->begin_reversible_command (_("add marker"));
XMLNode &before = session->locations()->get_state();
session->locations()->add (location, true);
Location* loc = find_location_from_marker (marker, is_start);
if (session && loc) {
- if (loc->is_end()) {
- /* you can't hide or delete this marker */
- return;
- }
- if (loc->is_auto_loop() || loc->is_auto_punch()) {
- // just hide them
- loc->set_hidden (true, this);
- }
- else {
- Glib::signal_idle().connect (bind (mem_fun(*this, &Editor::really_remove_marker), loc));
- }
+ Glib::signal_idle().connect (bind (mem_fun(*this, &Editor::really_remove_marker), loc));
}
}
Location * loc = find_location_from_marker (marker, is_start);
if (loc == transport_loop_location() || loc == transport_punch_location()) {
if (transport_marker_menu == 0) {
- build_transport_marker_menu ();
+ build_range_marker_menu (true);
}
marker_menu_item = item;
transport_marker_menu->popup (1, ev->time);
} else {
if (loc->is_mark()) {
- if (marker_menu == 0) {
- build_marker_menu ();
- }
+ bool start_or_end = loc->is_start() || loc->is_end();
+ Menu *markerMenu;
+ if (start_or_end) {
+ if (start_end_marker_menu == 0)
+ build_marker_menu (true);
+ markerMenu = start_end_marker_menu;
+ } else {
+ if (marker_menu == 0)
+ build_marker_menu (false);
+ markerMenu = marker_menu;
+ }
// GTK2FIX use action group sensitivity
}
#endif
marker_menu_item = item;
- marker_menu->popup (1, ev->time);
+ markerMenu->popup (1, ev->time);
}
if (loc->is_range_marker()) {
if (range_marker_menu == 0){
- build_range_marker_menu ();
+ build_range_marker_menu (false);
}
marker_menu_item = item;
range_marker_menu->popup (1, ev->time);
Editor::transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
if (transport_marker_menu == 0) {
- build_transport_marker_menu ();
+ build_range_marker_menu (true);
}
transport_marker_menu->popup (1, ev->time);
}
void
-Editor::build_marker_menu ()
+Editor::build_marker_menu (bool start_or_end)
{
using namespace Menu_Helpers;
- marker_menu = new Menu;
- MenuList& items = marker_menu->items();
- marker_menu->set_name ("ArdourContextMenu");
+ Menu *markerMenu = new Menu;
+ if (start_or_end) {
+ start_end_marker_menu = markerMenu;
+ } else {
+ marker_menu = markerMenu;
+ }
+ MenuList& items = markerMenu->items();
+ markerMenu->set_name ("ArdourContextMenu");
items.push_back (MenuElem (_("Locate to Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead)));
items.push_back (MenuElem (_("Play from Mark"), mem_fun(*this, &Editor::marker_menu_play_from)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Rename Mark"), mem_fun(*this, &Editor::marker_menu_rename)));
items.push_back (MenuElem (_("Hide Mark"), mem_fun(*this, &Editor::marker_menu_hide)));
+ if (start_or_end) return;
+ items.push_back (MenuElem (_("Rename Mark"), mem_fun(*this, &Editor::marker_menu_rename)));
items.push_back (MenuElem (_("Remove Mark"), mem_fun(*this, &Editor::marker_menu_remove)));
}
void
-Editor::build_range_marker_menu ()
+Editor::build_range_marker_menu (bool loop_or_punch)
{
using namespace Menu_Helpers;
- range_marker_menu = new Menu;
- MenuList& items = range_marker_menu->items();
- range_marker_menu->set_name ("ArdourContextMenu");
+ Menu *markerMenu = new Menu;
+ if (loop_or_punch) {
+ transport_marker_menu = markerMenu;
+ } else {
+ range_marker_menu = markerMenu;
+ }
+ MenuList& items = markerMenu->items();
+ markerMenu->set_name ("ArdourContextMenu");
items.push_back (MenuElem (_("Locate to Range Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead)));
items.push_back (MenuElem (_("Play from Range Mark"), mem_fun(*this, &Editor::marker_menu_play_from)));
- items.push_back (MenuElem (_("Loop Range"), mem_fun(*this, &Editor::marker_menu_loop_range)));
+ if (! loop_or_punch) {
+ items.push_back (MenuElem (_("Play Range"), mem_fun(*this, &Editor::marker_menu_play_range)));
+ items.push_back (MenuElem (_("Loop Range"), mem_fun(*this, &Editor::marker_menu_loop_range)));
+ }
items.push_back (MenuElem (_("Set Range Mark from Playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
items.push_back (MenuElem (_("Set Range from Range Selection"), mem_fun(*this, &Editor::marker_menu_set_from_selection)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Rename Range"), mem_fun(*this, &Editor::marker_menu_rename)));
items.push_back (MenuElem (_("Hide Range"), mem_fun(*this, &Editor::marker_menu_hide)));
- items.push_back (MenuElem (_("Remove Range"), mem_fun(*this, &Editor::marker_menu_remove)));
+ if (! loop_or_punch) {
+ items.push_back (MenuElem (_("Rename Range"), mem_fun(*this, &Editor::marker_menu_rename)));
+ items.push_back (MenuElem (_("Remove Range"), mem_fun(*this, &Editor::marker_menu_remove)));
+ }
items.push_back (SeparatorElem());
items.push_back (MenuElem (_("Separate Regions in Range"), mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
items.push_back (MenuElem (_("Select All in Range"), mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
+ items.push_back (MenuElem (_("Select Range"), mem_fun(*this, &Editor::marker_menu_select_using_range)));
}
}
void
-Editor::build_transport_marker_menu ()
+Editor::marker_menu_hide ()
{
- using namespace Menu_Helpers;
+ Marker* marker;
- transport_marker_menu = new Menu;
- MenuList& items = transport_marker_menu->items();
- transport_marker_menu->set_name ("ArdourContextMenu");
+ if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
+ /*NOTREACHED*/
+ }
- items.push_back (MenuElem (_("Locate to Range Mark"), mem_fun(*this, &Editor::marker_menu_set_playhead)));
- items.push_back (MenuElem (_("Play from Range Mark"), mem_fun(*this, &Editor::marker_menu_play_from)));
- items.push_back (MenuElem (_("Set Range Mark from Playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
- items.push_back (MenuElem (_("Set Range from Range Selection"), mem_fun(*this, &Editor::marker_menu_set_from_selection)));
- items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Hide Range"), mem_fun(*this, &Editor::marker_menu_hide)));
- items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Separate Regions in Range"), mem_fun(*this, &Editor::marker_menu_separate_regions_using_location)));
- items.push_back (MenuElem (_("Select All in Range"), mem_fun(*this, &Editor::marker_menu_select_all_selectables_using_range)));
+ Location* l;
+ bool is_start;
+
+ if ((l = find_location_from_marker (marker, is_start)) != 0) {
+ l->set_hidden (true, this);
+ }
}
void
-Editor::marker_menu_hide ()
+Editor::marker_menu_select_using_range ()
{
Marker* marker;
Location* l;
bool is_start;
-
- if ((l = find_location_from_marker (marker, is_start)) != 0) {
- l->set_hidden (true, this);
+
+ if (((l = find_location_from_marker (marker, is_start)) != 0) && (l->end() > l->start())) {
+ set_selection_from_range (*l);
}
}
bool is_start;
if (((l = find_location_from_marker (marker, is_start)) != 0) && (l->end() > l->start())) {
- select_all_within (l->start(), l->end() - 1, 0, DBL_MAX, Selection::Set);
+ select_all_within (l->start(), l->end() - 1, 0, DBL_MAX, track_views, Selection::Set);
}
}
}
}
+
+void
+Editor::marker_menu_play_range ()
+{
+ Marker* marker;
+
+ if ((marker = reinterpret_cast<Marker *> (marker_menu_item->get_data ("marker"))) == 0) {
+ fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
+ /*NOTREACHED*/
+ }
+
+ Location* l;
+ bool is_start;
+
+ if ((l = find_location_from_marker (marker, is_start)) != 0) {
+
+ if (l->is_mark()) {
+ session->request_locate (l->start(), true);
+ }
+ else {
+ session->request_bounded_roll (l->start(), l->end());
+
+ }
+ }
+}
+
void
Editor::marker_menu_loop_range ()
{
string txt;
dialog.set_prompt (_("New Name:"));
-
+
+ WindowTitle title(Glib::get_application_name());
if (loc->is_mark()) {
- dialog.set_title (_("ardour: rename mark"));
+ title += _("Rename Mark");
} else {
- dialog.set_title (_("ardour: rename range"));
+ title += _("Rename Range");
}
+ dialog.set_title(title.get_string());
+
dialog.set_name ("MarkRenameWindow");
dialog.set_size_request (250, -1);
dialog.set_position (Gtk::WIN_POS_MOUSE);
Location* tll;
- if (Config->get_auto_loop() && ((tll = transport_loop_location()) != 0)) {
+ if (session->get_play_loop() && ((tll = transport_loop_location()) != 0)) {
double x1 = frame_to_pixel (tll->start());
double x2 = frame_to_pixel (tll->end());
if (visibility) {
transport_loop_range_rect->show();
}
- }
- else if (visibility) {
+
+ } else if (visibility) {
transport_loop_range_rect->hide();
}
}