|
Nikita Kitaev |
254e11 |
/* === S Y N F I G ========================================================= */
|
|
Nikita Kitaev |
254e11 |
/*! \file widget_keyframe_list.cpp
|
|
Nikita Kitaev |
254e11 |
** \brief A custom widget to manage keyframes in the timeline.
|
|
Nikita Kitaev |
254e11 |
**
|
|
Nikita Kitaev |
254e11 |
** $Id$
|
|
Nikita Kitaev |
254e11 |
**
|
|
Nikita Kitaev |
254e11 |
** \legal
|
|
Nikita Kitaev |
254e11 |
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
|
|
Nikita Kitaev |
254e11 |
** Copyright (c) 2007 Chris Moore
|
|
Nikita Kitaev |
254e11 |
** Copyright (c) 2009 Carlos Lรณpez
|
|
|
14213e |
** Copyright (c) 2012-2013 Konstantin Dmitriev
|
|
|
008ed2 |
** ......... ... 2018 Ivan Mahonin
|
|
Nikita Kitaev |
254e11 |
**
|
|
Nikita Kitaev |
254e11 |
** This package is free software; you can redistribute it and/or
|
|
Nikita Kitaev |
254e11 |
** modify it under the terms of the GNU General Public License as
|
|
Nikita Kitaev |
254e11 |
** published by the Free Software Foundation; either version 2 of
|
|
Nikita Kitaev |
254e11 |
** the License, or (at your option) any later version.
|
|
Nikita Kitaev |
254e11 |
**
|
|
Nikita Kitaev |
254e11 |
** This package is distributed in the hope that it will be useful,
|
|
Nikita Kitaev |
254e11 |
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Nikita Kitaev |
254e11 |
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Nikita Kitaev |
254e11 |
** General Public License for more details.
|
|
Nikita Kitaev |
254e11 |
** \endlegal
|
|
Nikita Kitaev |
254e11 |
*/
|
|
Nikita Kitaev |
254e11 |
/* ========================================================================= */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
/* === H E A D E R S ======================================================= */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
#ifdef USING_PCH
|
|
Nikita Kitaev |
254e11 |
# include "pch.h"
|
|
Nikita Kitaev |
254e11 |
#else
|
|
Nikita Kitaev |
254e11 |
#ifdef HAVE_CONFIG_H
|
|
Nikita Kitaev |
254e11 |
# include <config.h></config.h>
|
|
Nikita Kitaev |
254e11 |
#endif
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
#include <gtkmm menu.h=""></gtkmm>
|
|
bw |
94d8a6 |
#include <synfig general.h=""></synfig>
|
|
|
008ed2 |
#include <gui app.h=""></gui>
|
|
Nikita Kitaev |
254e11 |
#include "widget_keyframe_list.h"
|
|
|
abdbf2 |
#include <gui localization.h=""></gui>
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
#endif
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
/* === U S I N G =========================================================== */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
using namespace synfig;
|
|
|
008ed2 |
using namespace synfigapp;
|
|
Nikita Kitaev |
254e11 |
using namespace studio;
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
/* === M A C R O S ========================================================= */
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
/* === G L O B A L S ======================================================= */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
/* === P R O C E D U R E S ================================================= */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
/* === M E T H O D S ======================================================= */
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
Widget_Keyframe_List::Widget_Keyframe_List():
|
|
|
008ed2 |
kf_list(),
|
|
|
008ed2 |
editable(true),
|
|
|
008ed2 |
dragging(),
|
|
|
008ed2 |
changed(),
|
|
|
008ed2 |
selected(),
|
|
|
008ed2 |
moving_tooltip(Gtk::WINDOW_POPUP),
|
|
|
008ed2 |
moving_tooltip_y()
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
aeb01c |
set_size_request(-1, 10);
|
|
|
008ed2 |
add_events( Gdk::BUTTON_PRESS_MASK
|
|
|
008ed2 |
| Gdk::BUTTON_RELEASE_MASK
|
|
|
008ed2 |
| Gdk::BUTTON1_MOTION_MASK
|
|
|
008ed2 |
| Gdk::POINTER_MOTION_MASK );
|
|
|
008ed2 |
|
|
|
008ed2 |
// Window of the moving tooltip
|
|
|
008ed2 |
|
|
|
008ed2 |
moving_tooltip_label.set_alignment(0.5, 0.5);
|
|
|
008ed2 |
moving_tooltip_label.show();
|
|
|
008ed2 |
|
|
|
008ed2 |
moving_tooltip.set_resizable(false);
|
|
|
008ed2 |
moving_tooltip.set_name("gtk-tooltips");
|
|
|
008ed2 |
moving_tooltip.set_border_width(4);
|
|
|
008ed2 |
moving_tooltip.set_default_size(10, 10);
|
|
|
008ed2 |
moving_tooltip.set_type_hint(Gdk::WINDOW_TYPE_HINT_TOOLTIP);
|
|
|
008ed2 |
moving_tooltip.add(moving_tooltip_label);
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
Widget_Keyframe_List::~Widget_Keyframe_List()
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
set_time_model(etl::handle<timemodel>());</timemodel>
|
|
|
008ed2 |
set_kf_list(NULL);
|
|
|
008ed2 |
set_canvas_interface(etl::loose_handle<canvasinterface>());</canvasinterface>
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
|
54b6a4 |
void
|
|
|
54b6a4 |
Widget_Keyframe_List::draw_arrow(
|
|
|
54b6a4 |
const Cairo::RefPtr<cairo::context> &cr,</cairo::context>
|
|
|
54b6a4 |
double x, double y,
|
|
|
54b6a4 |
double width, double height,
|
|
|
54b6a4 |
bool fill,
|
|
|
008ed2 |
const Color &color )
|
|
|
54b6a4 |
{
|
|
|
008ed2 |
cr->save();
|
|
|
54b6a4 |
cr->set_source_rgba(color.get_r(), color.get_g(), color.get_b(), color.get_a());
|
|
|
83f20f |
cr->set_line_width(1.0);
|
|
|
54b6a4 |
cr->move_to(x, y);
|
|
|
54b6a4 |
cr->line_to(x - 0.5*width, y - height);
|
|
|
54b6a4 |
cr->line_to(x + 0.5*width, y - height);
|
|
|
54b6a4 |
cr->close_path();
|
|
|
54b6a4 |
if (fill) cr->fill(); else cr->stroke();
|
|
|
008ed2 |
cr->restore();
|
|
|
54b6a4 |
}
|
|
|
54b6a4 |
|
|
Nikita Kitaev |
254e11 |
bool
|
|
|
945ca9 |
Widget_Keyframe_List::on_draw(const Cairo::RefPtr<cairo::context> &cr)</cairo::context>
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
// Check if the window we want draw is ready
|
|
|
008ed2 |
if (!time_model)
|
|
|
008ed2 |
return false;
|
|
|
008ed2 |
|
|
|
008ed2 |
// TODO: hardcoded colors
|
|
|
008ed2 |
// Colors
|
|
|
008ed2 |
Color background(0.46, 0.55, 0.70, 1.0);
|
|
|
008ed2 |
Color normal(0.0, 0.0, 0.0, 1.0);
|
|
|
008ed2 |
Color selected(1.0, 1.0, 1.0, 1.0);
|
|
|
008ed2 |
Color drag_old_position(1.0, 1.0, 1.0, 0.6);
|
|
|
008ed2 |
Color drag_new_position(1.0, 1.0, 1.0, 1.0);
|
|
|
008ed2 |
|
|
|
008ed2 |
if (!editable) {
|
|
|
008ed2 |
normal.set_a(0.5);
|
|
|
008ed2 |
selected.set_a(0.5);
|
|
|
008ed2 |
drag_old_position.set_a(0.3);
|
|
|
008ed2 |
drag_new_position.set_a(0.5);
|
|
|
008ed2 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
|
54b6a4 |
const double h(get_height());
|
|
|
54b6a4 |
const double w(get_width());
|
|
|
54b6a4 |
const double y(h - 2);
|
|
|
54b6a4 |
const double ah(h - 4);
|
|
|
54b6a4 |
const double aw(2*ah);
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
if (w <= 0 || h <= 0)
|
|
|
008ed2 |
return false;
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
// Boundaries of the drawing area in time units.
|
|
|
008ed2 |
Time lower(time_model->get_visible_lower());
|
|
|
008ed2 |
Time upper(time_model->get_visible_upper());
|
|
|
945ca9 |
|
|
|
008ed2 |
time_ratio = (upper - lower)*(0.5*(double)aw/(double)w);
|
|
|
008ed2 |
Time lower_ex = lower - time_ratio;
|
|
|
008ed2 |
Time upper_ex = upper + time_ratio;
|
|
|
008ed2 |
double k = (double)w/(double)(upper - lower);
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
// Draw a background
|
|
|
e307c2 |
cr->save();
|
|
|
54b6a4 |
cr->set_source_rgba(background.get_r(), background.get_g(), background.get_b(), background.get_a());
|
|
|
945ca9 |
cr->rectangle(0.0, 0.0, w, h);
|
|
|
945ca9 |
cr->fill();
|
|
|
945ca9 |
cr->restore();
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
// Returns if there are not keyframes to draw.
|
|
|
008ed2 |
if (!kf_list || kf_list->empty()) return true;
|
|
|
008ed2 |
|
|
|
008ed2 |
// draw all keyframes
|
|
|
c20b21 |
Time selected_time = Time::end();
|
|
|
008ed2 |
for(KeyframeList::const_iterator i = kf_list->begin(); i != kf_list->end(); ++i)
|
|
|
008ed2 |
if (lower_ex < i->get_time() && i->get_time() < upper_ex) {
|
|
|
008ed2 |
if (*i == selected_kf) {
|
|
|
c20b21 |
selected_time = i->get_time();
|
|
|
008ed2 |
} else {
|
|
|
008ed2 |
const double x = k*(double)(i->get_time() - lower);
|
|
|
008ed2 |
draw_arrow(cr, x, y, aw, ah, i->active(), normal);
|
|
|
008ed2 |
}
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
// we do this so that we can be sure that
|
|
Nikita Kitaev |
254e11 |
// the selected keyframe is shown on top
|
|
|
c20b21 |
if (selected_time != Time::end()) {
|
|
|
c20b21 |
const double x = k*(double)(selected_time - lower);
|
|
|
008ed2 |
if (dragging) {
|
|
|
008ed2 |
const double new_x = k*(double)(dragging_kf_time - lower);
|
|
|
008ed2 |
draw_arrow(cr, x, y, aw, ah, selected_kf.active(), drag_old_position);
|
|
|
008ed2 |
draw_arrow(cr, new_x, y, aw, ah, selected_kf.active(), drag_new_position);
|
|
|
008ed2 |
} else {
|
|
|
008ed2 |
draw_arrow(cr, x, y, aw, ah, selected_kf.active(), selected);
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
return true;
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
void
|
|
|
008ed2 |
Widget_Keyframe_List::set_kf_list(KeyframeList *x)
|
|
|
008ed2 |
{
|
|
|
008ed2 |
if (kf_list == x) return;
|
|
|
008ed2 |
kf_list = x;
|
|
|
008ed2 |
reset_selected_keyframe();
|
|
|
008ed2 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
void
|
|
|
008ed2 |
Widget_Keyframe_List::reset_selected_keyframe()
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
selected = false;
|
|
|
008ed2 |
dragging = false;
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
void
|
|
|
008ed2 |
Widget_Keyframe_List::set_selected_keyframe(const Keyframe &x)
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
if (selected && x == selected_kf) {
|
|
|
008ed2 |
// Keyframe::operator== only on uniqueid::operator==
|
|
|
008ed2 |
// \see UniqueID::operator==
|
|
|
008ed2 |
// In all case, refresh keyframe description, time and activation status to do not loose it
|
|
|
008ed2 |
selected_kf = x;
|
|
[d.j.a.y] Jerome Blanchi |
48b421 |
return;
|
|
[d.j.a.y] Jerome Blanchi |
48b421 |
}
|
|
[d.j.a.y] Jerome Blanchi |
bb3396 |
|
|
|
008ed2 |
selected_kf = x;
|
|
|
008ed2 |
selected = true;
|
|
|
008ed2 |
dragging = false;
|
|
|
008ed2 |
dragging_kf_time = selected_kf.get_time();
|
|
[d.j.a.y] Jerome Blanchi |
bb3396 |
|
|
|
008ed2 |
if (canvas_interface)
|
|
|
008ed2 |
canvas_interface->signal_keyframe_selected()(selected_kf);
|
|
[d.j.a.y] Jerome Blanchi |
bb3396 |
|
|
[d.j.a.y] Jerome Blanchi |
4b3c39 |
queue_draw();
|
|
[d.j.a.y] Jerome Blanchi |
4b3c39 |
}
|
|
[d.j.a.y] Jerome Blanchi |
4b3c39 |
|
|
[d.j.a.y] Jerome Blanchi |
4b3c39 |
void
|
|
|
008ed2 |
Widget_Keyframe_List::on_keyframe_selected(Keyframe keyframe)
|
|
|
d96b6a |
{ set_selected_keyframe(keyframe); }
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
bool
|
|
|
008ed2 |
Widget_Keyframe_List::perform_move_kf(bool delta)
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
if (!kf_list)
|
|
|
008ed2 |
return false;
|
|
|
008ed2 |
if (!selected)
|
|
Nikita Kitaev |
254e11 |
return false;
|
|
|
008ed2 |
if (dragging_kf_time == selected_kf.get_time())
|
|
Nikita Kitaev |
254e11 |
return false; // change this checking if not sticked to integer frames
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
Time selected_kf_time(selected_kf.get_time());
|
|
Nikita Kitaev |
254e11 |
Time prev, next;
|
|
|
008ed2 |
kf_list->find_prev_next(selected_kf_time, prev, next);
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
// Not possible to set delta to the first keyframe
|
|
Nikita Kitaev |
254e11 |
// perform normal movement
|
|
Nikita Kitaev |
254e11 |
// As suggested by Zelgadis it is better to not perform anything.
|
|
|
008ed2 |
if (prev == Time::begin() && delta) {
|
|
|
008ed2 |
info(_("Not possible to ALT-drag the first keyframe"));
|
|
Nikita Kitaev |
254e11 |
return false;
|
|
Nikita Kitaev |
254e11 |
}
|
|
[d.j.a.y] Jerome Blanchi |
4b3c39 |
|
|
|
008ed2 |
if (!delta) {
|
|
|
008ed2 |
Action::Handle action(Action::create("KeyframeSet"));
|
|
|
008ed2 |
if (!action) return false;
|
|
|
008ed2 |
selected_kf.set_time(dragging_kf_time);
|
|
|
008ed2 |
action->set_param("canvas", canvas_interface->get_canvas());
|
|
|
008ed2 |
action->set_param("canvas_interface", canvas_interface);
|
|
|
008ed2 |
action->set_param("keyframe", selected_kf);
|
|
|
008ed2 |
try {
|
|
|
008ed2 |
canvas_interface->get_instance()->perform_action(action);
|
|
|
008ed2 |
canvas_interface->signal_keyframe_selected()(selected_kf);
|
|
|
008ed2 |
} catch(...) { return false; }
|
|
|
008ed2 |
} else {
|
|
|
008ed2 |
// find prev from selected kf time including deactivated kf
|
|
|
0589a7 |
KeyframeList::iterator iter;
|
|
|
0589a7 |
if (kf_list->find_prev(selected_kf_time, iter, false)) {
|
|
|
0589a7 |
//Keyframe prev_kf(*kf_list->find_prev(selected_kf_time, false));
|
|
|
0589a7 |
Keyframe prev_kf(*iter);
|
|
|
0589a7 |
Time prev_kf_time(prev_kf.get_time());
|
|
|
0589a7 |
if (prev_kf_time >= dragging_kf_time) { // Not allowed
|
|
|
0589a7 |
warning(_("Delta set not allowed"));
|
|
|
0589a7 |
info("Widget_Keyframe_List::perform_move_kf(%i)::prev_kf_time=%s", delta, prev_kf_time.get_string().c_str());
|
|
|
0589a7 |
info("Widget_Keyframe_List::perform_move_kf(%i)::dragging_kf_time=%s", delta, dragging_kf_time.get_string().c_str());
|
|
Nikita Kitaev |
254e11 |
return false;
|
|
|
0589a7 |
} else {
|
|
|
0589a7 |
Time old_delta_time(selected_kf_time-prev_kf_time);
|
|
|
0589a7 |
Time new_delta_time(dragging_kf_time-prev_kf_time);
|
|
|
0589a7 |
Time change_delta(new_delta_time-old_delta_time);
|
|
|
0589a7 |
Action::Handle action(Action::create("KeyframeSetDelta"));
|
|
|
0589a7 |
if (!action)
|
|
|
0589a7 |
return false;
|
|
|
0589a7 |
action->set_param("canvas", canvas_interface->get_canvas());
|
|
|
0589a7 |
action->set_param("canvas_interface", canvas_interface);
|
|
|
0589a7 |
action->set_param("keyframe", prev_kf);
|
|
|
0589a7 |
action->set_param("delta", change_delta);
|
|
|
0589a7 |
canvas_interface->get_instance()->perform_action(action);
|
|
|
0589a7 |
}
|
|
|
0589a7 |
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
}
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
queue_draw();
|
|
Nikita Kitaev |
254e11 |
return true;
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
bool
|
|
Nikita Kitaev |
254e11 |
Widget_Keyframe_List::on_event(GdkEvent *event)
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
if (!time_model || get_width() <= 0 || !kf_list || !editable)
|
|
|
008ed2 |
return false;
|
|
|
008ed2 |
|
|
|
008ed2 |
const int x = (int)event->button.x;
|
|
|
008ed2 |
|
|
|
008ed2 |
// Boundaries of the drawing area in time units.
|
|
|
008ed2 |
Time lower(time_model->get_visible_lower());
|
|
|
008ed2 |
Time upper(time_model->get_visible_upper());
|
|
[d.j.a.y] Jerome Blanchi |
502323 |
|
|
|
008ed2 |
// The time where the event x is
|
|
|
008ed2 |
Time t = lower + (upper - lower)*((double)x/(double)get_width());
|
|
|
008ed2 |
t = std::max(lower, std::min(upper, t));
|
|
|
008ed2 |
|
|
|
008ed2 |
// here the guts of the event
|
|
|
008ed2 |
switch(event->type) {
|
|
|
008ed2 |
case GDK_MOTION_NOTIFY: {
|
|
|
008ed2 |
if (event->motion.state & GDK_BUTTON1_MASK) {
|
|
Nikita Kitaev |
254e11 |
// here is captured mouse motion
|
|
Nikita Kitaev |
254e11 |
// AND left or right mouse button pressed
|
|
[d.j.a.y] Jerome Blanchi |
b952bd |
|
|
|
008ed2 |
if (!selected)
|
|
Nikita Kitaev |
254e11 |
return true;
|
|
|
008ed2 |
|
|
|
008ed2 |
// stick to integer frames
|
|
|
008ed2 |
t = time_model->round_time(t);
|
|
|
008ed2 |
|
|
|
008ed2 |
dragging_kf_time = t;
|
|
|
008ed2 |
dragging = true;
|
|
|
008ed2 |
|
|
|
008ed2 |
// Moving tooltip displaying the dragging time
|
|
|
008ed2 |
int x_root = static_cast<int>(event->button.x_root);</int>
|
|
|
008ed2 |
int x_origin; int y_origin;
|
|
|
008ed2 |
get_window()->get_origin (x_origin, y_origin);
|
|
|
008ed2 |
|
|
|
008ed2 |
moving_tooltip_label.set_text(
|
|
|
008ed2 |
String(_("Time : "))
|
|
|
008ed2 |
+ dragging_kf_time.get_string(time_model->get_frame_rate(), App::get_time_format())
|
|
|
008ed2 |
+ "\n"
|
|
|
008ed2 |
+ _("Old Time : ")
|
|
|
008ed2 |
+ selected_kf.get_time().get_string(time_model->get_frame_rate(), App::get_time_format()) );
|
|
|
008ed2 |
|
|
|
008ed2 |
// Show the tooltip and move to a nice position
|
|
|
008ed2 |
if (!moving_tooltip.get_visible()) moving_tooltip.show();
|
|
|
008ed2 |
moving_tooltip.move(x_root, y_origin - moving_tooltip.get_height());
|
|
|
008ed2 |
} else {
|
|
Nikita Kitaev |
254e11 |
// here is captured mouse motion
|
|
Nikita Kitaev |
254e11 |
// AND NOT left or right mouse button pressed
|
|
|
008ed2 |
String ttip;
|
|
|
008ed2 |
Time p_t, n_t;
|
|
|
008ed2 |
kf_list->find_prev_next(t, p_t, n_t);
|
|
|
008ed2 |
if ( (p_t == Time::begin() && n_t == Time::end())
|
|
|
008ed2 |
|| (t - p_t > time_ratio && n_t - t > time_ratio) )
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
ttip = _("Click and drag keyframes");
|
|
|
008ed2 |
} else
|
|
|
008ed2 |
if (t - p_t < n_t - t) {
|
|
|
0589a7 |
//Keyframe kf = *kf_list->find_prev(t);
|
|
|
0589a7 |
//ttip = kf.get_description().empty() ? String(_("No name")) : kf.get_description();
|
|
|
0589a7 |
KeyframeList::iterator iter;
|
|
|
0589a7 |
if (kf_list->find_prev(t, iter)) {
|
|
|
0589a7 |
Keyframe kf(*iter);
|
|
|
0589a7 |
ttip = kf.get_description().empty() ? String(_("No name")) : kf.get_description();
|
|
|
0589a7 |
}
|
|
|
0589a7 |
|
|
|
0589a7 |
|
|
|
008ed2 |
} else {
|
|
|
0589a7 |
//Keyframe kf(*kf_list->find_next(t));
|
|
|
0589a7 |
//ttip = kf.get_description().empty() ? String(_("No name")) : kf.get_description();
|
|
|
0589a7 |
KeyframeList::iterator iter;
|
|
|
0589a7 |
if (kf_list->find_next(t, iter)) {
|
|
|
0589a7 |
Keyframe kf(*iter);
|
|
|
0589a7 |
ttip = kf.get_description().empty() ? String(_("No name")) : kf.get_description();
|
|
|
0589a7 |
}
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
set_tooltip_text(ttip);
|
|
|
008ed2 |
dragging = false;
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
queue_draw();
|
|
|
008ed2 |
return true;
|
|
|
008ed2 |
}
|
|
|
008ed2 |
case GDK_BUTTON_PRESS: {
|
|
|
008ed2 |
changed = false;
|
|
|
008ed2 |
dragging = false;
|
|
|
008ed2 |
|
|
|
008ed2 |
const Keyframe *kf = NULL;
|
|
|
008ed2 |
Time prev_t, next_t;
|
|
|
008ed2 |
kf_list->find_prev_next(t, prev_t, next_t, false);
|
|
|
008ed2 |
if (t - prev_t < next_t - t) {
|
|
|
0589a7 |
if (t - prev_t <= time_ratio) {
|
|
|
0589a7 |
//kf = &*kf_list->find_prev(t, false);
|
|
|
0589a7 |
KeyframeList::iterator iter;
|
|
|
0589a7 |
if (kf_list->find_prev(t, iter, false))
|
|
|
0589a7 |
kf = &*iter;
|
|
|
0589a7 |
}
|
|
|
008ed2 |
} else {
|
|
|
0589a7 |
if (next_t - t <= time_ratio) {
|
|
|
0589a7 |
//kf = &*kf_list->find_next(t, false);
|
|
|
0589a7 |
KeyframeList::iterator iter;
|
|
|
0589a7 |
if (kf_list->find_next(t, iter, false))
|
|
|
0589a7 |
kf = &*iter;
|
|
|
0589a7 |
}
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
switch(event->button.button) {
|
|
|
008ed2 |
case 1:
|
|
|
008ed2 |
if (kf) set_selected_keyframe(*kf); else reset_selected_keyframe();
|
|
|
008ed2 |
break;
|
|
|
008ed2 |
case 3:
|
|
|
008ed2 |
if (kf) set_selected_keyframe(*kf);
|
|
|
008ed2 |
if (Gtk::Menu* menu = dynamic_cast<gtk::menu*>(App::ui_manager()->get_widget("/menu-keyframe")))</gtk::menu*>
|
|
|
008ed2 |
menu->popup(event->button.button,gtk_get_current_event_time());
|
|
|
008ed2 |
break;
|
|
|
008ed2 |
default:
|
|
|
008ed2 |
return false;
|
|
|
008ed2 |
}
|
|
|
008ed2 |
|
|
|
008ed2 |
queue_draw();
|
|
|
008ed2 |
return true;
|
|
|
008ed2 |
}
|
|
|
008ed2 |
case GDK_2BUTTON_PRESS: {
|
|
|
008ed2 |
if (event->button.button == 1) {
|
|
|
008ed2 |
if (selected && canvas_interface)
|
|
|
008ed2 |
canvas_interface->signal_keyframe_properties()();
|
|
|
008ed2 |
return true;
|
|
[d.j.a.y] Jerome Blanchi |
bdfded |
}
|
|
[d.j.a.y] Jerome Blanchi |
bdfded |
break;
|
|
|
008ed2 |
}
|
|
|
008ed2 |
case GDK_BUTTON_RELEASE: {
|
|
|
008ed2 |
if (event->button.button == 1 && dragging) {
|
|
|
008ed2 |
moving_tooltip.hide();
|
|
|
008ed2 |
perform_move_kf((bool)(event->button.state & GDK_MOD1_MASK));
|
|
|
008ed2 |
dragging = false;
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
if (event->button.button == 1 || event->button.button == 3)
|
|
|
008ed2 |
return true; // we captured press of buttons 1 and 3, so capture release too
|
|
Nikita Kitaev |
254e11 |
break;
|
|
|
008ed2 |
}
|
|
Nikita Kitaev |
254e11 |
default:
|
|
Nikita Kitaev |
254e11 |
break;
|
|
Nikita Kitaev |
254e11 |
}
|
|
|
008ed2 |
|
|
Nikita Kitaev |
254e11 |
return false;
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
void Widget_Keyframe_List::set_time_model(const etl::handle<timemodel> &x)</timemodel>
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
if (time_model == x) return;
|
|
|
008ed2 |
time_model_change.disconnect();
|
|
|
008ed2 |
time_model = x;
|
|
|
008ed2 |
if (time_model)
|
|
|
008ed2 |
time_model_change = x->signal_visible_changed().connect(
|
|
|
008ed2 |
sigc::mem_fun(*this, &Widget_Keyframe_List::queue_draw) );
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
|
|
Nikita Kitaev |
254e11 |
void
|
|
|
008ed2 |
Widget_Keyframe_List::set_canvas_interface(const etl::loose_handle<canvasinterface> &x)</canvasinterface>
|
|
Nikita Kitaev |
254e11 |
{
|
|
|
008ed2 |
if (canvas_interface == x) return;
|
|
Nikita Kitaev |
254e11 |
|
|
|
008ed2 |
keyframe_added.disconnect();
|
|
|
008ed2 |
keyframe_changed.disconnect();
|
|
|
008ed2 |
keyframe_removed.disconnect();
|
|
|
008ed2 |
keyframe_selected.disconnect();
|
|
|
008ed2 |
|
|
|
008ed2 |
canvas_interface = x;
|
|
|
008ed2 |
set_kf_list(canvas_interface ? &canvas_interface->get_canvas()->keyframe_list() : NULL);
|
|
|
008ed2 |
|
|
|
008ed2 |
if (canvas_interface) {
|
|
|
008ed2 |
keyframe_added = canvas_interface->signal_keyframe_added().connect(
|
|
|
25f25d |
sigc::hide_return(
|
|
|
25f25d |
sigc::hide(
|
|
|
008ed2 |
sigc::mem_fun(*this,&Widget_Keyframe_List::queue_draw) )));
|
|
|
008ed2 |
keyframe_changed = canvas_interface->signal_keyframe_changed().connect(
|
|
|
6a8a36 |
sigc::hide_return(
|
|
|
6a8a36 |
sigc::hide(
|
|
|
008ed2 |
sigc::mem_fun(*this,&Widget_Keyframe_List::queue_draw) )));
|
|
|
008ed2 |
keyframe_removed = canvas_interface->signal_keyframe_removed().connect(
|
|
|
6a8a36 |
sigc::hide_return(
|
|
|
f65c68 |
sigc::hide(
|
|
|
008ed2 |
sigc::mem_fun(*this,&Widget_Keyframe_List::queue_draw) )));
|
|
|
008ed2 |
keyframe_selected = canvas_interface->signal_keyframe_selected().connect(
|
|
|
008ed2 |
sigc::mem_fun(*this,&Widget_Keyframe_List::on_keyframe_selected) );
|
|
Nikita Kitaev |
254e11 |
}
|
|
Nikita Kitaev |
254e11 |
}
|