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