fix control layout size allocation (nearly done) and make duplicate region even more useful for multiple selected regions

git-svn-id: svn://localhost/trunk/ardour2@250 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2006-01-08 14:50:41 +00:00
parent a6ab33815a
commit b5e4144156
9 changed files with 64 additions and 29 deletions

View File

@ -391,6 +391,7 @@ Editor::Editor (AudioEngine& eng)
controls_layout.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::ENTER_NOTIFY_MASK|Gdk::LEAVE_NOTIFY_MASK);
controls_layout.signal_button_release_event().connect (mem_fun(*this, &Editor::edit_controls_button_release));
controls_layout.signal_size_request().connect (mem_fun (*this, &Editor::controls_layout_size_request));
edit_vscrollbar.set_adjustment (vertical_adjustment);
edit_hscrollbar.set_adjustment (horizontal_adjustment);

View File

@ -651,6 +651,7 @@ class Editor : public PublicEditor
Gtk::Layout controls_layout;
bool Editor::control_layout_scroll (GdkEventScroll* ev);
void controls_layout_size_request (Gtk::Requisition*);
Gtk::HScrollbar edit_hscrollbar;
bool edit_hscroll_dragging;

View File

@ -383,13 +383,41 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc)
// XXX what is the correct height value for the time canvas ? this overstates it
time_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height);
controls_layout.queue_resize();
}
void
Editor::controls_layout_size_request (Requisition* req)
{
TreeModel::Children rows = route_display_model->children();
TreeModel::Children::iterator i;
double pos;
for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
TimeAxisView *tv = (*i)[route_display_columns.tv];
pos += tv->effective_height;
pos += track_spacing;
}
RefPtr<Gdk::Screen> screen = get_screen();
if (!screen) {
screen = Gdk::Screen::get_default();
}
/* never let the width of the controls area shrink horizontally */
edit_controls_vbox.check_resize();
int w = max (edit_controls_vbox.get_width(), controls_layout.get_width());
controls_layout.set_size_request (w, min ((gint) pos, (screen->get_height() - 400)));
controls_layout.set_size (w, (gint) pos);
req->width = max (edit_controls_vbox.get_width(), controls_layout.get_width());
req->height = min ((gint) pos, (screen->get_height() - 400));
/* this one is important: it determines how big the layout thinks it really is, as
opposed to what it displays on the screen
*/
controls_layout.set_size (req->width, (gint) pos);
}
bool

View File

@ -3279,10 +3279,13 @@ void
Editor::duplicate_some_regions (AudioRegionSelection& regions, float times)
{
Playlist *playlist;
AudioRegionSelection sel = regions; // clear (below) will clear the argument list
begin_reversible_command (_("duplicate region"));
for (AudioRegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) {
selection->clear_audio_regions ();
for (AudioRegionSelection::iterator i = sel.begin(); i != sel.end(); ++i) {
Region& r ((*i)->region);
@ -3296,11 +3299,12 @@ Editor::duplicate_some_regions (AudioRegionSelection& regions, float times)
session->add_redo_no_execute (playlist->get_memento());
c.disconnect ();
if (latest_regionview) {
selection->add (latest_regionview);
}
}
if (latest_regionview) {
selection->set (latest_regionview);
}
commit_reversible_command ();
}

View File

@ -81,7 +81,6 @@ Editor::handle_new_route (Route& route)
tv->GoingAway.connect (bind (mem_fun(*this, &Editor::remove_route), tv));
editor_mixer_button.set_sensitive(true);
}
void

View File

@ -3,7 +3,7 @@
#include <list>
#include <string>
#include <vector>
#include <set>
#include <sigc++/signal.h>
@ -13,7 +13,6 @@ namespace ARDOUR {
typedef uint32_t state_id_t;
class StateManager : public sigc::trackable
{
public:
@ -36,13 +35,12 @@ class StateManager : public sigc::trackable
state_id_t _current_state_id;
static void set_allow_save (bool);
static bool allow_save ();
static void prohibit_save ();
static void allow_save (const char* why, bool dosave);
protected:
static bool _allow_save;
typedef std::pair<StateManager*,std::string> DeferredSave;
static std::vector<DeferredSave> deferred;
static std::set<StateManager*> deferred;
StateMap states;

View File

@ -1445,7 +1445,7 @@ Session::set_state (const XMLNode& node)
return -1;
}
StateManager::set_allow_save (false);
StateManager::prohibit_save ();
if ((prop = node.property ("name")) != 0) {
_name = prop->value ();
@ -1607,7 +1607,7 @@ Session::set_state (const XMLNode& node)
_state_of_the_state = Clean;
StateManager::set_allow_save (true);
StateManager::allow_save (_("initial state"), true);
if (state_was_pending) {
save_state (_current_snapshot_name);
@ -1615,11 +1615,11 @@ Session::set_state (const XMLNode& node)
state_was_pending = false;
}
ret = 0;
return 0;
out:
/* yes, doing it twice doesn't hurt and makes the code easier */
StateManager::set_allow_save (true);
/* we failed, re-enable state saving but don't actually save internal state */
StateManager::allow_save (X_("ignored"), false);
return ret;
}

View File

@ -7,7 +7,7 @@ using namespace ARDOUR;
using namespace std;
bool StateManager::_allow_save = true;
vector<StateManager::DeferredSave> StateManager::deferred;
set<StateManager*> StateManager::deferred;
StateManager::StateManager ()
{
@ -19,16 +19,21 @@ StateManager::~StateManager()
}
void
StateManager::set_allow_save (bool yn)
StateManager::prohibit_save ()
{
_allow_save = yn;
_allow_save = false;
}
if (yn) {
for (vector<DeferredSave>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
(*x).first->save_state ((*x).second);
void
StateManager::allow_save (const char* why, bool do_save)
{
_allow_save = true;
if (do_save) {
for (set<StateManager*>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
(*x)->save_state (why);
}
deferred.clear ();
}
deferred.clear ();
}
void
@ -69,7 +74,7 @@ void
StateManager::save_state (std::string why)
{
if (!_allow_save) {
deferred.push_back (DeferredSave (this, why));
deferred.insert (this);
return;
}

View File

@ -233,7 +233,6 @@ UI::quit ()
static bool idle_quit ()
{
cerr << "idle quit, level = " << Main::level() << endl;
Main::quit ();
return true;
}