roundabout,
created on Saturday, 8 March 2025, 14:07:42 (1741442862),
received on Saturday, 8 March 2025, 14:07:45 (1741442865)
Author identity: vlad <vlad.muntoiu@gmail.com>
26ca7eb4b1afe5f88b4b53485397250debae4373
gpanthera.cc
@@ -259,6 +259,10 @@ namespace gPanthera {
}, false); } DockStack *DockStackSwitcher::get_stack() const { return stack; } DockStackSwitcher::~DockStackSwitcher() { add_handler.disconnect(); remove_handler.disconnect();
@@ -309,6 +313,30 @@ namespace gPanthera {
} return false; }, false); // Add a drop target to the button auto drop_target = Gtk::DropTarget::create(DockablePane::get_type(), Gdk::DragAction::MOVE); drop_target->set_actions(Gdk::DragAction::MOVE); drop_target->set_propagation_phase(Gtk::PropagationPhase::CAPTURE); this->add_controller(drop_target); // Process dropped buttons by inserting them after the current button drop_target->signal_drop().connect([this](const Glib::ValueBase& value, double x, double y) { const auto &widget = static_cast<const Glib::Value<Gtk::Widget*>&>(value).get(); if(widget) { if(auto pane = dynamic_cast<DockablePane*>(widget)) { auto switcher = dynamic_cast<DockStackSwitcher*>(this->get_parent()); if(switcher) { auto *stack = switcher->get_stack(); // Move the button to the new position pane->redock(stack); pane->insert_before(*stack, *this->pane); switcher->update_buttons(); } } } return true; // Drop OK }, false);this->update_active_style(); }
@@ -355,4 +383,13 @@ namespace gPanthera {
Gtk::Stack::remove(child); signal_child_removed.emit(&child); } DraggableNotebook::DraggableNotebook() : Gtk::Notebook() { } void DraggableNotebook::append_page(Gtk::Widget &child, const Glib::ustring &tab_label) { Gtk::Notebook::append_page(child, tab_label); this->set_tab_detachable(child, true); }} // namespace gPanthera
gpanthera.hh
@@ -95,8 +95,15 @@ namespace gPanthera {
public: void update_buttons(); explicit DockStackSwitcher(DockStack *stack, Gtk::Orientation orientation = Gtk::Orientation::HORIZONTAL); DockStack *get_stack() const;~DockStackSwitcher() override; }; class DraggableNotebook : public Gtk::Notebook { public: DraggableNotebook(); void append_page(Gtk::Widget &child, const Glib::ustring &tab_label); };} // namespace gPanthera #endif // GPANTHERA_LIBRARY_H
panthera-www.cc
@@ -23,22 +23,29 @@ protected:
pane_1_content->append(*Gtk::make_managed<Gtk::Label>("Pane 1 content")); auto pane_2_content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0); pane_2_content->append(*Gtk::make_managed<Gtk::Label>("Pane 2 content")); auto pane_3_content = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 0); pane_3_content->append(*Gtk::make_managed<Gtk::Label>("Pane 3 content"));auto pane_1_icon = Gtk::make_managed<Gtk::Image>(); pane_1_icon->set_from_icon_name("go-home-symbolic"); auto pane_2_icon = Gtk::make_managed<Gtk::Image>(); pane_2_icon->set_from_icon_name("folder-symbolic"); auto pane_3_icon = Gtk::make_managed<Gtk::Image>(); pane_3_icon->set_from_icon_name("network-transmit-receive-symbolic");auto pane_1 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_1_content, "pane1", "Pane 1", pane_1_icon); auto pane_2 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_2_content, "pane2", "Pane 2", pane_2_icon); auto pane_3 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_3_content, "pane3", "Pane 3", pane_3_icon);dock_stack_1->add_pane(*pane_1);dock_stack_1->set_transition_type(Gtk::StackTransitionType::SLIDE_LEFT_RIGHT); dock_stack_1->set_transition_duration(125); dock_stack_1->set_expand(true); dock_stack_2->add_pane(*pane_2);dock_stack_2->set_transition_type(Gtk::StackTransitionType::SLIDE_UP_DOWN); dock_stack_2->set_transition_duration(125); dock_stack_2->set_expand(true); dock_stack_1->add_pane(*pane_1); dock_stack_1->add_pane(*pane_3); dock_stack_2->add_pane(*pane_2); auto outer_grid = Gtk::make_managed<Gtk::Grid>(); outer_grid->attach(*switcher_2, 0, 1, 1, 1); outer_grid->attach(*switcher_1, 1, 2, 1, 1);
@@ -46,7 +53,18 @@ 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); content->append(*Gtk::make_managed<Gtk::Label>("Main content"));auto notebook1 = Gtk::make_managed<gPanthera::DraggableNotebook>(); auto notebook2 = Gtk::make_managed<gPanthera::DraggableNotebook>(); notebook1->set_group_name("content"); notebook2->set_group_name("content"); auto tab1 = Gtk::make_managed<Gtk::Label>("Tab 1"); auto tab2 = Gtk::make_managed<Gtk::Label>("Tab 2"); auto tab3 = Gtk::make_managed<Gtk::Label>("Tab 3"); notebook1->append_page(*tab1, "Tab 1"); notebook1->append_page(*tab2, "Tab 2"); notebook2->append_page(*tab3, "Tab 3"); content->append(*notebook1); content->append(*notebook2);inner_paned->set_start_child(*content); inner_paned->set_end_child(*dock_stack_1); outer_paned->set_end_child(*inner_paned);