roundabout,
created on Sunday, 23 February 2025, 19:16:22 (1740338182),
received on Sunday, 23 February 2025, 19:16:36 (1740338196)
Author identity: vlad <vlad.muntoiu@gmail.com>
83a8609fc646df9d00a9c477b0e399ecc24aed1a
gpanthera.cc
@@ -1,6 +1,7 @@
#include "gpanthera.hh"
#include <iostream>
#include <utility>
#include <gtk/gtk.h>
namespace gPanthera {
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)
@@ -13,7 +14,7 @@ namespace gPanthera {
}
this->layout = std::move(layout);
this->label.set_text(label);
header = Gtk::make_managed<Gtk::HeaderBar>();
header = std::make_unique<Gtk::HeaderBar>();
header->set_show_close_button(false);
if(custom_header) {
header->set_custom_title(*custom_header);
@@ -40,7 +41,7 @@ namespace gPanthera {
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);
this_stack->add_pane(*this);
});
move_menu->append(*menu_item);
}
@@ -59,12 +60,21 @@ namespace gPanthera {
void DockablePane::redock(DockStack *stack) {
if(this->window != nullptr) {
this->window->hide();
gtk_window_set_titlebar(GTK_WINDOW(this->window->gobj()), nullptr);
// TODO: Why is it changing style?
this->header->unset_background_color();
this->window->remove();
this->window->set_decorated(false);
this->window->close();
delete this->window;
this->window = nullptr;
this->pack_start(*this->header);
this->pack_start(*this->header, Gtk::PACK_SHRINK);
this->header->show_all();
}
this->stack = stack;
this->stack->add(*this, this->get_identifier());
this->show_all();
}
void DockablePane::pop_out() {
@@ -89,10 +99,6 @@ namespace gPanthera {
return icon;
}
Gtk::HeaderBar *DockablePane::get_header() const {
return header;
}
Gtk::Widget *DockablePane::get_child() const {
return child;
}
@@ -157,12 +163,10 @@ namespace gPanthera {
}
}
}
this->show_all();
}
void DockStack::add_pane(Gtk::Widget &child, const Glib::ustring &name) {
if(auto pane = dynamic_cast<DockablePane*>(&child)) {
pane->redock(this);
}
Gtk::Stack::add(child, name);
void DockStack::add_pane(DockablePane &child) {
child.redock(this);
}
} // namespace gPanthera
gpanthera.hh
@@ -20,7 +20,7 @@ namespace gPanthera {
Gtk::Image *icon;
DockStack *stack;
DockWindow *window = nullptr;
Gtk::HeaderBar *header;
std::unique_ptr<Gtk::HeaderBar> header;
Gtk::Widget *child;
std::shared_ptr<LayoutManager> layout;
public:
@@ -30,7 +30,6 @@ namespace gPanthera {
Gtk::Label *get_label();
void redock(DockStack *stack);
void pop_out();
Gtk::HeaderBar *get_header() const;
Gtk::Widget *get_child() const;
};
@@ -60,7 +59,7 @@ namespace gPanthera {
Glib::ustring name;
explicit DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name);
void add_pane(Gtk::Widget &child, const Glib::ustring &name);
void add_pane(DockablePane &child);
};
class DockStackSwitcher : public Gtk::ButtonBox {
panthera-www.cc
@@ -19,7 +19,7 @@ int main(int argc, char *argv[]) {
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>(layout_manager, *pane_content, "pane1", "Pane 1", pane_icon);
dock_stack->add_pane(*pane, pane->get_identifier());
dock_stack->add_pane(*pane);
switcher->update_buttons();
Gtk::Box vbox(Gtk::ORIENTATION_VERTICAL);