#include "selection.h"
#include "editing.h"
#include "gui_thread.h"
+#include "simplerect.h"
+#include "actions.h"
+#include "prompter.h"
#include "i18n.h"
using namespace std;
using namespace sigc;
using namespace ARDOUR;
+using namespace PBD;
using namespace Gtk;
void
void
Editor::add_new_location (Location *location)
{
+ ENSURE_GUI_THREAD (bind (mem_fun(*this, &Editor::add_new_location), location));
+
LocationMarkers *lam = new LocationMarkers;
uint32_t color;
}
if (location->is_mark()) {
- lam->start = new Marker (*this, GNOME_CANVAS_GROUP(marker_group), color,
- location->name(), Marker::Mark, PublicEditor::canvas_marker_event, location->start());
+ lam->start = new Marker (*this, *marker_group, color, location->name(), Marker::Mark, location->start());
lam->end = 0;
} else if (location->is_auto_loop()) {
// transport marker
- lam->start = new Marker (*this, GNOME_CANVAS_GROUP(transport_marker_group), color,
- location->name(), Marker::LoopStart, PublicEditor::canvas_marker_event, location->start());
- lam->end = new Marker (*this, GNOME_CANVAS_GROUP(transport_marker_group), color,
- location->name(), Marker::LoopEnd, PublicEditor::canvas_marker_event, location->end());
+ lam->start = new Marker (*this, *transport_marker_group, color,
+ location->name(), Marker::LoopStart, location->start());
+ lam->end = new Marker (*this, *transport_marker_group, color,
+ location->name(), Marker::LoopEnd, location->end());
} else if (location->is_auto_punch()) {
// transport marker
- lam->start = new Marker (*this, GNOME_CANVAS_GROUP(transport_marker_group), color,
- location->name(), Marker::PunchIn, PublicEditor::canvas_marker_event, location->start());
- lam->end = new Marker (*this, GNOME_CANVAS_GROUP(transport_marker_group), color,
- location->name(), Marker::PunchOut, PublicEditor::canvas_marker_event, location->end());
+ lam->start = new Marker (*this, *transport_marker_group, color,
+ location->name(), Marker::PunchIn, location->start());
+ lam->end = new Marker (*this, *transport_marker_group, color,
+ location->name(), Marker::PunchOut, location->end());
} else {
// range marker
- lam->start = new Marker (*this, GNOME_CANVAS_GROUP(range_marker_group), color,
- location->name(), Marker::Start, PublicEditor::canvas_marker_event, location->start());
- lam->end = new Marker (*this, GNOME_CANVAS_GROUP(range_marker_group), color,
- location->name(), Marker::End, PublicEditor::canvas_marker_event, location->end());
+ lam->start = new Marker (*this, *range_marker_group, color,
+ location->name(), Marker::Start, location->start());
+ lam->end = new Marker (*this, *range_marker_group, color,
+ location->name(), Marker::End, location->end());
}
if (location->is_hidden ()) {
}
void
-Editor::remove_marker (GnomeCanvasItem* item, GdkEvent* event)
+Editor::remove_marker (ArdourCanvas::Item& item, GdkEvent* event)
{
Marker* marker;
bool is_start;
- if ((marker = static_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(item), "marker"))) == 0) {
+ if ((marker = static_cast<Marker*> (item.get_data ("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
}
void
-Editor::tm_marker_context_menu (GdkEventButton* ev, GnomeCanvasItem* item)
+Editor::tm_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
if (tm_marker_menu == 0) {
build_tm_marker_menu ();
}
-
void
-Editor::marker_context_menu (GdkEventButton* ev, GnomeCanvasItem* item)
+Editor::marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
Marker * marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(item), "marker"))) == 0) {
+ if ((marker = reinterpret_cast<Marker *> (item->get_data("marker"))) == 0) {
fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg;
/*NOTREACHED*/
}
}
marker_menu_item = item;
transport_marker_menu->popup (1, ev->time);
- }
- else {
- if (marker_menu == 0) {
- build_marker_menu ();
- }
+ } else {
+
+ if (loc->is_mark()) {
+ if (marker_menu == 0) {
+ build_marker_menu ();
+ }
- Menu_Helpers::MenuList & children = marker_menu->items();
- // XXX: should really find this some other way
+
+ // GTK2FIX use action group sensitivity
+#ifdef GTK2FIX
if (children.size() >= 3) {
MenuItem * loopitem = &children[2];
if (loopitem) {
}
}
}
-
+#endif
marker_menu_item = item;
marker_menu->popup (1, ev->time);
+ }
+
+ if (loc->is_range_marker()) {
+ if (range_marker_menu == 0){
+ build_range_marker_menu ();
+ }
+ marker_menu_item = item;
+ range_marker_menu->popup (1, ev->time);
+ }
}
}
-
void
-Editor::new_transport_marker_context_menu (GdkEventButton* ev, GnomeCanvasItem* item)
+Editor::new_transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
if (new_transport_marker_menu == 0) {
build_new_transport_marker_menu ();
}
void
-Editor::transport_marker_context_menu (GdkEventButton* ev, GnomeCanvasItem* item)
+Editor::transport_marker_context_menu (GdkEventButton* ev, ArdourCanvas::Item* item)
{
if (transport_marker_menu == 0) {
build_transport_marker_menu ();
MenuList& items = marker_menu->items();
marker_menu->set_name ("ArdourContextMenu");
- items.push_back (MenuElem (_("Locate to"), mem_fun(*this, &Editor::marker_menu_set_playhead)));
- items.push_back (MenuElem (_("Play from"), mem_fun(*this, &Editor::marker_menu_play_from)));
- items.push_back (MenuElem (_("Loop range"), mem_fun(*this, &Editor::marker_menu_loop_range)));
- items.push_back (MenuElem (_("Set from playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
- items.push_back (MenuElem (_("Set from range"), mem_fun(*this, &Editor::marker_menu_set_from_selection)));
+ 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 (MenuElem (_("Set Mark from Playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Rename"), mem_fun(*this, &Editor::marker_menu_rename)));
- items.push_back (MenuElem (_("Hide"), mem_fun(*this, &Editor::marker_menu_hide)));
- items.push_back (MenuElem (_("Remove"), mem_fun(*this, &Editor::marker_menu_remove)));
+ 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)));
+ items.push_back (MenuElem (_("Remove Mark"), mem_fun(*this, &Editor::marker_menu_remove)));
+
+}
+
+void
+Editor::build_range_marker_menu ()
+{
+ using namespace Menu_Helpers;
+
+ range_marker_menu = new Menu;
+ MenuList& items = range_marker_menu->items();
+ range_marker_menu->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)));
+ 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)));
+
+ 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)));
+
}
void
MenuList& items = transport_marker_menu->items();
transport_marker_menu->set_name ("ArdourContextMenu");
- items.push_back (MenuElem (_("Locate to"), mem_fun(*this, &Editor::marker_menu_set_playhead)));
- items.push_back (MenuElem (_("Play from"), mem_fun(*this, &Editor::marker_menu_play_from)));
- items.push_back (MenuElem (_("Set from playhead"), mem_fun(*this, &Editor::marker_menu_set_from_playhead)));
- items.push_back (MenuElem (_("Set from range"), mem_fun(*this, &Editor::marker_menu_set_from_selection)));
+ 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"), mem_fun(*this, &Editor::marker_menu_hide)));
+ 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)));
}
void
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
}
}
+void
+Editor::marker_menu_select_all_selectables_using_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) && (l->end() > l->start())) {
+ select_all_within (l->start(), l->end() - 1, 0, DBL_MAX, Selection::Set);
+ }
+
+}
+
+void
+Editor::marker_menu_separate_regions_using_location ()
+{
+ 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) && (l->end() > l->start())) {
+ separate_regions_using_location (*l);
+ }
+
+}
+
void
Editor::marker_menu_play_from ()
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
}
}
else {
- if (!selection->audio_regions.empty()) {
- l->set_start (selection->audio_regions.start());
- l->set_end (selection->audio_regions.end_frame());
+ if (!selection->regions.empty()) {
+ l->set_start (selection->regions.start());
+ l->set_end (selection->regions.end_frame());
}
}
}
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
TempoMarker* tm;
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
TempoMarker* tm;
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
} else if ((tm = dynamic_cast<TempoMarker*> (marker)) != 0) {
remove_tempo_marker (marker_menu_item);
} else {
- remove_marker (marker_menu_item, (GdkEvent*) 0);
+ remove_marker (*marker_menu_item, (GdkEvent*) 0);
}
}
{
Marker* marker;
- if ((marker = reinterpret_cast<Marker *> (gtk_object_get_data (GTK_OBJECT(marker_menu_item), "marker"))) == 0) {
+ 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*/
}
if (!loc) return;
- Dialog dialog;
- Entry entry;
- Button ok_button (_("OK"));
- Button cancel_button (_("Cancel"));
+ ArdourPrompter dialog (true);
+ string txt;
+
+ dialog.set_prompt (_("New Name:"));
if (loc->is_mark()) {
dialog.set_title (_("ardour: rename mark"));
}
dialog.set_name ("MarkRenameWindow");
- dialog.set_size_request (300, -1);
+ dialog.set_size_request (250, -1);
dialog.set_position (Gtk::WIN_POS_MOUSE);
- dialog.set_modal (true);
-
- dialog.get_vbox()->set_border_width (10);
- dialog.get_vbox()->pack_start (entry);
- dialog.get_action_area()->pack_start (ok_button);
- dialog.get_action_area()->pack_start (cancel_button);
- entry.set_text (loc->name());
- entry.set_name ("MarkerNameDisplay");
- ok_button.set_name ("EditorGTKButton");
- cancel_button.set_name ("EditorGTKButton");
+ dialog.add_button (_("Rename"), RESPONSE_ACCEPT);
+ dialog.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+ dialog.set_initial_text (loc->name());
- entry.signal_activate().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
- cancel_button.signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), -1));
- ok_button.signal_clicked().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop), 1));
- dialog.signal_delete_event().connect (bind (mem_fun(*this, &Editor::finish_sub_event_loop_on_delete), -1));
+ dialog.show ();
- dialog.show_all ();
- entry.grab_focus ();
-
- run_sub_event_loop ();
-
- if (sub_event_loop_status == 1) {
+ switch (dialog.run ()) {
+ case RESPONSE_ACCEPT:
+ break;
+ default:
+ return;
+ }
- Location* l;
- bool is_start;
+ begin_reversible_command ( _("rename marker") );
+ session->add_undo( session->locations()->get_memento() );
- if ((l = find_location_from_marker (marker, is_start)) != 0) {
- l->set_name (entry.get_text());
- }
- }
+ dialog.get_result(txt);
+ loc->set_name (txt);
+
+ session->add_redo_no_execute( session->locations()->get_memento() );
+ commit_reversible_command ();
}
gint
Editor::new_transport_marker_menu_popdown (GdkEventAny *ev)
{
// hide rects
- gnome_canvas_item_hide (transport_bar_drag_rect);
- gnome_canvas_item_hide (range_marker_drag_rect);
+ transport_bar_drag_rect->hide();
+ range_marker_drag_rect->hide();
return FALSE;
}
double x1 = frame_to_pixel (tll->start());
double x2 = frame_to_pixel (tll->end());
- gnome_canvas_item_set (transport_loop_range_rect, "x1", x1, "x2", x2, NULL);
+ transport_loop_range_rect->property_x1() = x1;
+ transport_loop_range_rect->property_x2() = x2;
if (visibility) {
- gnome_canvas_item_show (transport_loop_range_rect);
+ transport_loop_range_rect->show();
}
}
else if (visibility) {
- gnome_canvas_item_hide (transport_loop_range_rect);
+ transport_loop_range_rect->hide();
}
}
double x1 = frame_to_pixel (tpl->start());
double x2 = frame_to_pixel (tpl->end());
- gnome_canvas_item_set (transport_punch_range_rect, "x1", x1, "x2", x2, NULL);
+ transport_punch_range_rect->property_x1() = x1;
+ transport_punch_range_rect->property_x2() = x2;
if (visibility) {
- gnome_canvas_item_show (transport_punch_range_rect);
+ transport_punch_range_rect->show();
}
}
else if (visibility) {
- gnome_canvas_item_hide (transport_punch_range_rect);
+ transport_punch_range_rect->hide();
}
// if (session->get_punch_in()) {