X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fvisual_time_axis.cc;h=10c8513ec8741753c4601e3a4e9f0b15038dd5a5;hb=19e97d1d64e8aa6d87d79d1f6332065992e5e027;hp=688f5a4122a41a0ff277f6b8584de976c0f31b2a;hpb=4b233612261e2d13ebbd1931f4d999c6da1451e9;p=ardour.git diff --git a/gtk2_ardour/visual_time_axis.cc b/gtk2_ardour/visual_time_axis.cc index 688f5a4122..10c8513ec8 100644 --- a/gtk2_ardour/visual_time_axis.cc +++ b/gtk2_ardour/visual_time_axis.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2003 Paul Davis + Copyright (C) 2003 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -24,24 +23,23 @@ #include #include -#include -#include +#include "pbd/error.h" +#include "pbd/stl_delete.h" +#include "pbd/whitespace.h" #include #include #include -#include #include -#include -#include -#include -#include +#include "ardour/session.h" +#include "ardour/utils.h" +#include "ardour/processor.h" +#include "ardour/location.h" #include "ardour_ui.h" #include "public_editor.h" #include "imageframe_time_axis.h" -#include "canvas-simplerect.h" #include "imageframe_time_axis_view.h" #include "marker_time_axis_view.h" #include "imageframe_view.h" @@ -50,31 +48,14 @@ #include "utils.h" #include "prompter.h" #include "rgb_macros.h" +#include "canvas_impl.h" #include "i18n.h" using namespace ARDOUR; -using namespace sigc; +using namespace PBD; using namespace Gtk; -//XXX should really have a common home... -static const gchar* small_x_xpm[] = { - "11 11 2 1", - " c None", - ". c #000000", - " ", - " ", - " . . ", - " . . ", - " . . ", - " . ", - " . . ", - " . . ", - " . . ", - " ", - " "}; - - /** * Abstract Constructor for base visual time axis classes * @@ -83,34 +64,31 @@ static const gchar* small_x_xpm[] = { * @param sess the current session * @param canvas the parent canvas object */ -VisualTimeAxis::VisualTimeAxis(std::string name, PublicEditor& ed, ARDOUR::Session& sess, Widget *canvas) +VisualTimeAxis::VisualTimeAxis(const string & name, PublicEditor& ed, ARDOUR::Session* sess, Canvas& canvas) : AxisView(sess), TimeAxisView(sess,ed,(TimeAxisView*) 0, canvas), visual_button (_("v")), size_button (_("h")) { time_axis_name = name ; - name_prompter = 0 ; _color = unique_random_color() ; - _marked_for_display = true; - - name_entry.activate.connect(mem_fun(*this, &VisualTimeAxis::name_entry_changed)) ; - name_entry.signal_focus_out_event().connect(mem_fun(*this, &VisualTimeAxis::name_entry_focus_out_handler)) ; - name_entry.signal_button_press_event().connect(mem_fun(*this, &VisualTimeAxis::name_entry_button_press_handler)) ; - name_entry.signal_button_release_event().connect(mem_fun(*this, &VisualTimeAxis::name_entry_button_release_handler)) ; - name_entry.signal_key_release_event().connect(mem_fun(*this, &VisualTimeAxis::name_entry_key_release_handler)) ; - + + name_entry.signal_activate().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_changed)) ; + name_entry.signal_button_press_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_button_press_handler)) ; + name_entry.signal_button_release_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_button_release_handler)) ; + name_entry.signal_key_release_event().connect(sigc::mem_fun(*this, &VisualTimeAxis::name_entry_key_release_handler)) ; + size_button.set_name("TrackSizeButton") ; visual_button.set_name("TrackVisualButton") ; hide_button.set_name("TrackRemoveButton") ; - hide_button.add(*(Gtk::manage(new Gtk::Image(small_x_xpm)))) ; - size_button.signal_button_release_event().connect (mem_fun (*this, &VisualTimeAxis::size_click)) ; - visual_button.signal_clicked().connect (mem_fun (*this, &VisualTimeAxis::visual_click)) ; - hide_button.signal_clicked().connect (mem_fun (*this, &VisualTimeAxis::hide_click)) ; - ARDOUR_UI::instance()->tooltips().set_tip(size_button,_("Display Height")) ; - ARDOUR_UI::instance()->tooltips().set_tip(visual_button, _("Visual options")) ; - ARDOUR_UI::instance()->tooltips().set_tip(hide_button, _("Hide this track")) ; - + hide_button.add(*(Gtk::manage(new Gtk::Image(get_xpm("small_x.xpm"))))); + size_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VisualTimeAxis::size_click)) ; + visual_button.signal_clicked().connect (sigc::mem_fun (*this, &VisualTimeAxis::visual_click)) ; + hide_button.signal_clicked().connect (sigc::mem_fun (*this, &VisualTimeAxis::hide_click)) ; + ARDOUR_UI::instance()->set_tip(size_button,_("Display Height")) ; + ARDOUR_UI::instance()->set_tip(visual_button, _("Visual options")) ; + ARDOUR_UI::instance()->set_tip(hide_button, _("Hide this track")) ; + controls_table.attach (hide_button, 0, 1, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); controls_table.attach (visual_button, 1, 2, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); controls_table.attach (size_button, 2, 3, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND); @@ -119,8 +97,8 @@ VisualTimeAxis::VisualTimeAxis(std::string name, PublicEditor& ed, ARDOUR::Sessi size_button.unset_flags(Gtk::CAN_FOCUS) ; hide_button.unset_flags(Gtk::CAN_FOCUS) ; visual_button.unset_flags(Gtk::CAN_FOCUS) ; - - set_height(Normal) ; + + set_height (hNormal) ; } /** @@ -129,11 +107,6 @@ VisualTimeAxis::VisualTimeAxis(std::string name, PublicEditor& ed, ARDOUR::Sessi */ VisualTimeAxis::~VisualTimeAxis() { - if(name_prompter) - { - delete name_prompter ; - name_prompter = 0 ; - } } @@ -141,16 +114,16 @@ VisualTimeAxis::~VisualTimeAxis() // Name/Id Accessors/Mutators void -VisualTimeAxis::set_time_axis_name(std::string name, void* src) +VisualTimeAxis::set_time_axis_name(const string & name, void* src) { std::string old_name = time_axis_name ; - + if(name != time_axis_name) { time_axis_name = name ; label_view() ; editor.route_name_changed(this) ; - + NameChanged(time_axis_name, old_name, src) ; /* EMIT_SIGNAL */ } } @@ -168,39 +141,25 @@ VisualTimeAxis::name() const /** * Sets the height of this TrackView to one of the defined TrackHeghts * - * @param h the TrackHeight value to set + * @param h */ void -VisualTimeAxis::set_height(TrackHeight h) +VisualTimeAxis::set_height(uint32_t h) { - TimeAxisView::set_height(h) ; - - switch (height) - { - case Largest: - case Large: - case Larger: - case Normal: - { - name_label.hide() ; - name_entry.show() ; - other_button_hbox.show_all() ; - break; - } - case Smaller: - { - name_label.hide() ; - name_entry.show() ; - other_button_hbox.hide_all() ; - break; - } - case Small: - { - name_label.show() ; - name_entry.hide() ; - other_button_hbox.hide_all() ; - } - break; + TimeAxisView::set_height(h); + + if (h >= hNormal) { + hide_name_label (); + show_name_entry (); + other_button_hbox.show_all() ; + } else if (h >= hSmaller) { + hide_name_label (); + show_name_entry (); + other_button_hbox.hide_all() ; + } else if (h >= hSmall) { + hide_name_entry (); + show_name_label (); + other_button_hbox.hide_all() ; } } @@ -222,7 +181,12 @@ VisualTimeAxis::visual_click() void VisualTimeAxis::hide_click() { - editor.unselect_strip_in_display (*this); + // LAME fix for hide_button display refresh + hide_button.set_sensitive(false); + + editor.hide_track_in_display (*this); + + hide_button.set_sensitive(true); } @@ -247,16 +211,18 @@ bool VisualTimeAxis::choose_time_axis_color() { bool picked ; - GdkColor color ; + Gdk::Color color ; gdouble current[4] ; - + Gdk::Color current_color ; + current[0] = _color.get_red() / 65535.0 ; current[1] = _color.get_green() / 65535.0 ; current[2] = _color.get_blue() / 65535.0 ; current[3] = 1.0 ; - - color = Gtkmm2ext::UI::instance()->get_color(_("ardour: color selection"),picked, current) ; - + + current_color.set_rgb_p (current[0],current[1],current[2]); + color = Gtkmm2ext::UI::instance()->get_color(_("Color Selection"),picked, ¤t_color) ; + if (picked) { set_time_axis_color(color) ; @@ -270,13 +236,13 @@ VisualTimeAxis::choose_time_axis_color() * @param c the new TimeAxis color */ void -VisualTimeAxis::set_time_axis_color(Gdk_Color c) +VisualTimeAxis::set_time_axis_color(Gdk::Color c) { _color = c ; } void -VisualTimeAxis::set_selected_regionviews (AudioRegionSelection& regions) +VisualTimeAxis::set_selected_regionviews (RegionSelection& regions) { // Not handled by purely visual TimeAxis } @@ -294,25 +260,19 @@ VisualTimeAxis::remove_this_time_axis(void* src) { vector choices; - std::string prompt = compose (_("Do you really want to remove track \"%1\" ?\n(cannot be undone)"), time_axis_name); + std::string prompt = string_compose (_("Do you really want to remove track \"%1\" ?\n\nYou may also lose the playlist used by this track.\n\n(This action cannot be undone, and the session file will be overwritten)"), time_axis_name); - choices.push_back (_("Yes, remove it.")); choices.push_back (_("No, do nothing.")); + choices.push_back (_("Yes, remove it.")); Gtkmm2ext::Choice prompter (prompt, choices); - prompter.chosen.connect (Gtk::Main::quit.slot()); - prompter.show_all (); - - Gtk::Main::run (); - - if (prompter.get_choice() == 0) - { + if (prompter.run () == 1) { /* - defer to idle loop, otherwise we'll delete this object - while we're still inside this function ... + defer to idle loop, otherwise we'll delete this object + while we're still inside this function ... */ - Gtk::Main::idle.connect(bind(mem_fun(&VisualTimeAxis::idle_remove_this_time_axis), this, src)); + Glib::signal_idle().connect(sigc::bind(sigc::ptr_fun(&VisualTimeAxis::idle_remove_this_time_axis), this, src)); } } @@ -338,7 +298,7 @@ VisualTimeAxis::idle_remove_this_time_axis(VisualTimeAxis* ta, void* src) //---------------------------------------------------------------------------------------// // Handle TimeAxis rename - + /** * Construct a new prompt to receive a new name for this TimeAxis * @@ -347,18 +307,27 @@ VisualTimeAxis::idle_remove_this_time_axis(VisualTimeAxis* ta, void* src) void VisualTimeAxis::start_time_axis_rename() { - if(name_prompter) - { - delete name_prompter ; - name_prompter = 0 ; + ArdourPrompter name_prompter; + + name_prompter.set_prompt (_("new name: ")) ; + name_prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT); + name_prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + name_prompter.show_all() ; + + switch (name_prompter.run ()) { + case Gtk::RESPONSE_ACCEPT: + string result; + name_prompter.get_result (result); + if (result.length()) { + if (editor.get_named_time_axis(result) != 0) { + ARDOUR_UI::instance()->popup_error (_("A track already exists with that name")); + return ; + } + + set_time_axis_name(result, this) ; + } } - - name_prompter = new ArdourPrompter() ; - - name_prompter->set_prompt (_("new name: ")) ; - ARDOUR_UI::instance()->allow_focus(true) ; - name_prompter->done.connect (mem_fun(*this, &VisualTimeAxis::finish_time_axis_rename)) ; - name_prompter->show_all() ; + label_view() ; } /** @@ -366,98 +335,59 @@ VisualTimeAxis::start_time_axis_rename() * * @see start_time_axis_rename() */ -void -VisualTimeAxis::finish_time_axis_rename() -{ - name_prompter->hide_all () ; - ARDOUR_UI::instance()->allow_focus (false) ; - - if (name_prompter->status == Gtkmm2ext::Prompter::cancelled) - { - return; - } - - string result ; - name_prompter->get_result (result) ; - //time_axis_name = result ; - - if (editor.get_named_time_axis(result) != 0) { - ARDOUR_UI::instance()->popup_error (_("A track already exists with that name")); - return ; - } - - set_time_axis_name(result, this) ; - - delete name_prompter ; - name_prompter = 0 ; - label_view() ; -} -/** - * Handle the (re-)displaying of the TimeAxis name label - * - */ void VisualTimeAxis::label_view() { name_label.set_text(time_axis_name) ; name_entry.set_text(time_axis_name) ; - ARDOUR_UI::instance()->tooltips().set_tip(name_entry, time_axis_name) ; + ARDOUR_UI::instance()->set_tip(name_entry, time_axis_name) ; } //---------------------------------------------------------------------------------------// -// Handle name entry signals +// Handle name entry signals void VisualTimeAxis::name_entry_changed() { - ARDOUR_UI::generic_focus_out_event (0); - string x = name_entry.get_text (); - + if (x == time_axis_name) { return; } + strip_whitespace_edges(x); + if (x.length() == 0) { name_entry.set_text (time_axis_name); return; } - strip_whitespace_edges(x); - if (!editor.get_named_time_axis(x)) { set_time_axis_name(x, this); } else { - ARDOUR_UI::instance()->popup_error (_("a track already exists with that name")); + ARDOUR_UI::instance()->popup_error (_("A track already exists with that name")); name_entry.set_text(time_axis_name); } } -gint +bool VisualTimeAxis::name_entry_button_press_handler(GdkEventButton *ev) { if (ev->button == 3) { - return stop_signal (name_entry, "button_press_event"); + return true; } - return FALSE; + return false } -gint +bool VisualTimeAxis::name_entry_button_release_handler(GdkEventButton *ev) { - return FALSE; -} - -gint -VisualTimeAxis::name_entry_focus_out_handler(GdkEventFocus* ev) -{ - name_entry_changed(); - return TRUE; + return false; } -gint +bool VisualTimeAxis::name_entry_key_release_handler(GdkEventKey* ev) { switch (ev->keyval) { @@ -465,27 +395,29 @@ VisualTimeAxis::name_entry_key_release_handler(GdkEventKey* ev) case GDK_Up: case GDK_Down: name_entry_changed (); - return TRUE; + return true; default: - return FALSE; + break; } + + return false; } //---------------------------------------------------------------------------------------// // Super class methods not handled by VisualTimeAxis - + void -VisualTimeAxis::show_timestretch (jack_nframes_t start, jack_nframes_t end) +VisualTimeAxis::show_timestretch (framepos_t start, framepos_t end) { - // Not handled by purely visual TimeAxis + // Not handled by purely visual TimeAxis } void VisualTimeAxis::hide_timestretch() { - // Not handled by purely visual TimeAxis + // Not handled by purely visual TimeAxis }