/* This file is part of Ingen. Copyright 2007-2015 David Robillard Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. Ingen 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 Affero General Public License for details. You should have received a copy of the GNU Affero General Public License along with Ingen. If not, see . */ #ifndef INGEN_GUI_GRAPHCANVAS_HPP #define INGEN_GUI_GRAPHCANVAS_HPP #include "NodeModule.hpp" #include "ganv/Canvas.hpp" #include "ganv/Module.hpp" #include "ingen/Node.hpp" #include "ingen/client/ArcModel.hpp" #include "ingen/types.hpp" #include "lilv/lilv.h" #include "raul/Path.hpp" #include #include #include namespace ingen { namespace client { class GraphModel; } namespace gui { class NodeModule; class PluginMenu; /** Graph canvas widget. * * \ingroup GUI */ class GraphCanvas : public Ganv::Canvas { public: GraphCanvas(App& app, SPtr graph, int width, int height); virtual ~GraphCanvas() {} App& app() { return _app; } void build(); void show_human_names(bool b); void show_port_names(bool b); bool show_port_names() const { return _show_port_names; } void add_plugin(SPtr p); void remove_plugin(const URI& uri); void add_block(SPtr bm); void remove_block(SPtr bm); void add_port(SPtr pm); void remove_port(SPtr pm); void connection(SPtr arc); void disconnection(SPtr arc); void get_new_module_location(double& x, double& y); void clear_selection() override; void destroy_selection(); void copy_selection(); void paste(); void show_menu(bool position, unsigned button, uint32_t time); bool on_event(GdkEvent* event); private: enum class ControlType { NUMBER, BUTTON }; void generate_port_name( const std::string& sym_base, std::string& symbol, const std::string& name_base, std::string& name); void menu_add_port(const std::string& sym_base, const std::string& name_base, const URI& type, bool is_output); void menu_load_plugin(); void menu_new_graph(); void menu_load_graph(); void menu_properties(); void load_plugin(WPtr weak_plugin); void build_menus(); void auto_menu_position(int& x, int& y, bool& push_in); using LV2Children = std::multimap; Properties get_initial_data(Resource::Graph ctx=Resource::Graph::DEFAULT); Ganv::Port* get_port_view(SPtr port); void connect(Ganv::Node* tail, Ganv::Node* head); void disconnect(Ganv::Node* tail, Ganv::Node* head); App& _app; SPtr _graph; using Views = std::map, Ganv::Module*>; Views _views; int _auto_position_count; std::pair _auto_position_scroll_offsets; int _menu_x; int _menu_y; int _paste_count; // Track pasted objects so they can be selected when they arrive std::set _pastees; Gtk::Menu* _menu; Gtk::Menu* _internal_menu; PluginMenu* _plugin_menu; Gtk::MenuItem* _menu_add_audio_input; Gtk::MenuItem* _menu_add_audio_output; Gtk::MenuItem* _menu_add_control_input; Gtk::MenuItem* _menu_add_control_output; Gtk::MenuItem* _menu_add_cv_input; Gtk::MenuItem* _menu_add_cv_output; Gtk::MenuItem* _menu_add_event_input; Gtk::MenuItem* _menu_add_event_output; Gtk::MenuItem* _menu_load_plugin; Gtk::MenuItem* _menu_load_graph; Gtk::MenuItem* _menu_new_graph; Gtk::MenuItem* _menu_properties; Gtk::CheckMenuItem* _menu_edit; bool _human_names; bool _show_port_names; bool _menu_dirty; }; } // namespace gui } // namespace ingen #endif // INGEN_GUI_GRAPHCANVAS_HPP