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 14class DockStack; 15class DockWindow; 16class LayoutManager; 17 18class DockablePane : public Gtk::Box { 19private: 20Gtk::Label label; 21Glib::ustring name; 22Gtk::Image *icon; 23DockStack *stack; 24DockWindow *window = nullptr; 25std::unique_ptr<Gtk::HeaderBar> header; 26Gtk::Widget *child; 27std::shared_ptr<LayoutManager> layout; 28Glib::RefPtr<Gio::SimpleActionGroup> action_group; 29public: 30DockStack *last_stack = nullptr; 31DockablePane(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); 32Gtk::Stack *get_stack() const; 33Glib::ustring get_identifier() const; 34Gtk::Image *get_icon() const; 35Gtk::Label *get_label(); 36void redock(DockStack *stack); 37void pop_out(); 38Gtk::Widget *get_child() const; 39}; 40 41class DockWindow : public Gtk::Window { 42private: 43DockablePane *pane; 44public: 45explicit DockWindow(DockablePane *pane); 46}; 47 48class LayoutManager : public Glib::ObjectBase { 49private: 50public: 51std::vector<DockablePane*> panes; 52std::vector<DockStack*> stacks; 53LayoutManager(); 54 55void add_pane(DockablePane *pane); 56 57void add_stack(DockStack *stack); 58void remove_pane(DockablePane *pane); 59void remove_stack(DockStack *stack); 60}; 61 62class BaseStack : public Gtk::Stack { 63public: 64sigc::signal<void(Gtk::Widget*)> signal_child_added; 65sigc::signal<void(Gtk::Widget*)> signal_child_removed; 66}; 67 68class DockStack : public BaseStack { 69private: 70public: 71std::shared_ptr<LayoutManager> layout; 72Glib::ustring name; 73explicit DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name); 74 75void add_pane(DockablePane &child); 76void add(Gtk::Widget &child, const Glib::ustring &name); 77void remove(Gtk::Widget &child); 78void add(Gtk::Widget &child) = delete; 79void add(Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &title) = delete; 80}; 81 82class DockButton : public Gtk::Button { 83private: 84sigc::connection active_style_handler; 85std::shared_ptr<Gtk::DragSource> drag_source; 86Glib::Value<Gtk::Widget*> value; 87void update_active_style(); 88public: 89DockablePane *pane; 90explicit DockButton(DockablePane *pane); 91~DockButton(); 92}; 93 94class DockStackSwitcher : public Gtk::Box { 95private: 96DockStack *stack; 97sigc::connection add_handler, remove_handler; 98std::shared_ptr<Gtk::DropTarget> drop_target; 99public: 100void update_buttons(); 101explicit DockStackSwitcher(DockStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL); 102DockStack *get_stack() const; 103~DockStackSwitcher() override; 104}; 105} // namespace gPanthera 106 107#endif // GPANTHERA_LIBRARY_H