/* This file is part of Patchage. * Copyright 2007-2014 David Robillard * * Patchage 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 3 of the License, or (at your option) * any later version. * * Patchage 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 Patchage. If not, see . */ #ifndef PATCHAGE_PATCHAGEPORT_HPP #define PATCHAGE_PATCHAGEPORT_HPP #include "patchage_config.h" #include "Configuration.hpp" #include "PatchageCanvas.hpp" #include "PatchageModule.hpp" #include "PortID.hpp" #include "ganv/Module.hpp" #include "ganv/Port.hpp" #include #include #include /** A Port on a PatchageModule */ class PatchagePort : public Ganv::Port { public: PatchagePort(Ganv::Module& module, PortType type, const std::string& name, const std::string& human_name, bool is_input, uint32_t color, bool show_human_name, boost::optional order = boost::optional()) : Port(module, (show_human_name && !human_name.empty()) ? human_name : name, is_input, color) , _type(type) , _name(name) , _human_name(human_name) , _order(order) { signal_event().connect(sigc::mem_fun(this, &PatchagePort::on_event)); } virtual ~PatchagePort() {} /** Returns the full name of this port, as "modulename:portname" */ std::string full_name() const { auto* pmod = dynamic_cast(get_module()); return std::string(pmod->name()) + ":" + _name; } void show_human_name(bool human) { if (human && !_human_name.empty()) { set_label(_human_name.c_str()); } else { set_label(_name.c_str()); } } bool on_event(GdkEvent* ev) { if (ev->type != GDK_BUTTON_PRESS || ev->button.button != 3) { return false; } Gtk::Menu* menu = Gtk::manage(new Gtk::Menu()); menu->items().push_back(Gtk::Menu_Helpers::MenuElem( "Disconnect", sigc::mem_fun(this, &Port::disconnect))); menu->popup(ev->button.button, ev->button.time); return true; } PortType type() const { return _type; } const std::string& name() const { return _name; } const std::string& human_name() const { return _human_name; } const boost::optional& order() const { return _order; } private: PortType _type; std::string _name; std::string _human_name; boost::optional _order; }; #endif // PATCHAGE_PATCHAGEPORT_HPP