Refactored widget mouse movement handling, removed some Glib::RefPtrs, and tidied a few things

This commit is contained in:
Joel Holdsworth 2008-07-17 19:07:38 +01:00
parent 063a22fcd5
commit 8689d0dced
6 changed files with 179 additions and 163 deletions

View file

@ -52,10 +52,12 @@ TimelineWidget::TimelineWidget() :
headerContainer = new HeaderContainer(this); headerContainer = new HeaderContainer(this);
ENSURE(headerContainer != NULL); ENSURE(headerContainer != NULL);
horizontalAdjustment.signal_value_changed().connect( horizontalAdjustment.signal_value_changed().connect( sigc::mem_fun(
sigc::mem_fun(this, &TimelineWidget::on_scroll) ); this, &TimelineWidget::on_scroll) );
verticalAdjustment.signal_value_changed().connect( verticalAdjustment.signal_value_changed().connect( sigc::mem_fun(
sigc::mem_fun(this, &TimelineWidget::on_scroll) ); this, &TimelineWidget::on_scroll) );
body->signal_motion_notify_event().connect( sigc::mem_fun(
this, &TimelineWidget::on_motion_in_body_notify_event) );
set_time_scale(GAVL_TIME_SCALE / 200); set_time_scale(GAVL_TIME_SCALE / 200);
@ -214,10 +216,12 @@ TimelineWidget::get_y_scroll_offset() const
return (int)verticalAdjustment.get_value(); return (int)verticalAdjustment.get_value();
} }
void bool
TimelineWidget::on_mouse_move_in_body(int x, int y) TimelineWidget::on_motion_in_body_notify_event(GdkEventMotion *event)
{ {
ruler.set_mouse_chevron_offset(x); REQUIRE(event != NULL);
ruler.set_mouse_chevron_offset(event->x);
return true;
} }
} // namespace widgets } // namespace widgets

View file

@ -111,7 +111,7 @@ protected:
int get_y_scroll_offset() const; int get_y_scroll_offset() const;
void on_mouse_move_in_body(int x, int y); bool on_motion_in_body_notify_event(GdkEventMotion *event);
protected: protected:
gavl_time_t timeOffset; gavl_time_t timeOffset;

View file

@ -148,12 +148,9 @@ TimelineBody::on_button_release_event(GdkEventButton* event)
bool bool
TimelineBody::on_motion_notify_event(GdkEventMotion *event) TimelineBody::on_motion_notify_event(GdkEventMotion *event)
{ {
REQUIRE(event != NULL); REQUIRE(event != NULL);
REQUIRE(timelineWidget != NULL);
timelineWidget->on_mouse_move_in_body(event->x, event->y);
switch(dragType) switch(dragType)
{ {
case Shift: case Shift:
@ -169,7 +166,8 @@ TimelineBody::on_motion_notify_event(GdkEventMotion *event)
} }
} }
return true; // false so that the message is passed up to the owner TimelineWidget
return false;
} }
bool bool

View file

@ -108,14 +108,14 @@ Actions::add_stock_item(const Glib::RefPtr<IconFactory>& factory,
{ {
Gtk::IconSource source; Gtk::IconSource source;
try try
{ {
//This throws an exception if the file is not found: //This throws an exception if the file is not found:
source.set_pixbuf( Gdk::Pixbuf::create_from_file(filepath) ); source.set_pixbuf( Gdk::Pixbuf::create_from_file(filepath) );
} }
catch(const Glib::Exception& ex) catch(const Glib::Exception& ex)
{ {
g_message(ex.what().c_str()); g_message(ex.what().c_str());
} }
source.set_size(Gtk::ICON_SIZE_SMALL_TOOLBAR); source.set_size(Gtk::ICON_SIZE_SMALL_TOOLBAR);
source.set_size_wildcarded(); //Icon may be scaled. source.set_size_wildcarded(); //Icon may be scaled.
@ -131,9 +131,9 @@ Actions::add_stock_item(const Glib::RefPtr<IconFactory>& factory,
void void
Actions::update_action_state() Actions::update_action_state()
{ {
REQUIRE(workspaceWindow.assets_panel); REQUIRE(workspaceWindow.assets_panel != NULL);
REQUIRE(workspaceWindow.timeline_panel); REQUIRE(workspaceWindow.timeline_panel != NULL);
REQUIRE(workspaceWindow.viewer_panel); REQUIRE(workspaceWindow.viewer_panel != NULL);
is_updating_action_state = true; is_updating_action_state = true;
assetsPanelAction->set_active(workspaceWindow.assets_panel->is_shown()); assetsPanelAction->set_active(workspaceWindow.assets_panel->is_shown());

View file

@ -45,126 +45,140 @@ namespace workspace {
WorkspaceWindow::WorkspaceWindow(Project *source_project) : WorkspaceWindow::WorkspaceWindow(Project *source_project) :
project(source_project), project(source_project),
actions(*this) actions(*this)
{ {
REQUIRE(source_project != NULL); REQUIRE(source_project != NULL);
layout = NULL; layout = NULL;
assets_panel = NULL;
viewer_panel = NULL;
timeline_panel = NULL;
create_ui(); create_ui();
} }
WorkspaceWindow::~WorkspaceWindow() WorkspaceWindow::~WorkspaceWindow()
{ {
if(layout != NULL) g_object_unref(layout); REQUIRE(layout != NULL);
} g_object_unref(layout);
REQUIRE(assets_panel != NULL);
assets_panel->unreference();
REQUIRE(viewer_panel != NULL);
viewer_panel->unreference();
REQUIRE(timeline_panel != NULL);
timeline_panel->unreference();
}
void void
WorkspaceWindow::create_ui() WorkspaceWindow::create_ui()
{ {
//----- Configure the Window -----// //----- Configure the Window -----//
set_title(AppTitle); set_title(AppTitle);
set_default_size(1024, 768); set_default_size(1024, 768);
//----- Set up the UI Manager -----// //----- Set up the UI Manager -----//
// The UI will be nested within a VBox // The UI will be nested within a VBox
add(base_container); add(base_container);
uiManager = Gtk::UIManager::create(); uiManager = Gtk::UIManager::create();
uiManager->insert_action_group(actions.actionGroup); uiManager->insert_action_group(actions.actionGroup);
add_accel_group(uiManager->get_accel_group()); add_accel_group(uiManager->get_accel_group());
//Layout the actions in a menubar and toolbar: //Layout the actions in a menubar and toolbar:
Glib::ustring ui_info = Glib::ustring ui_info =
"<ui>" "<ui>"
" <menubar name='MenuBar'>" " <menubar name='MenuBar'>"
" <menu action='FileMenu'>" " <menu action='FileMenu'>"
" <menuitem action='FileNewProject'/>" " <menuitem action='FileNewProject'/>"
" <menuitem action='FileOpenProject'/>" " <menuitem action='FileOpenProject'/>"
" <separator/>" " <separator/>"
" <menuitem action='FileRender'/>" " <menuitem action='FileRender'/>"
" <separator/>" " <separator/>"
" <menuitem action='FileQuit'/>" " <menuitem action='FileQuit'/>"
" </menu>" " </menu>"
" <menu action='EditMenu'>" " <menu action='EditMenu'>"
" <menuitem action='EditCopy'/>" " <menuitem action='EditCopy'/>"
" <menuitem action='EditPaste'/>" " <menuitem action='EditPaste'/>"
" <separator/>" " <separator/>"
" <menuitem action='EditPreferences'/>" " <menuitem action='EditPreferences'/>"
" </menu>" " </menu>"
" <menu action='ViewMenu'>" " <menu action='ViewMenu'>"
" <menuitem action='ViewAssets'/>" " <menuitem action='ViewAssets'/>"
" <menuitem action='ViewTimeline'/>" " <menuitem action='ViewTimeline'/>"
" <menuitem action='ViewViewer'/>" " <menuitem action='ViewViewer'/>"
" </menu>" " </menu>"
" <menu action='HelpMenu'>" " <menu action='HelpMenu'>"
" <menuitem action='HelpAbout'/>" " <menuitem action='HelpAbout'/>"
" </menu>" " </menu>"
" </menubar>" " </menubar>"
" <toolbar name='ToolBar'>" " <toolbar name='ToolBar'>"
" <toolitem action='FileNewProject'/>" " <toolitem action='FileNewProject'/>"
" <toolitem action='FileOpenProject'/>" " <toolitem action='FileOpenProject'/>"
" </toolbar>" " </toolbar>"
"</ui>"; "</ui>";
try try
{ {
uiManager->add_ui_from_string(ui_info); uiManager->add_ui_from_string(ui_info);
} }
catch(const Glib::Error& ex) catch(const Glib::Error& ex)
{ {
ERROR(gui, "Building menus failed: %s", ex.what().data()); ERROR(gui, "Building menus failed: %s", ex.what().data());
return; return;
} }
//----- Set up the Menu Bar -----// //----- Set up the Menu Bar -----//
Gtk::Widget* menu_bar = uiManager->get_widget("/MenuBar"); Gtk::Widget* menu_bar = uiManager->get_widget("/MenuBar");
ASSERT(menu_bar != NULL); ASSERT(menu_bar != NULL);
base_container.pack_start(*menu_bar, Gtk::PACK_SHRINK); base_container.pack_start(*menu_bar, Gtk::PACK_SHRINK);
//----- Set up the Tool Bar -----// //----- Set up the Tool Bar -----//
Gtk::Toolbar* toolbar = dynamic_cast<Gtk::Toolbar*>(uiManager->get_widget("/ToolBar")); Gtk::Toolbar* toolbar = dynamic_cast<Gtk::Toolbar*>(uiManager->get_widget("/ToolBar"));
ASSERT(toolbar != NULL); ASSERT(toolbar != NULL);
toolbar->set_toolbar_style(TOOLBAR_ICONS); toolbar->set_toolbar_style(TOOLBAR_ICONS);
base_container.pack_start(*toolbar, Gtk::PACK_SHRINK); base_container.pack_start(*toolbar, Gtk::PACK_SHRINK);
//----- Create the Panels -----// //----- Create the Panels -----//
assets_panel = Glib::RefPtr<AssetsPanel>(new AssetsPanel()); assets_panel = new AssetsPanel();
viewer_panel = Glib::RefPtr<ViewerPanel>(new ViewerPanel()); ENSURE(assets_panel != NULL);
timeline_panel = Glib::RefPtr<TimelinePanel>(new TimelinePanel()); viewer_panel = new ViewerPanel();
ENSURE(viewer_panel != NULL);
timeline_panel = new TimelinePanel();
ENSURE(timeline_panel != NULL);
//----- Create the Dock -----// //----- Create the Dock -----//
dock = Glib::wrap(gdl_dock_new()); dock = Glib::wrap(gdl_dock_new());
layout = gdl_dock_layout_new((GdlDock*)dock->gobj()); layout = gdl_dock_layout_new((GdlDock*)dock->gobj());
dockbar = Glib::wrap(gdl_dock_bar_new ((GdlDock*)dock->gobj())); dockbar = Glib::wrap(gdl_dock_bar_new ((GdlDock*)dock->gobj()));
dock_container.pack_start(*dockbar, PACK_SHRINK); dock_container.pack_start(*dockbar, PACK_SHRINK);
dock_container.pack_end(*dock, PACK_EXPAND_WIDGET); dock_container.pack_end(*dock, PACK_EXPAND_WIDGET);
base_container.pack_start(dock_container, PACK_EXPAND_WIDGET); base_container.pack_start(dock_container, PACK_EXPAND_WIDGET);
gdl_dock_add_item ((GdlDock*)dock->gobj(), assets_panel->get_dock_item(), GDL_DOCK_LEFT); gdl_dock_add_item ((GdlDock*)dock->gobj(), assets_panel->get_dock_item(), GDL_DOCK_LEFT);
gdl_dock_add_item ((GdlDock*)dock->gobj(), viewer_panel->get_dock_item(), GDL_DOCK_RIGHT); gdl_dock_add_item ((GdlDock*)dock->gobj(), viewer_panel->get_dock_item(), GDL_DOCK_RIGHT);
gdl_dock_add_item ((GdlDock*)dock->gobj(), timeline_panel->get_dock_item(), GDL_DOCK_BOTTOM); gdl_dock_add_item ((GdlDock*)dock->gobj(), timeline_panel->get_dock_item(), GDL_DOCK_BOTTOM);
// Manually dock and move around some of the items // Manually dock and move around some of the items
gdl_dock_item_dock_to (timeline_panel->get_dock_item(), gdl_dock_item_dock_to (timeline_panel->get_dock_item(),
assets_panel->get_dock_item(), GDL_DOCK_BOTTOM, -1); assets_panel->get_dock_item(), GDL_DOCK_BOTTOM, -1);
gdl_dock_item_dock_to (viewer_panel->get_dock_item(), gdl_dock_item_dock_to (viewer_panel->get_dock_item(),
assets_panel->get_dock_item(), GDL_DOCK_RIGHT, -1); assets_panel->get_dock_item(), GDL_DOCK_RIGHT, -1);
show_all_children(); show_all_children();
gchar ph1[] = "ph1"; gchar ph1[] = "ph1";
gdl_dock_placeholder_new (ph1, (GdlDockObject*)dock->gobj(), GDL_DOCK_TOP, FALSE); gdl_dock_placeholder_new (ph1, (GdlDockObject*)dock->gobj(), GDL_DOCK_TOP, FALSE);
gchar ph2[] = "ph2"; gchar ph2[] = "ph2";
gdl_dock_placeholder_new (ph2, (GdlDockObject*)dock->gobj(), GDL_DOCK_BOTTOM, FALSE); gdl_dock_placeholder_new (ph2, (GdlDockObject*)dock->gobj(), GDL_DOCK_BOTTOM, FALSE);
gchar ph3[] = "ph3"; gchar ph3[] = "ph3";
gdl_dock_placeholder_new (ph3, (GdlDockObject*)dock->gobj(), GDL_DOCK_LEFT, FALSE); gdl_dock_placeholder_new (ph3, (GdlDockObject*)dock->gobj(), GDL_DOCK_LEFT, FALSE);
gchar ph4[] = "ph4"; gchar ph4[] = "ph4";
gdl_dock_placeholder_new (ph4, (GdlDockObject*)dock->gobj(), GDL_DOCK_RIGHT, FALSE); gdl_dock_placeholder_new (ph4, (GdlDockObject*)dock->gobj(), GDL_DOCK_RIGHT, FALSE);
} }
} // namespace workspace } // namespace workspace
} // namespace gui } // namespace gui

View file

@ -49,47 +49,47 @@ namespace model {
namespace workspace { namespace workspace {
/** /**
* The main lumiera workspace window * The main lumiera workspace window
*/ */
class WorkspaceWindow : public Gtk::Window class WorkspaceWindow : public Gtk::Window
{ {
public: public:
WorkspaceWindow(lumiera::gui::model::Project *source_project); WorkspaceWindow(lumiera::gui::model::Project *source_project);
virtual ~WorkspaceWindow(); virtual ~WorkspaceWindow();
private:
void create_ui();
/* ===== Model ===== */ private:
private: void create_ui();
lumiera::gui::model::Project *project;
/* ===== UI ===== */ /* ===== Model ===== */
private: private:
Glib::RefPtr<Gtk::UIManager> uiManager; lumiera::gui::model::Project *project;
Gtk::VBox base_container;
Gtk::HBox dock_container;
Gtk::Widget *dock;
Gtk::Widget *dockbar;
GdlDockLayout *layout;
/* ===== Panels ===== */ /* ===== UI ===== */
private: private:
Glib::RefPtr<AssetsPanel> assets_panel; Glib::RefPtr<Gtk::UIManager> uiManager;
Glib::RefPtr<ViewerPanel> viewer_panel; Gtk::VBox base_container;
Glib::RefPtr<TimelinePanel> timeline_panel; Gtk::HBox dock_container;
/* ===== Helpers ===== */ Gtk::Widget *dock;
private: Gtk::Widget *dockbar;
/** GdlDockLayout *layout;
* The instantiation of the actions helper class, which
* registers and handles user action events */
Actions actions;
friend class Actions; /* ===== Panels ===== */
}; private:
AssetsPanel *assets_panel;
ViewerPanel *viewer_panel;
TimelinePanel *timeline_panel;
/* ===== Helpers ===== */
private:
/**
* The instantiation of the actions helper class, which
* registers and handles user action events */
Actions actions;
friend class Actions;
};
} // namespace workspace } // namespace workspace
} // namespace gui } // namespace gui