roundabout,
created on Saturday, 1 March 2025, 09:07:51 (1740820071),
received on Saturday, 1 March 2025, 09:07:54 (1740820074)
Author identity: vlad <vlad.muntoiu@gmail.com>
98adf72a8c22f9cd1b5a4e8a2893c432378297dd
CMakeLists.txt
@@ -16,3 +16,5 @@ link_directories(${GTKMM_LIBRARY_DIRS})
add_definitions(${GTKMM_CFLAGS_OTHER})
target_link_libraries(gpanthera ${GTKMM_LIBRARIES})
file(COPY locales DESTINATION ${CMAKE_BINARY_DIR})
gpanthera.cc
@@ -2,8 +2,18 @@
#include <iostream>
#include <utility>
#include <gtk/gtk.h>
#include <libintl.h>
#include <locale.h>
#include <filesystem>
#define _(STRING) gettext(STRING)
namespace gPanthera {
void init() {
setlocale(LC_ALL, "ro_RO.utf8");
bindtextdomain("gpanthera", "./locales");
textdomain("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)
: Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0), name(name) {
if(icon) {
@@ -25,8 +35,8 @@ namespace gPanthera {
auto header_menu = Gtk::make_managed<Gtk::Menu>();
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");
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) {
@@ -45,7 +55,7 @@ namespace gPanthera {
});
move_menu->append(*menu_item);
}
auto move_menu_item = Gtk::make_managed<Gtk::MenuItem>("Move");
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);
@@ -146,6 +156,13 @@ namespace gPanthera {
remove_handler.disconnect();
}
DockButton::DockButton(DockablePane *pane) : Gtk::Button(), pane(pane) {
if(pane->get_icon()) {
this->set_image(*pane->get_icon());
}
this->set_tooltip_text(pane->get_label()->get_text());
}
void DockStackSwitcher::update_buttons() {
auto children = get_children();
for(auto &child: children) {
@@ -155,10 +172,7 @@ namespace gPanthera {
}
for(auto const &widget : stack->get_children()) {
if(auto pane = dynamic_cast<DockablePane*>(widget)) {
auto *button = Gtk::make_managed<Gtk::Button>();
if(pane->get_icon()) {
button->set_image(*pane->get_icon());
}
auto *button = Gtk::make_managed<DockButton>(pane);
button->signal_clicked().connect([this, pane]() {
if(stack->get_visible_child_name() == pane->get_identifier()) {
stack->set_visible_child("empty");
gpanthera.hh
@@ -9,6 +9,8 @@
#include <memory>
namespace gPanthera {
void init();
class DockStack;
class DockWindow;
class LayoutManager;
@@ -42,8 +44,8 @@ namespace gPanthera {
class LayoutManager : public Glib::ObjectBase {
private:
std::vector<DockablePane*> panes;
public:
std::vector<DockablePane*> panes;
std::vector<DockStack*> stacks;
LayoutManager();
@@ -54,14 +56,21 @@ namespace gPanthera {
class DockStack : public Gtk::Stack {
private:
std::shared_ptr<LayoutManager> layout;
public:
std::shared_ptr<LayoutManager> layout;
Glib::ustring name;
explicit DockStack(std::shared_ptr<LayoutManager> layout, const Glib::ustring &name);
void add_pane(DockablePane &child);
};
class DockButton : public Gtk::Button {
private:
public:
DockablePane *pane;
explicit DockButton(DockablePane *pane);
};
class DockStackSwitcher : public Gtk::ButtonBox {
private:
DockStack *stack;
panthera-www.cc
@@ -4,8 +4,11 @@
#include <glibmm/ustring.h>
#include <iostream>
#include <memory>
#include <libintl.h>
#include <locale.h>
int main(int argc, char *argv[]) {
gPanthera::init();
auto app = Gtk::Application::create(argc, argv, "org.gpanthera.demo");
Gtk::Window window;
@@ -20,12 +23,19 @@ int main(int argc, char *argv[]) {
auto switcher_1 = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack_1);
auto dock_stack_2 = Gtk::make_managed<gPanthera::DockStack>(layout_manager, "Two");
auto switcher_2 = Gtk::make_managed<gPanthera::DockStackSwitcher>(dock_stack_2);
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>(layout_manager, *pane_content, "pane1", "Pane 1", pane_icon);
dock_stack_1->add_pane(*pane);
auto pane_1_content = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_VERTICAL, 0);
pane_1_content->pack_start(*Gtk::make_managed<Gtk::Label>("Pane 1 content"), Gtk::PACK_EXPAND_WIDGET);
auto pane_2_content = Gtk::make_managed<Gtk::Box>(Gtk::ORIENTATION_VERTICAL, 0);
pane_2_content->pack_start(*Gtk::make_managed<Gtk::Label>("Pane 2 content"), Gtk::PACK_EXPAND_WIDGET);
auto pane_1_icon = Gtk::make_managed<Gtk::Image>();
pane_1_icon->set_from_icon_name("go-home-symbolic", Gtk::ICON_SIZE_MENU);
auto pane_2_icon = Gtk::make_managed<Gtk::Image>();
pane_2_icon->set_from_icon_name("folder-symbolic", Gtk::ICON_SIZE_MENU);
auto pane_1 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_1_content, "pane1", "Pane 1", pane_1_icon);
auto pane_2 = Gtk::make_managed<gPanthera::DockablePane>(layout_manager, *pane_2_content, "pane2", "Pane 2", pane_2_icon);
dock_stack_1->add_pane(*pane_1);
dock_stack_2->add_pane(*pane_2);
Gtk::Box vbox(Gtk::ORIENTATION_VERTICAL);
vbox.pack_start(*switcher_1, Gtk::PACK_SHRINK);
po/gpanthera.pot
@@ -0,0 +1,30 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-26 17:31+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: gpanthera.cc:31
msgid "Close"
msgstr ""
#: gpanthera.cc:32
msgid "Pop out"
msgstr ""
#: gpanthera.cc:51
msgid "Move"
msgstr ""
po/ro.po
@@ -0,0 +1,31 @@
# Romanian translations for PACKAGE package.
# Copyright (C) 2025 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Vlad <vlad@roundabout-host.com>, 2025.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-26 17:31+0200\n"
"PO-Revision-Date: 2025-02-26 17:32+0200\n"
"Last-Translator: Vlad <vlad@roundabout-host.com>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
#: gpanthera.cc:31
msgid "Close"
msgstr "Închide"
#: gpanthera.cc:32
msgid "Pop out"
msgstr "Scoate"
#: gpanthera.cc:51
msgid "Move"
msgstr "Mută"