|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === S Y N F I G ========================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/*! \file widget_curves.cpp
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** \brief Template File
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
**
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** $Id$
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
**
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** \legal
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** ......... ... 2019 Rodolfo R. Gomes
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
**
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** This package is free software; you can redistribute it and/or
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** modify it under the terms of the GNU General Public License as
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** published by the Free Software Foundation; either version 2 of
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** the License, or (at your option) any later version.
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
**
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** This package is distributed in the hope that it will be useful,
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** General Public License for more details.
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
** \endlegal
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
*/
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* ========================================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === H E A D E R S ======================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
#ifdef USING_PCH
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# include "pch.h"
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
#else
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# ifdef HAVE_CONFIG_H
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# include <config.h></config.h>
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# endif
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# include "timeplotdata.h"
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
# include <etl misc=""></etl>
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
#endif
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === U S I N G =========================================================== */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === M A C R O S ========================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === G L O B A L S ======================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === P R O C E D U R E S ================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
/* === C L A S S E S ======================================================= */
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
namespace studio {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::TimePlotData(Gtk::Widget& widget, Glib::RefPtr<gtk::adjustment> vertical_adjustment) :</gtk::adjustment>
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
invalid(true),
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
extra_margin(0),
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
has_vertical(false),
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget(widget),
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
vertical_adjustment(vertical_adjustment)
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget_resized = widget.signal_configure_event().connect(
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
sigc::mem_fun(*this, &TimePlotData::on_widget_resize) );
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (vertical_adjustment) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
vertical_changed = vertical_adjustment->signal_changed().connect(
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
sigc::mem_fun(*this, &TimePlotData::recompute_vertical) );
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
vertical_value_changed = vertical_adjustment->signal_value_changed().connect(
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
sigc::mem_fun(*this, &TimePlotData::recompute_vertical) );
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_vertical();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::~TimePlotData()
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget_resized.disconnect();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
time_model_changed.disconnect();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
vertical_changed.disconnect();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
vertical_value_changed.disconnect();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::set_time_model(const etl::handle<studio::timemodel>& time_model)</studio::timemodel>
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (this->time_model == time_model)
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
time_model_changed.disconnect();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
this->time_model = time_model;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (time_model) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
time_model_changed = this->time_model->signal_changed().connect(
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
sigc::mem_fun(*this, &TimePlotData::recompute_time_bounds) );
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
invalid = false;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
} else {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
invalid = true;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_time_bounds();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::set_extra_time_margin(double margin)
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
extra_margin = margin;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_extra_time();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
bool
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::on_widget_resize(GdkEventConfigure*)
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_geometry_data();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return false;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::recompute_time_bounds()
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (!time_model) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
time = lower = upper = 0;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
invalid = true;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget.queue_draw();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
time = time_model->get_time();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
lower = time_model->get_visible_lower();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
upper = time_model->get_visible_upper();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (lower >= upper) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
invalid = true;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget.queue_draw();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
12c51e |
invalid = false;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_geometry_data(); // lower and upper change other fields
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::recompute_geometry_data()
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
k = widget.get_width()/(upper - lower);
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
dt = 1.0/k;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (has_vertical) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
range_k = widget.get_height()/(range_upper - range_lower);
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
recompute_extra_time(); // k (and lower and upper) changes extra_time
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::recompute_extra_time()
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
extra_time = extra_margin/k;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
lower_ex = lower - extra_time;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
upper_ex = upper + extra_time;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget.queue_draw();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
void
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
TimePlotData::recompute_vertical()
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
if (!vertical_adjustment) {
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
has_vertical = false;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
range_lower = vertical_adjustment->get_value();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
range_upper = range_lower + vertical_adjustment->get_page_size();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
range_k = widget.get_height()/(range_upper - range_lower);
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
has_vertical = true;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
widget.queue_draw();
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
bool
|
|
Rodolfo Ribeiro Gomes |
12c51e |
TimePlotData::is_invalid() const
|
|
Rodolfo Ribeiro Gomes |
12c51e |
{
|
|
Rodolfo Ribeiro Gomes |
12c51e |
return invalid;
|
|
Rodolfo Ribeiro Gomes |
12c51e |
}
|
|
Rodolfo Ribeiro Gomes |
12c51e |
|
|
Rodolfo Ribeiro Gomes |
12c51e |
bool
|
|
Rodolfo Ribeiro Gomes |
f56b2a |
TimePlotData::is_time_visible(const synfig::Time& t) const
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return t >= lower && t <= upper;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
bool
|
|
Rodolfo Ribeiro Gomes |
f56b2a |
TimePlotData::is_time_visible_extra(const synfig::Time& t) const
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return t >= lower_ex && t <= upper_ex;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
bool
|
|
Rodolfo Ribeiro Gomes |
f56b2a |
TimePlotData::is_y_visible(synfig::Real y) const
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return y >= range_lower && y <= range_upper;
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
int
|
|
Rodolfo Ribeiro Gomes |
f56b2a |
TimePlotData::get_pixel_t_coord(const synfig::Time& t) const
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
return etl::round_to_int((t - lower) * k);
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
12c51e |
double
|
|
Rodolfo Ribeiro Gomes |
12c51e |
TimePlotData::get_double_pixel_t_coord(const synfig::Time& t) const
|
|
Rodolfo Ribeiro Gomes |
12c51e |
{
|
|
Rodolfo Ribeiro Gomes |
12c51e |
return round((t - lower) * k);
|
|
Rodolfo Ribeiro Gomes |
12c51e |
}
|
|
Rodolfo Ribeiro Gomes |
12c51e |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
int
|
|
Rodolfo Ribeiro Gomes |
f56b2a |
TimePlotData::get_pixel_y_coord(synfig::Real y) const
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
{
|
|
Rodolfo Ribeiro Gomes |
8e579f |
return etl::round_to_int(-(y + range_lower) * range_k);
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
|
|
Rodolfo Ribeiro Gomes |
12c51e |
synfig::Time
|
|
Rodolfo Ribeiro Gomes |
12c51e |
TimePlotData::get_t_from_pixel_coord(double pixel) const
|
|
Rodolfo Ribeiro Gomes |
12c51e |
{
|
|
Rodolfo Ribeiro Gomes |
12c51e |
return lower + synfig::Time(pixel/k);
|
|
Rodolfo Ribeiro Gomes |
12c51e |
}
|
|
Rodolfo Ribeiro Gomes |
12c51e |
|
|
Rodolfo Ribeiro Gomes |
12c51e |
double TimePlotData::get_y_from_pixel_coord(double pixel) const
|
|
Rodolfo Ribeiro Gomes |
12c51e |
{
|
|
Rodolfo Ribeiro Gomes |
82d3ab |
return -(range_lower + pixel / range_k);
|
|
Rodolfo Ribeiro Gomes |
12c51e |
}
|
|
Rodolfo Ribeiro Gomes |
12c51e |
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
synfig::Time studio::TimePlotData::get_delta_t_from_delta_pixel_coord(int delta_pixel) const
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
{
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
return synfig::Time(delta_pixel/k);
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
}
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
double TimePlotData::get_delta_y_from_delta_pixel_coord(int delta_pixel) const
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
{
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
return -(delta_pixel / range_k);
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
}
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
int TimePlotData::get_delta_pixel_from_delta_t_coord(double delta_t) const
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
{
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
return int(delta_t * k);
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
}
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
int TimePlotData::get_delta_pixel_from_delta_y_coord(double delta_y) const
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
{
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
return int(-delta_y * range_k);
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
}
|
|
Rodolfo Ribeiro Gomes |
eb6db5 |
|
|
Rodolfo Ribeiro Gomes |
13ab6f |
}
|