comments for BBT math methods; remove chunks from GUI; split location UI into a widget and a window; add the widget part to the editor RHS notebook. this is unfinished - it looks absurd. but its the starting point for a reworking of the location UI in its rightful place

git-svn-id: svn://localhost/ardour2/branches/3.0@6071 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-11-12 05:47:05 +00:00
parent c4c25e19bc
commit 7857ec8b45
15 changed files with 204 additions and 179 deletions

View File

@ -75,7 +75,7 @@ class BundleManager;
class ConnectionEditor;
class KeyEditor;
class Keyboard;
class LocationUI;
class LocationUIWindow;
class Mixer_UI;
class PublicEditor;
class RCOptionEditor;
@ -572,9 +572,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI
BundleManager *bundle_manager;
void create_bundle_manager ();
LocationUI *location_ui;
int create_location_ui ();
void handle_locations_change (ARDOUR::Location*);
LocationUIWindow *location_ui;
int create_location_ui ();
void handle_locations_change (ARDOUR::Location*);
static UIConfiguration *ui_config;
ThemeManager *theme_manager;

View File

@ -127,6 +127,7 @@ ARDOUR_UI::display_message (const char *prefix, gint prefix_len, RefPtr<TextBuff
#endif
}
#if 0
static bool
null_crossing (GdkEventCrossing* /* ignored */)
{
@ -139,6 +140,7 @@ block_prelight (Gtk::Widget& w)
w.signal_enter_notify_event().connect (sigc::ptr_fun (null_crossing), false);
w.signal_leave_notify_event().connect (sigc::ptr_fun (null_crossing), false);
}
#endif
void
ARDOUR_UI::setup_transport ()

View File

@ -272,7 +272,7 @@ int
ARDOUR_UI::create_location_ui ()
{
if (location_ui == 0) {
location_ui = new LocationUI ();
location_ui = new LocationUIWindow ();
location_ui->set_session (session);
location_ui->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleLocations")));
}

View File

@ -103,6 +103,7 @@
#include "mixer_strip.h"
#include "editor_route_groups.h"
#include "editor_regions.h"
#include "editor_locations.h"
#include "editor_snapshots.h"
#include "i18n.h"
@ -524,22 +525,7 @@ Editor::Editor ()
_routes = new EditorRoutes (this);
_regions = new EditorRegions (this);
_snapshots = new EditorSnapshots (this);
named_selection_scroller.add (named_selection_display);
named_selection_scroller.set_policy (POLICY_NEVER, POLICY_AUTOMATIC);
named_selection_model = TreeStore::create (named_selection_columns);
named_selection_display.set_model (named_selection_model);
named_selection_display.append_column (_("Chunks"), named_selection_columns.text);
named_selection_display.set_headers_visible (false);
named_selection_display.set_size_request (100, -1);
named_selection_display.set_name ("NamedSelectionDisplay");
named_selection_display.get_selection()->set_mode (SELECTION_SINGLE);
named_selection_display.set_size_request (100, -1);
named_selection_display.signal_button_release_event().connect (mem_fun(*this, &Editor::named_selection_display_button_release), false);
named_selection_display.signal_key_release_event().connect (mem_fun(*this, &Editor::named_selection_display_key_release), false);
named_selection_display.get_selection()->signal_changed().connect (mem_fun (*this, &Editor::named_selection_display_selection_changed));
_locations = new EditorLocations (this);
Gtk::Label* nlabel;
@ -555,12 +541,9 @@ Editor::Editor ()
nlabel = manage (new Label (_("Route Groups")));
nlabel->set_angle (-90);
the_notebook.append_page (_route_groups->widget (), *nlabel);
if (!Profile->get_sae()) {
nlabel = manage (new Label (_("Chunks")));
nlabel->set_angle (-90);
the_notebook.append_page (named_selection_scroller, *nlabel);
}
nlabel = manage (new Label (_("Ranges & Marks")));
nlabel->set_angle (-90);
the_notebook.append_page (_locations->widget (), *nlabel);
the_notebook.set_show_tabs (true);
the_notebook.set_scrollable (true);
@ -1080,8 +1063,6 @@ Editor::connect_to_session (Session *t)
session_connections.push_back (session->PositionChanged.connect (mem_fun(*this, &Editor::map_position_change)));
session_connections.push_back (session->RouteAdded.connect (mem_fun(*this, &Editor::handle_new_route)));
session_connections.push_back (session->DurationChanged.connect (mem_fun(*this, &Editor::handle_new_duration)));
session_connections.push_back (session->NamedSelectionAdded.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
session_connections.push_back (session->NamedSelectionRemoved.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
session_connections.push_back (session->DirtyChanged.connect (mem_fun(*this, &Editor::update_title)));
session_connections.push_back (session->StateSaved.connect (mem_fun(*this, &Editor::update_title_s)));
session_connections.push_back (session->AskAboutPlaylistDeletion.connect (mem_fun(*this, &Editor::playlist_deletion_dialog)));
@ -1164,8 +1145,6 @@ Editor::connect_to_session (Session *t)
handle_new_duration ();
redisplay_named_selections ();
restore_ruler_visibility ();
//tempo_map_changed (Change (0));
session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks);
@ -1197,6 +1176,7 @@ Editor::connect_to_session (Session *t)
_regions->connect_to_session (session);
_snapshots->connect_to_session (session);
_routes->connect_to_session (session);
_locations->connect_to_session (session);
start_updating ();
}
@ -1951,7 +1931,6 @@ Editor::add_selection_context_items (Menu_Helpers::MenuList& edit_items)
edit_items.push_back (MenuElem (_("Crop Region to Range"), mem_fun(*this, &Editor::crop_region_to_selection)));
edit_items.push_back (MenuElem (_("Fill Range with Region"), mem_fun(*this, &Editor::region_fill_selection)));
edit_items.push_back (MenuElem (_("Duplicate Range"), bind (mem_fun(*this, &Editor::duplicate_dialog), false)));
edit_items.push_back (MenuElem (_("Create Chunk from Range"), mem_fun(*this, &Editor::create_named_selection)));
edit_items.push_back (SeparatorElem());
edit_items.push_back (MenuElem (_("Consolidate Range"), bind (mem_fun(*this, &Editor::bounce_range_selection), true, false)));
@ -2022,8 +2001,6 @@ Editor::add_dstream_context_items (Menu_Helpers::MenuList& edit_items)
cutnpaste_items.push_back (SeparatorElem());
cutnpaste_items.push_back (MenuElem (_("Insert chunk"), bind (mem_fun(*this, &Editor::paste_named_selection), 1.0f)));
edit_items.push_back (MenuElem (_("Edit"), *cutnpaste_menu));
/* Adding new material */

View File

@ -122,6 +122,7 @@ class EditorGroupTabs;
class EditorRoutes;
class EditorRouteGroups;
class EditorRegions;
class EditorLocations;
class EditorSnapshots;
/* <CMT Additions> */
@ -948,35 +949,6 @@ class Editor : public PublicEditor
void end_location_changed (ARDOUR::Location*);
/* named selections */
struct NamedSelectionDisplayModelColumns : public Gtk::TreeModel::ColumnRecord {
NamedSelectionDisplayModelColumns() {
add (text);
add (selection);
}
Gtk::TreeModelColumn<Glib::ustring> text;
Gtk::TreeModelColumn<ARDOUR::NamedSelection*> selection;
};
NamedSelectionDisplayModelColumns named_selection_columns;
Glib::RefPtr<Gtk::TreeStore> named_selection_model;
Gtkmm2ext::DnDTreeView<ARDOUR::NamedSelection*> named_selection_display;
Gtk::ScrolledWindow named_selection_scroller;
void create_named_selection ();
void paste_named_selection (float times);
void remove_selected_named_selections ();
void handle_new_named_selection ();
void add_named_selection_to_named_selection_display (ARDOUR::NamedSelection&);
void redisplay_named_selections ();
bool named_selection_display_button_release (GdkEventButton *ev);
bool named_selection_display_key_release (GdkEventKey *ev);
void named_selection_display_selection_changed ();
/* track views */
TrackViewList track_views;
std::pair<TimeAxisView*, ARDOUR::layer_t> trackview_by_y_position (double);
@ -1665,6 +1637,7 @@ public:
EditorRoutes* _routes;
EditorRegions* _regions;
EditorSnapshots* _snapshots;
EditorLocations* _locations;
/* diskstream/route display management */
Glib::RefPtr<Gdk::Pixbuf> rec_enabled_icon;

View File

@ -583,8 +583,6 @@ Editor::register_actions ()
act = ActionManager::register_action (editor_actions, "crop", _("Crop"), mem_fun(*this, &Editor::crop_region_to_selection));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "insert-chunk", _("Insert Chunk"), bind (mem_fun(*this, &Editor::paste_named_selection), 1.0f));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (editor_actions, "start-range", _("Start Range"), mem_fun(*this, &Editor::keyboard_selection_begin));
ActionManager::session_sensitive_actions.push_back (act);

View File

@ -0,0 +1,45 @@
/*
Copyright (C) 2009 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 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.
*/
#include "editor_locations.h"
#include "location_ui.h"
#include "i18n.h"
using namespace ARDOUR;
using namespace Gtk;
EditorLocations::EditorLocations (Editor* e)
: EditorComponent (e)
{
locations = new LocationUI;
}
void
EditorLocations::connect_to_session (ARDOUR::Session* s)
{
EditorComponent::connect_to_session (s);
locations->set_session (s);
}
Widget&
EditorLocations::widget()
{
return *locations;
}

View File

@ -0,0 +1,45 @@
/*
Copyright (C) 2000-2009 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 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.
*/
#ifndef __gtk_ardour_editor_locations_h__
#define __gtk_ardour_editor_locations_h__
#include "editor_component.h"
class LocationUI;
namespace Gtk {
class Widget;
}
class EditorLocations : public EditorComponent
{
public:
EditorLocations (Editor *);
void connect_to_session (ARDOUR::Session *);
Gtk::Widget& widget ();
private:
LocationUI* locations;
};
#endif /* __gtk_ardour_editor_locations_h__ */

View File

@ -360,10 +360,6 @@ Editor::session_going_away ()
_routes->clear ();
_route_groups->clear ();
named_selection_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
named_selection_model->clear ();
named_selection_display.set_model (named_selection_model);
edit_point_clock_connection_a.disconnect();
edit_point_clock_connection_b.disconnect();

View File

@ -44,7 +44,6 @@
#include "ardour/audio_diskstream.h"
#include "ardour/utils.h"
#include "ardour/location.h"
#include "ardour/named_selection.h"
#include "ardour/audio_track.h"
#include "ardour/audioplaylist.h"
#include "ardour/region_factory.h"
@ -4344,62 +4343,6 @@ Editor::paste_internal (nframes64_t position, float times)
}
}
void
Editor::paste_named_selection (float times)
{
TrackSelection::iterator t;
Glib::RefPtr<TreeSelection> selected = named_selection_display.get_selection();
if (selected->count_selected_rows() != 1 || selection->tracks.empty()) {
return;
}
TreeModel::iterator i = selected->get_selected();
NamedSelection* ns = (*i)[named_selection_columns.selection];
list<boost::shared_ptr<Playlist> >::iterator chunk;
list<boost::shared_ptr<Playlist> >::iterator tmp;
chunk = ns->playlists.begin();
begin_reversible_command (_("paste chunk"));
sort_track_selection ();
for (t = selection->tracks.begin(); t != selection->tracks.end(); ++t) {
RouteTimeAxisView* rtv;
boost::shared_ptr<Playlist> pl;
boost::shared_ptr<AudioPlaylist> apl;
if ((rtv = dynamic_cast<RouteTimeAxisView*> (*t)) == 0) {
continue;
}
if ((pl = rtv->playlist()) == 0) {
continue;
}
if ((apl = boost::dynamic_pointer_cast<AudioPlaylist> (pl)) == 0) {
continue;
}
tmp = chunk;
++tmp;
XMLNode &before = apl->get_state();
apl->paste (*chunk, get_preferred_edit_position(), times);
session->add_command(new MementoCommand<AudioPlaylist>(*apl, &before, &apl->get_state()));
if (tmp != ns->playlists.end()) {
chunk = tmp;
}
}
commit_reversible_command();
}
void
Editor::duplicate_some_regions (RegionSelection& regions, float times)
{

View File

@ -16,6 +16,8 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __gtk_ardour_editor_regions_h__
#define __gtk_ardour_editor_regions_h__
#include "editor_component.h"
@ -148,4 +150,4 @@ private:
std::list<boost::shared_ptr<ARDOUR::Region> > tmp_region_list;
};
#endif /* __gtk_ardour_editor_regions_h__ */

View File

@ -620,21 +620,14 @@ LocationEditRow::focus_name() {
LocationUI::LocationUI ()
: ArdourDialog ("locations dialog"),
add_location_button (_("Add New Location")),
add_range_button (_("Add New Range"))
: session (0)
, add_location_button (_("Add New Location"))
, add_range_button (_("Add New Range"))
{
i_am_the_modifier = 0;
set_title (_("Locations"));
set_wmclass(X_("ardour_locations"), "Ardour");
set_name ("LocationWindow");
get_vbox()->pack_start (location_hpacker);
location_vpacker.set_spacing (5);
location_vpacker.pack_start (loop_edit_row, false, false);
location_vpacker.pack_start (punch_edit_row, false, false);
@ -681,28 +674,20 @@ LocationUI::LocationUI ()
loc_range_panes.pack2(range_frame, true, false);
location_vpacker.pack_start (loc_range_panes, true, true);
location_hpacker.pack_start (location_vpacker, true, true);
pack_start (location_vpacker, true, true);
add_location_button.signal_clicked().connect (mem_fun(*this, &LocationUI::add_new_location));
add_range_button.signal_clicked().connect (mem_fun(*this, &LocationUI::add_new_range));
//add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_RELEASE_MASK);
show_all ();
}
LocationUI::~LocationUI()
{
}
void LocationUI::on_show()
{
ArdourDialog::on_show();
refresh_location_list();
}
gint LocationUI::do_location_remove (ARDOUR::Location *loc)
gint
LocationUI::do_location_remove (ARDOUR::Location *loc)
{
/* this is handled internally by Locations, but there's
no point saving state etc. when we know the marker
@ -723,24 +708,23 @@ gint LocationUI::do_location_remove (ARDOUR::Location *loc)
return FALSE;
}
void LocationUI::location_remove_requested (ARDOUR::Location *loc)
void
LocationUI::location_remove_requested (ARDOUR::Location *loc)
{
// must do this to prevent problems when destroying
// the effective sender of this event
Glib::signal_idle().connect (bind (mem_fun(*this, &LocationUI::do_location_remove), loc));
Glib::signal_idle().connect (bind (mem_fun(*this, &LocationUI::do_location_remove), loc));
}
void LocationUI::location_redraw_ranges ()
void
LocationUI::location_redraw_ranges ()
{
range_rows.hide();
range_rows.show();
}
void
LocationUI::location_added (Location* location)
{
@ -896,6 +880,8 @@ LocationUI::refresh_location_list ()
loc_children.clear();
range_children.clear();
cerr << "about to map locations with session = " << session << endl;
if (session) {
session->locations()->apply (*this, &LocationUI::map_locations);
}
@ -903,9 +889,9 @@ LocationUI::refresh_location_list ()
}
void
LocationUI::set_session(ARDOUR::Session* sess)
LocationUI::set_session(ARDOUR::Session* s)
{
ArdourDialog::set_session (sess);
session = s;
if (session) {
session->locations()->changed.connect (mem_fun(*this, &LocationUI::refresh_location_list));
@ -922,8 +908,6 @@ LocationUI::session_gone()
{
ENSURE_GUI_THREAD(mem_fun(*this, &LocationUI::session_gone));
hide_all();
using namespace Box_Helpers;
BoxList & loc_children = location_rows.children();
BoxList & range_children = range_rows.children();
@ -936,13 +920,53 @@ LocationUI::session_gone()
punch_edit_row.set_session (0);
punch_edit_row.set_location (0);
}
ArdourDialog::session_gone ();
/*------------------------*/
LocationUIWindow::LocationUIWindow ()
: ArdourDialog ("locations dialog")
{
set_title (_("Locations"));
set_wmclass(X_("ardour_locations"), "Ardour");
set_name ("LocationWindow");
get_vbox()->pack_start (_ui);
}
LocationUIWindow::~LocationUIWindow()
{
}
void
LocationUIWindow::on_show()
{
cerr << "Show loc list\n";
_ui.refresh_location_list();
ArdourDialog::on_show();
}
bool
LocationUI::on_delete_event (GdkEventAny*)
LocationUIWindow::on_delete_event (GdkEventAny*)
{
hide ();
return true;
}
void
LocationUIWindow::set_session (Session *s)
{
cerr << "Setting session in LUW, with s = " << s << "\n";
ArdourDialog::set_session (s);
_ui.set_session (s);
s->GoingAway.connect (mem_fun (*this, &LocationUIWindow::session_gone));
}
void
LocationUIWindow::session_gone ()
{
hide_all();
ArdourDialog::session_gone ();
}

View File

@ -26,10 +26,13 @@
#include <gtkmm/table.h>
#include <gtkmm/entry.h>
#include <gtkmm/label.h>
#include <gtkmm/paned.h>
#include <gtkmm/scrolledwindow.h>
#include "ardour/location.h"
#include "ardour_dialog.h"
#include "audio_clock.h"
namespace ARDOUR {
class LocationStack;
@ -137,25 +140,28 @@ class LocationEditRow : public Gtk::HBox
};
class LocationUI : public ArdourDialog
class LocationUI : public Gtk::HBox
{
public:
LocationUI ();
~LocationUI ();
virtual void set_session (ARDOUR::Session *);
void set_session (ARDOUR::Session *);
void add_new_location();
void add_new_range();
void on_show();
void refresh_location_list ();
void refresh_location_list_s (ARDOUR::Change);
private:
ARDOUR::Session* session;
ARDOUR::LocationStack* locations;
ARDOUR::Location *newest_location;
void session_gone();
Gtk::VBox location_vpacker;
Gtk::HBox location_hpacker;
LocationEditRow loop_edit_row;
LocationEditRow punch_edit_row;
@ -174,7 +180,6 @@ class LocationUI : public ArdourDialog
Gtk::ScrolledWindow range_rows_scroller;
Gtk::VBox range_rows;
/* When any location changes it start
or end points, it sends a signal that is caught
by one of these functions
@ -188,17 +193,26 @@ class LocationUI : public ArdourDialog
guint32 i_am_the_modifier;
void add_new_location();
void add_new_range();
void refresh_location_list ();
void refresh_location_list_s (ARDOUR::Change);
void location_removed (ARDOUR::Location *);
void location_added (ARDOUR::Location *);
void map_locations (ARDOUR::Locations::LocationList&);
};
class LocationUIWindow : public ArdourDialog
{
public:
LocationUIWindow ();
~LocationUIWindow ();
void on_show();
void set_session (ARDOUR::Session *);
LocationUI& ui() { return _ui; }
protected:
LocationUI _ui;
bool on_delete_event (GdkEventAny*);
void session_gone();
};
#endif // __ardour_location_ui_h__

View File

@ -82,6 +82,7 @@ gtk2_ardour_sources = [
'editor_hscroller.cc',
'editor_keyboard.cc',
'editor_keys.cc',
'editor_locations.cc',
'editor_markers.cc',
'editor_mixer.cc',
'editor_mouse.cc',
@ -92,7 +93,6 @@ gtk2_ardour_sources = [
'editor_rulers.cc',
'editor_scrub.cc',
'editor_selection.cc',
'editor_selection_list.cc',
'editor_snapshots.cc',
'editor_summary.cc',
'editor_tempodisplay.cc',

View File

@ -1684,11 +1684,14 @@ TempoMap::bbt_add (const BBT_Time& start, const BBT_Time& other) const
return bbt_add (start, other, metric);
}
/**
* add the BBT interval @param increment to @param start and return the result
*/
BBT_Time
TempoMap::bbt_add (const BBT_Time& start, const BBT_Time& other, const TempoMetric& metric) const
TempoMap::bbt_add (const BBT_Time& start, const BBT_Time& increment, const TempoMetric& metric) const
{
BBT_Time result = start;
BBT_Time op = other;
BBT_Time op = increment; /* argument is const, but we need to modify it */
uint32_t ticks = result.ticks + op.ticks;
if (ticks >= Meter::ticks_per_beat) {
@ -1780,11 +1783,14 @@ TempoMap::bbt_add (const BBT_Time& start, const BBT_Time& other, const TempoMetr
return result;
}
/**
* subtract the BBT interval @param decrement from @param start and return the result
*/
BBT_Time
TempoMap::bbt_subtract (const BBT_Time& start, const BBT_Time& other) const
TempoMap::bbt_subtract (const BBT_Time& start, const BBT_Time& decrement) const
{
BBT_Time result = start;
BBT_Time op = other;
BBT_Time op = decrement; /* argument is const, but we need to modify it */
if (op.ticks > result.ticks) {
/* subtract an extra beat later; meanwhile set ticks to the right "carry" value */