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