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