Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix some keyframes behaviors... #10

Merged
merged 13 commits into from Sep 9, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion synfig-core/src/synfig/keyframe.cpp
Expand Up @@ -246,7 +246,8 @@ KeyframeList::insert_time(const Time& location, const Time& delta)
return;
try
{
iterator iter(find_next(location));
// find next from time (location) including deactivated kf
iterator iter(find_next(location, false));
for(;iter!=end();++iter)
{
iter->set_time(iter->get_time()+delta);
Expand Down
123 changes: 81 additions & 42 deletions synfig-studio/src/gui/actionmanagers/keyframeactionmanager.cpp
Expand Up @@ -155,7 +155,25 @@ KeyframeActionManager::on_keyframe_properties()
signal_show_keyframe_properties_();
}

/*! \fn KeyframeActionManager::on_keyframe_properties()
/*! \fn KeyframeActionManager::on_keyframe_toggle()
** \brief Signal handler for selected keyframe toogle
*/
void
KeyframeActionManager::on_keyframe_toggle()
{
signal_keyframe_toggle_();
}

/*! \fn KeyframeActionManager::on_keyframe_description_set()
** \brief Signal handler for selected keyframe description change
*/
void
KeyframeActionManager::on_keyframe_description_set()
{
signal_keyframe_description_set_();
}

/*! \fn KeyframeActionManager::on_add_keyframe()
** \brief Signal handler for add keyframe
*/
void
Expand Down Expand Up @@ -219,57 +237,78 @@ KeyframeActionManager::refresh()
synfigapp::Action::CATEGORY_KEYFRAME
);
}
if(action_group_->get_action("action-KeyframeAdd"))

Glib::RefPtr<Gtk::Action> action_kf_add = action_group_->get_action("action-KeyframeAdd");
if(action_kf_add)
{
action_group_->remove(action_group_->get_action("action-KeyframeAdd"));
action_group_->remove(action_kf_add);
}

action_group_->add(Gtk::Action::create(
"action-KeyframeAdd",
Gtk::StockID("gtk-add"),
_("Add New Keyframe"),_("Add New Keyframe")
),
sigc::mem_fun(*this,&KeyframeActionManager::on_add_keyframe)
);
action_kf_add = Gtk::Action::create("action-KeyframeAdd",Gtk::StockID("gtk-add"),
_("Add New Keyframe"),_("Add New Keyframe"));
action_group_->add(action_kf_add, sigc::mem_fun(*this,&KeyframeActionManager::on_add_keyframe));

try
{
canvas_interface_->get_canvas()->keyframe_list().find(canvas_interface_->get_time());
action_group_->get_action("action-KeyframeAdd")->set_sensitive(false);
if(action_group_->get_action("action-KeyframeDuplicate"))
action_group_->get_action("action-KeyframeDuplicate")->set_sensitive(false);
}
catch(...)
{
}
//Keyframe properties definition
Glib::RefPtr<Gtk::Action> action_kf_properties(Gtk::Action::create("keyframe-properties", Gtk::StockID("gtk-properties"),
_("Keyframe Properties"), _("Keyframe Properties")));
action_group_->add(action_kf_properties,sigc::mem_fun(*this,&KeyframeActionManager::on_keyframe_properties));

{
Glib::RefPtr<Gtk::Action> action(Gtk::Action::create("keyframe-properties", Gtk::StockID("gtk-properties"),
_("Keyframe Properties"), _("Keyframe Properties")));
action_group_->add(action,sigc::mem_fun(*this,&KeyframeActionManager::on_keyframe_properties));
if(keyframe_tree_->get_selection()->count_selected_rows()==0)
action->set_sensitive(false);
}
// Keyframe activate status definition
Glib::RefPtr<Gtk::Action> action_kf_toggle(Gtk::Action::create("keyframe-toggle", _("Keyframe Toggle"), _("Keyframe Toggle")));
action_group_->add(action_kf_toggle,sigc::mem_fun(*this,&KeyframeActionManager::on_keyframe_toggle));

//get the beginning and ending time of the time slider
Time begin_time=canvas_interface_->get_canvas()->rend_desc().get_time_start();
Time end_time=canvas_interface_->get_canvas()->rend_desc().get_time_end();
//enable add key frame action if animation duration != 0
if(begin_time==end_time)
{
action_group_->get_action("action-KeyframeAdd")->set_sensitive(false);
}
else
// Keyframe description defintion
Glib::RefPtr<Gtk::Action> action_kf_description(Gtk::Action::create("keyframe-description-set", _("Keyframe Set Description"), _("Keyframe Set Description")));
action_group_->add(action_kf_description,sigc::mem_fun(*this,&KeyframeActionManager::on_keyframe_description_set));

//activate actions depending on context
{
action_group_->get_action("action-KeyframeAdd")->set_sensitive(true);
//get the keyframe at current time
bool kf_at_current_time = true;
try
{
canvas_interface_->get_canvas()->keyframe_list().find(canvas_interface_->get_time());
if(action_group_->get_action("action-KeyframeDuplicate"))
action_group_->get_action("action-KeyframeDuplicate")->set_sensitive(false);
}
catch(synfig::Exception::NotFound)
{
kf_at_current_time = false;
}
//get the beginning and ending time of the time slider
Time begin_time=canvas_interface_->get_canvas()->rend_desc().get_time_start();
Time end_time=canvas_interface_->get_canvas()->rend_desc().get_time_end();
//enable add key frame action if animation duration != 0
if(kf_at_current_time||(begin_time==end_time))
{
action_kf_add->set_sensitive(false);
}
else
{
action_kf_add->set_sensitive(true);
}

if(keyframe_tree_->get_selection()->count_selected_rows()==0)
{
action_kf_properties->set_sensitive(false);
action_kf_toggle->set_sensitive(false);
action_kf_description->set_sensitive(false);
}
}

// this popup menu should be removed since we don't provide a keyframe menu
// but the removing will effect the toolbar buttons on keyframe panel, to have
// a quick solution, I just remove the menu items and let it here before someone
// figure out how this String ui_info works.
// this popup menu is used from widget_keyframe_list
String full_ui_info;
full_ui_info="<ui><popup action=''><menu action='menu-keyframe'>"+ui_info+"</menu></popup></ui>";
full_ui_info=
"<ui>"
"<popup action='menu-keyframe'>"
"<menuitem action='action-KeyframeAdd' />"
"<menuitem action='action-KeyframeDuplicate' />"
"<menuitem action='action-KeyframeRemove' />"
"<menuitem action='keyframe-properties' />"
"<menuitem action='keyframe-toggle' />"
"<menuitem action='keyframe-description-set' />"
"</popup>"
"</ui>";
popup_id_=get_ui_manager()->add_ui_from_string(full_ui_info);

#ifdef ONE_ACTION_GROUP
Expand Down
6 changes: 6 additions & 0 deletions synfig-studio/src/gui/actionmanagers/keyframeactionmanager.h
Expand Up @@ -45,6 +45,8 @@ class KeyframeTree;
class KeyframeActionManager
{
sigc::signal<void> signal_show_keyframe_properties_;
sigc::signal<void> signal_keyframe_toggle_;
sigc::signal<void> signal_keyframe_description_set_;

Glib::RefPtr<Gtk::UIManager> ui_manager_;
//Glib::RefPtr<Gtk::TreeSelection> tree_selection_;
Expand All @@ -63,9 +65,13 @@ class KeyframeActionManager

void on_add_keyframe();
void on_keyframe_properties();
void on_keyframe_toggle();
void on_keyframe_description_set();

public:
sigc::signal<void>& signal_show_keyframe_properties() { return signal_show_keyframe_properties_; }
sigc::signal<void>& signal_keyframe_toggle() { return signal_keyframe_toggle_; }
sigc::signal<void>& signal_keyframe_description_set() { return signal_keyframe_description_set_; }

void queue_refresh();

Expand Down
84 changes: 69 additions & 15 deletions synfig-studio/src/gui/canvasview.cpp
Expand Up @@ -1957,21 +1957,6 @@ CanvasView::on_unselect_layers()
layer_tree->clear_selected_layers();
}

void
CanvasView::show_keyframe_dialog()
{
Glib::RefPtr<Gtk::TreeSelection> selection(keyframe_tree->get_selection());
if(selection->get_selected())
{
Gtk::TreeRow row(*selection->get_selected());

Keyframe keyframe(row[keyframe_tree->model.keyframe]);

keyframe_dialog.set_keyframe(keyframe);
keyframe_dialog.present();
}
}

void
CanvasView::add_layer(synfig::String x)
{
Expand Down Expand Up @@ -3871,6 +3856,75 @@ CanvasView::on_keyframe_remove_pressed()
canvas_interface()->get_instance()->perform_action(action);
}

void
CanvasView::show_keyframe_dialog()
{
Glib::RefPtr<Gtk::TreeSelection> selection(keyframe_tree->get_selection());
if(selection->get_selected())
{
Gtk::TreeRow row(*selection->get_selected());

Keyframe keyframe(row[keyframe_tree->model.keyframe]);

keyframe_dialog.set_keyframe(keyframe);
keyframe_dialog.present();
}
}

void
CanvasView::on_keyframe_toggle()
{
Glib::RefPtr<Gtk::TreeSelection> selection(keyframe_tree->get_selection());
if(selection->get_selected())
{
Gtk::TreeRow row(*selection->get_selected());

Keyframe keyframe(row[keyframe_tree->model.keyframe]);

synfigapp::Action::Handle action(synfigapp::Action::create("KeyframeToggl"));

if(!action)
return;
action->set_param("canvas",canvas_interface()->get_canvas());
action->set_param("canvas_interface",canvas_interface());
action->set_param("keyframe",keyframe);
action->set_param("new_status",!keyframe.active ());

canvas_interface()->get_instance()->perform_action(action);

}
}

void
CanvasView::on_keyframe_description_set()
{
Glib::RefPtr<Gtk::TreeSelection> selection(keyframe_tree->get_selection());
if(selection->get_selected())
{
Gtk::TreeRow row(*selection->get_selected());

Keyframe keyframe(row[keyframe_tree->model.keyframe]);

synfigapp::Action::Handle action(synfigapp::Action::create("KeyframeSet"));

if(!action)
return;

String str(keyframe.get_description ());
if(!studio::App::dialog_entry(action->get_name(), action->get_local_name(),str))
return;

keyframe.set_description(str);

action->set_param("canvas",canvas_interface()->get_canvas());
action->set_param("canvas_interface",canvas_interface());
action->set_param("keyframe",keyframe);

canvas_interface()->get_instance()->perform_action(action);

}
}

void
CanvasView::toggle_duck_mask(Duckmatic::Type type)
{
Expand Down
2 changes: 2 additions & 0 deletions synfig-studio/src/gui/canvasview.h
Expand Up @@ -726,6 +726,8 @@ class CanvasView : public Dockable, public etl::shared_object
void add_layer(synfig::String x);

void show_keyframe_dialog();
void on_keyframe_toggle();
void on_keyframe_description_set();

void play_audio(float t);
void stop_audio();
Expand Down
22 changes: 22 additions & 0 deletions synfig-studio/src/gui/docks/dock_keyframes.cpp
Expand Up @@ -71,6 +71,13 @@ Dock_Keyframes::Dock_Keyframes():
keyframe_action_manager->signal_show_keyframe_properties().connect(
sigc::mem_fun(*this,&Dock_Keyframes::show_keyframe_properties)
);
keyframe_action_manager->signal_keyframe_toggle().connect(
sigc::mem_fun(*this,&Dock_Keyframes::keyframe_toggle)
);
keyframe_action_manager->signal_keyframe_description_set().connect(
sigc::mem_fun(*this,&Dock_Keyframes::keyframe_description_set)
);


Glib::ustring ui_info =
"<ui>"
Expand Down Expand Up @@ -99,6 +106,21 @@ Dock_Keyframes::show_keyframe_properties()
get_canvas_view()->show_keyframe_dialog();
}

void
Dock_Keyframes::keyframe_toggle()
{
if(get_canvas_view())
get_canvas_view()->on_keyframe_toggle();
}

void
Dock_Keyframes::keyframe_description_set()
{
if(get_canvas_view())
get_canvas_view()->on_keyframe_description_set();
}


/*! \fn Dock_Keyframes::refresh_rend_desc()
** \brief Signal handler for animation render description change
*/
Expand Down
2 changes: 2 additions & 0 deletions synfig-studio/src/gui/docks/dock_keyframes.h
Expand Up @@ -61,6 +61,8 @@ class Dock_Keyframes : public Dock_CanvasSpecific
*/

void show_keyframe_properties();
void keyframe_toggle();
void keyframe_description_set();
//animation render description change signal handler
void refresh_rend_desc();

Expand Down
50 changes: 31 additions & 19 deletions synfig-studio/src/gui/trees/keyframetree.cpp
Expand Up @@ -31,6 +31,7 @@
# include <config.h>
#endif

#include "app.h"
#include "trees/keyframetree.h"
#include "cellrenderer/cellrenderer_time.h"
#include <gtkmm/treemodelsort.h>
Expand Down Expand Up @@ -278,27 +279,38 @@ KeyframeTree::on_event(GdkEvent *event)
break;
case GDK_BUTTON_PRESS:
{
Gtk::TreeModel::Path path;
Gtk::TreeViewColumn *column;
int cell_x, cell_y;
int wx(round_to_int(event->button.x)),wy(round_to_int(event->button.y));
//tree_to_widget_coords (,, wx, wy);
send_selection = true;

if(!get_path_at_pos(
wx,wy, // x, y
path, // TreeModel::Path&
column, //TreeViewColumn*&
cell_x,cell_y //int&cell_x,int&cell_y
)
) break;
const Gtk::TreeRow row = *(get_model()->get_iter(path));

signal_user_click()(event->button.button,row,(ColumnID)column->get_sort_column_id());
if (synfig::String(column->get_title ()) == _("Jump"))
if (event->button.button == 1)
{
keyframe_tree_store_->canvas_interface()->set_time(row[model.time]);
Gtk::TreeModel::Path path;
Gtk::TreeViewColumn *column;
int cell_x, cell_y;
int wx(round_to_int(event->button.x)),wy(round_to_int(event->button.y));
//tree_to_widget_coords (,, wx, wy);
send_selection = true;

if(!get_path_at_pos(
wx,wy, // x, y
path, // TreeModel::Path&
column, //TreeViewColumn*&
cell_x,cell_y //int&cell_x,int&cell_y
)
) break;
const Gtk::TreeRow row = *(get_model()->get_iter(path));

signal_user_click()(event->button.button,row,(ColumnID)column->get_sort_column_id());
if (synfig::String(column->get_title ()) == _("Jump"))
{
keyframe_tree_store_->canvas_interface()->set_time(row[model.time]);
}
} else if (event->button.button == 3)
{
Gtk::Menu* menu = dynamic_cast<Gtk::Menu*>(App::ui_manager()->get_widget("/menu-keyframe"));
if(menu)
{
menu->popup(event->button.button,gtk_get_current_event_time());
}
}

}
break;
case GDK_2BUTTON_PRESS:
Expand Down