gpanthera.hh
C++ source, ASCII text
1#ifndef GPANTHERA_LIBRARY_H 2#define GPANTHERA_LIBRARY_H 3 4#include <gtkmm.h> 5#include <glibmm.h> 6#include <glibmm/ustring.h> 7#include <utility> 8#include <vector> 9#include <memory> 10 11namespace gPanthera { 12void init(); 13// Utility function to create a signal that fires when a context menu is requested 14sigc::signal<void(double, double)> add_context_menu(Gtk::Widget &widget); 15std::vector<Gtk::Widget*> collect_children(Gtk::Widget &widget); 16Gtk::Image *copy_image(Gtk::Image *image); 17 18class DockStack; 19class DockWindow; 20class LayoutManager; 21 22class DockablePane : public Gtk::Box { 23protected: 24Gtk::Widget *child; 25Gtk::Label label; 26Glib::ustring name; 27Gtk::Image *icon; 28DockStack *stack = nullptr; 29DockWindow *window = nullptr; 30std::unique_ptr<Gtk::HeaderBar> header; 31Glib::RefPtr<Gio::SimpleActionGroup> action_group; 32public: 33DockWindow *get_window() const; 34std::shared_ptr<LayoutManager> layout; 35Glib::RefPtr<Gio::Menu> header_menu = Gio::Menu::create(); 36DockStack *last_stack = nullptr; 37DockablePane(std::shared_ptr<LayoutManager> layout, Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &label, Gtk::Image *icon, DockStack *stack = nullptr, Gtk::Widget *custom_header = nullptr); 38Gtk::Stack *get_stack() const; 39Glib::ustring get_identifier() const; 40Gtk::Image *get_icon() const; 41Gtk::Label *get_label(); 42void redock(DockStack *stack); 43void pop_out(); 44Gtk::Widget *get_child() const; 45sigc::signal<void()> signal_pane_shown; 46sigc::signal<void()> signal_pane_hidden; 47}; 48 49class DockWindow : public Gtk::Window { 50private: 51DockablePane *pane; 52public: 53explicit DockWindow(DockablePane *pane); 54}; 55 56class LayoutManager : public Glib::ObjectBase { 57private: 58public: 59std::vector<DockablePane*> panes; 60std::vector<DockStack*> stacks; 61sigc::signal<void(DockablePane*)> signal_pane_moved; 62LayoutManager(); 63std::string get_layout_as_json() const; 64 65void restore_json_layout(const std::string& json_string); 66 67void add_pane(DockablePane *pane); 68 69void add_stack(DockStack *stack); 70void remove_pane(DockablePane *pane); 71void remove_stack(DockStack *stack); 72}; 73 74class BaseStack : public Gtk::Stack { 75public: 76sigc::signal<void(Gtk::Widget*)> signal_child_added; 77sigc::signal<void(Gtk::Widget*)> signal_child_removed; 78BaseStack(); 79void add(Gtk::Widget &child, const Glib::ustring &name); 80void remove(Gtk::Widget &child); 81void add(Gtk::Widget &child); 82void add(Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &title) = delete; 83}; 84 85class DockStack : public BaseStack { 86private: 87public: 88std::shared_ptr<LayoutManager> layout; 89Glib::ustring name; 90std::string id; 91DockablePane *last_pane = nullptr; 92explicit DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name, const std::string &id); 93 94void add_pane(DockablePane &child); 95}; 96 97class DockButton : public Gtk::ToggleButton { 98private: 99sigc::connection active_style_handler; 100std::shared_ptr<Gtk::DragSource> drag_source; 101Glib::Value<DockablePane*> value; 102void update_active_style(); 103public: 104DockablePane *pane; 105explicit DockButton(DockablePane *pane); 106~DockButton() override; 107}; 108 109class DockStackSwitcher : public Gtk::Box { 110private: 111DockStack *stack; 112sigc::connection add_handler, remove_handler; 113std::shared_ptr<Gtk::DropTarget> drop_target; 114public: 115void update_buttons(); 116explicit DockStackSwitcher(DockStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL); 117DockStack *get_stack() const; 118~DockStackSwitcher() override; 119}; 120 121class ContentStack; 122class ContentPage; 123 124class ContentManager : public Glib::ObjectBase { 125private: 126ContentPage *last_operated_page = nullptr; 127public: 128ContentPage *get_last_operated_page() const; 129void set_last_operated_page(ContentPage *page); 130sigc::signal<void(ContentPage*)> signal_page_operated; 131std::vector<ContentStack*> stacks; 132ContentManager(); 133 134void add_stack(ContentStack *stack); 135void remove_stack(ContentStack *stack); 136}; 137 138class ContentPage : public Gtk::Overlay { 139protected: 140ContentStack *stack = nullptr; 141Gtk::Widget *child; 142public: 143Gtk::Widget *tab_widget; 144std::shared_ptr<ContentManager> content_manager; 145ContentStack *last_stack = nullptr; 146ContentPage(std::shared_ptr<ContentManager> content_manager, ContentStack *stack, Gtk::Widget *child, Gtk::Widget *tab_widget); 147sigc::signal<bool()> signal_close; 148sigc::signal<void(bool)> signal_control_status_changed; 149void close(); 150Gtk::Widget *get_tab_widget() const; 151void redock(ContentStack *stack); 152void set_tab_widget(Gtk::Widget *tab_widget); 153ContentStack *get_stack() const; 154void lose_visibility(); 155}; 156 157class ContentTab : public Gtk::ToggleButton { 158private: 159std::shared_ptr<Gtk::DragSource> drag_source; 160std::shared_ptr<Gtk::DropTarget> drop_target; 161Glib::Value<ContentPage*> value; 162Glib::RefPtr<Gio::Menu> context_menu = Gio::Menu::create(); 163sigc::connection drag_end_handler; 164sigc::connection drag_cancel_handler; 165void update_active_style(); 166sigc::connection active_style_handler; 167sigc::connection control_status_handler; 168Gtk::PopoverMenu *popover = nullptr; 169public: 170void close(); 171explicit ContentTab(ContentPage *page); 172ContentPage *page; 173~ContentTab() override; 174}; 175 176class ContentStack : public BaseStack { 177private: 178void disable_children(); 179void enable_children(); 180protected: 181std::function<bool(ContentPage*)> detach_handler; 182public: 183sigc::signal<bool(ContentPage*)> signal_detach; 184std::function<bool(ContentPage*)> get_detach_handler() const; 185std::shared_ptr<ContentManager> content_manager; 186std::shared_ptr<Gtk::DropTarget> drop_target; 187sigc::signal<void()> signal_leave_empty; 188explicit ContentStack(std::shared_ptr<ContentManager> content_manager, std::function<bool(ContentPage*)> detach_handler = nullptr); 189void make_paned(Gtk::Orientation orientation, Gtk::PackType pack_type); 190void add_page(ContentPage &child); 191void remove_with_paned(); 192}; 193 194class ContentTabBar : public Gtk::Box { 195// Dragging a tab to an empty space should split the view; 196// dragging a tab outside the window should pop it out with user-defined behaviour 197private: 198ContentStack *stack; 199sigc::connection add_handler, remove_handler; 200std::shared_ptr<Gtk::DropTarget> drop_target; 201Gtk::ScrolledWindow *scrolled_window; 202Gtk::Box *tab_box; 203std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function; 204public: 205void update_buttons(); 206explicit ContentTabBar(ContentStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function = nullptr); 207void set_orientation(Gtk::Orientation orientation); 208void set_extra_child_function(std::function<Gtk::Widget*(gPanthera::ContentTabBar*)>); 209ContentStack *get_stack() const; 210~ContentTabBar() override; 211std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> get_extra_child_function() const; 212}; 213 214class ContentNotebook : public Gtk::Box { 215private: 216ContentStack *stack; 217ContentTabBar *switcher; 218Gtk::PositionType tab_position; 219public: 220ContentNotebook(ContentStack *stack, ContentTabBar *switcher, Gtk::PositionType tab_position = Gtk::PositionType::TOP); 221Gtk::PositionType get_tab_position() const; 222ContentStack *get_stack() const; 223ContentTabBar *get_switcher() const; 224}; 225 226class ContentWindow : public Gtk::Window { 227private: 228ContentNotebook *notebook; 229public: 230ContentWindow(ContentNotebook *notebook); 231}; 232} // namespace gPanthera 233 234#endif // GPANTHERA_LIBRARY_H