67: Gtk::Box(Gtk::Orientation::VERTICAL, 12)
74 auto hboxSwitch = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 6);
76 auto lbl = Gtk::make_managed<Gtk::Label>(
_(
"<b>Abilita scansione Samba</b>"));
77 lbl->set_use_markup(
true);
78 lbl->set_hexpand(
true);
79 lbl->set_halign(Gtk::Align::START);
91 hboxSwitch->append(*lbl);
95 auto col = Gtk::make_managed<Gtk::TreeViewColumn>(
_(
"Percorso"));
96 auto cell = Gtk::make_managed<Gtk::CellRendererText>();
98 col->pack_start(*cell,
true);
102 auto scroll = Gtk::make_managed<Gtk::ScrolledWindow>();
104 scroll->set_vexpand(
true);
105 scroll->set_min_content_height(180);
109 auto btnBox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 6);
111 btnAdd.set_label(
_(
"Aggiungi"));
113 btnScan.set_label(
_(
"Scansiona ora"));
114 btnSave.set_label(
_(
"Salva configurazione"));
121 btnBox->set_halign(Gtk::Align::END);
193 auto dlg = Gtk::make_managed<Gtk::Dialog>();
194 Gtk::Dialog* dialog = dlg;
196 dialog->set_title(
"");
197 dialog->set_modal(
false);
198 dialog->set_destroy_with_parent(
true);
199 dialog->set_default_size(480, 260);
200 dialog->set_resizable(
false);
202 auto ctx = dialog->get_style_context();
203 ctx->add_class(
"app-dialog");
204 ctx->add_class(
"main-window");
205 ctx->add_class(
"app-window");
207 auto header = Gtk::make_managed<Gtk::HeaderBar>();
208 header->set_show_title_buttons(
false);
209 header->set_decoration_layout(
"");
210 header->add_css_class(
"custom-headerbar");
212 auto close_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
213 close_box->set_margin_end(6);
216 auto px = Gdk::Pixbuf::create_from_file(
resource(
"icon-close.png"), 28, 28,
true);
217 auto btnCloseIcon = Gtk::make_managed<Gtk::Button>();
218 btnCloseIcon->set_child(*Gtk::make_managed<Gtk::Image>(px));
219 btnCloseIcon->add_css_class(
"header-button");
220 btnCloseIcon->signal_clicked().connect([dialog]() { dialog->close(); });
221 close_box->append(*btnCloseIcon);
224 header->pack_end(*close_box);
226 auto header_wrapper = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
227 header_wrapper->append(*header);
228 dialog->set_titlebar(*header_wrapper);
231 auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 14);
233 dialog->get_content_area()->append(*box);
235 auto lblTitle = Gtk::make_managed<Gtk::Label>(
_(
"<b>Aggiungi percorso SMB</b>"));
236 lblTitle->set_use_markup(
true);
237 lblTitle->set_halign(Gtk::Align::CENTER);
238 lblTitle->add_css_class(
"title");
239 box->append(*lblTitle);
241 auto entryUrl = Gtk::make_managed<Gtk::Entry>();
242 entryUrl->set_placeholder_text(
"smb://server/share/percorso");
244 auto entryUser = Gtk::make_managed<Gtk::Entry>();
245 entryUser->set_placeholder_text(
_(
"Username (opzionale)"));
247 auto entryPass = Gtk::make_managed<Gtk::Entry>();
248 entryPass->set_placeholder_text(
_(
"Password (opzionale)"));
249 entryPass->set_visibility(
false);
251 box->append(*entryUrl);
252 box->append(*entryUser);
253 box->append(*entryPass);
255 auto infoAlert = Gtk::make_managed<Gtk::Label>(
_(
256 "<i>Nota: in caso di rilevamento malware su file remoti,\n"
257 "sarà necessario intervenire manualmente per la rimozione.</i>")
259 infoAlert->set_use_markup(
true);
260 infoAlert->add_css_class(
"alert-info");
261 infoAlert->set_halign(Gtk::Align::CENTER);
262 box->append(*infoAlert);
264 auto btnRow = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 12);
265 btnRow->set_halign(Gtk::Align::CENTER);
266 box->append(*btnRow);
268 auto btnOk = Gtk::make_managed<Gtk::Button>(
_(
"Aggiungi"));
269 auto btnCancel = Gtk::make_managed<Gtk::Button>(
_(
"Annulla"));
271 btnOk->add_css_class(
"btn-success");
272 btnCancel->add_css_class(
"btn-danger");
274 btnRow->append(*btnOk);
275 btnRow->append(*btnCancel);
278 btnOk->signal_clicked().connect([=,
this]() {
280 std::string url = entryUrl->get_text();
284 std::replace(url.begin(), url.end(),
'\\',
'/');
286 if (url.size() > 7 && url.back() ==
'/')
293 dynamic_cast<Gtk::Window*
>(get_root()),
294 _(
"Percorso SMB non valido:\n") + url,
295 Gtk::MessageType::ERROR);
304 entryUser->get_text(),
305 entryPass->get_text()
312 btnCancel->signal_clicked().connect([dialog]() {
336 auto active = std::make_shared<std::atomic<bool>>(
true);
337 auto dialog_open = std::make_shared<bool>(
true);
340 auto dialog = Gtk::make_managed<Gtk::Dialog>();
341 Gtk::Dialog* dlg = dialog;
344 dlg->set_modal(
false);
345 dlg->set_default_size(520, 420);
346 dlg->set_resizable(
false);
348 auto ctx = dlg->get_style_context();
349 ctx->add_class(
"app-dialog");
350 ctx->add_class(
"main-window");
351 ctx->add_class(
"app-window");
354 auto header = Gtk::make_managed<Gtk::HeaderBar>();
355 header->set_show_title_buttons(
false);
356 header->set_decoration_layout(
"");
357 header->add_css_class(
"custom-headerbar");
359 auto close_box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
360 close_box->set_margin_end(6);
363 auto px = Gdk::Pixbuf::create_from_file(
resource(
"icon-close.png"), 28, 28,
true);
364 auto btnCloseIcon = Gtk::make_managed<Gtk::Button>();
365 btnCloseIcon->set_child(*Gtk::make_managed<Gtk::Image>(px));
366 btnCloseIcon->add_css_class(
"header-button");
367 btnCloseIcon->signal_clicked().connect([dlg]() { dlg->close(); });
368 close_box->append(*btnCloseIcon);
371 header->pack_end(*close_box);
373 auto header_wrapper = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
374 header_wrapper->append(*header);
375 dlg->set_titlebar(*header_wrapper);
378 auto box = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 20);
380 dlg->get_content_area()->append(*box);
382 auto lbl = Gtk::make_managed<Gtk::Label>(
_(
"Scansione Samba avviata…"));
383 lbl->set_halign(Gtk::Align::CENTER);
384 lbl->add_css_class(
"title");
387 auto lblCurrent = Gtk::make_managed<Gtk::Label>(
_(
"File corrente: --"));
388 lblCurrent->set_halign(Gtk::Align::CENTER);
389 lblCurrent->add_css_class(
"subtitle");
390 box->append(*lblCurrent);
393 auto prog = Gtk::make_managed<Gtk::ProgressBar>();
394 prog->set_show_text(
true);
395 prog->set_text(
"0%");
396 prog->set_fraction(0.0);
397 prog->set_halign(Gtk::Align::CENTER);
398 prog->set_margin_bottom(10);
403 auto fileList = Gtk::make_managed<Gtk::ListBox>();
404 fileList->set_vexpand(
true);
405 fileList->add_css_class(
"scan-file-list");
407 auto scroll = Gtk::make_managed<Gtk::ScrolledWindow>();
408 scroll->set_child(*fileList);
409 scroll->set_vexpand(
true);
410 scroll->set_min_content_height(140);
411 box->append(*scroll);
415 auto buttonRow = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL, 20);
416 buttonRow->set_halign(Gtk::Align::CENTER);
417 box->append(*buttonRow);
419 auto btnStop = Gtk::make_managed<Gtk::Button>(
_(
"Interrompi scansione"));
420 btnStop->add_css_class(
"btn-danger");
422 auto btnClose = Gtk::make_managed<Gtk::Button>(
_(
"Chiudi"));
423 btnClose->add_css_class(
"btn-success");
425 buttonRow->append(*btnStop);
426 buttonRow->append(*btnClose);
431 btnStop->signal_clicked().connect([dlg, active]() {
433 if (active->load()) {
434 active->store(
false);
439 btnClose->signal_clicked().connect([dlg]() { dlg->close(); });
442 auto timeoutFiles = std::make_shared<sigc::connection>();
444 *timeoutFiles = Glib::signal_timeout().connect(
445 [lbl, lblCurrent, prog, fileList, btnStop, dialog_open]() ->
bool
454 const size_t logCount = st.files.size();
455 const size_t infected = st.infected;
457 std::string summary =
458 Glib::ustring::compose(
459 _(
"Scansione completata.\n"
460 "File analizzati: %1\n"
466 lbl->set_text(summary);
467 lblCurrent->set_text(
_(
"File corrente: --"));
469 prog->set_fraction(1.0);
470 prog->set_text(
"100%");
472 btnStop->set_sensitive(
false);
473 btnStop->remove_css_class(
"btn-danger");
474 btnStop->add_css_class(
"btn-grey");
476 while (
auto row = fileList->get_row_at_index(0))
477 fileList->remove(*row);
479 for (
const auto& f : st.files)
481 auto lblLine = Gtk::make_managed<Gtk::Label>(f);
482 lblLine->set_halign(Gtk::Align::START);
484 auto row = Gtk::make_managed<Gtk::ListBoxRow>();
485 row->set_child(*lblLine);
487 fileList->append(*row);
493 lblCurrent->set_text(
_(
"File corrente: ") +
494 (st.current_scanning.empty() ?
"--" : st.current_scanning));
496 prog->set_fraction(st.progress);
497 prog->set_text(std::to_string(
int(st.progress * 100)) +
"%");
499 while (
auto row = fileList->get_row_at_index(0))
500 fileList->remove(*row);
502 for (
const auto& f : st.files)
504 auto lblLine = Gtk::make_managed<Gtk::Label>(f);
505 lblLine->set_halign(Gtk::Align::START);
507 auto row = Gtk::make_managed<Gtk::ListBoxRow>();
508 row->set_child(*lblLine);
510 fileList->append(*row);
519 dlg->signal_close_request().connect(
520 [dialog_open, timeoutFiles]() ->
bool {
522 *dialog_open =
false;
524 if (timeoutFiles->connected())
525 timeoutFiles->disconnect();
536 [lbl, dialog_open](
const std::string& summary,
float pct)
538 Glib::signal_idle().connect_once(
539 [lbl, dialog_open, summary]()
541 if (!*dialog_open)
return;
542 lbl->set_text(summary);
550 for (
const auto& d : dirs)
static bool samba_temp_exists()
static bool clamdscan_running()
Glib::RefPtr< Gtk::ListStore > sambaStore