summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor.cc')
-rw-r--r--gtk2_ardour/editor.cc258
1 files changed, 106 insertions, 152 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index 35038740cc..5d5f3e44c0 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -523,27 +523,27 @@ Editor::Editor (AudioEngine& eng)
bottom_hbox.set_spacing (3);
route_display_model = ListStore::create(route_display_columns);
- route_list.set_model (route_display_model);
- route_list.append_column (_("Tracks"), route_display_columns.text);
- route_list.set_name ("TrackListDisplay");
- route_list.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE);
- route_list.set_reorderable (true);
+ route_list_display.set_model (route_display_model);
+ route_list_display.append_column (_("Tracks"), route_display_columns.text);
+ route_list_display.set_name ("TrackListDisplay");
+ route_list_display.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE);
+ route_list_display.set_reorderable (true);
- route_list.set_size_request (75,-1);
- route_list.set_headers_visible (true);
- route_list.set_headers_clickable (true);
+ route_list_display.set_size_request (75,-1);
+ route_list_display.set_headers_visible (true);
+ route_list_display.set_headers_clickable (true);
// GTK2FIX
- // route_list.signal_rows_reordered().connect (mem_fun (*this, &Editor::queue_route_list_reordered));
+ // route_list_display.signal_rows_reordered().connect (mem_fun (*this, &Editor::queue_route_list_reordered));
// GTK2FIX
// route_display_model->set_sort_func (0, mem_fun (*this, &Editor::route_list_compare_func));
- route_list_scroller.add (route_list);
+ route_list_scroller.add (route_list_display);
route_list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- route_list.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::route_display_selection_changed));
- route_list.signal_columns_changed().connect (mem_fun(*this, &Editor::route_list_column_click));
+ route_list_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::route_display_selection_changed));
+ route_list_display.signal_columns_changed().connect (mem_fun(*this, &Editor::route_list_column_click));
edit_group_list_button_label.set_text (_("Edit Groups"));
edit_group_list_button_label.set_name ("EditGroupTitleButton");
@@ -551,69 +551,70 @@ Editor::Editor (AudioEngine& eng)
edit_group_list_button.set_name ("EditGroupTitleButton");
group_model = ListStore::create(group_columns);
- edit_group_list.set_model (group_model);
- edit_group_list.append_column (_("active"), group_columns.is_active);
- edit_group_list.append_column (_("groupname"), group_columns.text);
- edit_group_list.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
- edit_group_list.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
+ edit_group_display.set_model (group_model);
+ edit_group_display.append_column (_("active"), group_columns.is_active);
+ edit_group_display.append_column (_("groupname"), group_columns.text);
+ edit_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
+ edit_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
/* use checkbox for the active column */
- CellRendererToggle *active_cell = dynamic_cast<CellRendererToggle*>(edit_group_list.get_column_cell_renderer (0));
+ CellRendererToggle *active_cell = dynamic_cast<CellRendererToggle*>(edit_group_display.get_column_cell_renderer (0));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- edit_group_list.set_name ("MixerGroupList");
- //edit_group_list.set_shadow_type (Gtk::SHADOW_IN);
+ edit_group_display.set_name ("MixerGroupList");
+ //edit_group_display.set_shadow_type (Gtk::SHADOW_IN);
- edit_group_list.columns_autosize ();
- edit_group_list.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE);
- edit_group_list.set_reorderable (false);
+ edit_group_display.columns_autosize ();
+ edit_group_display.get_selection()->set_mode (Gtk::SELECTION_MULTIPLE);
+ edit_group_display.set_reorderable (false);
- edit_group_list.set_size_request (75, -1);
- edit_group_list.set_headers_visible (true);
+ edit_group_display.set_size_request (75, -1);
+ edit_group_display.set_headers_visible (true);
- edit_group_list_scroller.add (edit_group_list);
+ edit_group_list_scroller.add (edit_group_display);
edit_group_list_scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
edit_group_list_button.signal_clicked().connect (mem_fun(*this, &Editor::edit_group_list_button_clicked));
- edit_group_list.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event));
- edit_group_list.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::edit_group_selection_changed));
+ edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event));
+ edit_group_display.get_selection()->signal_changed().connect (mem_fun(*this, &Editor::edit_group_selection_changed));
TreeModel::Row row = *(group_model->append());
row[group_columns.is_active] = false;
row[group_columns.text] = (_("-all-"));
row[group_columns.routegroup] = 0;
- edit_group_list.get_selection()->select (row);
+ edit_group_display.get_selection()->select (row);
edit_group_vbox.pack_start (edit_group_list_button, false, false);
edit_group_vbox.pack_start (edit_group_list_scroller, true, true);
+ region_list_display.set_size_request (100, -1);
+ region_list_display.set_name ("RegionListDisplay");
+
region_list_model = TreeStore::create (region_list_columns);
- region_list_sort_model = TreeModelSort::create (region_list_model);
region_list_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
- region_list_display.set_model (region_list_sort_model);
+ region_list_display.set_model (region_list_model);
region_list_display.append_column (_("Regions"), region_list_columns.name);
region_list_display.set_reorderable (true);
- region_list_display.set_size_request (100, -1);
- region_list_display.set_data ("editor", this);
- region_list_display.set_flags (Gtk::CAN_FOCUS);
- region_list_display.set_name ("RegionListDisplay");
-
- region_list_scroller.add (region_list_display);
- region_list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+ region_list_display.get_selection()->set_mode (SELECTION_SINGLE);
+ region_list_display.add_object_drag (region_list_columns.region.index(), "regions");
+ /* setup DnD handling */
+
list<Gtk::TargetEntry> region_list_target_table;
region_list_target_table.push_back (TargetEntry ("STRING"));
region_list_target_table.push_back (TargetEntry ("text/plain"));
region_list_target_table.push_back (TargetEntry ("text/uri-list"));
region_list_target_table.push_back (TargetEntry ("application/x-rootwin-drop"));
+
+ region_list_display.add_drop_targets (region_list_target_table);
+ region_list_display.signal_drag_data_received().connect (mem_fun(*this, &Editor::region_list_display_drag_data_received));
- // GTK2FIX
- // region_list_display.drag_dest_set (region_list_target_table, DEST_DEFAULT_ALL, GdkDragAction (Gdk::ACTION_COPY|Gdk::ACTION_MOVE));
- // region_list_display.signal_drag_data_received().connect (mem_fun(*this, &Editor::region_list_display_drag_data_received));
+ region_list_scroller.add (region_list_display);
+ region_list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
region_list_display.signal_key_press_event().connect (mem_fun(*this, &Editor::region_list_display_key_press));
region_list_display.signal_key_release_event().connect (mem_fun(*this, &Editor::region_list_display_key_release));
@@ -666,9 +667,7 @@ Editor::Editor (AudioEngine& eng)
global_hpacker.pack_start (global_vpacker, true, true);
set_name ("EditorWindow");
- cerr << "Adding accel group " << ActionManager::ui_manager->get_accel_group()->gobj() << endl;
add_accel_group (ActionManager::ui_manager->get_accel_group());
- cerr << "... done\n";
vpacker.pack_end (global_hpacker, true, true);
@@ -1235,17 +1234,17 @@ Editor::connect_to_session (Session *t)
redisplay_named_selections ();
// GTK2FIX
- // route_list.set_model (Glib::RefPtr<TreeModel>(0));
+ // route_list_display.set_model (Glib::RefPtr<TreeModel>(0));
route_display_model->clear ();
session->foreach_route (this, &Editor::handle_new_route);
- // route_list.select_all ();
+ // route_list_display.select_all ();
// GTK2FIX
- //route_list.sort ();
+ //route_list_display.sort ();
route_list_reordered ();
- // route_list.set_model (route_display_model);
+ // route_list_display.set_model (route_display_model);
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
(static_cast<TimeAxisView*>(*i))->set_samples_per_unit (frames_per_unit);
@@ -1279,7 +1278,7 @@ Editor::connect_to_session (Session *t)
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
- //route_list.freeze ();
+ //route_list_display.freeze ();
for (i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
@@ -1287,13 +1286,13 @@ Editor::connect_to_session (Session *t)
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
if (atv->route().master()) {
- route_list.get_selection()->unselect (i);
+ route_list_display.get_selection()->unselect (i);
//(*i)->unselect ();
}
}
}
- //route_list.thaw ();
+ //route_list_display.thaw ();
}
}
@@ -2762,130 +2761,85 @@ Editor::stop_canvas_autoscroll ()
int
Editor::convert_drop_to_paths (vector<string>& paths,
- GdkDragContext *context,
+ const RefPtr<Gdk::DragContext>& context,
gint x,
gint y,
- GtkSelectionData *data,
+ const SelectionData& data,
guint info,
guint time)
{
- string spath;
- char *path;
- int state;
- gchar *tname = gdk_atom_name (data->type);
-
- if (session == 0 || strcmp (tname, "text/plain") != 0) {
+ if (session == 0) {
return -1;
}
- /* Parse the "uri-list" format that Nautilus provides,
- where each pathname is delimited by \r\n
- */
+ vector<ustring> uris = data.get_uris();
- path = (char *) data->data;
- state = 0;
+ if (uris.empty()) {
+
+ /* This is seriously fucked up. Nautilus doesn't say that its URI lists
+ are actually URI lists. So do it by hand.
+ */
- for (int n = 0; n < data->length; ++n) {
+ if (data.get_target() != "text/plain") {
+ return -1;
+ }
+
+ /* Parse the "uri-list" format that Nautilus provides,
+ where each pathname is delimited by \r\n
+ */
+
+ cerr << "by hand parsing of URI list\n";
+
+ const char* p = data.get_text().c_str();
+ const char* q;
- switch (state) {
- case 0:
- if (path[n] == '\r') {
- state = 1;
- } else {
- spath += path[n];
- }
- break;
- case 1:
- if (path[n] == '\n') {
- paths.push_back (spath);
- spath = "";
- state = 0;
- } else {
- warning << _("incorrectly formatted URI list, ignored")
- << endmsg;
- return -1;
+ while (p)
+ {
+ if (*p != '#')
+ {
+ while (g_ascii_isspace (*p))
+ p++;
+
+ q = p;
+ while (*q && (*q != '\n') && (*q != '\r'))
+ q++;
+
+ if (q > p)
+ {
+ q--;
+ while (q > p && g_ascii_isspace (*q))
+ q--;
+
+ if (q > p)
+ {
+ uris.push_back (ustring (p, q - p + 1));
+ }
+ }
}
- break;
+ p = strchr (p, '\n');
+ if (p)
+ p++;
}
- }
-
- /* nautilus and presumably some other file managers prefix even text/plain with file:// */
-
- for (vector<string>::iterator p = paths.begin(); p != paths.end(); ++p) {
-
- // cerr << "dropped text was " << *p << endl;
- url_decode (*p);
+ cerr << "end result = " << uris.size() << endl;
- // cerr << "decoded was " << *p << endl;
-
- if ((*p).substr (0,7) == "file://") {
- (*p) = (*p).substr (7);
+ if (uris.empty()) {
+ return -1;
}
}
- return 0;
-}
-
-void
-Editor::track_canvas_drag_data_received (GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *data,
- guint info,
- guint time)
-{
- TimeAxisView* tvp;
- AudioTimeAxisView* tv;
- double cy;
- vector<string> paths;
- string spath;
- GdkEvent ev;
- jack_nframes_t frame;
-
- if (convert_drop_to_paths (paths, context, x, y, data, info, time)) {
- goto out;
- }
-
- /* D-n-D coordinates are window-relative, so convert to "world" coordinates
- */
-
- double wx;
- double wy;
-
- track_canvas.c2w( x, y, wx, wy);
-
- ev.type = GDK_BUTTON_RELEASE;
- ev.button.x = wx;
- ev.button.y = wy;
-
- frame = event_frame (&ev, 0, &cy);
-
- snap_to (frame);
-
- if ((tvp = trackview_by_y_position (cy)) == 0) {
-
- /* drop onto canvas background: create a new track */
-
- insert_paths_as_new_tracks (paths, false);
-
-
- } else if ((tv = dynamic_cast<AudioTimeAxisView*>(tvp)) != 0) {
-
- /* check that its an audio track, not a bus */
-
- if (tv->get_diskstream()) {
-
- for (vector<string>::iterator p = paths.begin(); p != paths.end(); ++p) {
- insert_sndfile_into (*p, true, tv, frame);
- }
+ for (vector<ustring>::iterator i = uris.begin(); i != uris.end(); ++i) {
+ cerr << "looking at " << (*i) << endl;
+ if ((*i).substr (0,7) == "file://") {
+ string p = *i;
+ url_decode (p);
+ cerr << "adding " << p << endl;
+ paths.push_back (p.substr (7));
}
-
}
- out:
- gtk_drag_finish (context, TRUE, FALSE, time);
+ return 0;
}
void