32 set_default_size(600, 400);
38 stack_.get_style_context()->add_class(
"content");
39 stack_.set_transition_type(Gtk::StackTransitionType::SLIDE_LEFT_RIGHT);
40 stack_.set_transition_duration(220);
41 stack_.set_interpolate_size(
true);
50 mainBox_.get_style_context()->add_class(
"settings-main");
64 get_style_context()->add_class(
"settings-window");
68 signal_map().connect([
this]() {
70 get_style_context()->add_provider(
global_css, GTK_STYLE_PROVIDER_PRIORITY_USER);
73 signal_hide().connect([
this]() {
78 signal_show().connect([
this]() {
86 const std::string& label_text,
87 Gtk::Box** out_submenu)
89 auto outer = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 6);
91 auto icon_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
92 icon_box->set_size_request(16, 16);
93 icon_box->set_halign(Gtk::Align::START);
94 icon_box->set_valign(Gtk::Align::CENTER);
96 auto pic = Gtk::make_managed<Gtk::Picture>();
97 if (!icon_path.empty()) {
99 auto pb = Gdk::Pixbuf::create_from_file(icon_path);
100 auto scaled = pb->scale_simple(16, 16, Gdk::InterpType::BILINEAR);
101 pic->set_paintable(Gdk::Texture::create_for_pixbuf(scaled));
102 pic->set_content_fit(Gtk::ContentFit::FILL);
103 pic->set_keep_aspect_ratio(
true);
107 icon_box->append(*pic);
108 outer->append(*icon_box);
110 auto lbl = Gtk::make_managed<Gtk::Label>(label_text);
111 lbl->set_halign(Gtk::Align::START);
112 lbl->set_hexpand(
true);
115 auto chevron = Gtk::make_managed<Gtk::Label>(
"▸");
116 chevron->set_halign(Gtk::Align::END);
117 outer->append(*chevron);
119 auto btn = Gtk::make_managed<Gtk::Button>();
120 btn->set_child(*outer);
121 btn->get_style_context()->add_class(
"sidebar-button");
124 auto sub = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 2);
125 sub->set_visible(
false);
126 sub->get_style_context()->add_class(
"sidebar-submenu");
129 btn->signal_clicked().connect([sub, chevron]() {
130 bool vis = sub->get_visible();
131 sub->set_visible(!vis);
132 chevron->set_text(vis ?
"▸" :
"▾");
141 Gtk::Box* parent_submenu)
143 auto lbl = Gtk::make_managed<Gtk::Label>(label_text);
144 lbl->set_halign(Gtk::Align::START);
146 auto btn = Gtk::make_managed<Gtk::Button>();
147 btn->set_child(*lbl);
148 btn->get_style_context()->add_class(
"sidebar-button");
149 btn->get_style_context()->add_class(
"sidebar-leaf");
152 btn->get_style_context()->add_class(
"sidebar-leaf-indent");
164 b->get_style_context()->remove_class(
"active-sidebar-button");
167 btn->get_style_context()->add_class(
"active-sidebar-button");
171 std::set<Gtk::Box*> all_submenus;
174 all_submenus.insert(sub);
176 for (
auto* sub : all_submenus) {
177 const bool should_open = (sub == active_sub);
178 sub->set_visible(should_open);
180 if (
auto* parent_box =
dynamic_cast<Gtk::Box*
>(sub->get_parent())) {
181 Gtk::Widget* prev =
nullptr;
183 for (
auto* child = parent_box->get_first_child();
185 child = child->get_next_sibling())
188 if (
auto* grp_btn =
dynamic_cast<Gtk::Button*
>(prev)) {
189 if (
auto* outer =
dynamic_cast<Gtk::Box*
>(grp_btn->get_child())) {
190 Gtk::Widget* last =
nullptr;
191 for (
auto* w = outer->get_first_child(); w; w = w->get_next_sibling())
194 if (
auto* chev =
dynamic_cast<Gtk::Label*
>(last))
195 chev->set_text(should_open ?
"▾" :
"▸");
208 sidebar_box_ = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 6);
210 sidebar_box_->get_style_context()->add_class(
"sidebar");
214 auto header = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 8);
215 header->get_style_context()->add_class(
"sidebar-header");
218 auto pix = Gdk::Pixbuf::create_from_file(
resource(
"logo-sidebar.png"), 48, 48,
true);
219 header->append(*Gtk::make_managed<Gtk::Image>(pix));
222 auto title_lbl = Gtk::make_managed<Gtk::Label>(
_(
"Impostazioni"));
223 title_lbl->set_halign(Gtk::Align::START);
224 title_lbl->get_style_context()->add_class(
"sidebar-title");
225 header->append(*title_lbl);
230 auto sep = Gtk::make_managed<Gtk::Separator>(Gtk::Orientation::HORIZONTAL);
231 sep->get_style_context()->add_class(
"sidebar-separator");
235 auto menu_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 2);
236 menu_box->set_margin_top(4);
237 menu_box->set_margin_bottom(4);
238 menu_box->set_vexpand(
true);
240 auto go = [
this](
int idx) {
247 btn->signal_clicked().connect([
this, btn, go]() {
251 menu_box->append(*btn);
256 btn->signal_clicked().connect([
this, btn, go]() {
260 menu_box->append(*btn);
264 Gtk::Box* submenu =
nullptr;
266 _(
"Anti-Ransomware"),
268 menu_box->append(*grp);
269 menu_box->append(*submenu);
272 sub_base->signal_clicked().connect([
this, sub_base, go]() {
276 submenu->append(*sub_base);
279 sub_adv->signal_clicked().connect([
this, sub_adv, go]() {
283 submenu->append(*sub_adv);
287 Gtk::Box* submenu =
nullptr;
291 menu_box->append(*grp);
292 menu_box->append(*submenu);
295 sub_prot->signal_clicked().connect([
this, sub_prot, go]() {
299 submenu->append(*sub_prot);
302 sub_wl->signal_clicked().connect([
this, sub_wl, go]() {
306 submenu->append(*sub_wl);
310 Gtk::Box* submenu =
nullptr;
312 _(
"Pagamenti Sicuri"),
314 menu_box->append(*grp);
315 menu_box->append(*submenu);
318 sub_pay->signal_clicked().connect([
this, sub_pay, go]() {
322 submenu->append(*sub_pay);
325 sub_bypass->signal_clicked().connect([
this, sub_bypass, go]() {
329 submenu->append(*sub_bypass);
333 Gtk::Box* submenu =
nullptr;
337 menu_box->append(*grp);
338 menu_box->append(*submenu);
341 sub_user->signal_clicked().connect([
this, sub_user, go]() {
345 submenu->append(*sub_user);
348 sub_sys->signal_clicked().connect([
this, sub_sys, go]() {
352 submenu->append(*sub_sys);
357 btn->signal_clicked().connect([
this, btn, go]() {
361 menu_box->append(*btn);
366 btn->signal_clicked().connect([
this, btn, go]() {
370 menu_box->append(*btn);
375 btn->signal_clicked().connect([
this, btn, go]() {
379 menu_box->append(*btn);
385 auto* spacer = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
386 spacer->set_vexpand(
true);
389 auto* sep = Gtk::make_managed<Gtk::Separator>(Gtk::Orientation::HORIZONTAL);
390 sep->get_style_context()->add_class(
"sidebar-separator");
404 auto header = Gtk::make_managed<Gtk::HeaderBar>();
405 header->set_show_title_buttons(
false);
406 header->set_decoration_layout(
"");
407 header->get_style_context()->add_class(
"custom-headerbar");
409 auto header_left = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
410 header_left->set_size_request(220, -1);
411 header_left->get_style_context()->add_class(
"header-left");
413 auto accent = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
414 accent->set_size_request(6, -1);
415 accent->get_style_context()->add_class(
"header-accent");
416 header_left->append(*accent);
418 header->pack_start(*header_left);
420 auto header_spacer = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
421 header_spacer->set_hexpand(
true);
422 header->pack_start(*header_spacer);
424 auto header_right = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
425 header_right->get_style_context()->add_class(
"header-right");
428 auto pix = Gdk::Pixbuf::create_from_file(
resource(
"icon-close.png"), 32, 32,
true);
429 auto btn_close = Gtk::make_managed<Gtk::Button>();
430 btn_close->set_child(*Gtk::make_managed<Gtk::Image>(pix));
431 btn_close->get_style_context()->add_class(
"header-button");
432 btn_close->signal_clicked().connect([
this]() { this->close(); });
435 std::cerr <<
_(
"⚠ Errore caricamento icona close") <<
"\n";
438 header->pack_end(*header_right);
439 set_titlebar(*header);
void set_notebook_no_tabs()