Move Track enabled/locked state to GUI model.

This commit is contained in:
Stefan Kangas 2010-12-27 07:16:02 +01:00 committed by Stefan Kangas
parent ebd93b0f12
commit c01d6dbd0b
4 changed files with 262 additions and 109 deletions

View file

@ -33,6 +33,8 @@ namespace model {
const list< shared_ptr<Track> > Track::NoChildren;
Track::Track()
: enabled(true),
locked(false)
{
}
@ -43,12 +45,38 @@ Track::get_child_tracks() const
return Track::NoChildren;
}
bool
Track::getEnabled() const
{
return enabled;
}
bool
Track::getLocked() const
{
return locked;
}
const string
Track::get_name() const
{
return name;
}
void
Track::setEnabled(bool enabled)
{
this->enabled = enabled;
enabledChangedSignal.emit(enabled);
}
void
Track::setLocked(bool locked)
{
this->locked = locked;
lockedChangedSignal.emit(locked);
}
void
Track::set_name(const string &name)
{
@ -75,8 +103,20 @@ Track::find_descendant_track_parent(
return shared_ptr<ParentTrack>();
}
sigc::signal<void, bool>
Track::signalEnabledChanged() const
{
return enabledChangedSignal;
}
sigc::signal<void, bool>
Track::signalLockedChanged() const
{
return lockedChangedSignal;
}
sigc::signal<void, std::string>
Track::signal_name_changed() const
Track::signalNameChanged() const
{
return nameChangedSignal;
}

View file

@ -48,27 +48,56 @@ protected:
public:
/**
* Returns true if this track can own any child tracks.
**/
virtual bool
can_host_children () const;
/**
* Gets the list of child tracks.
**/
virtual const std::list< boost::shared_ptr<Track> >&
get_child_tracks() const;
get_child_tracks () const;
/**
* Gets the enabled status of this track, i.e. if the track is to be rendered.
**/
bool
getEnabled () const;
/**
* Gets the locked status of this track, i.e. if the track can be edited.
**/
bool
getLocked () const;
/**
* Gets the name of this track.
**/
const std::string get_name() const;
const std::string
get_name () const;
/**
* Sets the enabled status of this track, i.e. if the track is to be rendered.
* @param[in] name The new enabled status.
**/
void
setEnabled (bool enabled);
/**
* Gets the locked status of this track, i.e. if the track can be edited.
* @param[in] name The new locked status.
**/
void
setLocked (bool locked);
/**
* Sets the name of this track.
* @param[in] name The new name to set this track to.
**/
void set_name(const std::string &name);
/**
* Returns true if this track can own any child tracks.
**/
virtual bool can_host_children() const;
void
set_name (const std::string &name);
/**
* A utility function that attempts to find the parent of a track by
@ -78,59 +107,94 @@ public:
* shared_ptr if none was found.
**/
virtual boost::shared_ptr<ParentTrack>
find_descendant_track_parent(boost::shared_ptr<Track> child);
find_descendant_track_parent (boost::shared_ptr<Track> child);
public:
/**
* A signal which fires when the enabled status changes.
* @return Returns the signal. The signal sends the new name for the
* track.
**/
sigc::signal<void, bool>
signalEnabledChanged () const;
/**
* A signal which fires when the locked status changes changes.
* @return Returns the signal. The signal sends the new name for the
* track.
**/
sigc::signal<void, bool>
signalLockedChanged () const;
/**
* A signal which fires when the name changes.
* @return Returns the signal. The signal sends the new name for the
* track.
**/
sigc::signal<void, std::string> signal_name_changed() const;
sigc::signal<void, std::string>
signalNameChanged () const;
public:
/**
* A debugging helper function that prints this track, and all it's
* child tracks in a human-readable form.
* @return Returns the human readable string.
**/
std::string print_branch();
std::string
print_branch ();
/**
* A pure-virtual function which is the base of functions that print
* this track in human readable form.
* @return Returns the human readable string.
**/
virtual std::string print_track() = 0;
virtual std::string
print_track () = 0;
protected:
/**
* The internal implementation of print_branch.
* @param indentation The level of recursion into the tree. This value
* is used to specify the width of indentation to print with.
* @return Returns the human readable string.
**/
std::string print_branch_recursive(const unsigned int indentation);
private:
//----- Data -----//
/**
* The name of this track.
**/
std::string name;
/**
* A signal which fires when the name changes.
**/
sigc::signal<void, std::string> nameChangedSignal;
protected:
/**
* An object used internally as a return value for when there's no
* children.
**/
static const std::list< boost::shared_ptr<Track> > NoChildren;
/**
* The internal implementation of print_branch.
* @param indentation The level of recursion into the tree. This value
* is used to specify the width of indentation to print with.
* @return Returns the human readable string.
**/
std::string
print_branch_recursive (const unsigned int indentation);
private:
/**
* The name of this track.
**/
std::string name;
/**
* True if this track is enabled, i.e. will not be rendered.
*/
bool enabled;
/**
* True if this track is locked, i.e. cannot be edited.
*/
bool locked;
/**
* A signal which fires when the enabled status changes.
**/
sigc::signal<void, bool> enabledChangedSignal;
/**
* A signal which fires when the locked status changes.
**/
sigc::signal<void, bool> lockedChangedSignal;
/**
* A signal which fires when the name changes.
**/
sigc::signal<void, std::string> nameChangedSignal;
};
} // namespace model

View file

@ -40,10 +40,8 @@ Track::Track(TimelineWidget &timeline_widget,
shared_ptr<model::Track> track) :
timelineWidget(timeline_widget),
model_track(track),
enabled(true),
expanded(true),
expandDirection(None),
locked(false),
headerWidget(*this),
enableButton(Gtk::StockID("track_enabled"), WindowManager::MenuIconSize),
lockButton(Gtk::StockID("track_unlocked"), WindowManager::MenuIconSize)
@ -53,8 +51,8 @@ Track::Track(TimelineWidget &timeline_widget,
titleMenuButton.set_relief(RELIEF_HALF);
titleMenuButton.unset_flags(CAN_FOCUS);
buttonBar.append(enableButton, mem_fun(this, &Track::on_enable));
buttonBar.append(lockButton, mem_fun(this, &Track::on_lock));
buttonBar.append(enableButton, mem_fun(this, &Track::onToggleEnabled));
buttonBar.append(lockButton, mem_fun(this, &Track::onToggleLocked));
headerWidget.set_child_widget(headerBox);
@ -71,11 +69,11 @@ Track::Track(TimelineWidget &timeline_widget,
title_list.push_back( Menu_Helpers::MenuElem(_("_Remove"),
mem_fun(this, &Track::on_remove_track) ) );
update_name();
// Setup tooltips
enableButton.set_tooltip_text(_("Disable track"));
lockButton.set_tooltip_text(_("Lock track"));
updateEnableButton();
updateLockButton();
updateName();
// Setup the context menu
Menu::MenuList& context_list = contextMenu.items();
@ -85,9 +83,12 @@ Track::Track(TimelineWidget &timeline_widget,
mem_fun(this, &Track::on_remove_track) ) );
// Connect to the model
model_track->signal_name_changed().connect(sigc::mem_fun(this,
&Track::on_name_changed));
model_track->signalEnabledChanged().connect(sigc::mem_fun(this,
&Track::onEnabledChanged));
model_track->signalLockedChanged().connect(sigc::mem_fun(this,
&Track::onLockedChanged));
model_track->signalNameChanged().connect(sigc::mem_fun(this,
&Track::onNameChanged));
}
Track::~Track()
@ -226,42 +227,15 @@ Track::show_header_context_menu(guint button, guint32 time)
}
void
Track::update_name()
Track::onEnabledChanged(bool)
{
REQUIRE(model_track);
titleMenuButton.set_label(model_track->get_name());
updateEnableButton();
}
void
Track::on_enable()
Track::onLockedChanged(bool)
{
enabled = !enabled;
if (enabled)
{
enableButton.set_stock_id(Gtk::StockID("track_enabled"), WindowManager::MenuIconSize);
enableButton.set_tooltip_text(_("Disable track"));
}
else
{
enableButton.set_stock_id(Gtk::StockID("track_disabled"), WindowManager::MenuIconSize);
enableButton.set_tooltip_text(_("Enable track"));
}
}
void
Track::on_lock()
{
locked = !locked;
if (locked)
{
lockButton.set_stock_id(Gtk::StockID("track_locked"), WindowManager::MenuIconSize);
lockButton.set_tooltip_text(_("Unlock track"));
}
else
{
lockButton.set_stock_id(Gtk::StockID("track_unlocked"), WindowManager::MenuIconSize);
lockButton.set_tooltip_text(_("Lock track"));
}
updateLockButton();
}
void
@ -281,9 +255,9 @@ Track::on_set_name()
}
void
Track::on_name_changed(std::string)
Track::onNameChanged(std::string)
{
update_name();
updateName();
}
void
@ -296,6 +270,61 @@ Track::on_remove_track()
state->get_sequence()->remove_descendant_track(model_track);
}
void
Track::onToggleEnabled()
{
bool status = model_track->getEnabled();
model_track->setEnabled(!status);
}
void
Track::onToggleLocked()
{
bool status = model_track->getLocked();
model_track->setLocked(!status);
}
void
Track::updateEnableButton()
{
REQUIRE (model_track);
if (model_track->getEnabled())
{
enableButton.set_stock_id(Gtk::StockID("track_enabled"), WindowManager::MenuIconSize);
enableButton.set_tooltip_text(_("Disable track"));
}
else
{
enableButton.set_stock_id(Gtk::StockID("track_disabled"), WindowManager::MenuIconSize);
enableButton.set_tooltip_text(_("Enable track"));
}
}
void
Track::updateLockButton()
{
REQUIRE (model_track);
if (model_track->getLocked())
{
lockButton.set_stock_id(Gtk::StockID("track_locked"), WindowManager::MenuIconSize);
lockButton.set_tooltip_text(_("Unlock track"));
}
else
{
lockButton.set_stock_id(Gtk::StockID("track_unlocked"), WindowManager::MenuIconSize);
lockButton.set_tooltip_text(_("Lock track"));
}
}
void
Track::updateName()
{
REQUIRE(model_track);
titleMenuButton.set_label(model_track->get_name());
}
} // namespace timeline
} // namespace widgets
} // namespace gui

View file

@ -62,6 +62,9 @@ public:
};
public:
/**
* Constructor
*/
Track(TimelineWidget &timeline_widget,
boost::shared_ptr<model::Track> track);
@ -74,6 +77,10 @@ public:
boost::shared_ptr<model::Track> get_model_track() const;
/**
* Return the visual height of the track in pixels.
* @return The visual height of the track in pixels.
*/
int get_height() const;
/**
@ -125,45 +132,63 @@ public:
virtual void draw_track(Cairo::RefPtr<Cairo::Context> cairo,
TimelineViewWindow* const window)
const = 0;
public:
//----- Constants -----//
private:
/**
* Specifies the period of the expand animation in seconds.
**/
static const float ExpandAnimationPeriod;
private:
//----- Internals -----//
void update_name();
private:
//----- Event Handlers -----//
void on_enable();
void on_lock();
/**
* Event handler for when the enabled status changes.
**/
void onEnabledChanged(bool);
/**
* Event handler for when the track name changes.
**/
void onNameChanged(std::string);
/**
* Event handler for when the user requested to remove the track.
**/
void on_remove_track();
/**
* Event handler for when the locked status changes.
**/
void onLockedChanged(bool);
/**
* Event handler for when the user requested a name change.
**/
void on_set_name();
/**
* Event handler for when the track name changes
**/
void on_name_changed(std::string);
* Event handler for when the user pressed the Enable button.
*/
void onToggleEnabled();
/**
* Event handler for when the user pressed the Lock button.
*/
void onToggleLocked();
void updateEnableButton();
void updateLockButton();
void updateName();
void on_remove_track();
protected:
TimelineWidget &timelineWidget;
boost::shared_ptr<model::Track> model_track;
private:
/**
* True if this track is enabled.
*/
bool enabled;
/**
* This bool is true if this branch is expanded. false if it is
* collapsed.
@ -194,11 +219,6 @@ private:
**/
boost::scoped_ptr<Glib::Timer> expand_timer;
/**
* True if this track is locked.
*/
bool locked;
//----- Header Widgets ------//
timeline::TimelineHeaderWidget headerWidget;