roundabout,
created on Monday, 17 February 2025, 21:25:48 (1739827548),
received on Monday, 17 February 2025, 21:26:08 (1739827568)
Author identity: vlad <vlad.muntoiu@gmail.com>
8ddecd2a941783e6693dfcf8bb7241fd4f0a5a03
gpanthera.cc
@@ -23,12 +23,19 @@ namespace gPanthera {
header_menu_button->set_direction(Gtk::ARROW_NONE); header_menu_button->set_popup(*header_menu); auto close_menu_item = Gtk::make_managed<Gtk::MenuItem>("Close"); auto pop_out_menu_item = Gtk::make_managed<Gtk::MenuItem>("Pop out");close_menu_item->signal_activate().connect([this]() { if(this->stack) { this->stack->set_visible_child("empty"); } }); pop_out_menu_item->signal_activate().connect([this]() { if(this->stack) { this->pop_out(); } });header_menu->append(*close_menu_item); header_menu->append(*pop_out_menu_item);header_menu->show_all(); header->pack_end(*header_menu_button); this->pack_start(*header, Gtk::PACK_SHRINK);
@@ -37,9 +44,21 @@ namespace gPanthera {
} void DockablePane::redock(DockStack *stack) { if(this->window) { this->window->close(); this->window = nullptr; }this->stack = stack; } void DockablePane::pop_out() { if(this->stack) { this->stack->remove(*this); this->stack = nullptr; } } Glib::ustring DockablePane::get_identifier() const { return name; }
@@ -55,16 +74,27 @@ namespace gPanthera {
LayoutManager::LayoutManager() : Glib::ObjectBase("LayoutManager") { } void LayoutManager::add_pane(std::shared_ptr<DockablePane> pane) {panes.push_back(std::move(pane));void LayoutManager::add_pane(DockablePane *pane) { panes.push_back(pane);} DockStack::DockStack(std::shared_ptr<LayoutManager> layout) : Gtk::Stack(), layout(std::move(layout)) {DockStack::DockStack(std::shared_ptr<LayoutManager> layout) : Gtk::Stack(), layout(layout) {auto *empty_child = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_VERTICAL, 0); add(*empty_child, "empty"); } DockStackSwitcher::DockStackSwitcher(DockStack *stack) : Gtk::ButtonBox(Gtk::ORIENTATION_HORIZONTAL), stack(std::move(stack)) {}DockWindow::DockWindow(DockablePane *pane) { this->pane = pane; } DockStackSwitcher::DockStackSwitcher(DockStack *stack) : Gtk::ButtonBox(Gtk::ORIENTATION_HORIZONTAL), stack(stack) { this->stack->signal_add().connect([this](Gtk::Widget *child) { this->update_buttons(); }); this->stack->signal_remove().connect([this](Gtk::Widget *child) { this->update_buttons(); }); }void DockStackSwitcher::update_buttons() { for(auto const &child : get_children()) {
@@ -90,7 +120,7 @@ namespace gPanthera {
} } void DockStack::add(Gtk::Widget &child, const Glib::ustring &name) {void DockStack::add_pane(Gtk::Widget &child, const Glib::ustring &name) {if(auto pane = dynamic_cast<DockablePane*>(&child)) { pane->redock(this); }
gpanthera.hh
@@ -10,6 +10,7 @@
namespace gPanthera { class DockStack; class DockWindow;class DockablePane : public Gtk::Box { private:
@@ -17,21 +18,30 @@ namespace gPanthera {
Glib::ustring name; Gtk::Image *icon; DockStack *stack; DockWindow *window;public: DockablePane(Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &label, Gtk::Image *icon, DockStack *stack = nullptr, Gtk::Widget *custom_header = nullptr); Glib::ustring get_identifier() const; Gtk::Image *get_icon() const; Gtk::Label *get_label(); void redock(DockStack *stack); void pop_out(); }; class DockWindow : public Gtk::Window { private: DockablePane *pane; public: explicit DockWindow(DockablePane *pane);}; class LayoutManager : public Glib::ObjectBase { private: std::vector<std::shared_ptr<DockablePane>> panes;std::vector<DockablePane*> panes;public: LayoutManager(); void add_pane(std::shared_ptr<DockablePane> pane);void add_pane(DockablePane *pane);}; class DockStack : public Gtk::Stack {
@@ -40,7 +50,7 @@ namespace gPanthera {
public: explicit DockStack(std::shared_ptr<LayoutManager> layout); void add(Gtk::Widget &child, const Glib::ustring &name);void add_pane(Gtk::Widget &child, const Glib::ustring &name);}; class DockStackSwitcher : public Gtk::ButtonBox {
panthera-www.cc
@@ -13,19 +13,15 @@ int main(int argc, char *argv[]) {
auto layout_manager = std::make_shared<gPanthera::LayoutManager>(); if(!layout_manager) {std::cout << "null" << std::endl;return 1;}auto dock_stack = Gtk::make_managed<gPanthera::DockStack>(layout_manager); auto switcher = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack); auto pane_content = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_VERTICAL, 0); pane_content->pack_start(*Gtk::make_managed<Gtk::Label>("Pane 1 content"), Gtk::PACK_EXPAND_WIDGET); auto pane_icon = Gtk::make_managed<Gtk::Image>(); pane_icon->set_from_icon_name("go-home-symbolic", Gtk::ICON_SIZE_MENU); auto pane = std::make_shared<gPanthera::DockablePane>(*pane_content, "pane1", "Pane 1", pane_icon);auto pane = Gtk::make_managed<gPanthera::DockablePane>(*pane_content, "pane1", "Pane 1", pane_icon);layout_manager->add_pane(pane); dock_stack->add(*pane, pane->get_identifier());dock_stack->add_pane(*pane, pane->get_identifier());switcher->update_buttons(); Gtk::Box vbox(Gtk::ORIENTATION_VERTICAL);