allow dragging of automation lines (Ben Loftis, backported from 2.X)
git-svn-id: svn://localhost/ardour2/branches/3.0@4715 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
9f4c7a9e9e
commit
7a5adcbe72
|
@ -1,19 +1,19 @@
|
|||
/*
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
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
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
*/
|
||||
|
||||
|
@ -22,10 +22,14 @@
|
|||
|
||||
#include <sigc++/bind.h>
|
||||
#include <gtkmm/stock.h>
|
||||
#include <gtkmm/separator.h>
|
||||
|
||||
#include "pbd/error.h"
|
||||
#include "pbd/convert.h"
|
||||
#include <gtkmm2ext/utils.h>
|
||||
#include "gtkmm2ext/utils.h"
|
||||
#include "ardour/profile.h"
|
||||
#include "ardour/template_utils.h"
|
||||
#include "ardour/session.h"
|
||||
|
||||
#include "utils.h"
|
||||
#include "add_route_dialog.h"
|
||||
|
@ -36,16 +40,17 @@ using namespace Gtkmm2ext;
|
|||
using namespace sigc;
|
||||
using namespace std;
|
||||
using namespace PBD;
|
||||
using namespace ARDOUR;
|
||||
|
||||
static const char* channel_setup_names[] = {
|
||||
N_("Mono"),
|
||||
N_("Stereo"),
|
||||
N_("3 channels"),
|
||||
N_("4 channels"),
|
||||
N_("6 channels"),
|
||||
N_("8 channels"),
|
||||
N_("Manual setup"),
|
||||
"MIDI",
|
||||
N_("3 Channels"),
|
||||
N_("4 Channels"),
|
||||
N_("6 Channels"),
|
||||
N_("8 Channels"),
|
||||
N_("Manual Setup"),
|
||||
N_("MIDI"),
|
||||
0
|
||||
};
|
||||
|
||||
|
@ -63,6 +68,7 @@ AddRouteDialog::AddRouteDialog ()
|
|||
: Dialog (_("ardour: add track/bus")),
|
||||
track_button (_("Tracks")),
|
||||
bus_button (_("Busses")),
|
||||
template_button (_("Using this template:")),
|
||||
routes_adjustment (1, 1, 128, 1, 4),
|
||||
routes_spinner (routes_adjustment)
|
||||
{
|
||||
|
@ -90,7 +96,7 @@ AddRouteDialog::AddRouteDialog ()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
set_name ("AddRouteDialog");
|
||||
set_wmclass (X_("ardour_add_track_bus"), "Ardour");
|
||||
set_position (Gtk::WIN_POS_MOUSE);
|
||||
|
@ -99,22 +105,60 @@ AddRouteDialog::AddRouteDialog ()
|
|||
name_template_entry.set_name ("AddRouteDialogNameTemplateEntry");
|
||||
track_button.set_name ("AddRouteDialogRadioButton");
|
||||
bus_button.set_name ("AddRouteDialogRadioButton");
|
||||
template_button.set_name ("AddRouteDialogRadioButton");
|
||||
routes_spinner.set_name ("AddRouteDialogSpinner");
|
||||
|
||||
RadioButton::Group g = track_button.get_group();
|
||||
bus_button.set_group (g);
|
||||
template_button.set_group (g);
|
||||
track_button.set_active (true);
|
||||
|
||||
HBox *hbrb = manage (new HBox);
|
||||
/* add */
|
||||
|
||||
hbrb->set_spacing (6);
|
||||
hbrb->pack_start (routes_spinner, true, false, 5);
|
||||
hbrb->pack_start (track_button, true, false, 5);
|
||||
hbrb->pack_start (bus_button, true, false, 5);
|
||||
HBox* hbox1 = manage (new HBox);
|
||||
hbox1->set_spacing (6);
|
||||
Label* label1 = manage (new Label (_("Add this many:")));
|
||||
hbox1->pack_start (*label1, PACK_SHRINK);
|
||||
hbox1->pack_start (routes_spinner, PACK_SHRINK);
|
||||
|
||||
aframe.set_label (_("Add"));
|
||||
aframe.set_shadow_type (SHADOW_IN);
|
||||
aframe.add (*hbrb);
|
||||
HBox* hbox2 = manage (new HBox);
|
||||
hbox2->set_spacing (6);
|
||||
hbox2->set_border_width (6);
|
||||
hbox2->pack_start (*hbox1, PACK_EXPAND_WIDGET);
|
||||
|
||||
/* templates */
|
||||
|
||||
hbox3 = new HBox;
|
||||
hbox3->set_spacing (6);
|
||||
hbox3->set_border_width (6);
|
||||
hbox3->pack_start (template_button, PACK_SHRINK);
|
||||
|
||||
hbox9 = new HBox;
|
||||
hbox9->set_spacing (6);
|
||||
hbox9->set_border_width (6);
|
||||
hbox9->pack_start (track_template_combo, PACK_EXPAND_WIDGET);
|
||||
|
||||
/* separator */
|
||||
|
||||
hbox4 = new HBox;
|
||||
hbox4->set_spacing (6);
|
||||
Label* label2 = manage (new Label (_("OR")));
|
||||
hbox4->pack_start (*(manage (new HSeparator)), PACK_EXPAND_WIDGET);
|
||||
hbox4->pack_start (*label2, false, false);
|
||||
hbox4->pack_start (*(manage (new HSeparator)), PACK_EXPAND_WIDGET);
|
||||
|
||||
/* we need more control over the visibility of these boxes */
|
||||
/*
|
||||
hbox3->set_no_show_all (true);
|
||||
hbox9->set_no_show_all (true);
|
||||
hbox4->set_no_show_all (true);
|
||||
*/
|
||||
/* track/bus choice & modes */
|
||||
|
||||
HBox* hbox5 = manage (new HBox);
|
||||
hbox5->set_spacing (6);
|
||||
hbox5->pack_start (track_button, PACK_EXPAND_PADDING);
|
||||
hbox5->pack_start (bus_button, PACK_EXPAND_PADDING);
|
||||
|
||||
set_popdown_strings (channel_combo, channel_combo_strings);
|
||||
set_popdown_strings (track_mode_combo, track_mode_strings);
|
||||
|
@ -123,53 +167,46 @@ AddRouteDialog::AddRouteDialog ()
|
|||
|
||||
track_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen));
|
||||
bus_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen));
|
||||
template_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen));
|
||||
|
||||
track_mode_combo.set_active_text (track_mode_strings.front());
|
||||
track_mode_combo.set_name (X_("ChannelCountSelector"));
|
||||
|
||||
#if NOT_USEFUL_YET
|
||||
HBox *hbnt = manage (new HBox);
|
||||
VBox* vbox1 = manage (new VBox);
|
||||
vbox1->set_spacing (6);
|
||||
vbox1->set_border_width (6);
|
||||
|
||||
hbnt->pack_start (*(manage (new Label (_("Name (template)")))), false, false);
|
||||
hbnt->pack_start (name_template_entry, true, true);
|
||||
#endif
|
||||
VBox *dvbox = manage (new VBox);
|
||||
HBox *dhbox = manage (new HBox);
|
||||
Frame* frame1 = manage (new Frame (_("Channel Configuration")));
|
||||
frame1->add (channel_combo);
|
||||
Frame* frame2 = manage (new Frame (_("Track Mode")));
|
||||
frame2->add (track_mode_combo);
|
||||
|
||||
ccframe.set_label (_("Channel configuration"));
|
||||
ccframe.set_shadow_type (SHADOW_IN);
|
||||
vbox1->pack_start (*hbox5, PACK_SHRINK);
|
||||
vbox1->pack_start (*frame1, PACK_SHRINK);
|
||||
|
||||
dvbox->pack_start (channel_combo, true, false, 5);
|
||||
if (!ARDOUR::Profile->get_sae()) {
|
||||
dvbox->pack_start (track_mode_combo, true, false, 5);
|
||||
vbox1->pack_start (*frame2, PACK_SHRINK);
|
||||
}
|
||||
dhbox->pack_start (*dvbox, true, false, 5);
|
||||
|
||||
ccframe.add (*dhbox);
|
||||
get_vbox()->set_spacing (6);
|
||||
get_vbox()->set_border_width (6);
|
||||
|
||||
get_vbox()->pack_start (aframe, true, false, 10);
|
||||
get_vbox()->pack_start (ccframe, true, false);
|
||||
#if NOT_USEFUL_YET
|
||||
get_vbox()->pack_start (*hbnt, false, false);
|
||||
#endif
|
||||
get_vbox()->pack_start (*hbox2, PACK_SHRINK);
|
||||
get_vbox()->pack_start (*hbox3, PACK_SHRINK);
|
||||
get_vbox()->pack_start (*hbox9, PACK_SHRINK);
|
||||
get_vbox()->pack_start (*hbox4, PACK_SHRINK);
|
||||
get_vbox()->pack_start (*vbox1, PACK_SHRINK);
|
||||
|
||||
get_vbox()->show_all ();
|
||||
|
||||
/* track template info will be managed whenever
|
||||
this dialog is shown, via ::on_show()
|
||||
*/
|
||||
|
||||
add_button (Stock::CANCEL, RESPONSE_CANCEL);
|
||||
add_button (Stock::ADD, RESPONSE_ACCEPT);
|
||||
|
||||
name_template_entry.show();
|
||||
track_button.show();
|
||||
bus_button.show();
|
||||
routes_spinner.show();
|
||||
channel_combo.show();
|
||||
track_mode_combo.show();
|
||||
aframe.show();
|
||||
ccframe.show();
|
||||
|
||||
hbrb->show();
|
||||
dvbox->show();
|
||||
dhbox->show();
|
||||
|
||||
//get_vbox()->show(); why isnt this needed?
|
||||
track_type_chosen ();
|
||||
}
|
||||
|
||||
AddRouteDialog::~AddRouteDialog ()
|
||||
|
@ -179,10 +216,18 @@ AddRouteDialog::~AddRouteDialog ()
|
|||
void
|
||||
AddRouteDialog::track_type_chosen ()
|
||||
{
|
||||
if (track_button.get_active()) {
|
||||
track_mode_combo.set_sensitive (true);
|
||||
} else {
|
||||
if (template_button.get_active()) {
|
||||
track_mode_combo.set_sensitive (false);
|
||||
channel_combo.set_sensitive (false);
|
||||
track_template_combo.set_sensitive (true);
|
||||
} else {
|
||||
track_template_combo.set_sensitive (false);
|
||||
channel_combo.set_sensitive (true);
|
||||
if (track_button.get_active()) {
|
||||
track_mode_combo.set_sensitive (true);
|
||||
} else {
|
||||
track_mode_combo.set_sensitive (false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -243,7 +288,7 @@ AddRouteDialog::channels ()
|
|||
string str = channel_combo.get_active_text();
|
||||
int chns;
|
||||
|
||||
if (str == _("Mono") || str == _("MIDI")) {
|
||||
if (str == _("Mono")) {
|
||||
return 1;
|
||||
} else if (str == _("Stereo")) {
|
||||
return 2;
|
||||
|
@ -254,3 +299,59 @@ AddRouteDialog::channels ()
|
|||
return 0;
|
||||
}
|
||||
|
||||
string
|
||||
AddRouteDialog::track_template ()
|
||||
{
|
||||
if (!template_button.get_active()) {
|
||||
return string ();
|
||||
}
|
||||
|
||||
string str = track_template_combo.get_active_text();
|
||||
|
||||
for (vector<RouteTemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
|
||||
if ((*x).name == str) {
|
||||
return (*x).path;
|
||||
}
|
||||
}
|
||||
|
||||
return string();
|
||||
}
|
||||
|
||||
void
|
||||
AddRouteDialog::on_show ()
|
||||
{
|
||||
refill_track_templates ();
|
||||
Dialog::on_show ();
|
||||
}
|
||||
|
||||
void
|
||||
AddRouteDialog::refill_track_templates ()
|
||||
{
|
||||
route_templates.clear ();
|
||||
ARDOUR::find_route_templates (route_templates);
|
||||
|
||||
if (!route_templates.empty()) {
|
||||
vector<string> v;
|
||||
for (vector<RouteTemplateInfo>::iterator x = route_templates.begin(); x != route_templates.end(); ++x) {
|
||||
v.push_back ((*x).name);
|
||||
}
|
||||
set_popdown_strings (track_template_combo, v);
|
||||
track_template_combo.set_active_text (v.front());
|
||||
}
|
||||
|
||||
reset_template_option_visibility ();
|
||||
}
|
||||
|
||||
void
|
||||
AddRouteDialog::reset_template_option_visibility ()
|
||||
{
|
||||
if (route_templates.empty()) {
|
||||
hbox3->hide ();
|
||||
hbox9->hide ();
|
||||
hbox4->hide ();
|
||||
} else {
|
||||
hbox3->show_all ();
|
||||
hbox9->show_all ();
|
||||
hbox4->show_all ();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,7 +32,8 @@
|
|||
#include <gtkmm/comboboxtext.h>
|
||||
|
||||
#include "ardour/types.h"
|
||||
#include "ardour/data_type.h"
|
||||
#include "ardour/template_utils.h"
|
||||
#include "ardour/session.h"
|
||||
|
||||
class AddRouteDialog : public Gtk::Dialog
|
||||
{
|
||||
|
@ -41,24 +42,38 @@ class AddRouteDialog : public Gtk::Dialog
|
|||
~AddRouteDialog ();
|
||||
|
||||
bool track ();
|
||||
ARDOUR::DataType type();
|
||||
std::string name_template ();
|
||||
int channels ();
|
||||
int count ();
|
||||
|
||||
std::string name_template ();
|
||||
std::string track_template ();
|
||||
|
||||
ARDOUR::DataType type();
|
||||
ARDOUR::TrackMode mode();
|
||||
|
||||
private:
|
||||
Gtk::Entry name_template_entry;
|
||||
Gtk::RadioButton track_button;
|
||||
Gtk::RadioButton bus_button;
|
||||
Gtk::RadioButton template_button;
|
||||
Gtk::Adjustment routes_adjustment;
|
||||
Gtk::SpinButton routes_spinner;
|
||||
Gtk::ComboBoxText channel_combo;
|
||||
Gtk::ComboBoxText track_mode_combo;
|
||||
Gtk::Frame aframe;
|
||||
Gtk::Frame ccframe;
|
||||
Gtk::ComboBoxText track_template_combo;
|
||||
|
||||
std::vector<ARDOUR::RouteTemplateInfo> route_templates;
|
||||
|
||||
void track_type_chosen ();
|
||||
void refill_track_templates ();
|
||||
|
||||
Gtk::HBox* hbox3;
|
||||
Gtk::HBox* hbox9;
|
||||
Gtk::HBox* hbox4;
|
||||
|
||||
void reset_template_option_visibility ();
|
||||
|
||||
void on_show ();
|
||||
};
|
||||
|
||||
#endif /* __gtk_ardour_add_route_dialog_h__ */
|
||||
|
|
|
@ -2932,6 +2932,13 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
|
|||
return;
|
||||
}
|
||||
|
||||
string template_path = add_route_dialog->track_template();
|
||||
|
||||
if (!template_path.empty()) {
|
||||
session->new_route_from_template (count, template_path);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t input_chan = add_route_dialog->channels ();
|
||||
uint32_t output_chan;
|
||||
string name_template = add_route_dialog->name_template ();
|
||||
|
|
|
@ -780,15 +780,31 @@ AutomationLine::line_drag (uint32_t i1, uint32_t i2, float fraction, bool with_p
|
|||
line_drag_cp1 = i1;
|
||||
line_drag_cp2 = i2;
|
||||
|
||||
//check if one of the control points on the line is in a selected range
|
||||
bool range_found = false;
|
||||
ControlPoint *cp;
|
||||
|
||||
for (uint32_t i = i1 ; i <= i2; i++) {
|
||||
cp = nth (i);
|
||||
modify_view_point (*cp,
|
||||
trackview.editor().unit_to_frame (_time_converter.to(cp->get_x())),
|
||||
((_height - cp->get_y()) /_height) + ydelta, with_push);
|
||||
if ( cp->selected ) {
|
||||
range_found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (range_found) {
|
||||
for (vector<ControlPoint*>::iterator i = control_points.begin(); i != control_points.end(); ++i) {
|
||||
if ( (*i)->selected ) {
|
||||
modify_view_point (*(*i), trackview.editor.unit_to_frame ((*i)->get_x()), ((_height - (*i)->get_y()) /_height) + ydelta, with_push);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ControlPoint *cp;
|
||||
for (uint32_t i = i1 ; i <= i2; i++) {
|
||||
cp = nth (i);
|
||||
modify_view_point (*cp, trackview.editor.unit_to_frame (cp->get_x()), ((_height - cp->get_y()) /_height) + ydelta, with_push);
|
||||
}
|
||||
}
|
||||
|
||||
if (line_points.size() > 1) {
|
||||
line->property_points() = line_points;
|
||||
}
|
||||
|
|
|
@ -40,6 +40,11 @@ curvetest (string filename)
|
|||
double minx = DBL_MAX;
|
||||
double maxx = DBL_MIN;
|
||||
|
||||
// needed to initialize ID objects/counter used
|
||||
// by Curve et al.
|
||||
|
||||
PBD::ID::init ();
|
||||
|
||||
while (in) {
|
||||
double x, y;
|
||||
|
||||
|
|
|
@ -1144,6 +1144,7 @@ MixerStrip::build_route_ops_menu ()
|
|||
|
||||
MenuList& items = route_ops_menu->items();
|
||||
|
||||
items.push_back (MenuElem (_("Save As Template"), mem_fun(*this, &RouteUI::save_as_template)));
|
||||
items.push_back (MenuElem (_("Rename"), mem_fun(*this, &RouteUI::route_rename)));
|
||||
items.push_back (SeparatorElem());
|
||||
items.push_back (CheckMenuElem (_("Active"), mem_fun (*this, &RouteUI::toggle_route_active)));
|
||||
|
|
|
@ -47,6 +47,9 @@
|
|||
#include "ardour/audio_diskstream.h"
|
||||
#include "ardour/midi_track.h"
|
||||
#include "ardour/midi_diskstream.h"
|
||||
#include "ardour/template_utils.h"
|
||||
#include "ardour/filename_extensions.h"
|
||||
#include "ardour/directory_names.h"
|
||||
#include "ardour/profile.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
@ -1195,4 +1198,37 @@ RouteUI::adjust_latency ()
|
|||
LatencyDialog dialog (_route->name() + _("latency"), *(_route.get()), _session.frame_rate(), _session.engine().frames_per_cycle());
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
RouteUI::save_as_template ()
|
||||
{
|
||||
sys::path path;
|
||||
Glib::ustring safe_name;
|
||||
string name;
|
||||
|
||||
path = ARDOUR::user_route_template_directory ();
|
||||
|
||||
if (g_mkdir_with_parents (path.to_string().c_str(), 0755)) {
|
||||
error << string_compose (_("Cannot create route template directory %1"), path.to_string()) << endmsg;
|
||||
return;
|
||||
}
|
||||
|
||||
Prompter p (true); // modal
|
||||
|
||||
p.set_prompt (_("Template name:"));
|
||||
switch (p.run()) {
|
||||
case RESPONSE_ACCEPT:
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
p.hide ();
|
||||
p.get_result (name, true);
|
||||
|
||||
safe_name = legalize_for_path (name);
|
||||
safe_name += temp_suffix;
|
||||
|
||||
path /= safe_name;
|
||||
|
||||
_route->save_as_template (path.to_string(), name);
|
||||
}
|
||||
|
|
|
@ -168,6 +168,7 @@ class RouteUI : public virtual AxisView
|
|||
void reversibly_apply_track_boolean (string name, void (ARDOUR::Track::*func)(bool, void*), bool, void *);
|
||||
|
||||
void adjust_latency ();
|
||||
void save_as_template ();
|
||||
|
||||
protected:
|
||||
std::vector<sigc::connection> connections;
|
||||
|
|
Loading…
Reference in New Issue