part 0 add trans and fix tray and allow ignore error and fix autostart

This commit is contained in:
Ward from fusion-voyager-3 2024-10-06 17:09:35 +03:00
parent 40c0a64c85
commit 650093da67
11 changed files with 336 additions and 181 deletions

5
Cargo.lock generated
View File

@ -1941,8 +1941,9 @@ dependencies = [
[[package]] [[package]]
name = "rust-apt" name = "rust-apt"
version = "0.7.0" version = "0.8.0"
source = "git+https://gitlab.com/volian/rust-apt#89f7f127b3af5595bec61ab520a813d8bf9fc502" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d78ef02335b0d12dff96f742b2124f371922d3efbedbcba5703025bb0e37a6"
dependencies = [ dependencies = [
"cxx", "cxx",
"cxx-build", "cxx-build",

View File

@ -25,7 +25,7 @@ adw = { version = "0.7.0", package = "libadwaita", features = ["v1_4"] }
gtk = { version = "0.9.0", package = "gtk4", features = ["v4_12"] } gtk = { version = "0.9.0", package = "gtk4", features = ["v4_12"] }
async-channel = "2.1.1" async-channel = "2.1.1"
rust-i18n = "3.0.1" rust-i18n = "3.0.1"
rust-apt = { git = "https://gitlab.com/volian/rust-apt" } rust-apt = "0.8.0"
apt-deb822-tools = { package = "deb822-tools", git = "https://github.com/CosmicFusion/deb822-tools" } apt-deb822-tools = { package = "deb822-tools", git = "https://github.com/CosmicFusion/deb822-tools" }
apt-legacy-tools = { version = "0.1.3", package = "legacy-apt-list-tools-rs", git = "https://github.com/CosmicFusion/legacy-apt-list-tools-rs" } apt-legacy-tools = { version = "0.1.3", package = "legacy-apt-list-tools-rs", git = "https://github.com/CosmicFusion/legacy-apt-list-tools-rs" }
tokio = { version = "1", features = ["full"] } tokio = { version = "1", features = ["full"] }

View File

@ -2,5 +2,6 @@
DISPLAY_CHECK=$(echo $DISPLAY) DISPLAY_CHECK=$(echo $DISPLAY)
WHO=$(whoami) WHO=$(whoami)
if [[ $DISPLAY_CHECK ]] && [[ $WHO != "pikaos" ]] && [[ $WHO != "gnome-initial-setup" ]] ; then if [[ $DISPLAY_CHECK ]] && [[ $WHO != "pikaos" ]] && [[ $WHO != "gnome-initial-setup" ]] ; then
sleep 30
pikman-update-manager --hidden pikman-update-manager --hidden
fi fi

View File

@ -159,5 +159,10 @@
"pikman_indicator_flatpak_count_item_label": "Flatpak Updates: {NUM}", "pikman_indicator_flatpak_count_item_label": "Flatpak Updates: {NUM}",
"pikman_indicator_flatpak_item_label_calculating": "calculating...", "pikman_indicator_flatpak_item_label_calculating": "calculating...",
"pikman_indicator_open_item_label": "Open", "pikman_indicator_open_item_label": "Open",
"pikman_indicator_exit_item_label": "Exit" "pikman_indicator_exit_item_label": "Exit",
"apt_install_str_error": "DPKG error in {PKGNAME}: {ERROR}",
"apt_update_str_hit": "Up-to-date: {DESC} {SHORT_DESC}",
"apt_update_str_fetch": "Fetching: {DESC} {SHORT_DESC}",
"apt_update_str_done": "Downloading: {DESC} {SHORT_DESC}",
"apt_update_str_fail": "Download Failed: {DESC} {SHORT_DESC}"
} }

View File

@ -5,8 +5,17 @@ use rust_apt::cache::Upgrade;
use rust_apt::new_cache; use rust_apt::new_cache;
use rust_apt::progress::{AcquireProgress, InstallProgress}; use rust_apt::progress::{AcquireProgress, InstallProgress};
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
use std::env;
// Init translations for current crate.
#[macro_use]
extern crate rust_i18n;
i18n!("locales", fallback = "en_US");
fn main() { fn main() {
let args: Vec<String> = env::args().collect();
rust_i18n::set_locale(&args[1]);
let percent_socket_path = "/tmp/pika_apt_upgrade_percent.sock"; let percent_socket_path = "/tmp/pika_apt_upgrade_percent.sock";
let status_socket_path = "/tmp/pika_apt_upgrade_status.sock"; let status_socket_path = "/tmp/pika_apt_upgrade_status.sock";
let json_file_path = "/tmp/pika-apt-exclusions.json"; let json_file_path = "/tmp/pika-apt-exclusions.json";
@ -56,13 +65,24 @@ fn main() {
apt_upgrade_cache.resolve(true).unwrap(); apt_upgrade_cache.resolve(true).unwrap();
let hit_strfmt_trans_str = t!("apt_update_str_hit").to_string();
let fetch_strfmt_trans_str = t!("apt_update_str_fetch").to_string();
let done_strfmt_trans_str = t!("apt_update_str_done").to_string();
let fail_strfmt_trans_str = t!("apt_update_str_fail").to_string();
let error_strfmt_trans_str = t!("apt_install_str_error").to_string();
let mut acquire_progress = AcquireProgress::new(AptUpdateProgressSocket::new( let mut acquire_progress = AcquireProgress::new(AptUpdateProgressSocket::new(
percent_socket_path, percent_socket_path,
status_socket_path, status_socket_path,
&hit_strfmt_trans_str,
&fetch_strfmt_trans_str,
&done_strfmt_trans_str,
&fail_strfmt_trans_str,
)); ));
let mut install_progress = InstallProgress::new(AptInstallProgressSocket::new( let mut install_progress = InstallProgress::new(AptInstallProgressSocket::new(
percent_socket_path, percent_socket_path,
status_socket_path, status_socket_path,
&error_strfmt_trans_str,
)); ));
apt_upgrade_cache.resolve(true).unwrap(); apt_upgrade_cache.resolve(true).unwrap();

View File

@ -3,14 +3,32 @@ use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::new_cache; use rust_apt::new_cache;
use rust_apt::progress::AcquireProgress; use rust_apt::progress::AcquireProgress;
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
use std::env;
// Init translations for current crate.
#[macro_use]
extern crate rust_i18n;
i18n!("locales", fallback = "en_US");
fn main() { fn main() {
let args: Vec<String> = env::args().collect();
rust_i18n::set_locale(&args[1]);
let hit_strfmt_trans_str = t!("apt_update_str_hit").to_string();
let fetch_strfmt_trans_str = t!("apt_update_str_fetch").to_string();
let done_strfmt_trans_str = t!("apt_update_str_done").to_string();
let fail_strfmt_trans_str = t!("apt_update_str_fail").to_string();
let update_cache = new_cache!().unwrap(); let update_cache = new_cache!().unwrap();
let percent_socket_path = "/tmp/pika_apt_update_percent.sock"; let percent_socket_path = "/tmp/pika_apt_update_percent.sock";
let status_socket_path = "/tmp/pika_apt_update_status.sock"; let status_socket_path = "/tmp/pika_apt_update_status.sock";
match update_cache.update(&mut AcquireProgress::new(AptUpdateProgressSocket::new( match update_cache.update(&mut AcquireProgress::new(AptUpdateProgressSocket::new(
percent_socket_path, percent_socket_path,
status_socket_path, status_socket_path,
&hit_strfmt_trans_str,
&fetch_strfmt_trans_str,
&done_strfmt_trans_str,
&fail_strfmt_trans_str,
))) { ))) {
Ok(_) => {} Ok(_) => {}
Err(e) => { Err(e) => {

View File

@ -66,7 +66,7 @@ pub fn apt_update_page(
thread::spawn(move || { thread::spawn(move || {
let apt_update_command = Command::new("pkexec") let apt_update_command = Command::new("pkexec")
.args(["/usr/lib/pika/pikman-update-manager/scripts/apt_update"]) .args(["/usr/lib/pika/pikman-update-manager/scripts/apt_update", "fr_FR"])
.status() .status()
.unwrap(); .unwrap();
match apt_update_command.code().unwrap() { match apt_update_command.code().unwrap() {
@ -127,12 +127,12 @@ pub fn apt_update_page(
.vexpand(true) .vexpand(true)
.build(); .build();
let packages_ignored_viewport_page = adw::StatusPage::builder() /*let packages_ignored_viewport_page = adw::StatusPage::builder()
.icon_name("dialog-warning-symbolic") .icon_name("dialog-warning-symbolic")
.title(t!("apt_ignored_viewport_page_title")) .title(t!("apt_ignored_viewport_page_title"))
.hexpand(true) .hexpand(true)
.vexpand(true) .vexpand(true)
.build(); .build();*/
let viewport_bin = adw::Bin::builder() let viewport_bin = adw::Bin::builder()
.child(&packages_no_viewport_page) .child(&packages_no_viewport_page)
@ -182,7 +182,6 @@ pub fn apt_update_page(
if window.is_visible() { if window.is_visible() {
let retry_signal_action0 = retry_signal_action.clone(); let retry_signal_action0 = retry_signal_action.clone();
let viewport_bin = viewport_bin.clone();
let flatpak_retry_signal_action = flatpak_retry_signal_action.clone(); let flatpak_retry_signal_action = flatpak_retry_signal_action.clone();
let flatpak_ran_once = flatpak_ran_once.clone(); let flatpak_ran_once = flatpak_ran_once.clone();
@ -194,7 +193,7 @@ pub fn apt_update_page(
retry_signal_action0.activate(None); retry_signal_action0.activate(None);
} }
"apt_update_dialog_ignore" => { "apt_update_dialog_ignore" => {
viewport_bin.set_child(Some(&packages_ignored_viewport_page)); //viewport_bin.set_child(Some(&packages_ignored_viewport_page));
let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut(); let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut();
if *flatpak_ran_once_borrow != true { if *flatpak_ran_once_borrow != true {
flatpak_retry_signal_action.activate(None); flatpak_retry_signal_action.activate(None);
@ -292,66 +291,30 @@ pub fn apt_update_page(
apt_update_dialog_child_box, apt_update_dialog_child_box,
#[weak] #[weak]
flatpak_retry_signal_action, flatpak_retry_signal_action,
#[strong]
apt_update_count,
#[strong]
flatpak_update_count,
#[strong]
update_sys_tray,
async move { async move {
while let Ok(state) = update_status_receiver.recv().await { while let Ok(state) = update_status_receiver.recv().await {
match state.as_ref() { match state.as_ref() {
"FN_OVERRIDE_SUCCESSFUL" => { "FN_OVERRIDE_SUCCESSFUL" => {
let get_upgradable_sender = get_upgradable_sender.clone(); get_apt_upgrades(&get_upgradable_sender);
thread::spawn(move || {
// Create upgradable list cache
let upgradable_cache = new_cache!().unwrap();
//
upgradable_cache.upgrade(Upgrade::FullUpgrade).unwrap();
upgradable_cache.resolve(true).unwrap();
let mut upgradeable_iter =
upgradable_cache.get_changes(false).peekable();
while let Some(pkg) = upgradeable_iter.next() {
if !pkg.marked_delete() {
let candidate_version_pkg = pkg.candidate().unwrap();
let package_struct = AptPackageSocket {
name: pkg.name().to_string(),
arch: pkg.arch().to_string(),
installed_version: match pkg.installed() {
Some(t) => t.version().to_string(),
_ => {
t!("installed_version_to_be_installed").to_string()
}
},
candidate_version: candidate_version_pkg
.version()
.to_string(),
description: match candidate_version_pkg.description() {
Some(s) => s,
_ => t!("apt_pkg_property_unknown").to_string(),
},
source_uri: candidate_version_pkg
.uris()
.collect::<Vec<String>>()
.join("\n"),
maintainer: match candidate_version_pkg
.get_record(RecordField::Maintainer)
{
Some(s) => s,
_ => t!("apt_pkg_property_unknown").to_string(),
},
size: candidate_version_pkg.size(),
installed_size: candidate_version_pkg.installed_size(),
is_last: upgradeable_iter.peek().is_none(),
};
get_upgradable_sender.send_blocking(package_struct).unwrap()
}
}
});
apt_update_dialog.close(); apt_update_dialog.close();
let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut(); let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut();
if *flatpak_ran_once_borrow != true { if *flatpak_ran_once_borrow != true {
flatpak_retry_signal_action.activate(None); flatpak_retry_signal_action.activate(None);
*flatpak_ran_once_borrow = true; *flatpak_ran_once_borrow = true;
} }
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[
*apt_update_count.borrow(),
*flatpak_update_count.borrow(),
])));
} }
"FN_OVERRIDE_FAILED" => { "FN_OVERRIDE_FAILED" => {
get_apt_upgrades(&get_upgradable_sender);
apt_update_dialog_child_box.set_visible(false); apt_update_dialog_child_box.set_visible(false);
apt_update_dialog.set_extra_child(Some( apt_update_dialog.set_extra_child(Some(
&Image::builder() &Image::builder()
@ -364,6 +327,15 @@ pub fn apt_update_page(
.set_title(Some(&t!("apt_update_dialog_status_failed").to_string())); .set_title(Some(&t!("apt_update_dialog_status_failed").to_string()));
apt_update_dialog.set_response_enabled("apt_update_dialog_retry", true); apt_update_dialog.set_response_enabled("apt_update_dialog_retry", true);
apt_update_dialog.set_response_enabled("apt_update_dialog_ignore", true); apt_update_dialog.set_response_enabled("apt_update_dialog_ignore", true);
let mut flatpak_ran_once_borrow = flatpak_ran_once.borrow_mut();
if *flatpak_ran_once_borrow != true {
flatpak_retry_signal_action.activate(None);
*flatpak_ran_once_borrow = true;
}
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[
*apt_update_count.borrow(),
*flatpak_update_count.borrow(),
])));
} }
_ => apt_update_dialog.set_body(&state), _ => apt_update_dialog.set_body(&state),
} }
@ -535,3 +507,54 @@ fn set_all_apt_row_marks_to(parent_listbox: &impl IsA<ListBox>, value: bool) {
child_counter = next_child child_counter = next_child
} }
} }
fn get_apt_upgrades(get_upgradable_sender: &async_channel::Sender<AptPackageSocket>) {
let get_upgradable_sender = get_upgradable_sender.clone();
thread::spawn(move || {
// Create upgradable list cache
let upgradable_cache = new_cache!().unwrap();
//
upgradable_cache.upgrade(Upgrade::FullUpgrade).unwrap();
upgradable_cache.resolve(true).unwrap();
let mut upgradeable_iter =
upgradable_cache.get_changes(false).peekable();
while let Some(pkg) = upgradeable_iter.next() {
if !pkg.marked_delete() {
let candidate_version_pkg = pkg.candidate().unwrap();
let package_struct = AptPackageSocket {
name: pkg.name().to_string(),
arch: pkg.arch().to_string(),
installed_version: match pkg.installed() {
Some(t) => t.version().to_string(),
_ => {
t!("installed_version_to_be_installed").to_string()
}
},
candidate_version: candidate_version_pkg
.version()
.to_string(),
description: match candidate_version_pkg.description() {
Some(s) => s,
_ => t!("apt_pkg_property_unknown").to_string(),
},
source_uri: candidate_version_pkg
.uris()
.collect::<Vec<String>>()
.join("\n"),
maintainer: match candidate_version_pkg
.get_record(RecordField::Maintainer)
{
Some(s) => s,
_ => t!("apt_pkg_property_unknown").to_string(),
},
size: candidate_version_pkg.size(),
installed_size: candidate_version_pkg.installed_size(),
is_last: upgradeable_iter.peek().is_none(),
};
get_upgradable_sender.send_blocking(package_struct).unwrap()
}
}
});
}

View File

@ -244,7 +244,7 @@ pub fn build_ui(app: &Application) {
let window_breakpoint = adw::Breakpoint::new(BreakpointCondition::new_length( let window_breakpoint = adw::Breakpoint::new(BreakpointCondition::new_length(
BreakpointConditionLengthType::MaxWidth, BreakpointConditionLengthType::MaxWidth,
1140.0, 1000.0,
LengthUnit::Sp, LengthUnit::Sp,
)); ));

View File

@ -192,12 +192,12 @@ pub fn flatpak_update_page(
.vexpand(true) .vexpand(true)
.build(); .build();
let packages_ignored_viewport_page = adw::StatusPage::builder() /*let packages_ignored_viewport_page = adw::StatusPage::builder()
.icon_name("dialog-warning-symbolic") .icon_name("dialog-warning-symbolic")
.title(t!("flatpak_ignored_viewport_page_title")) .title(t!("flatpak_ignored_viewport_page_title"))
.hexpand(true) .hexpand(true)
.vexpand(true) .vexpand(true)
.build(); .build();*/
let viewport_bin = adw::Bin::builder() let viewport_bin = adw::Bin::builder()
.child(&packages_no_viewport_page) .child(&packages_no_viewport_page)
@ -247,7 +247,7 @@ pub fn flatpak_update_page(
if window.is_visible() { if window.is_visible() {
let retry_signal_action0 = retry_signal_action.clone(); let retry_signal_action0 = retry_signal_action.clone();
let viewport_bin = viewport_bin.clone(); //let viewport_bin = viewport_bin.clone();
flatpak_update_dialog flatpak_update_dialog
.clone() .clone()
@ -256,9 +256,9 @@ pub fn flatpak_update_page(
"flatpak_update_dialog_retry" => { "flatpak_update_dialog_retry" => {
retry_signal_action0.activate(None); retry_signal_action0.activate(None);
} }
"flatpak_update_dialog_ignore" => { //"flatpak_update_dialog_ignore" => {
viewport_bin.set_child(Some(&packages_ignored_viewport_page)); // viewport_bin.set_child(Some(&packages_ignored_viewport_page));
} //}
_ => {} _ => {}
} }
}); });
@ -380,7 +380,156 @@ pub fn flatpak_update_page(
while let Ok(state) = appstream_sync_status_receiver.recv().await { while let Ok(state) = appstream_sync_status_receiver.recv().await {
match state.as_ref() { match state.as_ref() {
"FN_OVERRIDE_SUCCESSFUL" => { "FN_OVERRIDE_SUCCESSFUL" => {
let flatpak_system_installation = get_flatpak_updates(
cancellable_no,
&viewport_bin,
&update_button,
&select_button,
&packages_viewport,
&packages_boxedlist,
&system_refs_for_upgrade_vec,
&system_refs_for_upgrade_vec_all,
&user_refs_for_upgrade_vec,
&user_refs_for_upgrade_vec_all,
&update_sys_tray,
&apt_update_count,
&flatpak_update_count,
);
flatpak_update_dialog.close();
}
"FN_OVERRIDE_FAILED" => {
get_flatpak_updates(
cancellable_no,
&viewport_bin,
&update_button,
&select_button,
&packages_viewport,
&packages_boxedlist,
&system_refs_for_upgrade_vec,
&system_refs_for_upgrade_vec_all,
&user_refs_for_upgrade_vec,
&user_refs_for_upgrade_vec_all,
&update_sys_tray,
&apt_update_count,
&flatpak_update_count,
);
flatpak_update_dialog_child_box.set_visible(false);
flatpak_update_dialog.set_extra_child(Some(
&Image::builder()
.pixel_size(128)
.icon_name("dialog-error-symbolic")
.halign(Align::Center)
.build(),
));
flatpak_update_dialog.set_title(Some(
&t!("flatpak_update_dialog_status_failed").to_string(),
));
flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_retry", true);
flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_ignore", true);
}
_ => flatpak_update_dialog.set_body(&state),
}
}
}
));
searchbar.connect_search_changed(clone!(
#[weak]
searchbar,
#[weak]
packages_boxedlist,
move |_| {
let mut counter = packages_boxedlist.first_child();
while let Some(row) = counter {
if row.widget_name() == "FlatpakRefRow" {
if !searchbar.text().is_empty() {
if row
.property::<String>("flatref-name")
.to_lowercase()
.contains(&searchbar.text().to_string().to_lowercase())
|| row
.property::<String>("flatref-ref-name")
.to_lowercase()
.contains(&searchbar.text().to_string().to_lowercase())
{
row.set_property("visible", true);
searchbar.grab_focus();
} else {
row.set_property("visible", false);
}
} else {
row.set_property("visible", true);
}
}
counter = row.next_sibling();
}
}
));
main_box.append(&searchbar);
main_box.append(&viewport_bin);
main_box.append(&bottom_bar);
main_box
}
fn is_widget_select_all_ready(parent_listbox: &impl adw::prelude::IsA<ListBox>) -> bool {
let mut is_ready = false;
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
if !downcast.flatref_marked() {
is_ready = true;
break;
}
child_counter = next_child
}
is_ready
}
fn is_all_children_unmarked(parent_listbox: &impl adw::prelude::IsA<ListBox>) -> bool {
let mut is_all_unmarked = true;
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
if downcast.flatref_marked() {
is_all_unmarked = false;
break;
}
child_counter = next_child
}
is_all_unmarked
}
fn set_all_flatpak_row_marks_to(parent_listbox: &impl adw::prelude::IsA<ListBox>, value: bool) {
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
downcast.set_flatref_marked(value);
child_counter = next_child
}
}
fn get_flatpak_updates(
cancellable_no: Option<&libflatpak::gio::Cancellable>,
viewport_bin: &adw::Bin,
update_button: &gtk::Button,
select_button: &gtk::Button,
packages_viewport: &gtk::ScrolledWindow,
packages_boxedlist: &gtk::ListBox,
system_refs_for_upgrade_vec: &Rc<RefCell<Vec<FlatpakRefRow>>>,
system_refs_for_upgrade_vec_all: &Rc<RefCell<Vec<FlatpakRefRow>>>,
user_refs_for_upgrade_vec: &Rc<RefCell<Vec<FlatpakRefRow>>>,
user_refs_for_upgrade_vec_all: &Rc<RefCell<Vec<FlatpakRefRow>>>,
update_sys_tray: &SimpleAction,
apt_update_count: &Rc<RefCell<i32>>,
flatpak_update_count: &Rc<RefCell<i32>>,
) {
let flatpak_system_installation =
libflatpak::Installation::new_system(cancellable_no).unwrap(); libflatpak::Installation::new_system(cancellable_no).unwrap();
let flatpak_system_updates = flatpak_system_installation let flatpak_system_updates = flatpak_system_installation
.list_installed_refs_for_update(cancellable_no) .list_installed_refs_for_update(cancellable_no)
@ -397,7 +546,7 @@ pub fn flatpak_update_page(
// //
if !flatpak_system_updates.is_empty() || !flatpak_user_updates.is_empty() { if !flatpak_system_updates.is_empty() || !flatpak_user_updates.is_empty() {
update_button.set_sensitive(true); update_button.set_sensitive(true);
viewport_bin.set_child(Some(&packages_viewport)); viewport_bin.set_child(Some(packages_viewport));
} }
// //
if !flatpak_system_updates.is_empty() { if !flatpak_system_updates.is_empty() {
@ -713,107 +862,4 @@ pub fn flatpak_update_page(
&[*apt_update_count.borrow(), *flatpak_update_count.borrow()], &[*apt_update_count.borrow(), *flatpak_update_count.borrow()],
))); )));
} }
flatpak_update_dialog.close();
}
"FN_OVERRIDE_FAILED" => {
flatpak_update_dialog_child_box.set_visible(false);
flatpak_update_dialog.set_extra_child(Some(
&Image::builder()
.pixel_size(128)
.icon_name("dialog-error-symbolic")
.halign(Align::Center)
.build(),
));
flatpak_update_dialog.set_title(Some(
&t!("flatpak_update_dialog_status_failed").to_string(),
));
flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_retry", true);
flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_ignore", true);
}
_ => flatpak_update_dialog.set_body(&state),
}
}
}
));
searchbar.connect_search_changed(clone!(
#[weak]
searchbar,
#[weak]
packages_boxedlist,
move |_| {
let mut counter = packages_boxedlist.first_child();
while let Some(row) = counter {
if row.widget_name() == "FlatpakRefRow" {
if !searchbar.text().is_empty() {
if row
.property::<String>("flatref-name")
.to_lowercase()
.contains(&searchbar.text().to_string().to_lowercase())
|| row
.property::<String>("flatref-ref-name")
.to_lowercase()
.contains(&searchbar.text().to_string().to_lowercase())
{
row.set_property("visible", true);
searchbar.grab_focus();
} else {
row.set_property("visible", false);
}
} else {
row.set_property("visible", true);
}
}
counter = row.next_sibling();
}
}
));
main_box.append(&searchbar);
main_box.append(&viewport_bin);
main_box.append(&bottom_bar);
main_box
}
fn is_widget_select_all_ready(parent_listbox: &impl adw::prelude::IsA<ListBox>) -> bool {
let mut is_ready = false;
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
if !downcast.flatref_marked() {
is_ready = true;
break;
}
child_counter = next_child
}
is_ready
}
fn is_all_children_unmarked(parent_listbox: &impl adw::prelude::IsA<ListBox>) -> bool {
let mut is_all_unmarked = true;
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
if downcast.flatref_marked() {
is_all_unmarked = false;
break;
}
child_counter = next_child
}
is_all_unmarked
}
fn set_all_flatpak_row_marks_to(parent_listbox: &impl adw::prelude::IsA<ListBox>, value: bool) {
let mut child_counter = parent_listbox.borrow().first_child();
while let Some(child) = child_counter {
let next_child = child.next_sibling();
let downcast = child.downcast::<FlatpakRefRow>().unwrap();
downcast.set_flatref_marked(value);
child_counter = next_child
}
} }

View File

@ -8,14 +8,16 @@ use tokio::runtime::Runtime;
pub struct AptInstallProgressSocket<'a> { pub struct AptInstallProgressSocket<'a> {
percent_socket_path: &'a str, percent_socket_path: &'a str,
status_socket_path: &'a str, status_socket_path: &'a str,
error_strfmt_trans_str: &'a str,
} }
impl<'a> AptInstallProgressSocket<'a> { impl<'a> AptInstallProgressSocket<'a> {
/// Returns a new default progress instance. /// Returns a new default progress instance.
pub fn new(percent_socket_path: &'a str, status_socket_path: &'a str) -> Self { pub fn new(percent_socket_path: &'a str, status_socket_path: &'a str, error_strfmt_trans_str: &'a str) -> Self {
let progress = Self { let progress = Self {
percent_socket_path: percent_socket_path, percent_socket_path: percent_socket_path,
status_socket_path: status_socket_path, status_socket_path: status_socket_path,
error_strfmt_trans_str: error_strfmt_trans_str,
}; };
progress progress
} }
@ -40,7 +42,14 @@ impl<'a> DynInstallProgress for AptInstallProgressSocket<'a> {
} }
fn error(&mut self, pkgname: String, _steps_done: u64, _total_steps: u64, error: String) { fn error(&mut self, pkgname: String, _steps_done: u64, _total_steps: u64, error: String) {
let message = format!("dpkg failure on {}: {}", pkgname, error); let message = &strfmt::strfmt(
&self.error_strfmt_trans_str,
&std::collections::HashMap::from([
("PKGNAME".to_string(), pkgname),
("ERROR".to_string(), error),
]),
)
.unwrap();
eprintln!("{}", &message); eprintln!("{}", &message);
Runtime::new() Runtime::new()
.unwrap() .unwrap()

View File

@ -10,15 +10,23 @@ pub struct AptUpdateProgressSocket<'a> {
pulse_interval: usize, pulse_interval: usize,
percent_socket_path: &'a str, percent_socket_path: &'a str,
status_socket_path: &'a str, status_socket_path: &'a str,
hit_strfmt_trans_str: &'a str,
fetch_strfmt_trans_str: &'a str,
done_strfmt_trans_str: &'a str,
fail_strfmt_trans_str: &'a str,
} }
impl<'a> AptUpdateProgressSocket<'a> { impl<'a> AptUpdateProgressSocket<'a> {
/// Returns a new default progress instance. /// Returns a new default progress instance.
pub fn new(percent_socket_path: &'a str, status_socket_path: &'a str) -> Self { pub fn new(percent_socket_path: &'a str, status_socket_path: &'a str, hit_strfmt_trans_str: &'a str, fetch_strfmt_trans_str: &'a str, done_strfmt_trans_str: &'a str, fail_strfmt_trans_str: &'a str) -> Self {
let progress = Self { let progress = Self {
pulse_interval: 0, pulse_interval: 0,
percent_socket_path: percent_socket_path, percent_socket_path: percent_socket_path,
status_socket_path: status_socket_path, status_socket_path: status_socket_path,
hit_strfmt_trans_str: hit_strfmt_trans_str,
fetch_strfmt_trans_str: fetch_strfmt_trans_str,
done_strfmt_trans_str: done_strfmt_trans_str,
fail_strfmt_trans_str: fail_strfmt_trans_str,
}; };
progress progress
} }
@ -44,7 +52,14 @@ impl<'a> DynAcquireProgress for AptUpdateProgressSocket<'a> {
/// ///
/// Prints out the short description and the expected size. /// Prints out the short description and the expected size.
fn hit(&mut self, item: &ItemDesc) { fn hit(&mut self, item: &ItemDesc) {
let message = format!("Up-to-date: {} {}", item.description(), item.short_desc()); let message = &strfmt::strfmt(
&self.hit_strfmt_trans_str,
&std::collections::HashMap::from([
("DESC".to_string(), item.description()),
("SHORT_DESC".to_string(), item.short_desc()),
]),
)
.unwrap();
println!("{}", message); println!("{}", message);
Runtime::new() Runtime::new()
.unwrap() .unwrap()
@ -55,7 +70,14 @@ impl<'a> DynAcquireProgress for AptUpdateProgressSocket<'a> {
/// ///
/// Prints out the short description and the expected size. /// Prints out the short description and the expected size.
fn fetch(&mut self, item: &ItemDesc) { fn fetch(&mut self, item: &ItemDesc) {
let message = format!("Fetching: {} {}", item.description(), item.short_desc()); let message = &strfmt::strfmt(
&self.fetch_strfmt_trans_str,
&std::collections::HashMap::from([
("DESC".to_string(), item.description()),
("SHORT_DESC".to_string(), item.short_desc()),
]),
)
.unwrap();
println!("{}", message); println!("{}", message);
Runtime::new() Runtime::new()
.unwrap() .unwrap()
@ -66,7 +88,14 @@ impl<'a> DynAcquireProgress for AptUpdateProgressSocket<'a> {
/// ///
/// We don't print anything here to remain consistent with apt. /// We don't print anything here to remain consistent with apt.
fn done(&mut self, item: &ItemDesc) { fn done(&mut self, item: &ItemDesc) {
let message = format!("Downloading: {} {}", item.description(), item.short_desc()); let message = &strfmt::strfmt(
&self.done_strfmt_trans_str,
&std::collections::HashMap::from([
("DESC".to_string(), item.description()),
("SHORT_DESC".to_string(), item.short_desc()),
]),
)
.unwrap();
println!("{}", message); println!("{}", message);
Runtime::new() Runtime::new()
.unwrap() .unwrap()
@ -91,11 +120,14 @@ impl<'a> DynAcquireProgress for AptUpdateProgressSocket<'a> {
/// ///
/// Print out the ErrorText for the Item. /// Print out the ErrorText for the Item.
fn fail(&mut self, item: &ItemDesc) { fn fail(&mut self, item: &ItemDesc) {
let message = format!( let message = &strfmt::strfmt(
"Download Failed: {} {}", &self.fail_strfmt_trans_str,
item.description(), &std::collections::HashMap::from([
item.short_desc() ("DESC".to_string(), item.description()),
); ("SHORT_DESC".to_string(), item.short_desc()),
]),
)
.unwrap();
eprintln!("{}", &message); eprintln!("{}", &message);
Runtime::new() Runtime::new()
.unwrap() .unwrap()