Refactored widget mouse movement handling, removed some Glib::RefPtrs, and tidied a few things
This commit is contained in:
parent
063a22fcd5
commit
8689d0dced
6 changed files with 179 additions and 163 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue