/*
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_GRAPHTREEWINDOW_HPP
#define INGEN_GUI_GRAPHTREEWINDOW_HPP
#include "Window.hpp"
#include "ingen/URI.hpp"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace Gtk {
class Builder;
} // namespace Gtk
namespace ingen {
class Atom;
namespace client {
class ClientStore;
class ObjectModel;
class GraphModel;
} // namespace client
namespace gui {
class App;
class GraphTreeView;
/** Window with a TreeView of all loaded graphs.
*
* \ingroup GUI
*/
class GraphTreeWindow : public Window
{
public:
GraphTreeWindow(BaseObjectType* cobject,
const Glib::RefPtr& xml);
void init(App& app, client::ClientStore& store);
void new_object(const std::shared_ptr& object);
void
graph_property_changed(const URI& key,
const Atom& value,
const std::shared_ptr& graph);
void graph_moved(const std::shared_ptr& graph);
void add_graph(const std::shared_ptr& pm);
void remove_graph(const std::shared_ptr& pm);
void show_graph_menu(GdkEventButton* ev);
protected:
void event_graph_activated(const Gtk::TreeModel::Path& path,
Gtk::TreeView::Column* col);
void event_graph_enabled_toggled(const Glib::ustring& path_str);
Gtk::TreeModel::iterator
find_graph(Gtk::TreeModel::Children root,
const std::shared_ptr& graph);
GraphTreeView* _graphs_treeview{nullptr};
struct GraphTreeModelColumns : public Gtk::TreeModel::ColumnRecord {
GraphTreeModelColumns() {
add(name_col);
add(enabled_col);
add(graph_model_col);
}
Gtk::TreeModelColumn name_col;
Gtk::TreeModelColumn enabled_col;
Gtk::TreeModelColumn> graph_model_col;
};
GraphTreeModelColumns _graph_tree_columns;
Glib::RefPtr _graph_treestore;
Glib::RefPtr _graph_tree_selection;
bool _enable_signal{true};
};
/** Derived TreeView class to support context menus for graphs */
class GraphTreeView : public Gtk::TreeView
{
public:
GraphTreeView(BaseObjectType* cobject,
const Glib::RefPtr& xml)
: Gtk::TreeView(cobject)
{}
void set_window(GraphTreeWindow* win) { _window = win; }
bool on_button_press_event(GdkEventButton* ev) override {
bool ret = Gtk::TreeView::on_button_press_event(ev);
if ((ev->type == GDK_BUTTON_PRESS) && (ev->button == 3)) {
_window->show_graph_menu(ev);
}
return ret;
}
private:
GraphTreeWindow* _window{nullptr};
};
} // namespace gui
} // namespace ingen
#endif // INGEN_GUI_GRAPHTREEWINDOW_HPP