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);