ladish/gui/flowcanvas/Port.hpp

178 lines
4.5 KiB
C++

/* This file is part of FlowCanvas.
* Copyright (C) 2007-2009 David Robillard <http://drobilla.net>
*
* FlowCanvas is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option) any later
* version.
*
* FlowCanvas is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef FLOWCANVAS_PORT_HPP
#define FLOWCANVAS_PORT_HPP
#include <stdint.h>
#include <algorithm>
#include <list>
#include <string>
#include <vector>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <libgnomecanvasmm.h>
#include "Connectable.hpp"
namespace FlowCanvas {
class Connection;
class Module;
static const int PORT_LABEL_SIZE = 8000; // in thousandths of a point
/** A port on a Module.
*
* This is a group that contains both the label and rectangle for a port.
*
* \ingroup FlowCanvas
*/
class Port : public Gnome::Canvas::Group, public Connectable
{
public:
Port(boost::shared_ptr<Module> module,
const std::string& name,
bool is_input,
uint32_t color);
virtual ~Port();
void disconnect_all();
virtual Gnome::Art::Point src_connection_point();
virtual Gnome::Art::Point dst_connection_point(const Gnome::Art::Point& src);
virtual Gnome::Art::Point connection_point_vector(double dx, double dy);
boost::weak_ptr<Module> module() const { return _module; }
void set_fill_color(uint32_t c) { _rect->property_fill_color_rgba() = c; }
void show_label(bool b);
void set_selected(bool b);
bool selected() const { return _selected; }
void set_highlighted(bool highlight,
bool highlight_parent=true,
bool highlight_connections=true,
bool raise_connections=true);
void zoom(float z);
void popup_menu(guint button, guint32 activate_time) {
if ( ! _menu)
create_menu();
if (_menu)
_menu->popup(button, activate_time);
}
virtual void create_menu();
void set_menu(Gtk::Menu* m);
Gtk::Menu* menu() const { return _menu; }
double width() const { return _width; }
void set_width(double w);
void set_height(double h);
double border_width() const { return _border_width; }
void set_border_width(double w);
double natural_width() const;
const std::string& name() const { return _name; }
virtual void set_name(const std::string& n);
bool is_input() const { return _is_input; }
bool is_output() const { return !_is_input; }
uint32_t color() const { return _color; }
double height() const { return _height; }
virtual bool is_toggled() const { return _toggled; }
virtual void set_toggled(bool b) { _toggled = b; }
virtual void toggle(bool signal=true);
virtual void set_control(float value, bool signal=true);
virtual void set_control_min(float min);
virtual void set_control_max(float max);
float control_value() const { return _control ? _control->value : 0.0f; }
float control_min() const { return _control ? _control->min : 0.0f; }
float control_max() const { return _control ? _control->max : 1.0f; }
void show_control();
void hide_control();
inline bool operator==(const std::string& name) { return (_name == name); }
sigc::signal<void> signal_renamed;
sigc::signal<void,float> signal_control_changed;
protected:
friend class Canvas;
void on_menu_hide();
boost::weak_ptr<Module> _module;
std::string _name;
Gnome::Canvas::Text* _label;
Gnome::Canvas::Rect* _rect;
Gtk::Menu* _menu;
/** Port control value indicator "gauge" */
struct Control {
explicit Control(Gnome::Canvas::Rect* r)
: rect(r)
, value(0.0f)
, min(0.0f)
, max(1.0f)
{}
~Control() {
delete rect;
}
Gnome::Canvas::Rect* rect;
float value;
float min;
float max;
};
Control* _control;
double _width;
double _height;
double _border_width;
uint32_t _color;
bool _is_input :1;
bool _selected :1;
bool _toggled :1;
};
typedef std::vector<boost::shared_ptr<Port> > PortVector;
} // namespace FlowCanvas
#endif // FLOWCANVAS_PORT_HPP