many changes, read the diffs
git-svn-id: svn://localhost/trunk/ardour2@214 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
0faaa3ad7b
commit
d43cc4e7b5
@ -207,7 +207,7 @@ executable = 'ardour.bin'
|
||||
|
||||
ardour = gtkardour.Program(target = executable, source = gtkardour_files + extra_sources)
|
||||
mtest = gtkardour.Program(target = 'mtest', source = mtest_files)
|
||||
#itest = gtkardour.Program(target = 'itest', source = itest_files)
|
||||
itest = gtkardour.Program(target = 'itest', source = itest_files)
|
||||
|
||||
Default(ardour)
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include <vector>
|
||||
#include <string.h>
|
||||
|
||||
#include <gtk/gtkaccelmap.h>
|
||||
#include <gtk/gtkuimanager.h>
|
||||
@ -32,6 +33,7 @@
|
||||
#include <ardour/ardour.h>
|
||||
|
||||
#include "actions.h"
|
||||
#include "i18n.h"
|
||||
|
||||
using namespace std;
|
||||
using namespace Gtk;
|
||||
@ -199,35 +201,25 @@ ActionManager::get_widget (const char * name)
|
||||
}
|
||||
|
||||
RefPtr<Action>
|
||||
ActionManager::get_action (const char * _name)
|
||||
ActionManager::get_action (const char* group_name, const char* action_name)
|
||||
{
|
||||
/* the C++ API for functions used here appears to be broken in
|
||||
gtkmm2.6, so we fall back to the C level.
|
||||
*/
|
||||
|
||||
ustring name(_name);
|
||||
GList* list = gtk_ui_manager_get_action_groups (ui_manager->gobj());
|
||||
GList* node;
|
||||
RefPtr<Action> act;
|
||||
|
||||
if (name.substr (0,9) != "<Actions>") {
|
||||
error << "badly specified action name: " << name << endmsg;
|
||||
return act;
|
||||
}
|
||||
|
||||
ustring::size_type last_slash = name.find_last_of ('/');
|
||||
ustring group_name = name.substr (10, last_slash - 10);
|
||||
ustring action_name = name.substr (last_slash+1);
|
||||
|
||||
for (node = list; node; node = g_list_next (node)) {
|
||||
|
||||
GtkActionGroup* _ag = (GtkActionGroup*) node->data;
|
||||
|
||||
if (group_name == gtk_action_group_get_name (_ag)) {
|
||||
|
||||
if (strcmp (group_name, gtk_action_group_get_name (_ag)) == 0) {
|
||||
|
||||
GtkAction* _act;
|
||||
|
||||
if ((_act = gtk_action_group_get_action (_ag, action_name.c_str())) != 0) {
|
||||
if ((_act = gtk_action_group_get_action (_ag, action_name)) != 0) {
|
||||
act = Glib::wrap (_act, true);
|
||||
break;
|
||||
}
|
||||
@ -246,14 +238,33 @@ ActionManager::set_sensitive (vector<RefPtr<Action> >& actions, bool state)
|
||||
}
|
||||
|
||||
void
|
||||
ActionManager::uncheck_toggleaction (const char * actionname)
|
||||
ActionManager::uncheck_toggleaction (const char * name)
|
||||
{
|
||||
RefPtr<Action> act = get_action (actionname);
|
||||
char *last_slash = strrchr (name, '/');
|
||||
|
||||
if (last_slash == 0) {
|
||||
fatal << string_compose (_("programmer error: %1 %2"), X_("illegal toggle action name"), name) << endmsg;
|
||||
/*NOTREACHED*/
|
||||
return;
|
||||
}
|
||||
|
||||
/* 10 = strlen ("<Actions>/") */
|
||||
size_t len = last_slash - (name + 10);
|
||||
|
||||
char* group_name = new char[len+1];
|
||||
memcpy (group_name, name + 10, len);
|
||||
group_name[len] = '\0';
|
||||
|
||||
char* action_name = last_slash + 1;
|
||||
|
||||
RefPtr<Action> act = get_action (group_name, action_name);
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
tact->set_active (false);
|
||||
} else {
|
||||
error << "Invalid action name: " << actionname << endmsg;
|
||||
error << "Unknown action name: " << name << endmsg;
|
||||
}
|
||||
|
||||
delete [] group_name;
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ class ActionManager
|
||||
static Glib::RefPtr<Gtk::UIManager> ui_manager;
|
||||
|
||||
static Gtk::Widget* get_widget (const char * name);
|
||||
static Glib::RefPtr<Gtk::Action> get_action (const char * name);
|
||||
static Glib::RefPtr<Gtk::Action> get_action (const char* group, const char* name);
|
||||
|
||||
static void add_action_group (Glib::RefPtr<Gtk::ActionGroup>);
|
||||
|
||||
|
@ -831,10 +831,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
|
||||
theArdourUI = this;
|
||||
}
|
||||
|
||||
// allow run-time rebinding of accels
|
||||
|
||||
Settings::get_default()->property_gtk_can_change_accels() = true;
|
||||
|
||||
ActionManager::init ();
|
||||
|
||||
m_new_session_dialog = 0;
|
||||
|
@ -279,19 +279,19 @@ ARDOUR_UI::setup_transport ()
|
||||
|
||||
RefPtr<Action> act;
|
||||
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/Stop"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("Stop"));
|
||||
act->connect_proxy (stop_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/Roll"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("Roll"));
|
||||
act->connect_proxy (roll_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/Record"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("Record"));
|
||||
act->connect_proxy (rec_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/GotoStart"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("GotoStart"));
|
||||
act->connect_proxy (goto_start_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/GotoEnd"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("GotoEnd"));
|
||||
act->connect_proxy (goto_end_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/Loop"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("Loop"));
|
||||
act->connect_proxy (auto_loop_button);
|
||||
act = ActionManager::get_action (X_("<Actions>/Transport/PlaySelection"));
|
||||
act = ActionManager::get_action (X_("Transport"), X_("PlaySelection"));
|
||||
act->connect_proxy (play_selection_button);
|
||||
|
||||
ARDOUR_UI::instance()->tooltips().set_tip (roll_button, _("Play from playhead"));
|
||||
|
@ -180,14 +180,16 @@ ARDOUR_UI::unload_session ()
|
||||
int
|
||||
ARDOUR_UI::create_connection_editor ()
|
||||
{
|
||||
#if 0
|
||||
if (connection_editor == 0) {
|
||||
// connection_editor = new ConnectionEditor ();
|
||||
// connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
|
||||
connection_editor = new ConnectionEditor ();
|
||||
connection_editor->signal_unmap().connect (sigc::bind (ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleConnections")));
|
||||
}
|
||||
|
||||
if (session) {
|
||||
// connection_editor->set_session (session);
|
||||
connection_editor->set_session (session);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -199,13 +201,17 @@ ARDOUR_UI::toggle_connection_editor ()
|
||||
return;
|
||||
}
|
||||
|
||||
//GTK2FIX
|
||||
#if 0
|
||||
|
||||
if (connection_editor_check->get_active()){
|
||||
connection_editor->present();
|
||||
} else {
|
||||
connection_editor->hide_all();
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleConnections"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (tact->get_active()) {
|
||||
connection_editor->show_all ();
|
||||
connection_editor->present ();
|
||||
} else {
|
||||
connection_editor->hide ();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -213,11 +219,16 @@ ARDOUR_UI::toggle_connection_editor ()
|
||||
void
|
||||
ARDOUR_UI::toggle_big_clock_window ()
|
||||
{
|
||||
if (big_clock_window->is_visible()) {
|
||||
big_clock_window->hide ();
|
||||
} else {
|
||||
big_clock_window->show_all ();
|
||||
big_clock_window->present ();
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleBigClock"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (tact->get_active()) {
|
||||
big_clock_window->show_all ();
|
||||
big_clock_window->present ();
|
||||
} else {
|
||||
big_clock_window->hide ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -230,10 +241,16 @@ ARDOUR_UI::toggle_options_window ()
|
||||
option_editor->set_session (session);
|
||||
}
|
||||
|
||||
if (option_editor->is_visible()) {
|
||||
option_editor->hide ();
|
||||
} else {
|
||||
option_editor->present ();
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleOptionsEditor"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (tact->get_active()) {
|
||||
option_editor->show_all ();
|
||||
option_editor->present ();
|
||||
} else {
|
||||
option_editor->hide ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -264,10 +281,16 @@ ARDOUR_UI::toggle_location_window ()
|
||||
return;
|
||||
}
|
||||
|
||||
if (location_ui->is_visible()) {
|
||||
location_ui->hide();
|
||||
} else {
|
||||
location_ui->present();
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleLocations"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (tact->get_active()) {
|
||||
location_ui->show_all ();
|
||||
location_ui->present ();
|
||||
} else {
|
||||
location_ui->hide ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -289,10 +312,16 @@ ARDOUR_UI::toggle_route_params_window ()
|
||||
return;
|
||||
}
|
||||
|
||||
if (route_params->is_visible ()) {
|
||||
route_params->hide ();
|
||||
} else {
|
||||
route_params->present ();
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleInspector"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
if (tact->get_active()) {
|
||||
route_params->show_all ();
|
||||
route_params->present ();
|
||||
} else {
|
||||
route_params->hide ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -314,7 +343,7 @@ ARDOUR_UI::toggle_sound_file_browser ()
|
||||
return;
|
||||
}
|
||||
|
||||
RefPtr<Action> act = ActionManager::ui_manager->get_action (X_("<Actions>/Common/ToggleSoundFileBrowser"));
|
||||
RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleSoundFileBrowser"));
|
||||
if (act) {
|
||||
RefPtr<ToggleAction> tact = RefPtr<ToggleAction>::cast_dynamic(act);
|
||||
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "public_editor.h"
|
||||
#include "regionview.h"
|
||||
#include "utils.h"
|
||||
#include "canvas_impl.h"
|
||||
|
||||
using namespace sigc;
|
||||
using namespace ARDOUR;
|
||||
@ -78,8 +79,7 @@ CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent,
|
||||
vestigial_frame->hide();
|
||||
show_vestigial = false;
|
||||
|
||||
// GTK2FIX
|
||||
// group->signal_event.connect (bind (mem_fun (tv.editor, &PublicEditor::canvas_crossfade_view_event), group, this));
|
||||
group->signal_event().connect (bind (mem_fun (tv.editor, &PublicEditor::canvas_crossfade_view_event), group, this));
|
||||
|
||||
crossfade_changed (Change (~0));
|
||||
|
||||
|
@ -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_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.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_model = TreeStore::create (region_list_columns);
|
||||
region_list_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
|
||||
|
||||
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.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;
|
||||
|
||||
for (int n = 0; n < data->length; ++n) {
|
||||
|
||||
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;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* nautilus and presumably some other file managers prefix even text/plain with file:// */
|
||||
if (uris.empty()) {
|
||||
|
||||
for (vector<string>::iterator p = paths.begin(); p != paths.end(); ++p) {
|
||||
/* This is seriously fucked up. Nautilus doesn't say that its URI lists
|
||||
are actually URI lists. So do it by hand.
|
||||
*/
|
||||
|
||||
// cerr << "dropped text was " << *p << endl;
|
||||
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;
|
||||
|
||||
url_decode (*p);
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
p = strchr (p, '\n');
|
||||
if (p)
|
||||
p++;
|
||||
}
|
||||
|
||||
// cerr << "decoded was " << *p << endl;
|
||||
cerr << "end result = " << uris.size() << 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
|
||||
|
@ -40,6 +40,7 @@
|
||||
|
||||
#include <gtkmm2ext/selector.h>
|
||||
#include <gtkmm2ext/click_box.h>
|
||||
#include <gtkmm2ext/dndtreeview.h>
|
||||
|
||||
#include <ardour/stateful.h>
|
||||
#include <ardour/session.h>
|
||||
@ -688,7 +689,7 @@ class Editor : public PublicEditor
|
||||
};
|
||||
|
||||
RegionListDisplayModelColumns region_list_columns;
|
||||
Gtk::TreeView region_list_display;
|
||||
Gtkmm2ext::DnDTreeView region_list_display;
|
||||
Glib::RefPtr<Gtk::TreeStore> region_list_model;
|
||||
Glib::RefPtr<Gtk::TreeModelSort> region_list_sort_model;
|
||||
Glib::RefPtr<Gtk::Action> toggle_full_region_list_action;
|
||||
@ -738,8 +739,8 @@ class Editor : public PublicEditor
|
||||
NamedSelectionDisplayModelColumns named_selection_columns;
|
||||
Glib::RefPtr<Gtk::TreeStore> named_selection_model;
|
||||
|
||||
Gtk::TreeView named_selection_display;
|
||||
Gtk::ScrolledWindow named_selection_scroller;
|
||||
Gtkmm2ext::DnDTreeView named_selection_display;
|
||||
Gtk::ScrolledWindow named_selection_scroller;
|
||||
|
||||
void name_selection();
|
||||
void named_selection_name_chosen ();
|
||||
@ -1435,9 +1436,9 @@ class Editor : public PublicEditor
|
||||
Glib::RefPtr<Gtk::TreeSelection> route_display_selection;
|
||||
|
||||
gint route_list_compare_func (Gtk::TreeModel::iterator, Gtk::TreeModel::iterator);
|
||||
Gtk::TreeView route_list; //GTK2FIX rename to route_display
|
||||
Gtk::ScrolledWindow route_list_scroller;
|
||||
Gtk::Menu *route_list_menu;
|
||||
Gtkmm2ext::DnDTreeView route_list_display;
|
||||
Gtk::ScrolledWindow route_list_scroller;
|
||||
Gtk::Menu* route_list_menu;
|
||||
|
||||
void route_list_column_click ();
|
||||
void build_route_list_menu ();
|
||||
@ -1465,12 +1466,12 @@ class Editor : public PublicEditor
|
||||
Glib::RefPtr<Gtk::ListStore> group_model;
|
||||
Glib::RefPtr<Gtk::TreeSelection> group_selection;
|
||||
|
||||
Gtk::Button edit_group_list_button;
|
||||
Gtk::Label edit_group_list_button_label;
|
||||
Gtk::TreeView edit_group_list;
|
||||
Gtk::ScrolledWindow edit_group_list_scroller;
|
||||
Gtk::Menu *edit_group_list_menu;
|
||||
Gtk::VBox edit_group_vbox;
|
||||
Gtk::Button edit_group_list_button;
|
||||
Gtk::Label edit_group_list_button_label;
|
||||
Gtkmm2ext::DnDTreeView edit_group_display;
|
||||
Gtk::ScrolledWindow edit_group_list_scroller;
|
||||
Gtk::Menu* edit_group_list_menu;
|
||||
Gtk::VBox edit_group_vbox;
|
||||
|
||||
void edit_group_list_column_click (gint);
|
||||
void build_edit_group_list_menu ();
|
||||
@ -1524,27 +1525,28 @@ class Editor : public PublicEditor
|
||||
/* Drag-n-Drop */
|
||||
|
||||
int convert_drop_to_paths (std::vector<std::string>& paths,
|
||||
GdkDragContext *context,
|
||||
const Glib::RefPtr<Gdk::DragContext>& context,
|
||||
gint x,
|
||||
gint y,
|
||||
GtkSelectionData *data,
|
||||
const Gtk::SelectionData& data,
|
||||
guint info,
|
||||
guint time);
|
||||
|
||||
void track_canvas_drag_data_received (GdkDragContext *context,
|
||||
void track_canvas_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
|
||||
gint x,
|
||||
gint y,
|
||||
GtkSelectionData *data,
|
||||
const Gtk::SelectionData& data,
|
||||
guint info,
|
||||
guint time);
|
||||
|
||||
void region_list_display_drag_data_received (GdkDragContext *context,
|
||||
|
||||
void region_list_display_drag_data_received (const Glib::RefPtr<Gdk::DragContext>& context,
|
||||
gint x,
|
||||
gint y,
|
||||
GtkSelectionData *data,
|
||||
const Gtk::SelectionData& data,
|
||||
guint info,
|
||||
guint time);
|
||||
|
||||
|
||||
|
||||
/* audio export */
|
||||
|
||||
ExportDialog *export_dialog;
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "rgb_macros.h"
|
||||
#include "utils.h"
|
||||
#include "time_axis_view.h"
|
||||
#include "audio_time_axis.h"
|
||||
|
||||
#include "i18n.h"
|
||||
|
||||
@ -399,3 +400,61 @@ Editor::time_canvas_map_handler (GdkEventAny* ev)
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
||||
int x, int y,
|
||||
const SelectionData& 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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
out:
|
||||
context->drag_finish (true, false, time);
|
||||
}
|
||||
|
||||
|
@ -147,7 +147,7 @@ bool
|
||||
Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
|
||||
{
|
||||
gint ret = FALSE;
|
||||
|
||||
|
||||
switch (event->type) {
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_2BUTTON_PRESS:
|
||||
@ -444,7 +444,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
|
||||
|
||||
if (atv->is_audio_track()) {
|
||||
|
||||
|
||||
AudioPlaylist* pl = atv->get_diskstream()->playlist();
|
||||
Playlist::RegionList* rl = pl->regions_at (event_frame (event));
|
||||
|
||||
@ -459,7 +459,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item,
|
||||
delete rl;
|
||||
|
||||
return canvas_region_view_event (event, arv->get_canvas_group(), arv);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,7 @@ Editor::select_all_edit_groups ()
|
||||
|
||||
Gtk::TreeModel::Children children = group_model->children();
|
||||
for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
|
||||
edit_group_list.get_selection()->select (iter);
|
||||
edit_group_display.get_selection()->select (iter);
|
||||
}
|
||||
}
|
||||
|
||||
@ -126,7 +126,7 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
|
||||
int cellx;
|
||||
int celly;
|
||||
|
||||
if (!edit_group_list.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
|
||||
if (!edit_group_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -135,10 +135,10 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
|
||||
case 1:
|
||||
|
||||
if (Keyboard::is_edit_event (ev)) {
|
||||
// RouteGroup* group = (RouteGroup *) edit_group_list.row(row).get_data ();
|
||||
// RouteGroup* group = (RouteGroup *) edit_group_display.row(row).get_data ();
|
||||
// edit_route_group (group);
|
||||
|
||||
return stop_signal (edit_group_list, "button_press_event");
|
||||
return stop_signal (edit_group_display, "button_press_event");
|
||||
|
||||
} else {
|
||||
/* allow regular select to occur */
|
||||
@ -157,7 +157,7 @@ Editor::edit_group_list_button_press_event (GdkEventButton* ev)
|
||||
break;
|
||||
}
|
||||
|
||||
return stop_signal (edit_group_list, "button_press_event");
|
||||
return stop_signal (edit_group_display, "button_press_event");
|
||||
}
|
||||
|
||||
void
|
||||
@ -165,7 +165,7 @@ Editor::edit_group_selection_changed ()
|
||||
{
|
||||
TreeModel::iterator i;
|
||||
TreeModel::Children rows = group_model->children();
|
||||
Glib::RefPtr<TreeSelection> selection = edit_group_list.get_selection();
|
||||
Glib::RefPtr<TreeSelection> selection = edit_group_display.get_selection();
|
||||
|
||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||
RouteGroup* group;
|
||||
@ -212,12 +212,12 @@ Editor::group_flags_changed (void* src, RouteGroup* group)
|
||||
// select row
|
||||
}
|
||||
|
||||
CList_Helpers::RowIterator ri = edit_group_list.rows().find_data (group);
|
||||
CList_Helpers::RowIterator ri = edit_group_display.rows().find_data (group);
|
||||
|
||||
if (group->is_active()) {
|
||||
edit_group_list.cell (ri->get_row_num(),0).set_pixmap (check_pixmap, check_mask);
|
||||
edit_group_display.cell (ri->get_row_num(),0).set_pixmap (check_pixmap, check_mask);
|
||||
} else {
|
||||
edit_group_list.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask);
|
||||
edit_group_display.cell (ri->get_row_num(),0).set_pixmap (empty_pixmap, empty_mask);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -1090,7 +1090,7 @@ Editor::handle_new_imageframe_time_axis_view(const string & track_name, void* sr
|
||||
|
||||
row[route_display_columns.text] = iftav->name();
|
||||
row[route_display_columns.tv] = iftav;
|
||||
route_list.get_selection()->select (row);
|
||||
route_list_display.get_selection()->select (row);
|
||||
|
||||
iftav->GoingAway.connect(bind(mem_fun(*this, &Editor::remove_route), (TimeAxisView*)iftav)) ;
|
||||
iftav->gui_changed.connect(mem_fun(*this, &Editor::handle_gui_changes)) ;
|
||||
@ -1107,7 +1107,7 @@ Editor::handle_new_imageframe_marker_time_axis_view(const string & track_name, T
|
||||
|
||||
row[route_display_columns.text] = mta->name();
|
||||
row[route_display_columns.tv] = mta;
|
||||
route_list.get_selection()->select (row);
|
||||
route_list_display.get_selection()->select (row);
|
||||
|
||||
mta->GoingAway.connect(bind(mem_fun(*this, &Editor::remove_route), (TimeAxisView*)mta)) ;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ void
|
||||
Editor::kbd_driver (sigc::slot<void,GdkEvent*> theslot, bool use_track_canvas, bool use_time_canvas, bool can_select)
|
||||
{
|
||||
gint x, y;
|
||||
double dx, dy;
|
||||
double worldx, worldy;
|
||||
GdkEvent ev;
|
||||
Gdk::ModifierType mask;
|
||||
Glib::RefPtr<Gdk::Window> evw = track_canvas.get_window()->get_pointer (x, y, mask);
|
||||
@ -46,10 +46,11 @@ Editor::kbd_driver (sigc::slot<void,GdkEvent*> theslot, bool use_track_canvas, b
|
||||
selection->set (entered_regionview);
|
||||
}
|
||||
|
||||
track_canvas.c2w(x, y, dx, dy);
|
||||
track_canvas.window_to_world (x, y, worldx, worldy);
|
||||
|
||||
ev.type = GDK_BUTTON_PRESS;
|
||||
ev.button.x = dx;
|
||||
ev.button.y = dy;
|
||||
ev.button.x = worldx;
|
||||
ev.button.y = worldy;
|
||||
ev.button.state = 0; /* XXX correct? */
|
||||
|
||||
theslot (&ev);
|
||||
|
@ -41,6 +41,7 @@
|
||||
using namespace sigc;
|
||||
using namespace ARDOUR;
|
||||
using namespace Gtk;
|
||||
using namespace Glib;
|
||||
using namespace Editing;
|
||||
|
||||
#define wave_cursor_width 43
|
||||
@ -345,7 +346,7 @@ Editor::redisplay_regions ()
|
||||
add_audio_region_to_region_display (*r);
|
||||
}
|
||||
|
||||
region_list_display.set_model (region_list_sort_model);
|
||||
region_list_display.set_model (region_list_model);
|
||||
}
|
||||
}
|
||||
|
||||
@ -362,7 +363,7 @@ Editor::build_region_list_menu ()
|
||||
|
||||
/* now grab specific menu items that we need */
|
||||
|
||||
toggle_full_region_list_action = ActionManager::get_action ("<Actions>/RegionList/rlShowAll");
|
||||
toggle_full_region_list_action = ActionManager::get_action (X_("RegionList"), X_("rlShowAll"));
|
||||
}
|
||||
|
||||
void
|
||||
@ -646,7 +647,7 @@ Editor::reset_region_list_sort_type (RegionListSortType type)
|
||||
break;
|
||||
}
|
||||
|
||||
region_list_sort_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
|
||||
// region_list_sort_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
|
||||
}
|
||||
}
|
||||
|
||||
@ -656,7 +657,7 @@ Editor::reset_region_list_sort_direction (bool up)
|
||||
// GTK2FIX
|
||||
//region_list_display.set_sort_type (up ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING);
|
||||
/* reset to force resort */
|
||||
region_list_sort_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
|
||||
// region_list_sort_model->set_sort_func (0, mem_fun (*this, &Editor::region_list_sorter));
|
||||
}
|
||||
|
||||
void
|
||||
@ -710,18 +711,15 @@ Editor::remove_region_from_region_list ()
|
||||
}
|
||||
|
||||
void
|
||||
Editor::region_list_display_drag_data_received (GdkDragContext *context,
|
||||
gint x,
|
||||
gint y,
|
||||
GtkSelectionData *data,
|
||||
guint info,
|
||||
guint time)
|
||||
Editor::region_list_display_drag_data_received (const RefPtr<Gdk::DragContext>& context,
|
||||
int x, int y,
|
||||
const SelectionData& data,
|
||||
guint info, guint time)
|
||||
{
|
||||
vector<string> paths;
|
||||
|
||||
if (convert_drop_to_paths (paths, context, x, y, data, info, time) == 0) {
|
||||
do_embed_sndfiles (paths, false);
|
||||
context->drag_finish (true, false, time);
|
||||
}
|
||||
|
||||
gtk_drag_finish (context, TRUE, FALSE, time);
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ Editor::handle_new_route (Route& route)
|
||||
ignore_route_list_reorder = true;
|
||||
|
||||
if (tv->marked_for_display()) {
|
||||
route_list.get_selection()->select (row);
|
||||
route_list_display.get_selection()->select (row);
|
||||
}
|
||||
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*> (tv)) != 0) {
|
||||
@ -151,7 +151,7 @@ Editor::route_display_selection_changed ()
|
||||
TimeAxisView *tv;
|
||||
TreeModel::Children rows = route_display_model->children();
|
||||
TreeModel::Children::iterator i;
|
||||
Glib::RefPtr<TreeSelection> selection = route_list.get_selection();
|
||||
Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
|
||||
|
||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||
tv = (*i)[route_display_columns.tv];
|
||||
@ -177,7 +177,7 @@ Editor::unselect_strip_in_display (TimeAxisView& tv)
|
||||
{
|
||||
TreeModel::Children rows = route_display_model->children();
|
||||
TreeModel::Children::iterator i;
|
||||
Glib::RefPtr<TreeSelection> selection = route_list.get_selection();
|
||||
Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
|
||||
|
||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||
if ((*i)[route_display_columns.tv] == &tv) {
|
||||
@ -191,7 +191,7 @@ Editor::select_strip_in_display (TimeAxisView* tv)
|
||||
{
|
||||
TreeModel::Children rows = route_display_model->children();
|
||||
TreeModel::Children::iterator i;
|
||||
Glib::RefPtr<TreeSelection> selection = route_list.get_selection();
|
||||
Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
|
||||
|
||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||
if ((*i)[route_display_columns.tv] == tv) {
|
||||
@ -272,14 +272,14 @@ Editor::hide_all_tracks (bool with_select)
|
||||
TimeAxisView *tv = row[route_display_columns.tv];
|
||||
|
||||
if (with_select) {
|
||||
route_list.get_selection()->unselect (i);
|
||||
route_list_display.get_selection()->unselect (i);
|
||||
} else {
|
||||
tv->set_marked_for_display (false);
|
||||
tv->hide();
|
||||
|
||||
}
|
||||
}
|
||||
//route_list.thaw ();
|
||||
//route_list_display.thaw ();
|
||||
reset_scrolling_region ();
|
||||
}
|
||||
|
||||
@ -328,7 +328,7 @@ Editor::select_all_routes ()
|
||||
TreeModel::Children::iterator i;
|
||||
|
||||
for (i = rows.begin(); i != rows.end(); ++i) {
|
||||
route_list.get_selection()->select (i);
|
||||
route_list_display.get_selection()->select (i);
|
||||
}
|
||||
}
|
||||
|
||||
@ -345,7 +345,7 @@ Editor::select_all_audiotracks ()
|
||||
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
|
||||
if (atv->is_audio_track()) {
|
||||
route_list.get_selection()->select (i);
|
||||
route_list_display.get_selection()->select (i);
|
||||
|
||||
}
|
||||
}
|
||||
@ -366,7 +366,7 @@ Editor::unselect_all_audiotracks ()
|
||||
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
|
||||
if (atv->is_audio_track()) {
|
||||
route_list.get_selection()->unselect (i);
|
||||
route_list_display.get_selection()->unselect (i);
|
||||
|
||||
}
|
||||
}
|
||||
@ -387,7 +387,7 @@ Editor::select_all_audiobus ()
|
||||
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
|
||||
if (!atv->is_audio_track()) {
|
||||
route_list.get_selection()->select (i);
|
||||
route_list_display.get_selection()->select (i);
|
||||
|
||||
}
|
||||
}
|
||||
@ -408,7 +408,7 @@ Editor::unselect_all_audiobus ()
|
||||
|
||||
if ((atv = dynamic_cast<AudioTimeAxisView*>(tv)) != 0) {
|
||||
if (!atv->is_audio_track()) {
|
||||
route_list.get_selection()->unselect (i);
|
||||
route_list_display.get_selection()->unselect (i);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -575,15 +575,12 @@ LocationUI::LocationUI ()
|
||||
set_wmclass(_("ardour_locations"), "Ardour");
|
||||
|
||||
set_name ("LocationWindow");
|
||||
signal_delete_event().connect (bind (ptr_fun (just_hide_it), static_cast<Window*>(this)));
|
||||
|
||||
add (location_hpacker);
|
||||
|
||||
get_vbox()->pack_start (location_hpacker);
|
||||
|
||||
location_vpacker.set_border_width (10);
|
||||
location_vpacker.set_spacing (5);
|
||||
|
||||
|
||||
location_vpacker.pack_start (loop_edit_row, false, false);
|
||||
location_vpacker.pack_start (punch_edit_row, false, false);
|
||||
|
||||
@ -857,7 +854,13 @@ LocationUI::session_gone()
|
||||
|
||||
punch_edit_row.set_session (0);
|
||||
punch_edit_row.set_location (0);
|
||||
|
||||
ArdourDialog::session_gone();
|
||||
|
||||
ArdourDialog::session_gone ();
|
||||
}
|
||||
|
||||
bool
|
||||
LocationUI::on_delete_event (GdkEventAny* ev)
|
||||
{
|
||||
hide ();
|
||||
return true;
|
||||
}
|
||||
|
@ -148,13 +148,10 @@ class LocationUI : public ArdourDialog
|
||||
void set_session (ARDOUR::Session *);
|
||||
|
||||
private:
|
||||
|
||||
|
||||
ARDOUR::LocationStack *locations;
|
||||
|
||||
ARDOUR::LocationStack* locations;
|
||||
|
||||
void session_gone();
|
||||
|
||||
|
||||
Gtk::VBox location_vpacker;
|
||||
Gtk::HBox location_hpacker;
|
||||
|
||||
@ -197,6 +194,9 @@ class LocationUI : public ArdourDialog
|
||||
void location_removed (ARDOUR::Location *);
|
||||
void location_added (ARDOUR::Location *);
|
||||
void map_locations (ARDOUR::Locations::LocationList&);
|
||||
|
||||
protected:
|
||||
bool on_delete_event (GdkEventAny*);
|
||||
};
|
||||
|
||||
#endif // __ardour_location_ui_h__
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
|
||||
#include <gtkmm2ext/dndtreeview.h>
|
||||
|
||||
@ -13,13 +14,24 @@ DnDTreeView::DnDTreeView ()
|
||||
: TreeView ()
|
||||
{
|
||||
draggable.push_back (TargetEntry ("GTK_TREE_MODEL_ROW", TARGET_SAME_WIDGET));
|
||||
|
||||
data_column = -1;
|
||||
|
||||
enable_model_drag_source (draggable);
|
||||
enable_model_drag_dest (draggable);
|
||||
|
||||
suggested_action = Gdk::DragAction (0);
|
||||
|
||||
suggested_action = Gdk::DragAction (0);
|
||||
}
|
||||
|
||||
void
|
||||
DnDTreeView::add_drop_targets (list<TargetEntry>& targets)
|
||||
{
|
||||
for (list<TargetEntry>::iterator i = targets.begin(); i != targets.end(); ++i) {
|
||||
draggable.push_back (*i);
|
||||
}
|
||||
enable_model_drag_source (draggable);
|
||||
enable_model_drag_dest (draggable);
|
||||
}
|
||||
|
||||
void
|
||||
DnDTreeView::add_object_drag (int column, string type_name)
|
||||
{
|
||||
@ -57,11 +69,13 @@ DnDTreeView::serialize_pointers (RefPtr<TreeModel> model, TreeSelection::ListHan
|
||||
void
|
||||
DnDTreeView::on_drag_data_get(const RefPtr<DragContext>& context, SelectionData& selection_data, guint info, guint time)
|
||||
{
|
||||
cerr << "DnDTreeview::drag_data_get, target = " << selection_data.get_target() << endl;
|
||||
|
||||
if (selection_data.get_target() == "GTK_TREE_MODEL_ROW") {
|
||||
|
||||
TreeView::on_drag_data_get (context, selection_data, info, time);
|
||||
|
||||
} else {
|
||||
} else if (data_column >= 0) {
|
||||
|
||||
Gtk::TreeSelection::ListHandle_Path selection = get_selection()->get_selected_rows ();
|
||||
SerializedObjectPointers* sr = serialize_pointers (get_model(), &selection, selection_data.get_target());
|
||||
@ -73,20 +87,23 @@ DnDTreeView::on_drag_data_get(const RefPtr<DragContext>& context, SelectionData&
|
||||
void
|
||||
DnDTreeView::on_drag_data_received(const RefPtr<DragContext>& context, int x, int y, const SelectionData& selection_data, guint info, guint time)
|
||||
{
|
||||
if (suggested_action) {
|
||||
/* this is a drag motion callback. just update the status to
|
||||
say that we are still dragging, and that's it.
|
||||
*/
|
||||
suggested_action = Gdk::DragAction (0);
|
||||
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
|
||||
return;
|
||||
}
|
||||
|
||||
cerr << "DnDTreeview::drag_data_received @ " << x << ',' << y << " target = " << selection_data.get_target() << endl;
|
||||
|
||||
if (suggested_action) {
|
||||
/* this is a drag motion callback. just update the status to
|
||||
say that we are still dragging, and that's it.
|
||||
*/
|
||||
suggested_action = Gdk::DragAction (0);
|
||||
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
|
||||
return;
|
||||
}
|
||||
|
||||
if (selection_data.get_target() == "GTK_TREE_MODEL_ROW") {
|
||||
|
||||
TreeView::on_drag_data_received (context, x, y, selection_data, info, time);
|
||||
|
||||
} else {
|
||||
} else if (data_column >= 0) {
|
||||
|
||||
/* object D-n-D */
|
||||
|
||||
const SerializedObjectPointers* sr = reinterpret_cast<const SerializedObjectPointers *>(selection_data.get_data());
|
||||
@ -94,9 +111,9 @@ DnDTreeView::on_drag_data_received(const RefPtr<DragContext>& context, int x, in
|
||||
if (sr) {
|
||||
signal_object_drop (sr->type, sr->cnt, const_cast<void**>(sr->ptr));
|
||||
}
|
||||
|
||||
context->drag_finish (true, false, time);
|
||||
|
||||
|
||||
} else {
|
||||
/* some kind of target type added by the app, which will be handled by a signal handler */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,6 +53,10 @@ UI::UI (string name, int *argc, char ***argv, string rcfile)
|
||||
theMain = new Main (argc, argv);
|
||||
tips = new Tooltips;
|
||||
|
||||
// allow run-time rebinding of accels
|
||||
|
||||
Settings::get_default()->property_gtk_can_change_accels() = true;
|
||||
|
||||
if (pthread_key_create (&thread_request_buffer_key, 0)) {
|
||||
cerr << _("cannot create thread request buffer key") << endl;
|
||||
throw failed_constructor();
|
||||
|
@ -17,6 +17,7 @@ class DnDTreeView : public Gtk::TreeView
|
||||
DnDTreeView ();
|
||||
~DnDTreeView() {}
|
||||
|
||||
void add_drop_targets (std::list<Gtk::TargetEntry>&);
|
||||
void add_object_drag (int column, std::string type_name);
|
||||
sigc::signal<void,std::string,uint32_t,void**> signal_object_drop;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user