Source List: Source regions can be tagged, too.
This commit is contained in:
parent
d67d64ea03
commit
ff440276c1
@ -78,6 +78,7 @@ struct ColumnInfo {
|
||||
EditorSources::EditorSources (Editor* e)
|
||||
: EditorComponent (e)
|
||||
, old_focus (0)
|
||||
, tags_editable (0)
|
||||
, _menu (0)
|
||||
, _selection (0)
|
||||
, _no_redisplay (false)
|
||||
@ -109,6 +110,10 @@ EditorSources::EditorSources (Editor* e)
|
||||
col_name->set_sizing (TREE_VIEW_COLUMN_FIXED);
|
||||
col_name->set_sort_column(0);
|
||||
|
||||
TreeViewColumn* col_tags = manage (new TreeViewColumn ("", _columns.tags));
|
||||
col_tags->set_fixed_width (bbt_width*2);
|
||||
col_tags->set_sizing (TREE_VIEW_COLUMN_FIXED);
|
||||
|
||||
TreeViewColumn* col_take_id = manage (new TreeViewColumn ("", _columns.take_id));
|
||||
col_take_id->set_fixed_width (date_width);
|
||||
col_take_id->set_sizing (TREE_VIEW_COLUMN_FIXED);
|
||||
@ -125,6 +130,7 @@ EditorSources::EditorSources (Editor* e)
|
||||
col_path->set_sort_column(3);
|
||||
|
||||
_display.append_column (*col_name);
|
||||
_display.append_column (*col_tags);
|
||||
_display.append_column (*col_take_id);
|
||||
_display.append_column (*col_nat_pos);
|
||||
_display.append_column (*col_path);
|
||||
@ -134,9 +140,10 @@ EditorSources::EditorSources (Editor* e)
|
||||
|
||||
ColumnInfo ci[] = {
|
||||
{ 0, _("Source"), _("Source name, with number of channels in []'s") },
|
||||
{ 1, _("Take ID"), _("Take ID") },
|
||||
{ 2, _("Orig Pos"), _("Original Position of the file on timeline, when it was recorded") },
|
||||
{ 3, _("Path"), _("Path (folder) of the file locationlosition of end of region") },
|
||||
{ 1, _("Tags"), _("Tags") },
|
||||
{ 2, _("Take ID"), _("Take ID") },
|
||||
{ 3, _("Orig Pos"), _("Original Position of the file on timeline, when it was recorded") },
|
||||
{ 4, _("Path"), _("Path (folder) of the file locationlosition of end of region") },
|
||||
{ -1, 0, 0 }
|
||||
};
|
||||
|
||||
@ -160,17 +167,23 @@ EditorSources::EditorSources (Editor* e)
|
||||
tv_col->add_attribute(renderer->property_text(), _columns.name);
|
||||
tv_col->add_attribute(renderer->property_foreground_gdk(), _columns.color_);
|
||||
|
||||
//Tags cell: make editable
|
||||
CellRendererText* region_tags_cell = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (1));
|
||||
region_tags_cell->property_editable() = true;
|
||||
region_tags_cell->signal_edited().connect (sigc::mem_fun (*this, &EditorSources::tag_edit));
|
||||
region_tags_cell->signal_editing_started().connect (sigc::mem_fun (*this, &EditorSources::tag_editing_started));
|
||||
|
||||
//right-align the Natural Pos column
|
||||
TreeViewColumn* nat_col = _display.get_column(2);
|
||||
TreeViewColumn* nat_col = _display.get_column(3);
|
||||
nat_col->set_alignment (ALIGN_RIGHT);
|
||||
renderer = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (2));
|
||||
renderer = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (3));
|
||||
if (renderer) {
|
||||
renderer->property_xalign() = ( 1.0 );
|
||||
}
|
||||
|
||||
//the PATH field should expand when the pane is opened wider
|
||||
tv_col = _display.get_column(3);
|
||||
renderer = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (3));
|
||||
tv_col = _display.get_column(4);
|
||||
renderer = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (4));
|
||||
tv_col->add_attribute(renderer->property_text(), _columns.path);
|
||||
tv_col->set_expand (true);
|
||||
|
||||
@ -219,6 +232,8 @@ EditorSources::focus_in (GdkEventFocus*)
|
||||
old_focus = 0;
|
||||
}
|
||||
|
||||
tags_editable = 0;
|
||||
|
||||
/* try to do nothing on focus in (doesn't work, hence selection_count nonsense) */
|
||||
return true;
|
||||
}
|
||||
@ -231,12 +246,18 @@ EditorSources::focus_out (GdkEventFocus*)
|
||||
old_focus = 0;
|
||||
}
|
||||
|
||||
tags_editable = 0;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
EditorSources::enter_notify (GdkEventCrossing*)
|
||||
{
|
||||
if (tags_editable) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/* arm counter so that ::selection_filter() will deny selecting anything for the
|
||||
next two attempts to change selection status.
|
||||
*/
|
||||
@ -322,6 +343,9 @@ EditorSources::populate_row (TreeModel::Row row, boost::shared_ptr<ARDOUR::Regio
|
||||
}
|
||||
row[_columns.name] = str;
|
||||
|
||||
//TAGS
|
||||
row[_columns.tags] = region->tags();
|
||||
|
||||
row[_columns.region] = region;
|
||||
row[_columns.take_id] = source->take_id();
|
||||
|
||||
@ -643,11 +667,34 @@ EditorSources::remove_selected_sources ()
|
||||
bool
|
||||
EditorSources::key_press (GdkEventKey* ev)
|
||||
{
|
||||
TreeViewColumn *col;
|
||||
|
||||
switch (ev->keyval) {
|
||||
case GDK_Delete:
|
||||
case GDK_Tab:
|
||||
case GDK_ISO_Left_Tab:
|
||||
|
||||
if (tags_editable) {
|
||||
tags_editable->editing_done ();
|
||||
tags_editable = 0;
|
||||
}
|
||||
|
||||
col = _display.get_column (1); // select&focus on tags column
|
||||
|
||||
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
|
||||
treeview_select_previous (_display, _model, col);
|
||||
} else {
|
||||
treeview_select_next (_display, _model, col);
|
||||
}
|
||||
|
||||
return true;
|
||||
break;
|
||||
|
||||
case GDK_BackSpace:
|
||||
remove_selected_sources();
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -677,6 +724,52 @@ EditorSources::button_press (GdkEventButton *ev)
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
EditorSources::tag_editing_started (CellEditable* ce, const Glib::ustring& path)
|
||||
{
|
||||
tags_editable = ce;
|
||||
|
||||
/* give it a special name */
|
||||
|
||||
Gtk::Entry *e = dynamic_cast<Gtk::Entry*> (ce);
|
||||
|
||||
if (e) {
|
||||
e->set_name (X_("SourceTagEditorEntry"));
|
||||
|
||||
TreeIter iter;
|
||||
if ((iter = _model->get_iter (path))) {
|
||||
boost::shared_ptr<Region> region = (*iter)[_columns.region];
|
||||
|
||||
if(region) {
|
||||
e->set_text(region->tags());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
EditorSources::tag_edit (const std::string& path, const std::string& new_text)
|
||||
{
|
||||
tags_editable = 0;
|
||||
|
||||
boost::shared_ptr<Region> region;
|
||||
TreeIter row_iter;
|
||||
|
||||
if ((row_iter = _model->get_iter (path))) {
|
||||
region = (*row_iter)[_columns.region];
|
||||
(*row_iter)[_columns.tags] = new_text;
|
||||
}
|
||||
|
||||
if (region) {
|
||||
region->set_tags (new_text);
|
||||
|
||||
_session->set_dirty(); //whole-file regions aren't in a playlist to catch property changes, so we need to explicitly set the session dirty
|
||||
|
||||
populate_row ((*row_iter), region);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
EditorSources::selection_mapover (sigc::slot<void,boost::shared_ptr<Region> > sl)
|
||||
{
|
||||
|
@ -69,6 +69,7 @@ private:
|
||||
struct Columns : public Gtk::TreeModel::ColumnRecord {
|
||||
Columns () {
|
||||
add (name);
|
||||
add (tags);
|
||||
add (take_id);
|
||||
add (natural_pos);
|
||||
add (path);
|
||||
@ -78,6 +79,7 @@ private:
|
||||
}
|
||||
|
||||
Gtk::TreeModelColumn<std::string> name;
|
||||
Gtk::TreeModelColumn<std::string> tags;
|
||||
Gtk::TreeModelColumn<boost::shared_ptr<ARDOUR::Region> > region;
|
||||
Gtk::TreeModelColumn<Gdk::Color> color_;
|
||||
Gtk::TreeModelColumn<std::string> natural_pos;
|
||||
@ -102,6 +104,10 @@ private:
|
||||
|
||||
Gtk::Widget* old_focus;
|
||||
|
||||
Gtk::CellEditable* tags_editable;
|
||||
void tag_editing_started (Gtk::CellEditable*, const Glib::ustring&);
|
||||
void tag_edit (const std::string&, const std::string&);
|
||||
|
||||
bool key_press (GdkEventKey *);
|
||||
bool button_press (GdkEventButton *);
|
||||
|
||||
@ -152,7 +158,6 @@ private:
|
||||
Selection* _selection;
|
||||
|
||||
bool _no_redisplay;
|
||||
|
||||
};
|
||||
|
||||
#endif /* __gtk_ardour_editor_regions_h__ */
|
||||
|
Loading…
Reference in New Issue
Block a user