ladish/gui/flowcanvas/Module.hpp

154 lines
4.1 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_MODULE_HPP
#define FLOWCANVAS_MODULE_HPP
#include <string>
#include <algorithm>
#include <boost/shared_ptr.hpp>
#include <libgnomecanvasmm.h>
#include "Port.hpp"
#include "Item.hpp"
namespace FlowCanvas {
class Canvas;
/** A named block (possibly) containing input and output ports.
*
* \ingroup FlowCanvas
*/
class Module : public Item
{
public:
Module(boost::shared_ptr<Canvas> canvas,
const std::string& name,
double x = 0,
double y = 0,
bool show_title = true,
bool show_port_labels = true);
virtual ~Module();
const PortVector& ports() const { return _ports; }
PortVector& ports() { return _ports; }
inline boost::shared_ptr<Port> get_port(const std::string& name) const;
void add_port(boost::shared_ptr<Port> port);
void remove_port(boost::shared_ptr<Port> port);
boost::shared_ptr<Port> port_at(double x, double y);
void zoom(double z);
void resize();
bool show_port_labels(bool b) { return _show_port_labels; }
void set_show_port_labels(bool b);
virtual void move(double dx, double dy);
virtual void move_to(double x, double y);
virtual void set_name(const std::string& n);
double border_width() const { return _border_width; }
void set_border_width(double w);
void select_tick();
void set_selected(bool b);
void set_highlighted(bool b);
void set_border_color(uint32_t c);
void set_base_color(uint32_t c);
void set_default_base_color();
void set_stacked_border(bool b);
void set_icon(const Glib::RefPtr<Gdk::Pixbuf>& icon);
size_t num_ports() const { return _ports.size(); }
double empty_port_breadth() const;
double empty_port_depth() const;
protected:
virtual bool on_event(GdkEvent* ev);
virtual void set_width(double w);
virtual void set_height(double h);
void fit_canvas();
void measure_ports();
void resize_horiz();
void resize_vert();
void port_renamed() { _port_renamed = true; }
void embed(Gtk::Container* widget);
PortVector _ports;
Gnome::Canvas::Rect _module_box;
Gnome::Canvas::Text _canvas_title;
Gnome::Canvas::Rect* _stacked_border;
Gnome::Canvas::Pixbuf* _icon_box;
Gtk::Container* _embed_container;
Gnome::Canvas::Widget* _embed_item;
double _border_width;
double _embed_width;
double _embed_height;
double _icon_size;
double _widest_input;
double _widest_output;
double _title_width;
double _title_height;
bool _title_visible :1;
bool _port_renamed :1;
bool _show_port_labels :1;
private:
friend class Canvas;
struct PortComparator {
explicit PortComparator(const std::string& name) : _name(name) {}
inline bool operator()(const boost::shared_ptr<Port> port)
{ return (port && port->name() == _name); }
const std::string& _name;
};
void embed_size_request(Gtk::Requisition* req, bool force);
};
// Performance critical functions:
/** Find a port on this module. */
inline boost::shared_ptr<Port>
Module::get_port(const std::string& port_name) const
{
PortComparator comp(port_name);
PortVector::const_iterator i = std::find_if(_ports.begin(), _ports.end(), comp);
return (i != _ports.end()) ? *i : boost::shared_ptr<Port>();
}
} // namespace FlowCanvas
#endif // FLOWCANVAS_MODULE_HPP