GTK docking interfaces and more

By using this site, you agree to have cookies stored on your device, strictly for functional purposes, such as storing your session and preferences.

Dismiss

 gpanthera.hh

View raw Download
text/x-c++ • 7.43 kiB
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
sigc::connection drag_end_handler;
146
sigc::connection drag_cancel_handler;
147
void update_active_style();
148
sigc::connection active_style_handler;
149
public:
150
explicit ContentTab(ContentPage *page);
151
ContentPage *page;
152
~ContentTab() override;
153
};
154
155
class ContentStack : public BaseStack {
156
private:
157
void disable_children();
158
void enable_children();
159
protected:
160
std::function<bool(ContentPage*)> detach_handler;
161
public:
162
sigc::signal<bool(ContentPage*)> signal_detach;
163
std::function<bool(ContentPage*)> get_detach_handler() const;
164
std::shared_ptr<ContentManager> content_manager;
165
std::shared_ptr<Gtk::DropTarget> drop_target;
166
sigc::signal<void()> signal_leave_empty;
167
explicit ContentStack(std::shared_ptr<ContentManager> content_manager, std::function<bool(ContentPage*)> detach_handler = nullptr);
168
void make_paned(Gtk::Orientation orientation, Gtk::PackType pack_type);
169
void add_page(ContentPage &child);
170
void remove_with_paned();
171
};
172
173
class ContentTabBar : public Gtk::Box {
174
// TODO; should be similar to DockStackSwitcher
175
// Dragging a tab to an empty space should split the view;
176
// dragging a tab outside the window should pop it out with user-defined behaviour
177
private:
178
ContentStack *stack;
179
sigc::connection add_handler, remove_handler;
180
std::shared_ptr<Gtk::DropTarget> drop_target;
181
Gtk::ScrolledWindow *scrolled_window;
182
Gtk::Box *tab_box;
183
std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function;
184
public:
185
void update_buttons();
186
explicit ContentTabBar(ContentStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function = nullptr);
187
void set_orientation(Gtk::Orientation orientation);
188
void set_extra_child_function(std::function<Gtk::Widget(Gtk::Widget *)> function);
189
ContentStack *get_stack() const;
190
~ContentTabBar() override;
191
std::function<Gtk::Widget*(Gtk::Widget*)> get_extra_child_function() const;
192
};
193
194
class ContentNotebook : public Gtk::Box {
195
private:
196
ContentStack *stack;
197
ContentTabBar *switcher;
198
Gtk::PositionType tab_position;
199
public:
200
ContentNotebook(ContentStack *stack, ContentTabBar *switcher, Gtk::PositionType tab_position = Gtk::PositionType::TOP);
201
Gtk::PositionType get_tab_position() const;
202
ContentStack *get_stack() const;
203
ContentTabBar *get_switcher() const;
204
};
205
206
class ContentWindow : public Gtk::Window {
207
private:
208
ContentNotebook *notebook;
209
public:
210
ContentWindow(ContentNotebook *notebook);
211
};
212
} // namespace gPanthera
213
214
#endif // GPANTHERA_LIBRARY_H