Added show panel commands

This commit is contained in:
Joel Holdsworth 2009-04-15 18:14:16 +01:00
parent 12ecb634b6
commit 4165474900
6 changed files with 178 additions and 81 deletions

View file

@ -31,6 +31,8 @@
#include "../model/project.hpp"
#include "include/logging.h"
using namespace Gtk;
using namespace Glib;
using namespace sigc;
@ -44,72 +46,161 @@ Actions::Actions(WorkspaceWindow &workspace_window) :
is_updating_action_state(false)
{
workspace_window.signal_show ().connect_notify(mem_fun(this, &Actions::update_action_state));
}
void
Actions::populate_main_actions(RefPtr<Gtk::UIManager> uiManager)
{
REQUIRE(uiManager);
//----- Create the Action Group -----//
actionGroup = ActionGroup::create();
// File menu
actionGroup->add(Action::create("FileMenu", _("_File")));
actionGroup->add(Action::create("FileNewProject", Stock::NEW, _("_New Project...")),
sigc::mem_fun(*this, &Actions::on_menu_file_new_project));
mem_fun(*this, &Actions::on_menu_file_new_project));
actionGroup->add(Action::create("FileOpenProject", Stock::OPEN, _("_Open Project...")),
sigc::mem_fun(*this, &Actions::on_menu_file_open_project));
mem_fun(*this, &Actions::on_menu_file_open_project));
actionGroup->add(Action::create("FileRender", _("_Render...")),
Gtk::AccelKey("<shift>R"),
sigc::mem_fun(*this, &Actions::on_menu_file_render));
AccelKey("<shift>R"),
mem_fun(*this, &Actions::on_menu_file_render));
actionGroup->add(Action::create("FileQuit", Stock::QUIT),
sigc::mem_fun(*this, &Actions::on_menu_file_quit));
mem_fun(*this, &Actions::on_menu_file_quit));
// Edit menu
actionGroup->add(Action::create("EditMenu", _("_Edit")));
actionGroup->add(Action::create("EditCopy", Stock::COPY),
sigc::mem_fun(*this, &Actions::on_menu_others));
mem_fun(*this, &Actions::on_menu_others));
actionGroup->add(Action::create("EditPaste", Stock::PASTE),
sigc::mem_fun(*this, &Actions::on_menu_others));
mem_fun(*this, &Actions::on_menu_others));
actionGroup->add(Action::create("EditPreferences", Stock::PREFERENCES),
sigc::mem_fun(*this, &Actions::on_menu_edit_preferences));
mem_fun(*this, &Actions::on_menu_edit_preferences));
// View Menu
actionGroup->add(Action::create("ViewMenu", _("_View")));
assetsPanelAction = ToggleAction::create("ViewResources",
Gtk::StockID("panel_resources"));
StockID("panel_resources"));
assetsPanelAction->signal_toggled().connect(
sigc::mem_fun(*this, &Actions::on_menu_view_resources));
mem_fun(*this, &Actions::on_menu_view_resources));
actionGroup->add(assetsPanelAction);
timelinePanelAction = ToggleAction::create("ViewTimeline",
Gtk::StockID("panel_timeline"));
StockID("panel_timeline"));
timelinePanelAction->signal_toggled().connect(
sigc::mem_fun(*this, &Actions::on_menu_view_timeline));
mem_fun(*this, &Actions::on_menu_view_timeline));
actionGroup->add(timelinePanelAction);
viewerPanelAction = ToggleAction::create("ViewViewer",
Gtk::StockID("panel_viewer"));
StockID("panel_viewer"));
viewerPanelAction->signal_toggled().connect(
sigc::mem_fun(*this, &Actions::on_menu_view_viewer));
mem_fun(*this, &Actions::on_menu_view_viewer));
actionGroup->add(viewerPanelAction);
// Sequence Menu
actionGroup->add(Action::create("SequenceMenu", _("_Sequence")));
actionGroup->add(Action::create("SequenceAdd", _("_Add...")),
sigc::mem_fun(*this, &Actions::on_menu_sequence_add));
mem_fun(*this, &Actions::on_menu_sequence_add));
// Track Menu
actionGroup->add(Action::create("TrackMenu", _("_Track")));
actionGroup->add(Action::create("TrackAdd", _("_Add...")),
sigc::mem_fun(*this, &Actions::on_menu_track_add));
mem_fun(*this, &Actions::on_menu_track_add));
// Window Menu
actionGroup->add(Action::create("WindowMenu", _("_Window")));
actionGroup->add(Action::create("WindowNewWindow",
Gtk::StockID("new_window")),
sigc::mem_fun(*this, &Actions::on_menu_window_new_window));
StockID("new_window")),
mem_fun(*this, &Actions::on_menu_window_new_window));
actionGroup->add(Action::create("WindowShowPanel", _("_Show Panel")));
// Help Menu
actionGroup->add(Action::create("HelpMenu", _("_Help")) );
actionGroup->add(Action::create("HelpAbout", Stock::ABOUT),
sigc::mem_fun(*this, &Actions::on_menu_help_about) );
mem_fun(*this, &Actions::on_menu_help_about) );
uiManager->insert_action_group(actionGroup);
//----- Create the UI layout -----//
Glib::ustring ui_info =
"<ui>"
" <menubar name='MenuBar'>"
" <menu action='FileMenu'>"
" <menuitem action='FileNewProject'/>"
" <menuitem action='FileOpenProject'/>"
" <separator/>"
" <menuitem action='FileRender'/>"
" <separator/>"
" <menuitem action='FileQuit'/>"
" </menu>"
" <menu action='EditMenu'>"
" <menuitem action='EditCopy'/>"
" <menuitem action='EditPaste'/>"
" <separator/>"
" <menuitem action='EditPreferences'/>"
" </menu>"
" <menu action='ViewMenu'>"
" <menuitem action='ViewResources'/>"
" <menuitem action='ViewTimeline'/>"
" <menuitem action='ViewViewer'/>"
" </menu>"
" <menu action='SequenceMenu'>"
" <menuitem action='SequenceAdd'/>"
" </menu>"
" <menu action='TrackMenu'>"
" <menuitem action='TrackAdd'/>"
" </menu>"
" <menu action='WindowMenu'>"
" <menuitem action='WindowNewWindow'/>"
" <menu action='WindowShowPanel'/>"
" </menu>"
" <menu action='HelpMenu'>"
" <menuitem action='HelpAbout'/>"
" </menu>"
" </menubar>"
" <toolbar name='ToolBar'>"
" <toolitem action='FileNewProject'/>"
" <toolitem action='FileOpenProject'/>"
" </toolbar>"
"</ui>";
try
{
uiManager->add_ui_from_string(ui_info);
}
catch(const Glib::Error& ex)
{
ERROR(gui, "Building menus failed: %s", ex.what().data());
return;
}
//----- Add Extra Actions -----//
populate_show_panel_actions(uiManager);
}
void
Actions::populate_show_panel_actions(RefPtr<Gtk::UIManager> uiManager)
{
const int count = PanelManager::get_panel_description_count();
RefPtr<Gtk::ActionGroup> actionGroup = ActionGroup::create();
for(int i = 0; i < count; i++)
{
const gchar *stock_id = PanelManager::get_panel_stock_id(i);
const ustring name = ustring::compose("Panel%1", i);
actionGroup->add(Action::create(name, StockID(stock_id)),
bind(mem_fun(*this, &Actions::on_menu_show_panel), i));
}
uiManager->insert_action_group(actionGroup);
for(int i = 0; i < count; i++)
{
const ustring name = ustring::compose("Panel%1", i);
uiManager->add_ui(uiManager->new_merge_id(),
"/MenuBar/WindowMenu/WindowShowPanel", name, name);
}
}
void
@ -215,8 +306,15 @@ Actions::on_menu_track_add()
void
Actions::on_menu_window_new_window()
{
application().get_window_manager().new_window(workspaceWindow.project,
workspaceWindow.controller);
application().get_window_manager().new_window(
workspaceWindow.get_project(),
workspaceWindow.get_controller());
}
void
Actions::on_menu_show_panel(int panel_index)
{
workspaceWindow.get_panel_manager().show_panel(panel_index);
}
/* ===== Help Menu Event Handlers ===== */

View file

@ -42,11 +42,29 @@ class WorkspaceWindow;
*/
class Actions
{
private:
public:
/**
* Constructor
* @param workspace_window The owner workspace window.
**/
Actions(WorkspaceWindow &workspace_window);
/**
* Populates a uiManager with the main set of actions.
* @param uiManager A pointer to the uiManager to populate.
**/
void populate_main_actions(Glib::RefPtr<Gtk::UIManager> uiManager);
/* ===== Internals ===== */
private:
/**
* Populates a uiManager with actions for the Show Panel menu.
* @param uiManager A pointer to the uiManager to populate.
**/
void populate_show_panel_actions(
Glib::RefPtr<Gtk::UIManager> uiManager);
/**
* Updates the state of the menu/toolbar actions
* to reflect the current state of the workspace */
@ -75,6 +93,7 @@ private:
void on_menu_track_add();
void on_menu_window_new_window();
void on_menu_show_panel(int panel_index);
void on_menu_help_about();
@ -93,8 +112,6 @@ private:
/* ===== Internals ===== */
private:
bool is_updating_action_state;
friend class WorkspaceWindow;
};
} // namespace workspace

View file

@ -120,6 +120,21 @@ PanelManager::get_workspace_window()
return workspaceWindow;
}
void
PanelManager::show_panel(const int description_index)
{
// Create the new panel
shared_ptr<panels::Panel> new_panel =
create_panel_by_index(description_index);
// Add it to the list
panels.push_back(new_panel);
// Dock the item
gdl_dock_add_item(dock, new_panel->get_dock_item(),
GDL_DOCK_FLOATING);
}
void PanelManager::switch_panel(panels::Panel &old_panel,
const int description_index)
{
@ -193,6 +208,13 @@ PanelManager::get_panel_stock_id(int index)
return panelDescriptionList[index].get_stock_id();
}
const char*
PanelManager::get_panel_title(int index)
{
REQUIRE(index >= 0 && index < get_panel_description_count());
return panelDescriptionList[index].get_title();
}
void
PanelManager::create_panels()
{

View file

@ -82,6 +82,12 @@ public:
**/
WorkspaceWindow& get_workspace_window();
/**
* Shows a panel given a description index.
* @param description_index The index of the panel type to show.
**/
void show_panel(const int description_index);
/**
* Switches a panel from one type to another, without touching the
* underlying GdlDockItem.
@ -108,11 +114,18 @@ public:
static int get_panel_description_count();
/**
* Gets a panel description.
* Gets a panel description's stock id.
* @param index The index of the panel to retrieve.
* @return Returns the stock id of a panel at this index.
**/
static const gchar* get_panel_stock_id(const int index);
/**
* Gets a panel description's title.
* @param index The index of the panel to retrieve.
* @return Returns the title of a panel at this index.
**/
static const char* get_panel_title(int index);
private:

View file

@ -37,6 +37,7 @@
#include "include/logging.h"
using namespace Gtk;
using namespace Glib;
using namespace gui::model;
using namespace gui::controller;
@ -87,62 +88,9 @@ WorkspaceWindow::create_ui()
add(baseContainer);
uiManager = Gtk::UIManager::create();
uiManager->insert_action_group(actions.actionGroup);
actions.populate_main_actions(uiManager);
add_accel_group(uiManager->get_accel_group());
//Layout the actions in a menubar and toolbar:
Glib::ustring ui_info =
"<ui>"
" <menubar name='MenuBar'>"
" <menu action='FileMenu'>"
" <menuitem action='FileNewProject'/>"
" <menuitem action='FileOpenProject'/>"
" <separator/>"
" <menuitem action='FileRender'/>"
" <separator/>"
" <menuitem action='FileQuit'/>"
" </menu>"
" <menu action='EditMenu'>"
" <menuitem action='EditCopy'/>"
" <menuitem action='EditPaste'/>"
" <separator/>"
" <menuitem action='EditPreferences'/>"
" </menu>"
" <menu action='ViewMenu'>"
" <menuitem action='ViewResources'/>"
" <menuitem action='ViewTimeline'/>"
" <menuitem action='ViewViewer'/>"
" </menu>"
" <menu action='SequenceMenu'>"
" <menuitem action='SequenceAdd'/>"
" </menu>"
" <menu action='TrackMenu'>"
" <menuitem action='TrackAdd'/>"
" </menu>"
" <menu action='WindowMenu'>"
" <menuitem action='WindowNewWindow'/>"
" </menu>"
" <menu action='HelpMenu'>"
" <menuitem action='HelpAbout'/>"
" </menu>"
" </menubar>"
" <toolbar name='ToolBar'>"
" <toolitem action='FileNewProject'/>"
" <toolitem action='FileOpenProject'/>"
" </toolbar>"
"</ui>";
try
{
uiManager->add_ui_from_string(ui_info);
}
catch(const Glib::Error& ex)
{
NOBUG_ERROR(gui, "Building menus failed: %s", ex.what().data());
return;
}
//----- Set up the Menu Bar -----//
Gtk::Widget* menu_bar = uiManager->get_widget("/MenuBar");
REQUIRE(menu_bar != NULL);
@ -172,6 +120,7 @@ WorkspaceWindow::create_ui()
show_all_children();
}
} // namespace workspace
} // namespace gui

View file

@ -97,8 +97,6 @@ private:
* The instantiation of the actions helper class, which
* registers and handles user action events */
Actions actions;
friend class Actions;
};
} // namespace workspace