roundabout,
created on Wednesday, 19 February 2025, 09:03:27 (1739955807),
received on Wednesday, 19 February 2025, 09:03:44 (1739955824)
Author identity: vlad <vlad.muntoiu@gmail.com>
43b6623d24383bfc2233dc1930c5fd049136fdda
gpanthera.cc
@@ -1,8 +1,9 @@
#include "gpanthera.hh" #include <iostream> #include <utility>namespace gPanthera { DockablePane::DockablePane(Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &label, Gtk::Image *icon, DockStack *stack, Gtk::Widget *custom_header)DockablePane::DockablePane(std::shared_ptr<LayoutManager> layout, Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &label, Gtk::Image *icon, DockStack *stack, Gtk::Widget *custom_header): Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0), name(name) { if(icon) { this->icon = icon;
@@ -10,6 +11,7 @@ namespace gPanthera {
if(stack) { this->stack = stack; } this->layout = std::move(layout);this->label.set_text(label); header = Gtk::make_managed<Gtk::HeaderBar>(); header->set_show_close_button(false);
@@ -24,6 +26,7 @@ namespace gPanthera {
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"); auto move_menu = Gtk::make_managed<Gtk::Menu>();close_menu_item->signal_activate().connect([this]() { if(this->stack) { this->stack->set_visible_child("empty");
@@ -34,8 +37,18 @@ namespace gPanthera {
this->pop_out(); } }); for(auto &this_stack: this->layout->stacks) { auto menu_item = Gtk::make_managed<Gtk::MenuItem>(this_stack->name); menu_item->signal_activate().connect([this, this_stack]() { this->redock(this_stack); }); move_menu->append(*menu_item); } auto move_menu_item = Gtk::make_managed<Gtk::MenuItem>("Move"); move_menu_item->set_submenu(*move_menu);header_menu->append(*close_menu_item); header_menu->append(*pop_out_menu_item); header_menu->append(*move_menu_item);header_menu->show_all(); header->pack_end(*header_menu_button); this->pack_start(*header, Gtk::PACK_SHRINK);
@@ -49,6 +62,7 @@ namespace gPanthera {
this->window->close(); delete this->window; this->window = nullptr; this->pack_start(*this->header);} this->stack = stack; }
@@ -94,9 +108,15 @@ namespace gPanthera {
panes.push_back(pane); } DockStack::DockStack(std::shared_ptr<LayoutManager> layout) : Gtk::Stack(), layout(layout) {void LayoutManager::add_stack(DockStack *stack) { stacks.push_back(stack); } DockStack::DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name) : Gtk::Stack(), layout(layout), name(name) {auto *empty_child = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_VERTICAL, 0); add(*empty_child, "empty"); // Add the stack to a layout manager this->layout->add_stack(this);} DockWindow::DockWindow(DockablePane *pane) {
@@ -114,7 +134,7 @@ namespace gPanthera {
} void DockStackSwitcher::update_buttons() { for(auto &child : get_children()) {for(auto &child: get_children()) {if(child) { remove(*child); }
gpanthera.hh
@@ -11,6 +11,7 @@
namespace gPanthera { class DockStack; class DockWindow; class LayoutManager;class DockablePane : public Gtk::Box { private:
@@ -21,8 +22,9 @@ namespace gPanthera {
DockWindow *window = nullptr; Gtk::HeaderBar *header; Gtk::Widget *child; std::shared_ptr<LayoutManager> layout;public: DockablePane(Gtk::Widget &child, const Glib::ustring &name, const Glib::ustring &label, Gtk::Image *icon, DockStack *stack = nullptr, Gtk::Widget *custom_header = nullptr);DockablePane(std::shared_ptr<LayoutManager> layout, 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();
@@ -43,16 +45,20 @@ namespace gPanthera {
private: std::vector<DockablePane*> panes; public: std::vector<DockStack*> stacks;LayoutManager(); void add_pane(DockablePane *pane); void add_stack(DockStack *stack);}; class DockStack : public Gtk::Stack { private: std::shared_ptr<LayoutManager> layout; public: explicit DockStack(std::shared_ptr<LayoutManager> layout);Glib::ustring name; explicit DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name);void add_pane(Gtk::Widget &child, const Glib::ustring &name); };
panthera-www.cc
@@ -12,15 +12,13 @@ int main(int argc, char *argv[]) {
window.set_default_size(600, 400); auto layout_manager = std::make_shared<gPanthera::LayoutManager>(); auto dock_stack = Gtk::make_managed<gPanthera::DockStack>(layout_manager);auto dock_stack = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "Edge");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 = Gtk::make_managed<gPanthera::DockablePane>(*pane_content, "pane1", "Pane 1", pane_icon);layout_manager->add_pane(pane);auto pane = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_content, "pane1", "Pane 1", pane_icon);dock_stack->add_pane(*pane, pane->get_identifier()); switcher->update_buttons();