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 {