Improved switching implementation

This commit is contained in:
Joel Holdsworth 2009-04-13 16:11:50 +01:00
parent 53f987e63d
commit 653f820c7e
12 changed files with 207 additions and 99 deletions

View file

@ -22,12 +22,16 @@
#include "panel.hpp"
#include "../gtk-lumiera.hpp"
#include "../workspace/panel-manager.hpp"
#include "../workspace/workspace-window.hpp"
#include <libgdl-1.0/gdl/gdl-dock-item-grip.h>
using namespace Gtk;
namespace gui {
namespace panels {
Panel::Panel(workspace::WorkspaceWindow &workspace_window,
/*Panel::Panel(workspace::WorkspaceWindow &workspace_window,
const gchar *name, const gchar *long_name,
GdlDockItemBehavior behavior) :
workspace(workspace_window),
@ -59,55 +63,88 @@ Panel::Panel(workspace::WorkspaceWindow &workspace_window,
internal_setup();
ENSURE(dock_item != NULL);
}*/
Panel::Panel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item, const gchar *stock_id) :
panelManager(panel_manager),
dockItem(dock_item),
panelBar(*this, stock_id)
{
REQUIRE(dockItem);
g_object_ref(dockItem);
// Set the dock item title
StockItem stock_item;
REQUIRE(StockItem::lookup(Gtk::StockID(stock_id), stock_item));
Glib::Value<std::string> val;
val.init(val.value_type());
val.set(stock_item.get_label());
g_object_set_property (G_OBJECT (dockItem), "long-name", val.gobj());
// Set the grip handle
GdlDockItemGrip *grip = GDL_DOCK_ITEM_GRIP(
gdl_dock_item_get_grip(dockItem));
gdl_dock_item_grip_show_handle(grip);
gdl_dock_item_grip_set_label(grip, ((Widget&)panelBar).gobj());
// Set up the panel body
gtk_container_add ((GtkContainer*)dockItem, (GtkWidget*)gobj());
gtk_widget_show ((GtkWidget*)dockItem);
}
Panel::~Panel()
{
REQUIRE(dock_item != NULL);
g_object_unref(dock_item);
dock_item = NULL;
REQUIRE(dockItem != NULL);
g_object_unref(dockItem);
dockItem = NULL;
}
GdlDockItem*
Panel::get_dock_item() const
{
return dock_item;
return dockItem;
}
void
Panel::show(bool show)
{
REQUIRE(dock_item != NULL);
if(show) gdl_dock_item_show_item (dock_item);
else gdl_dock_item_hide_item (dock_item);
REQUIRE(dockItem != NULL);
if(show) gdl_dock_item_show_item (dockItem);
else gdl_dock_item_hide_item (dockItem);
}
bool
Panel::is_shown() const
{
REQUIRE(dock_item != NULL);
return GTK_WIDGET_VISIBLE((GtkWidget*)dock_item);
REQUIRE(dockItem != NULL);
return GTK_WIDGET_VISIBLE((GtkWidget*)dockItem);
}
workspace::PanelManager&
Panel::get_panel_manager()
{
return panelManager;
}
workspace::WorkspaceWindow&
Panel::get_workspace_window()
{
return workspace;
return panelManager.get_workspace_window();
}
void
Panel::internal_setup()
model::Project&
Panel::get_project()
{
REQUIRE(dock_item != NULL);
REQUIRE(gobj() != NULL);
GdlDockItemGrip *grip = GDL_DOCK_ITEM_GRIP(
gdl_dock_item_get_grip(dock_item));
gdl_dock_item_grip_show_handle(grip);
gdl_dock_item_grip_set_label(grip, ((Widget&)panelBar).gobj());
gtk_container_add ((GtkContainer*)dock_item, (GtkWidget*)gobj());
gtk_widget_show ((GtkWidget*)dock_item);
return panelManager.get_workspace_window().get_project();
}
controller::Controller&
Panel::get_controller()
{
return panelManager.get_workspace_window().get_controller();
}
} // namespace panels

View file

@ -35,7 +35,7 @@
namespace gui {
namespace workspace {
class WorkspaceWindow;
class PanelManager;
}
namespace panels {
@ -53,9 +53,9 @@ protected:
* @param long_name The name to display on the caption
* @param behavior The GDL behaviour of this item
*/
Panel(workspace::WorkspaceWindow &workspace_window,
const gchar *name, const gchar *long_name,
GdlDockItemBehavior behavior = GDL_DOCK_ITEM_BEH_NORMAL);
//Panel(workspace::WorkspaceWindow &workspace_window,
// const gchar *name, const gchar *long_name,
// GdlDockItemBehavior behavior = GDL_DOCK_ITEM_BEH_NORMAL);
/**
* Constructs a panel object with a stock item for a caption
@ -65,9 +65,18 @@ protected:
* @param stock_id The id of the stock item to display on the caption
* @param behavior The GDL behaviour of this item
*/
Panel(workspace::WorkspaceWindow &owner_window,
const gchar *name, const gchar *long_name, const gchar *stock_id,
GdlDockItemBehavior behavior = GDL_DOCK_ITEM_BEH_NORMAL);
//Panel(workspace::WorkspaceWindow &owner_window,
// const gchar *name, const gchar *long_name, const gchar *stock_id,
// GdlDockItemBehavior behavior = GDL_DOCK_ITEM_BEH_NORMAL);
/**
* Contructor.
* @param panel_manager The owner panel manager widget.
* @param dock_item The GdlDockItem that will host this panel.
* @param stock_id The stock_id of this panel.
**/
Panel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item, const gchar *stock_id);
public:
/**
@ -92,25 +101,44 @@ public:
*/
bool is_shown() const;
/**
* Returns a reference to the owner panel manager object.
**/
workspace::PanelManager& get_panel_manager();
protected:
/**
* Returns a reference to the owner workspace window object.
**/
workspace::WorkspaceWindow& get_workspace_window();
private:
/**
* @internal Used by both constructors
* The internal constructor for this class, whose purpose
* is to set up the internal container widgets.
*/
void internal_setup();
* Returns a reference to the project
**/
model::Project& get_project();
/**
* Returns a reference to the controller
**/
controller::Controller& get_controller();
protected:
workspace::WorkspaceWindow &workspace;
/**
* The owner panel manager object.
**/
workspace::PanelManager &panelManager;
GdlDockItem* dock_item;
/**
* The owner dock item widget that will host the widgets in this
* panel.
**/
GdlDockItem* dockItem;
/**
* The panel bar to attach to the panel grip.
**/
widgets::PanelBar panelBar;
};

View file

@ -26,8 +26,9 @@
namespace gui {
namespace panels {
ResourcesPanel::ResourcesPanel(workspace::WorkspaceWindow &workspace_window) :
Panel(workspace_window, "resources", get_title(), get_stock_id())
ResourcesPanel::ResourcesPanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item) :
Panel(panel_manager, dock_item, get_stock_id())
{
notebook.append_page(media, _("Media"));
notebook.append_page(clips, _("Clips"));

View file

@ -34,12 +34,13 @@ namespace panels {
class ResourcesPanel : public Panel
{
public:
/**
* Contructor.
* @param workspace_window The window that owns this panel.
* @param panel_manager The owner panel manager widget.
* @param dock_item The GdlDockItem that will host this panel.
**/
ResourcesPanel(workspace::WorkspaceWindow &workspace_window);
ResourcesPanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item);
/**
* Get the title of the panel.

View file

@ -46,9 +46,9 @@ namespace panels {
const int TimelinePanel::ZoomToolSteps = 2; // 2 seems comfortable
TimelinePanel::TimelinePanel(workspace::WorkspaceWindow
&workspace_window) :
Panel(workspace_window, "timeline", get_title(), get_stock_id()),
TimelinePanel::TimelinePanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item) :
Panel(panel_manager, dock_item, get_stock_id()),
timeIndicator(),
timeIndicatorButton(),
previousButton(Stock::MEDIA_PREVIOUS),
@ -65,8 +65,8 @@ TimelinePanel::TimelinePanel(workspace::WorkspaceWindow
currentTool(timeline::IBeam)
{
// Hook up notifications
workspace.get_project().get_sequences().signal_changed().connect(
mem_fun(this, &TimelinePanel::on_sequence_list_changed));
get_project().get_sequences().signal_changed().connect(mem_fun(this,
&TimelinePanel::on_sequence_list_changed));
// Setup the sequence chooser
sequenceChooserModel = Gtk::ListStore::create(sequenceChooserColumns);
@ -114,7 +114,7 @@ TimelinePanel::TimelinePanel(workspace::WorkspaceWindow
// Setup the timeline widget
shared_ptr<Sequence> sequence
= *workspace.get_project().get_sequences().begin();
= *get_project().get_sequences().begin();
timelineWidget.reset(new TimelineWidget(load_state(sequence)));
pack_start(*timelineWidget, PACK_EXPAND_WIDGET);
@ -160,7 +160,7 @@ TimelinePanel::on_play_pause()
void
TimelinePanel::on_stop()
{
workspace.get_controller().get_playback_controller().stop();
get_controller().get_playback_controller().stop();
update_playback_buttons();
}
@ -259,7 +259,7 @@ TimelinePanel::update_sequence_chooser()
timelineWidget->get_state();
BOOST_FOREACH( shared_ptr< model::Sequence > sequence,
workspace.get_project().get_sequences() )
get_project().get_sequences() )
{
Gtk::TreeIter iter = sequenceChooserModel->append();
Gtk::TreeModel::Row row = *iter;
@ -318,20 +318,19 @@ TimelinePanel::update_zoom_buttons()
void
TimelinePanel::play()
{
workspace.get_controller().get_playback_controller().play();
get_controller().get_playback_controller().play();
}
void
TimelinePanel::pause()
{
workspace.get_controller().get_playback_controller().pause();
get_controller().get_playback_controller().pause();
}
bool
TimelinePanel::is_playing() const
TimelinePanel::is_playing()
{
return workspace.get_controller().get_playback_controller().
is_playing();
return get_controller().get_playback_controller().is_playing();
}
void

View file

@ -47,10 +47,12 @@ class TimelinePanel : public Panel
{
public:
/**
* Constructor
* @param workspace_window The window that owns this panel.
*/
TimelinePanel(workspace::WorkspaceWindow &workspace_window);
* Contructor.
* @param panel_manager The owner panel manager widget.
* @param dock_item The GdlDockItem that will host this panel.
**/
TimelinePanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item);
/**
* Destructor
@ -109,7 +111,7 @@ private:
void pause();
bool is_playing() const;
bool is_playing();
void set_tool(gui::widgets::timeline::ToolType tool);

View file

@ -36,14 +36,15 @@ using namespace gui::controller;
namespace gui {
namespace panels {
ViewerPanel::ViewerPanel(workspace::WorkspaceWindow &workspace_window) :
Panel(workspace_window, "viewer", get_title(), get_stock_id())
ViewerPanel::ViewerPanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item) :
Panel(panel_manager, dock_item, get_stock_id())
{
//----- Pack in the Widgets -----//
pack_start(display, PACK_EXPAND_WIDGET);
PlaybackController &playback =
workspace_window.get_controller().get_playback_controller();
get_controller().get_playback_controller();
FrameDestination outputDestination (sigc::mem_fun(this, &ViewerPanel::on_frame));
playback.use_display (DisplayService::setUp (outputDestination));

View file

@ -42,9 +42,11 @@ class ViewerPanel : public Panel
public:
/**
* Contructor.
* @param workspace_window The window that owns this panel.
* @param panel_manager The owner panel manager widget.
* @param dock_item The GdlDockItem that will host this panel.
**/
ViewerPanel(workspace::WorkspaceWindow &owner_window);
ViewerPanel(workspace::PanelManager &panel_manager,
GdlDockItem *dock_item);
/**
* Get the title of the panel.

View file

@ -129,9 +129,7 @@ PanelBar::on_size_allocate(Gtk::Allocation& allocation)
void
PanelBar::on_panel_type(int type_index)
{
workspace::PanelManager &manager = panel.get_workspace_window().
get_panel_manager();
manager.switch_panel(panel, type_index);
panel.get_panel_manager().switch_panel(panel, type_index);
}
void

View file

@ -290,7 +290,10 @@ TimelineHeaderContainer::forall_vfunc(gboolean /* include_internals */,
BOOST_FOREACH( pair, timelineWidget.trackMap )
{
REQUIRE(pair.second);
callback(pair.second->get_header_widget().gobj(), callback_data);
GtkWidget *widget = pair.second->get_header_widget().gobj();
REQUIRE(widget);
callback(widget, callback_data);
}
}

View file

@ -40,6 +40,8 @@ const PanelManager::PanelDescription
PanelManager::Panel<ViewerPanel>(),
PanelManager::Panel<ResourcesPanel>()
};
unsigned short PanelManager::panelID = 0;
PanelManager::PanelManager(WorkspaceWindow &workspace_window) :
workspaceWindow(workspace_window),
@ -111,26 +113,23 @@ PanelManager::get_dock_bar() const
return dockBar;
}
WorkspaceWindow&
PanelManager::get_workspace_window()
{
return workspaceWindow;
}
void PanelManager::switch_panel(panels::Panel &old_panel,
int new_panel_description_index)
{
REQUIRE(new_panel_description_index >= 0 &&
new_panel_description_index < get_panel_description_count());
shared_ptr<panels::Panel> new_panel(
panelDescriptionList[new_panel_description_index].create(
workspaceWindow));
new_panel->show_all();
panels.push_back(new_panel);
gdl_dock_object_dock (GDL_DOCK_OBJECT(old_panel.get_dock_item()),
GDL_DOCK_OBJECT(new_panel->get_dock_item()),
GDL_DOCK_CENTER, NULL);
gdl_dock_object_unbind(GDL_DOCK_OBJECT(old_panel.get_dock_item()));
// Get the dock item
GdlDockItem *dock_item = old_panel.get_dock_item();
g_object_ref(dock_item);
// Release the old panel
list< boost::shared_ptr<panels::Panel> >::iterator i;
for(i = panels.begin(); i != panels.end(); i++)
{
@ -140,6 +139,16 @@ void PanelManager::switch_panel(panels::Panel &old_panel,
break;
}
}
// Create the new panel
shared_ptr<panels::Panel> new_panel(
panelDescriptionList[new_panel_description_index].create(
*this, dock_item));
g_object_unref(dock_item);
new_panel->show_all();
panels.push_back(new_panel);
}
int
@ -159,11 +168,11 @@ void
PanelManager::create_panels()
{
shared_ptr<panels::Panel> resourcesPanel(
(panels::Panel*)new ResourcesPanel(workspaceWindow));
create_panel_by_name("ResourcesPanel"));
shared_ptr<panels::Panel> viewerPanel(
(panels::Panel*)new ViewerPanel(workspaceWindow));
create_panel_by_name("ViewerPanel"));
shared_ptr<panels::Panel> timelinePanel(
(panels::Panel*)new TimelinePanel(workspaceWindow));
create_panel_by_name("TimelinePanel"));
gdl_dock_add_item(dock,
resourcesPanel->get_dock_item(), GDL_DOCK_LEFT);
@ -179,13 +188,24 @@ PanelManager::create_panels()
shared_ptr<panels::Panel>
PanelManager::create_panel_by_name(const char* class_name)
{
{
const int count = get_panel_description_count();
for(int i = 0; i < count; i++)
{
if(strstr(panelDescriptionList[i].get_class_name(), class_name))
return shared_ptr<panels::Panel>(panelDescriptionList[i].create(
workspaceWindow));
{
// Make a unique name for the panel
char name[5];
snprintf(name, sizeof(name), "%X", panelID++);
// Create a dock item
GdlDockItem *dock_item = GDL_DOCK_ITEM(
gdl_dock_item_new(name, "", GDL_DOCK_ITEM_BEH_NORMAL));
// Create the panel object
return shared_ptr<panels::Panel>(
panelDescriptionList[i].create(*this, dock_item));
}
}
ERROR(gui, "Unable to create a panel with class name %s", class_name);

View file

@ -76,6 +76,11 @@ public:
**/
GdlDockBar* get_dock_bar() const;
/**
* Returns a reference to the owner workspace window.
**/
WorkspaceWindow& get_workspace_window();
void switch_panel(panels::Panel &old_panel,
int new_panel_description_index);
@ -142,6 +147,11 @@ private:
* The list of created panels.
**/
std::list< boost::shared_ptr<panels::Panel> > panels;
/**
* An accumulator for the panel id.
**/
static unsigned short panelID;
private:
@ -150,6 +160,11 @@ private:
**/
class PanelDescription
{
protected:
typedef boost::shared_ptr<panels::Panel> (*const CreatePanelProc)(
PanelManager&, GdlDockItem*);
protected:
/**
* Constructor
@ -161,9 +176,7 @@ private:
* instantiate the panel object.
**/
PanelDescription(const char* class_name, const char *title,
const gchar *stock_id,
boost::shared_ptr<panels::Panel> (*const create_panel_proc)(
WorkspaceWindow&)) :
const gchar *stock_id, CreatePanelProc create_panel_proc) :
className(class_name),
titleName(title),
stockID(stock_id),
@ -203,12 +216,15 @@ private:
/**
* Creates an instance of this panel.
* @param panel_manager The owner panel manager.
* @param dock_item The GdlDockItem that will host this panel.
* @return Returns a shared pointer to the panel object.
**/
boost::shared_ptr<panels::Panel> create(
WorkspaceWindow& owner_window) const
PanelManager &panel_manager, GdlDockItem* dock_item) const
{
REQUIRE(createPanelProc);
return createPanelProc(owner_window);
return createPanelProc(panel_manager, dock_item);
}
private:
@ -230,8 +246,7 @@ private:
/**
* A pointer to a function that will instantiate the panel object.
**/
boost::shared_ptr<panels::Panel> (*const createPanelProc)(
WorkspaceWindow&);
CreatePanelProc createPanelProc;
};
/**
@ -253,14 +268,15 @@ private:
private:
/**
* A helper function that will create a panel of type P
* @param workspace_window The owner workspace window.
* @param panel_manager The owner panel manager.
* @param dock_item The GdlDockItem that will host this panel.
* @return Returns a shared pointer to the panel object.
**/
static boost::shared_ptr<panels::Panel> create_panel(
WorkspaceWindow &workspace_window)
PanelManager &panel_manager, GdlDockItem* dock_item)
{
return boost::shared_ptr<panels::Panel>(
new P(workspace_window));
new P(panel_manager, dock_item));
}
};