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