Blame synfig-studio/src/gui/timeplotdata.cpp

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
}