summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-05-14 16:16:54 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-05-14 16:16:54 +0000
commit6cf8026ac37cddb9cf84dbdecba9b7f576641fd8 (patch)
tree5a6fa3a9c23837478800192a950f568bc41ef167 /gtk2_ardour
parentb1b02296d48cd9ed9a529c6b05e0297774131cd3 (diff)
add new "lock position" feature for regions
git-svn-id: svn://localhost/ardour2/trunk@1842 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/audio_region_view.cc15
-rw-r--r--gtk2_ardour/editor.cc5
-rw-r--r--gtk2_ardour/editor.h1
-rw-r--r--gtk2_ardour/editor_mouse.cc7
-rw-r--r--gtk2_ardour/editor_ops.cc32
-rw-r--r--gtk2_ardour/region_view.cc25
-rw-r--r--gtk2_ardour/region_view.h2
7 files changed, 41 insertions, 46 deletions
diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc
index 170a421ad5..2e1c13b487 100644
--- a/gtk2_ardour/audio_region_view.cc
+++ b/gtk2_ardour/audio_region_view.cc
@@ -196,8 +196,6 @@ AudioRegionView::init (Gdk::Color& basic_color, bool wfd)
fade_in_active_changed ();
fade_out_active_changed ();
- _region->StateChanged.connect (mem_fun(*this, &AudioRegionView::region_changed));
-
fade_in_shape->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_in_event), fade_in_shape, this));
fade_in_handle->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_in_handle_event), fade_in_handle, this));
fade_out_shape->signal_event().connect (bind (mem_fun (PublicEditor::instance(), &PublicEditor::canvas_fade_out_event), fade_out_shape, this));
@@ -325,19 +323,8 @@ AudioRegionView::region_scale_amplitude_changed ()
void
AudioRegionView::region_renamed ()
{
- // FIXME: ugly duplication with RegionView...
+ Glib::ustring str = RegionView::make_name ();
- string str;
-
- if (_region->locked()) {
- str += '>';
- str += _region->name();
- str += '<';
- } else {
- str = _region->name();
- }
-
- // ... because of this
if (audio_region()->speed_mismatch (trackview.session().frame_rate())) {
str = string ("*") + str;
}
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index c46a050ea7..6ed5561804 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -1489,13 +1489,16 @@ Editor::add_region_context_items (Menu_Helpers::MenuList& edit_items)
items.push_back (MenuElem (_("Lock"), bind (mem_fun (*this, &Editor::set_region_lock), true)));
items.push_back (MenuElem (_("Unlock"), bind (mem_fun (*this, &Editor::set_region_lock), false)));
+ items.push_back (MenuElem (_("Lock Position"), bind (mem_fun (*this, &Editor::set_region_position_lock), true)));
+ items.push_back (MenuElem (_("Unlock Position"), bind (mem_fun (*this, &Editor::set_region_position_lock), false)));
items.push_back (MenuElem (_("Mute"), bind (mem_fun (*this, &Editor::set_region_mute), true)));
items.push_back (MenuElem (_("Unmute"), bind (mem_fun (*this, &Editor::set_region_mute), false)));
items.push_back (MenuElem (_("Opaque"), bind (mem_fun (*this, &Editor::set_region_opaque), true)));
items.push_back (MenuElem (_("Transparent"), bind (mem_fun (*this, &Editor::set_region_opaque), false)));
/* We allow "Original position" if at least one region is not at its
- natural position */
+ natural position
+ */
RegionSelection::iterator i = selection->regions.begin();
while (i != selection->regions.end() && (*i)->region()->at_natural_position() == true) {
++i;
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 66d2aa4335..51403c2992 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -868,6 +868,7 @@ class Editor : public PublicEditor
void reset_point_selection ();
void set_region_mute (bool);
void set_region_lock (bool);
+ void set_region_position_lock (bool);
void set_region_opaque (bool);
void raise_region ();
void raise_region_to_top ();
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index e2be04a570..4f06562fb0 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -3387,10 +3387,9 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
rv = (*i);
- if (rv->region()->locked()) {
+ if (!rv->region()->can_move()) {
continue;
}
-
if (regionview_x_movement) {
double ownspeed = 1.0;
@@ -3445,10 +3444,6 @@ Editor::region_drag_finished_callback (ArdourCanvas::Item* item, GdkEvent* event
selection->add (latest_regionview);
}
- /* if the original region was locked, we don't care for the new one */
-
- newregion->set_locked (false);
-
} else {
/* just change the model */
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 46443c20e9..64884c358b 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -3454,12 +3454,18 @@ void
Editor::set_region_lock (bool yn)
{
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
- if (arv) {
- if (arv->audio_region()->locked() != yn) {
- arv->audio_region()->set_locked (yn);
- }
- }
+ (*i)->region()->set_locked (yn);
+ }
+}
+
+/** Set the position-locked state of all selected regions to a particular value.
+ * @param yn true to make locked, false to make unlocked.
+ */
+void
+Editor::set_region_position_lock (bool yn)
+{
+ for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ (*i)->region()->set_position_locked (yn);
}
}
@@ -3467,12 +3473,7 @@ void
Editor::set_region_mute (bool yn)
{
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
- if (arv) {
- if (arv->audio_region()->muted() != yn) {
- arv->audio_region()->set_muted (yn);
- }
- }
+ (*i)->region()->set_muted (yn);
}
}
@@ -3480,12 +3481,7 @@ void
Editor::set_region_opaque (bool yn)
{
for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
- AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
- if (arv) {
- if (arv->audio_region()->opaque() != yn) {
- arv->audio_region()->set_opaque (yn);
- }
- }
+ (*i)->region()->set_opaque (yn);
}
}
diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc
index 24e476704a..859e2edfb4 100644
--- a/gtk2_ardour/region_view.cc
+++ b/gtk2_ardour/region_view.cc
@@ -405,26 +405,37 @@ RegionView::hide_region_editor()
}
}
-void
-RegionView::region_renamed ()
+Glib::ustring
+RegionView::make_name () const
{
- string str;
+ Glib::ustring str;
+
+ // XXX nice to have some good icons for this
if (_region->locked()) {
str += '>';
str += _region->name();
str += '<';
+ } else if (_region->position_locked()) {
+ str += '{';
+ str += _region->name();
+ str += '}';
} else {
str = _region->name();
}
- // speed mismatch handled in audio_region_view.cc
- // FIXME: come up with more elegant solution for this
-
if (_region->muted()) {
str = string ("!") + str;
}
+ return str;
+}
+
+void
+RegionView::region_renamed ()
+{
+ Glib::ustring str = make_name ();
+
set_item_name (str, this);
set_name_text (str);
reset_width_dependent_items (_pixel_width);
@@ -483,7 +494,7 @@ RegionView::region_sync_changed ()
void
RegionView::move (double x_delta, double y_delta)
{
- if (_region->locked() || (x_delta == 0 && y_delta == 0)) {
+ if (!_region->can_move() || (x_delta == 0 && y_delta == 0)) {
return;
}
diff --git a/gtk2_ardour/region_view.h b/gtk2_ardour/region_view.h
index 636abc031c..0f4d57ad04 100644
--- a/gtk2_ardour/region_view.h
+++ b/gtk2_ardour/region_view.h
@@ -111,6 +111,8 @@ class RegionView : public TimeAxisViewItem
virtual void region_renamed ();
void region_sync_changed ();
+ Glib::ustring make_name () const;
+
static gint _lock_toggle (ArdourCanvas::Item*, GdkEvent*, void*);
void lock_toggle ();