roundabout,
created on Tuesday, 22 April 2025, 09:42:42 (1745314962),
received on Tuesday, 22 April 2025, 09:42:53 (1745314973)
Author identity: vlad <vlad.muntoiu@gmail.com>
11d40002eb4aba00d7357e8a426d95affbb3eabf
gpanthera.cc
@@ -608,7 +608,7 @@ namespace gPanthera {
}
}
ContentTabBar::ContentTabBar(ContentStack *stack, Gtk::Orientation orientation, std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function) : Gtk::Box(orientation), stack(stack), extra_child_function(extra_child_function) {
ContentTabBar::ContentTabBar(ContentStack *stack, Gtk::Orientation orientation, std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function) : Gtk::Box(orientation), stack(stack), extra_child_function(extra_child_function) {
this->get_style_context()->add_class("gpanthera-content-tab-bar");
this->set_margin_top(0);
this->set_margin_bottom(0);
@@ -648,10 +648,15 @@ namespace gPanthera {
}
}
std::function<Gtk::Widget*(Gtk::Widget*)> ContentTabBar::get_extra_child_function() const {
std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> ContentTabBar::get_extra_child_function() const {
return this->extra_child_function;
}
void ContentTabBar::set_extra_child_function(std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function) {
// Note that this doesn't remove the existing extra child
this->extra_child_function = extra_child_function;
}
void ContentTabBar::set_orientation(Gtk::Orientation orientation) {
this->Gtk::Box::set_orientation(orientation);
if(orientation == Gtk::Orientation::HORIZONTAL) {
gpanthera.hh
@@ -176,7 +176,6 @@ namespace gPanthera {
};
class ContentTabBar : public Gtk::Box {
// TODO; should be similar to DockStackSwitcher
// Dragging a tab to an empty space should split the view;
// dragging a tab outside the window should pop it out with user-defined behaviour
private:
@@ -185,15 +184,15 @@ namespace gPanthera {
std::shared_ptr<Gtk::DropTarget> drop_target;
Gtk::ScrolledWindow *scrolled_window;
Gtk::Box *tab_box;
std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function;
std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function;
public:
void update_buttons();
explicit ContentTabBar(ContentStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, std::function<Gtk::Widget*(Gtk::Widget*)> extra_child_function = nullptr);
explicit ContentTabBar(ContentStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL, std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> extra_child_function = nullptr);
void set_orientation(Gtk::Orientation orientation);
void set_extra_child_function(std::function<Gtk::Widget(Gtk::Widget *)> function);
void set_extra_child_function(std::function<Gtk::Widget*(gPanthera::ContentTabBar*)>);
ContentStack *get_stack() const;
~ContentTabBar() override;
std::function<Gtk::Widget*(Gtk::Widget*)> get_extra_child_function() const;
std::function<Gtk::Widget*(gPanthera::ContentTabBar*)> get_extra_child_function() const;
};
class ContentNotebook : public Gtk::Box {
panthera-www.cc
@@ -13,11 +13,31 @@
class PantheraWww : public Gtk::Application {
Gtk::Window *window = Gtk::make_managed<Gtk::Window>();
protected:
std::shared_ptr<gPanthera::LayoutManager> layout_manager;
std::shared_ptr<gPanthera::ContentManager> content_manager;
void on_new_tab(gPanthera::ContentStack *stack) {
if(!stack) {
// Find the current area
stack = content_manager->get_last_operated_page()->get_stack();
}
WebKitWebView *webview = WEBKIT_WEB_VIEW(webkit_web_view_new());
webkit_web_view_load_uri(webview, "about:blank");
gtk_widget_set_hexpand(GTK_WIDGET(webview), true);
gtk_widget_set_vexpand(GTK_WIDGET(webview), true);
auto page_content = Gtk::make_managed<Gtk::Box>();
gtk_box_append(page_content->gobj(), GTK_WIDGET(webview));
auto page_tab = new Gtk::Label("Tab");
auto page = Gtk::make_managed<gPanthera::ContentPage>(content_manager, stack, page_content, page_tab);
stack->add_page(*page);
}
void on_startup() override {
Gtk::Application::on_startup();
add_window(*window);
window->set_default_size(600, 400);
auto layout_manager = std::make_shared<gPanthera::LayoutManager>();
layout_manager = std::make_shared<gPanthera::LayoutManager>();
auto dock_stack_1 = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "One");
auto switcher_1 = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack_1, Gtk::Orientation::HORIZONTAL);
auto dock_stack_2 = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "Two");
@@ -57,7 +77,7 @@ protected:
outer_paned->set_start_child(*dock_stack_2);
auto inner_paned = Gtk::make_managed<Gtk::Paned>(Gtk::Orientation::VERTICAL);
auto content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0);
auto content_manager = std::make_shared<gPanthera::ContentManager>();
content_manager = std::make_shared<gPanthera::ContentManager>();
std::function<bool(gPanthera::ContentPage*)> detach_handler;
detach_handler = [](gPanthera::ContentPage *widget) {
auto new_stack = Gtk::make_managed<gPanthera::ContentStack>(widget->content_manager, widget->get_stack()->get_detach_handler());
@@ -73,9 +93,14 @@ protected:
return true;
};
auto return_extra_child = [](Gtk::Widget *switcher) {
auto label = Gtk::make_managed<Gtk::Label>("Test");
return label;
auto return_extra_child = [this](gPanthera::ContentTabBar *switcher) {
auto new_tab_button = Gtk::make_managed<Gtk::Button>();
new_tab_button->set_child(*Gtk::make_managed<Gtk::Image>(Gio::Icon::create("list-add-symbolic")));
new_tab_button->set_tooltip_text("New tab");
new_tab_button->signal_clicked().connect([this, switcher]() {
on_new_tab(switcher->get_stack());
});
return new_tab_button;
};
auto content_stack = Gtk::make_managed<gPanthera::ContentStack>(content_manager, detach_handler);
auto content_stack_switcher = Gtk::make_managed<gPanthera::ContentTabBar>(content_stack, Gtk::Orientation::HORIZONTAL, return_extra_child);
@@ -99,9 +124,10 @@ protected:
outer_paned->set_end_child(*inner_paned);
outer_grid->attach(*outer_paned, 1, 1, 1, 1);
window->set_child(*outer_grid);
debug_button->signal_clicked().connect([this, content_manager]() {
debug_button->signal_clicked().connect([this]() {
std::cout << "Last operated page: " << content_manager->get_last_operated_page()->get_name() << std::endl;
});
// TODO: Use the last operated page and allow opening tabs next to the last operated page using panes
}
void on_activate() override {