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
112
class ContentManager : public Glib::ObjectBase {
113
private:
114
public:
115
std::vector<ContentStack*> stacks;
116
ContentManager();
117
118
void add_stack(ContentStack *stack);
119
void remove_stack(ContentStack *stack);
120
};
121
122
class ContentPage : public Gtk::Overlay {
123
private:
124
Gtk::Widget *tab_widget;
125
ContentStack *stack = nullptr;
126
Gtk::Widget *child;
127
public:
128
std::shared_ptr<ContentManager> content_manager;
129
ContentStack *last_stack = nullptr;
130
ContentPage(std::shared_ptr<ContentManager> content_manager, ContentStack *stack, Gtk::Widget *child, Gtk::Widget *tab_widget);
131
sigc::signal<bool()> signal_close;
132
Gtk::Widget *get_tab_widget() const;
133
void redock(ContentStack *stack);
134
void set_tab_widget(Gtk::Widget *tab_widget);
135
ContentStack *get_stack() const;
136
void lose_visibility();
137
};
138
139
class ContentTab : public Gtk::ToggleButton {
140
private:
141
std::shared_ptr<Gtk::DragSource> drag_source;
142
std::shared_ptr<Gtk::DropTarget> drop_target;
143
Glib::Value<ContentPage*> value;
144
Glib::RefPtr<Gio::Menu> context_menu = Gio::Menu::create();
145
void update_active_style();
146
sigc::connection active_style_handler;
147
public:
148
explicit ContentTab(ContentPage *page);
149
ContentPage *page;
150
~ContentTab() override;
151
};
152
153
class ContentStack : public BaseStack {
154
protected:
155
std::function<bool(ContentPage*)> detach_handler;
156
public:
157
sigc::signal<bool(ContentPage*)> signal_detach;
158
std::function<bool(ContentPage*)> get_detach_handler() const;
159
std::shared_ptr<ContentManager> content_manager;
160
std::shared_ptr<Gtk::DropTarget> drop_target;
161
sigc::signal<void()> signal_leave_empty;
162
explicit ContentStack(std::shared_ptr<ContentManager> content_manager, std::function<bool(ContentPage*)> detach_handler = nullptr);
163
void make_paned(Gtk::Orientation orientation, Gtk::PackType pack_type);
164
void add_page(ContentPage &child);
165
void remove_with_paned();
166
};
167
168
class ContentTabBar : public Gtk::Box {
169
// TODO; should be similar to DockStackSwitcher
170
// Dragging a tab to an empty space should split the view;
171
// dragging a tab outside the window should pop it out with user-defined behaviour
172
private:
173
ContentStack *stack;
174
sigc::connection add_handler, remove_handler;
175
std::shared_ptr<Gtk::DropTarget> drop_target;
176
Gtk::ScrolledWindow *scrolled_window;
177
Gtk::Box *tab_box;
178
std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function;
179
public:
180
void update_buttons();
181
explicit ContentTabBar(ContentStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function = nullptr);
182
void set_orientation(Gtk::Orientation orientation);
183
void set_extra_child_function(std::function<Gtk::Widget(Gtk::Widget *)> function);
184
ContentStack *get_stack() const;
185
~ContentTabBar() override;
186
std::function<Gtk::Widget*(Gtk::Widget*)> get_extra_child_function() const;
187
};
188
189
class ContentNotebook : public Gtk::Box {
190
private:
191
ContentStack *stack;
192
ContentTabBar *switcher;
193
Gtk::PositionType tab_position;
194
public:
195
ContentNotebook(ContentStack *stack, ContentTabBar *switcher, Gtk::PositionType tab_position = Gtk::PositionType::TOP);
196
Gtk::PositionType get_tab_position() const;
197
ContentStack *get_stack() const;
198
ContentTabBar *get_switcher() const;
199
};
200
201
class ContentWindow : public Gtk::Window {
202
private:
203
ContentNotebook *notebook;
204
public:
205
ContentWindow(ContentNotebook *notebook);
206
};
207
} // namespace gPanthera
208
209
#endif // GPANTHERA_LIBRARY_H