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

 panthera-www.cc

View raw Download
text/x-c++ • 6.45 kiB
C++ source, ASCII text
        
            
1
#include "gpanthera.hh"
2
#include <gtkmm.h>
3
#include <glibmm.h>
4
#include <glibmm/ustring.h>
5
#include <iostream>
6
#include <memory>
7
#include <libintl.h>
8
#include <locale.h>
9
#include <gtk/gtk.h>
10
#include <gdk/gdk.h>
11
#include <webkit/webkit.h>
12
13
class PantheraWww : public Gtk::Application {
14
Gtk::Window *window = Gtk::make_managed<Gtk::Window>();
15
protected:
16
void on_startup() override {
17
Gtk::Application::on_startup();
18
add_window(*window);
19
window->set_default_size(600, 400);
20
auto layout_manager = std::make_shared<gPanthera::LayoutManager>();
21
auto dock_stack_1 = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "One");
22
auto switcher_1 = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack_1, Gtk::Orientation::HORIZONTAL);
23
auto dock_stack_2 = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "Two");
24
auto switcher_2 = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack_2, Gtk::Orientation::VERTICAL);
25
auto pane_1_content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0);
26
auto debug_button = Gtk::make_managed<Gtk::Button>("Debug");
27
pane_1_content->append(*debug_button);
28
auto pane_2_content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0);
29
pane_2_content->append(*Gtk::make_managed<Gtk::Label>("Pane 2 content"));
30
auto pane_3_content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0);
31
pane_3_content->append(*Gtk::make_managed<Gtk::Label>("Pane 3 content"));
32
auto pane_1_icon = Gtk::make_managed<Gtk::Image>();
33
pane_1_icon->set_from_icon_name("go-home-symbolic");
34
auto pane_2_icon = Gtk::make_managed<Gtk::Image>();
35
pane_2_icon->set_from_icon_name("folder-symbolic");
36
auto pane_3_icon = Gtk::make_managed<Gtk::Image>();
37
pane_3_icon->set_from_icon_name("network-transmit-receive-symbolic");
38
auto pane_1 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_1_content, "pane1", "Pane 1", pane_1_icon);
39
auto pane_2 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_2_content, "pane2", "Pane 2", pane_2_icon);
40
auto pane_3 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_3_content, "pane3", "Pane 3", pane_3_icon);
41
42
dock_stack_1->set_transition_type(Gtk::StackTransitionType::SLIDE_LEFT_RIGHT);
43
dock_stack_1->set_transition_duration(125);
44
dock_stack_1->set_expand(true);
45
dock_stack_2->set_transition_type(Gtk::StackTransitionType::SLIDE_UP_DOWN);
46
dock_stack_2->set_transition_duration(125);
47
dock_stack_2->set_expand(true);
48
49
dock_stack_1->add_pane(*pane_1);
50
dock_stack_1->add_pane(*pane_3);
51
dock_stack_2->add_pane(*pane_2);
52
53
auto outer_grid = Gtk::make_managed<Gtk::Grid>();
54
outer_grid->attach(*switcher_2, 0, 1, 1, 1);
55
outer_grid->attach(*switcher_1, 1, 2, 1, 1);
56
auto outer_paned = Gtk::make_managed<Gtk::Paned>(Gtk::Orientation::HORIZONTAL);
57
outer_paned->set_start_child(*dock_stack_2);
58
auto inner_paned = Gtk::make_managed<Gtk::Paned>(Gtk::Orientation::VERTICAL);
59
auto content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0);
60
auto content_manager = std::make_shared<gPanthera::ContentManager>();
61
std::function<bool(gPanthera::ContentPage*)> detach_handler;
62
detach_handler = [](gPanthera::ContentPage *widget) {
63
auto new_stack = Gtk::make_managed<gPanthera::ContentStack>(widget->content_manager, widget->get_stack()->get_detach_handler());
64
auto new_switcher = Gtk::make_managed<gPanthera::ContentTabBar>(new_stack, Gtk::Orientation::HORIZONTAL, dynamic_cast<gPanthera::ContentTabBar*>(widget->get_stack()->get_parent()->get_first_child())->get_extra_child_function());
65
auto new_notebook = Gtk::make_managed<gPanthera::ContentNotebook>(new_stack, new_switcher);
66
auto window = new gPanthera::ContentWindow(new_notebook);
67
widget->redock(new_stack);
68
window->present();
69
new_stack->signal_leave_empty.connect([window]() {
70
window->close();
71
delete window;
72
});
73
return true;
74
};
75
76
auto return_extra_child = [](Gtk::Widget *switcher) {
77
auto label = Gtk::make_managed<Gtk::Label>("Test");
78
return label;
79
};
80
auto content_stack = Gtk::make_managed<gPanthera::ContentStack>(content_manager, detach_handler);
81
auto content_stack_switcher = Gtk::make_managed<gPanthera::ContentTabBar>(content_stack, Gtk::Orientation::HORIZONTAL, return_extra_child);
82
content_manager->add_stack(content_stack);
83
WebKitWebView *webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
84
webkit_web_view_load_uri(webview, "https://www.example.com");
85
gtk_widget_set_hexpand(GTK_WIDGET(webview), true);
86
gtk_widget_set_vexpand(GTK_WIDGET(webview), true);
87
auto page_1_content = Gtk::make_managed<Gtk::Box>();
88
gtk_box_append(page_1_content->gobj(), GTK_WIDGET(webview));
89
auto page_1_tab = new Gtk::Label("Page 1");
90
auto page_1 = Gtk::make_managed<gPanthera::ContentPage>(content_manager, content_stack, page_1_content, page_1_tab);
91
auto page_2_content = Gtk::make_managed<Gtk::Label>("Page 2...");
92
auto page_2_tab = new Gtk::Label("Page 2");
93
auto page_2 = Gtk::make_managed<gPanthera::ContentPage>(content_manager, content_stack, page_2_content, page_2_tab);
94
content->set_name("content_box");
95
auto content_notebook = Gtk::make_managed<gPanthera::ContentNotebook>(content_stack, content_stack_switcher, Gtk::PositionType::TOP);
96
content->append(*content_notebook);
97
inner_paned->set_start_child(*content);
98
inner_paned->set_end_child(*dock_stack_1);
99
outer_paned->set_end_child(*inner_paned);
100
outer_grid->attach(*outer_paned, 1, 1, 1, 1);
101
window->set_child(*outer_grid);
102
debug_button->signal_clicked().connect([this, content_manager]() {
103
std::cout << "Last operated page: " << content_manager->get_last_operated_page()->get_name() << std::endl;
104
});
105
}
106
107
void on_activate() override {
108
window->present();
109
}
110
public:
111
static Glib::RefPtr<PantheraWww> create() {
112
return Glib::make_refptr_for_instance<PantheraWww>(new PantheraWww());
113
}
114
};
115
116
int main(int argc, char *argv[]) {
117
gPanthera::init();
118
auto app = PantheraWww::create();
119
return app->run(argc, argv);
120
}
121