diff --git a/.idea/modules.xml b/.idea/modules.xml
index 4ba2158..e2a5217 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 596a428..e6f330c 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -59,13 +59,13 @@
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.rust.reset.selective.auto.import": "true",
"git-widget-placeholder": "main",
- "last_opened_file_path": "/home/ward/RustroverProjects/pikman-update-manager",
+ "last_opened_file_path": "/home/ward/RustroverProjects/pkg-pikman-update-manager",
"node.js.detected.package.eslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"org.rust.cargo.project.model.PROJECT_DISCOVERY": "true",
"org.rust.cargo.project.model.impl.CargoExternalSystemProjectAware.subscribe.first.balloon": "",
- "org.rust.disableDetachedFileInspection/home/ward/RustroverProjects/pikman-update-manager/src/apt_update_progress_socket/lib.rs": "true",
+ "org.rust.disableDetachedFileInspection/home/ward/RustroverProjects/pkg-pikman-update-manager/src/apt_update_progress_socket/lib.rs": "true",
"org.rust.first.attach.projects": "true"
}
}
diff --git a/locales/en_US.json b/locales/en_US.json
index 34e2c0e..fa909a6 100644
--- a/locales/en_US.json
+++ b/locales/en_US.json
@@ -52,5 +52,6 @@
"apt_upgrade_dialog_status_failed": "APT Upgrade Transaction Failed!",
"banner_text_no_internet": "Warning: No Internet Connection!",
"refresh_button_tooltip_text": "Refresh Opened Page",
- "apt_update_page_title": "Native Updates (APT)"
+ "apt_update_page_title": "Native Updates (APT)",
+ "packages_no_viewport_page_title": "All Native APT Packages are Up to date!"
}
\ No newline at end of file
diff --git a/src/bin/apt/apt_full_upgrade/main.rs b/src/bin/apt/apt_full_upgrade/main.rs
index d3eba9d..49d0654 100644
--- a/src/bin/apt/apt_full_upgrade/main.rs
+++ b/src/bin/apt/apt_full_upgrade/main.rs
@@ -14,8 +14,9 @@ fn main() {
if std::path::Path::new(json_file_path).exists() {
let data = std::fs::read_to_string(json_file_path).expect("Unable to read file");
- let json: serde_json::Value = serde_json::from_str(&data).expect("JSON was not well-formatted");
-
+ let json: serde_json::Value =
+ serde_json::from_str(&data).expect("JSON was not well-formatted");
+
if let serde_json::Value::Array(exclusions) = &json["exclusions"] {
for exclusion in exclusions {
match exclusion["package"].as_str() {
diff --git a/src/bin/apt/apt_update/main.rs b/src/bin/apt/apt_update/main.rs
index cd44841..ff6d760 100644
--- a/src/bin/apt/apt_update/main.rs
+++ b/src/bin/apt/apt_update/main.rs
@@ -1,7 +1,7 @@
use pika_unixsocket_tools::apt_update_progress_socket::AptUpdateProgressSocket;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::new_cache;
-use rust_apt::progress::{AcquireProgress};
+use rust_apt::progress::AcquireProgress;
use tokio::runtime::Runtime;
fn main() {
diff --git a/src/bin/gui/apt_package_row/imp.rs b/src/bin/gui/apt_package_row/imp.rs
index a709094..eace26f 100644
--- a/src/bin/gui/apt_package_row/imp.rs
+++ b/src/bin/gui/apt_package_row/imp.rs
@@ -78,24 +78,46 @@ impl ObjectImpl for AptPackageRow {
let expandable_box = Box::new(Orientation::Vertical, 0);
- obj.connect_package_name_notify(clone!(#[weak] prefix_box, #[weak] expandable_box, #[strong] obj, move |_| {
- remove_all_children_from_box(&prefix_box);
- remove_all_children_from_box(&expandable_box);
- //
- let package_name = obj.package_name();
- let package_arch = obj.package_arch();
- let package_installed_version= obj.package_installed_version();
- let package_candidate_version= obj.package_candidate_version();
- let package_description = obj.package_description();
- let package_source_uri = obj.package_source_uri();
- let package_maintainer = obj.package_maintainer();
- let package_size = obj.package_size();
- let package_installed_size= obj.package_installed_size();
- //
- create_prefix_content(&prefix_box, &package_name, &package_arch, &package_installed_version, &package_candidate_version);
- //
- create_expandable_content(&obj, &expandable_box, package_description, package_source_uri, package_maintainer, package_size, package_installed_size);
- }));
+ obj.connect_package_name_notify(clone!(
+ #[weak]
+ prefix_box,
+ #[weak]
+ expandable_box,
+ #[strong]
+ obj,
+ move |_| {
+ remove_all_children_from_box(&prefix_box);
+ remove_all_children_from_box(&expandable_box);
+ //
+ let package_name = obj.package_name();
+ let package_arch = obj.package_arch();
+ let package_installed_version = obj.package_installed_version();
+ let package_candidate_version = obj.package_candidate_version();
+ let package_description = obj.package_description();
+ let package_source_uri = obj.package_source_uri();
+ let package_maintainer = obj.package_maintainer();
+ let package_size = obj.package_size();
+ let package_installed_size = obj.package_installed_size();
+ //
+ create_prefix_content(
+ &prefix_box,
+ &package_name,
+ &package_arch,
+ &package_installed_version,
+ &package_candidate_version,
+ );
+ //
+ create_expandable_content(
+ &obj,
+ &expandable_box,
+ package_description,
+ package_source_uri,
+ package_maintainer,
+ package_size,
+ package_installed_size,
+ );
+ }
+ ));
obj.add_prefix(&prefix_box);
obj.add_row(&expandable_box);
@@ -108,13 +130,19 @@ impl ObjectImpl for AptPackageRow {
.vexpand(false)
.build();
- suffix_toggle.connect_toggled(clone!( #[weak] obj, #[weak] suffix_toggle, move |_| {
- if suffix_toggle.is_active() {
- obj.emit_by_name::<()>("checkbutton-toggled", &[]);
- } else {
- obj.emit_by_name::<()>("checkbutton-untoggled", &[]);
+ suffix_toggle.connect_toggled(clone!(
+ #[weak]
+ obj,
+ #[weak]
+ suffix_toggle,
+ move |_| {
+ if suffix_toggle.is_active() {
+ obj.emit_by_name::<()>("checkbutton-toggled", &[]);
+ } else {
+ obj.emit_by_name::<()>("checkbutton-untoggled", &[]);
+ }
}
- }));
+ ));
obj.add_suffix(&suffix_toggle);
@@ -183,10 +211,7 @@ fn create_version_badge(installed_version: &str, candidate_version: &str) -> Lis
installed_version_box.append(&installed_version_base_version_label.clone());
installed_version_box.append(&installed_diff_label);
- let label_separator = Separator::builder()
- .margin_start(5)
- .margin_end(5)
- .build();
+ let label_separator = Separator::builder().margin_start(5).margin_end(5).build();
let candidate_version_box = Box::builder()
.halign(Align::Start)
@@ -343,37 +368,65 @@ fn create_expandable_content(
//
let expandable_bin = Bin::builder().hexpand(true).vexpand(true).build();
//
- description_page_button.connect_clicked(
- clone!(#[strong] expandable_bin, #[strong] description_page_button, move |_|{
+ description_page_button.connect_clicked(clone!(
+ #[strong]
+ expandable_bin,
+ #[strong]
+ description_page_button,
+ move |_| {
if description_page_button.is_active() {
expandable_bin.set_child(Some(&description_stack_page(&package_description)));
}
- }),
- );
-
- extra_info_page_button.connect_clicked(clone!(#[strong] expandable_bin, #[strong] extra_info_page_button, move |_|{
- if extra_info_page_button.is_active() {
- expandable_bin.set_child(Some(&extra_info_stack_page(&package_maintainer, package_size, package_installed_size)));
}
- }));
+ ));
- uris_page_button.connect_clicked(
- clone!(#[strong] expandable_bin, #[strong] uris_page_button, move |_|{
- if uris_page_button.is_active() {
- expandable_bin.set_child(Some(&uris_stack_page(&package_source_uri)));
+ extra_info_page_button.connect_clicked(clone!(
+ #[strong]
+ expandable_bin,
+ #[strong]
+ extra_info_page_button,
+ move |_| {
+ if extra_info_page_button.is_active() {
+ expandable_bin.set_child(Some(&extra_info_stack_page(
+ &package_maintainer,
+ package_size,
+ package_installed_size,
+ )));
}
- }),
- );
-
- apt_package_row.connect_expanded_notify(clone!(#[strong] expandable_bin, #[strong] expandable_box, #[strong] apt_package_row, #[strong] description_page_button, move |_| {
- if apt_package_row.property("expanded") {
- description_page_button.set_active(true);
- description_page_button.emit_by_name::<()>("clicked", &[]);
- expandable_box.append(&expandable_bin)
- } else {
- expandable_box.remove(&expandable_bin)
}
- }));
+ ));
+
+ uris_page_button.connect_clicked(clone!(
+ #[strong]
+ expandable_bin,
+ #[strong]
+ uris_page_button,
+ move |_| {
+ if uris_page_button.is_active() {
+ expandable_bin.set_child(Some(&uris_stack_page(&package_source_uri)));
+ }
+ }
+ ));
+
+ apt_package_row.connect_expanded_notify(clone!(
+ #[strong]
+ expandable_bin,
+ #[strong]
+ expandable_box,
+ #[strong]
+ apt_package_row,
+ #[strong]
+ description_page_button,
+ move |_| {
+ if apt_package_row.property("expanded") {
+ description_page_button.set_active(true);
+ description_page_button.emit_by_name::<()>("clicked", &[]);
+ expandable_box.append(&expandable_bin)
+ } else {
+ expandable_box.remove(&expandable_bin)
+ }
+ }
+ ));
//expandable_bin.add_named(&extra_info_stack_page(package_maintainer, package_size, package_installed_size), Some("extra_info_page"));
//
}
diff --git a/src/bin/gui/apt_update_page/mod.rs b/src/bin/gui/apt_update_page/mod.rs
index 9f255d9..89280ae 100644
--- a/src/bin/gui/apt_update_page/mod.rs
+++ b/src/bin/gui/apt_update_page/mod.rs
@@ -1,7 +1,7 @@
mod process;
use crate::apt_package_row::AptPackageRow;
-use adw::gio::{SimpleAction};
+use adw::gio::SimpleAction;
use adw::prelude::*;
use gtk::glib::*;
use gtk::*;
@@ -12,9 +12,10 @@ use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
-use std::{thread};
+use std::thread;
use tokio::runtime::Runtime;
+#[derive(Clone)]
pub struct AptPackageSocket {
pub name: String,
pub arch: String,
@@ -58,7 +59,9 @@ pub fn apt_update_page(
thread::spawn(move || {
let apt_update_command = Command::new("pkexec")
- .args(["/home/ward/RustroverProjects/pikman-update-manager/target/debug/apt_update"])
+ .args([
+ "/home/ward/RustroverProjects/pkg-pikman-update-manager/target/debug/apt_update",
+ ])
.status()
.unwrap();
match apt_update_command.code().unwrap() {
@@ -99,7 +102,7 @@ pub fn apt_update_page(
.sensitive(false)
.build();
packages_boxedlist.add_css_class("boxed-list");
-
+
let packages_viewport = ScrolledWindow::builder()
.vexpand(true)
.hexpand(true)
@@ -111,15 +114,22 @@ pub fn apt_update_page(
.child(&packages_boxedlist)
.build();
- let apt_update_dialog_child_box = Box::builder()
- .orientation(Orientation::Vertical)
+ let packages_no_viewport_page = adw::StatusPage::builder()
+ .icon_name("emblem-default-symbolic")
+ .title(t!("packages_no_viewport_page_title"))
+ .hexpand(true)
+ .vexpand(true)
.build();
- let apt_update_dialog_progress_bar = ProgressBar::builder()
- .show_text(true)
- .hexpand(true)
+ let viewport_bin = adw::Bin::builder()
+ .child(&packages_no_viewport_page)
.build();
+ let apt_update_dialog_child_box = Box::builder().orientation(Orientation::Vertical).build();
+
+ let apt_update_dialog_progress_bar =
+ ProgressBar::builder().show_text(true).hexpand(true).build();
+
let apt_update_dialog_spinner = Spinner::builder()
.hexpand(true)
.valign(Align::Start)
@@ -173,17 +183,24 @@ pub fn apt_update_page(
.label(t!("select_button_deselect_all"))
.build();
- select_button.connect_clicked(clone!(#[weak] select_button, #[weak] packages_boxedlist, move |_| {
- let select_button_label = select_button.label().unwrap();
- let value_to_mark = if select_button_label == t!("select_button_select_all").to_string() {
- true
- } else if select_button_label == t!("select_button_deselect_all").to_string() {
- false
- } else {
- panic!("Unexpected label on selection button")
- };
- set_all_apt_row_marks_to(&packages_boxedlist, value_to_mark)
- }));
+ select_button.connect_clicked(clone!(
+ #[weak]
+ select_button,
+ #[weak]
+ packages_boxedlist,
+ move |_| {
+ let select_button_label = select_button.label().unwrap();
+ let value_to_mark = if select_button_label == t!("select_button_select_all").to_string()
+ {
+ true
+ } else if select_button_label == t!("select_button_deselect_all").to_string() {
+ false
+ } else {
+ panic!("Unexpected label on selection button")
+ };
+ set_all_apt_row_marks_to(&packages_boxedlist, value_to_mark)
+ }
+ ));
let update_button = Button::builder()
.halign(Align::End)
@@ -196,153 +213,228 @@ pub fn apt_update_page(
.build();
update_button.add_css_class("destructive-action");
- update_button.connect_clicked(
- clone!(#[weak] window, #[weak] retry_signal_action, #[strong] excluded_updates_vec, move |_| {
- process::apt_process_update(&excluded_updates_vec.borrow(), window, &retry_signal_action);
- }),
- );
+ update_button.connect_clicked(clone!(
+ #[weak]
+ window,
+ #[weak]
+ retry_signal_action,
+ #[strong]
+ excluded_updates_vec,
+ move |_| {
+ process::apt_process_update(
+ &excluded_updates_vec.borrow(),
+ window,
+ &retry_signal_action,
+ );
+ }
+ ));
bottom_bar.append(&select_button);
bottom_bar.append(&update_button);
let update_percent_server_context = MainContext::default();
// The main loop executes the asynchronous block
- update_percent_server_context.spawn_local(clone!(#[weak] apt_update_dialog_progress_bar, async move {
- while let Ok(state) = update_percent_receiver.recv().await {
+ update_percent_server_context.spawn_local(clone!(
+ #[weak]
+ apt_update_dialog_progress_bar,
+ async move {
+ while let Ok(state) = update_percent_receiver.recv().await {
match state.parse::() {
- Ok(p) => apt_update_dialog_progress_bar.set_fraction(p/100.0),
+ Ok(p) => apt_update_dialog_progress_bar.set_fraction(p / 100.0),
Err(_) => {}
}
+ }
}
- }));
+ ));
let update_status_server_context = MainContext::default();
// The main loop executes the asynchronous block
- update_status_server_context.spawn_local(
- clone!(#[weak] apt_update_dialog, #[weak] apt_update_dialog_child_box, async move {
- while let Ok(state) = update_status_receiver.recv().await {
- match state.as_ref() {
- "FN_OVERRIDE_SUCCESSFUL" => {
- 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();
+ update_status_server_context.spawn_local(clone!(
+ #[weak]
+ apt_update_dialog,
+ #[weak]
+ apt_update_dialog_child_box,
+ async move {
+ while let Ok(state) = update_status_receiver.recv().await {
+ match state.as_ref() {
+ "FN_OVERRIDE_SUCCESSFUL" => {
+ 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();
+ upgradable_cache.resolve(true).unwrap();
- let mut upgradeable_iter = upgradable_cache.get_changes(false).peekable();
- while let Some(pkg) = upgradeable_iter.next() {
+ 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::>().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()
+ 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::>()
+ .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();
}
- "FN_OVERRIDE_FAILED" => {
- apt_update_dialog_child_box.set_visible(false);
- apt_update_dialog.set_extra_child(Some(&Image::builder().pixel_size(128).icon_name("dialog-error-symbolic").halign(Align::Center).build()));
- apt_update_dialog.set_title(Some(&t!("apt_update_dialog_status_failed").to_string()));
- apt_update_dialog.set_response_enabled("apt_update_dialog_retry", true);
+ "FN_OVERRIDE_FAILED" => {
+ apt_update_dialog_child_box.set_visible(false);
+ apt_update_dialog.set_extra_child(Some(
+ &Image::builder()
+ .pixel_size(128)
+ .icon_name("dialog-error-symbolic")
+ .halign(Align::Center)
+ .build(),
+ ));
+ apt_update_dialog
+ .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_body(&state),
}
- _ => apt_update_dialog.set_body(&state)
}
}
- }),
- );
+ ));
let get_upgradable_server_context = MainContext::default();
// The main loop executes the asynchronous block
- get_upgradable_server_context.spawn_local(
- clone!(#[weak] select_button, #[weak] update_button, #[weak] packages_boxedlist, #[strong] excluded_updates_vec, async move {
- while let Ok(state) = get_upgradable_receiver.recv().await {
- let apt_row = AptPackageRow::new(AptPackageSocket {
- name: state.name,
- arch: state.arch,
- installed_version: state.installed_version,
- candidate_version: state.candidate_version,
- description: state.description,
- source_uri: state.source_uri,
- maintainer: state.maintainer,
- size: state.size,
- installed_size: state.installed_size,
- is_last: state.is_last
- });
+ get_upgradable_server_context.spawn_local(clone!(
+ #[strong]
+ select_button,
+ #[strong]
+ update_button,
+ #[strong]
+ packages_boxedlist,
+ #[strong]
+ packages_viewport,
+ #[strong]
+ viewport_bin,
+ #[strong]
+ excluded_updates_vec,
+ async move {
+ while let Ok(state) = get_upgradable_receiver.recv().await {
+ viewport_bin.set_child(Some(&packages_viewport));
+ let apt_row = AptPackageRow::new(state.clone());
apt_row.connect_closure(
"checkbutton-toggled",
false,
- closure_local!(#[strong] select_button, #[strong] update_button, #[strong] packages_boxedlist, #[strong] excluded_updates_vec, move |apt_row: AptPackageRow| {
- if is_widget_select_all_ready(&packages_boxedlist) {
- select_button.set_label(&t!("select_button_select_all").to_string());
- } else {
- select_button.set_label(&t!("select_button_deselect_all").to_string());
+ closure_local!(
+ #[strong]
+ select_button,
+ #[strong]
+ update_button,
+ #[strong]
+ packages_boxedlist,
+ #[strong]
+ excluded_updates_vec,
+ move |apt_row: AptPackageRow| {
+ if is_widget_select_all_ready(&packages_boxedlist) {
+ select_button
+ .set_label(&t!("select_button_select_all").to_string());
+ } else {
+ select_button
+ .set_label(&t!("select_button_deselect_all").to_string());
+ }
+ update_button
+ .set_sensitive(!is_all_children_unmarked(&packages_boxedlist));
+ excluded_updates_vec
+ .borrow_mut()
+ .retain(|x| x != &apt_row.package_name());
}
- update_button.set_sensitive(!is_all_children_unmarked(&packages_boxedlist));
- excluded_updates_vec.borrow_mut().retain(|x| x != &apt_row.package_name());
- }),
+ ),
);
apt_row.connect_closure(
"checkbutton-untoggled",
false,
- closure_local!(#[strong] select_button, #[strong] update_button, #[strong] packages_boxedlist, #[strong] excluded_updates_vec, move |apt_row: AptPackageRow| {
- select_button.set_label(&t!("select_button_select_all").to_string());
- update_button.set_sensitive(!is_all_children_unmarked(&packages_boxedlist));
- excluded_updates_vec.borrow_mut().push(apt_row.package_name())
- }),
+ closure_local!(
+ #[strong]
+ select_button,
+ #[strong]
+ update_button,
+ #[strong]
+ packages_boxedlist,
+ #[strong]
+ excluded_updates_vec,
+ move |apt_row: AptPackageRow| {
+ select_button.set_label(&t!("select_button_select_all").to_string());
+ update_button
+ .set_sensitive(!is_all_children_unmarked(&packages_boxedlist));
+ excluded_updates_vec
+ .borrow_mut()
+ .push(apt_row.package_name())
+ }
+ ),
);
packages_boxedlist.append(&apt_row);
if state.is_last {
packages_boxedlist.set_sensitive(true);
}
}
- }),
- );
-
- 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() == "AptPackageRow" {
- if !searchbar.text().is_empty() {
- if row.property::("package-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();
}
- }));
+ ));
+
+ 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() == "AptPackageRow" {
+ if !searchbar.text().is_empty() {
+ if row
+ .property::("package-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(&packages_viewport);
+ main_box.append(&viewport_bin);
main_box.append(&bottom_bar);
apt_update_dialog.present();
diff --git a/src/bin/gui/apt_update_page/process.rs b/src/bin/gui/apt_update_page/process.rs
index ad2fe78..5ed3cb3 100644
--- a/src/bin/gui/apt_update_page/process.rs
+++ b/src/bin/gui/apt_update_page/process.rs
@@ -10,11 +10,11 @@ use rust_apt::cache::Upgrade;
use rust_apt::new_cache;
use serde::Serialize;
use serde_json::Value;
+use std::cell::RefCell;
use std::path::Path;
use std::process::Command;
-use std::{thread};
-use std::cell::RefCell;
use std::rc::Rc;
+use std::thread;
use tokio::runtime::Runtime;
struct AptChangesInfo {
@@ -88,11 +88,15 @@ pub fn apt_process_update(
let excluded_updates_alert_dialog_action =
SimpleAction::new("excluded_updates_alert_dialog_action", None);
- excluded_updates_alert_dialog_action.connect_activate(
- clone!(#[weak] window, #[weak] retry_signal_action, #[strong] excluded_updates_vec, move |_, _| {
- apt_confirm_window(&excluded_updates_vec, window, &retry_signal_action)
- }),
- );
+ excluded_updates_alert_dialog_action.connect_activate(clone!(
+ #[weak]
+ window,
+ #[weak]
+ retry_signal_action,
+ #[strong]
+ excluded_updates_vec,
+ move |_, _| { apt_confirm_window(&excluded_updates_vec, window, &retry_signal_action) }
+ ));
if excluded_updates_vec.is_empty() {
excluded_updates_alert_dialog_action.activate(None);
@@ -136,7 +140,9 @@ fn apt_confirm_window(
pkg.mark_install(true, false);
} else if change.marked_delete() {
pkg.mark_delete(false);
- to_be_removed_packages_vec.borrow_mut().push(pkg.name().to_owned());
+ to_be_removed_packages_vec
+ .borrow_mut()
+ .push(pkg.name().to_owned());
}
pkg.protect();
}
@@ -182,9 +188,7 @@ fn apt_confirm_window(
}
}
- let apt_confirm_dialog_child_box = Box::builder()
- .orientation(Orientation::Vertical)
- .build();
+ let apt_confirm_dialog_child_box = Box::builder().orientation(Orientation::Vertical).build();
let apt_update_dialog_badges_size_group = SizeGroup::new(SizeGroupMode::Both);
let apt_update_dialog_badges_size_group0 = SizeGroup::new(SizeGroupMode::Both);
@@ -293,21 +297,37 @@ fn apt_confirm_window(
let apt_confirm_start_signal_action = SimpleAction::new("apt_confirm_start", None);
- apt_confirm_start_signal_action.connect_activate(clone!(#[weak] window, #[strong] retry_signal_action, #[strong] apt_confirm_dialog, move |_, _| {
- let retry_signal_action0 = retry_signal_action.clone();
- apt_confirm_dialog.clone().choose(None::<&gio::Cancellable>, move |choice| {
- if choice == "apt_confirm_dialog_confirm" {
- apt_full_upgrade_from_socket(window, &retry_signal_action0);
+ apt_confirm_start_signal_action.connect_activate(clone!(
+ #[weak]
+ window,
+ #[strong]
+ retry_signal_action,
+ #[strong]
+ apt_confirm_dialog,
+ move |_, _| {
+ let retry_signal_action0 = retry_signal_action.clone();
+ apt_confirm_dialog
+ .clone()
+ .choose(None::<&gio::Cancellable>, move |choice| {
+ if choice == "apt_confirm_dialog_confirm" {
+ apt_full_upgrade_from_socket(window, &retry_signal_action0);
+ }
+ });
}
- });
- }));
+ ));
let to_be_removed_packages_borrow = to_be_removed_packages_vec.borrow();
if to_be_removed_packages_borrow.is_empty() {
apt_confirm_start_signal_action.activate(None);
} else {
let apt_remove_confirm_text_buffer = TextBuffer::builder()
- .text(to_be_removed_packages_borrow.iter().map(|x| x.to_string() + "\n").collect::() + "\n")
+ .text(
+ to_be_removed_packages_borrow
+ .iter()
+ .map(|x| x.to_string() + "\n")
+ .collect::()
+ + "\n",
+ )
.build();
let apt_remove_confirm_text_view = TextView::builder()
@@ -347,9 +367,9 @@ fn apt_confirm_window(
apt_remove_confirm_dialog.set_close_response("apt_remove_confirm_dialog_cancel");
apt_remove_confirm_dialog.choose(None::<&gio::Cancellable>, move |choice| {
- if choice == "apt_remove_confirm_dialog_confirm" {
- apt_confirm_start_signal_action.activate(None);
- }
+ if choice == "apt_remove_confirm_dialog_confirm" {
+ apt_confirm_start_signal_action.activate(None);
+ }
});
}
}
@@ -388,7 +408,7 @@ fn apt_full_upgrade_from_socket(
thread::spawn(move || {
let apt_upgrade_command = Command::new("pkexec")
.args([
- "/home/ward/RustroverProjects/pikman-update-manager/target/debug/apt_full_upgrade",
+ "/home/ward/RustroverProjects/pkg-pikman-update-manager/target/debug/apt_full_upgrade",
])
.status()
.unwrap();
@@ -408,14 +428,10 @@ fn apt_full_upgrade_from_socket(
}
});
- let apt_upgrade_dialog_child_box = Box::builder()
- .orientation(Orientation::Vertical)
- .build();
+ let apt_upgrade_dialog_child_box = Box::builder().orientation(Orientation::Vertical).build();
- let apt_upgrade_dialog_progress_bar = ProgressBar::builder()
- .show_text(true)
- .hexpand(true)
- .build();
+ let apt_upgrade_dialog_progress_bar =
+ ProgressBar::builder().show_text(true).hexpand(true).build();
let apt_upgrade_dialog_spinner = Spinner::builder()
.hexpand(true)
@@ -441,9 +457,8 @@ fn apt_full_upgrade_from_socket(
&t!("apt_upgrade_dialog_ok_label").to_string(),
);
- let apt_upgrade_dialog_child_box_done = Box::builder()
- .orientation(Orientation::Vertical)
- .build();
+ let apt_upgrade_dialog_child_box_done =
+ Box::builder().orientation(Orientation::Vertical).build();
let apt_upgrade_log_image = Image::builder()
.pixel_size(128)
@@ -467,46 +482,62 @@ fn apt_full_upgrade_from_socket(
let upgrade_percent_server_context = MainContext::default();
// The main loop executes the asynchronous block
- upgrade_percent_server_context.spawn_local(clone!(#[weak] apt_upgrade_dialog_progress_bar, async move {
- while let Ok(state) = upgrade_percent_receiver.recv().await {
- match state.as_ref() {
- "FN_OVERRIDE_SUCCESSFUL" => {}
- _ => {
- match state.parse::() {
- Ok(p) => apt_upgrade_dialog_progress_bar.set_fraction(p/100.0),
+ upgrade_percent_server_context.spawn_local(clone!(
+ #[weak]
+ apt_upgrade_dialog_progress_bar,
+ async move {
+ while let Ok(state) = upgrade_percent_receiver.recv().await {
+ match state.as_ref() {
+ "FN_OVERRIDE_SUCCESSFUL" => {}
+ _ => match state.parse::() {
+ Ok(p) => apt_upgrade_dialog_progress_bar.set_fraction(p / 100.0),
Err(_) => {}
- }
+ },
}
}
}
- }));
+ ));
let upgrade_status_server_context = MainContext::default();
// The main loop executes the asynchronous block
- upgrade_status_server_context.spawn_local(
- clone!(#[weak] apt_upgrade_dialog, #[weak] apt_upgrade_dialog_child_box, #[strong] apt_upgrade_dialog_child_box_done, #[strong] apt_upgrade_log_image, async move {
- while let Ok(state) = upgrade_status_receiver.recv().await {
- match state.as_ref() {
- "FN_OVERRIDE_SUCCESSFUL" => {
+ upgrade_status_server_context.spawn_local(clone!(
+ #[weak]
+ apt_upgrade_dialog,
+ #[weak]
+ apt_upgrade_dialog_child_box,
+ #[strong]
+ apt_upgrade_dialog_child_box_done,
+ #[strong]
+ apt_upgrade_log_image,
+ async move {
+ while let Ok(state) = upgrade_status_receiver.recv().await {
+ match state.as_ref() {
+ "FN_OVERRIDE_SUCCESSFUL" => {
apt_upgrade_dialog_child_box.set_visible(false);
apt_upgrade_log_image.set_icon_name(Some("face-cool-symbolic"));
- apt_upgrade_dialog.set_extra_child(Some(&apt_upgrade_dialog_child_box_done));
- apt_upgrade_dialog.set_title(Some(&t!("apt_upgrade_dialog_status_successful").to_string()));
+ apt_upgrade_dialog
+ .set_extra_child(Some(&apt_upgrade_dialog_child_box_done));
+ apt_upgrade_dialog.set_title(Some(
+ &t!("apt_upgrade_dialog_status_successful").to_string(),
+ ));
apt_upgrade_dialog.set_response_enabled("apt_upgrade_dialog_ok", true);
}
- "FN_OVERRIDE_FAILED" => {
+ "FN_OVERRIDE_FAILED" => {
apt_upgrade_dialog_child_box.set_visible(false);
apt_upgrade_log_image.set_icon_name(Some("dialog-error-symbolic"));
- apt_upgrade_dialog.set_extra_child(Some(&apt_upgrade_dialog_child_box_done));
- apt_upgrade_dialog.set_title(Some(&t!("apt_upgrade_dialog_status_failed").to_string()));
+ apt_upgrade_dialog
+ .set_extra_child(Some(&apt_upgrade_dialog_child_box_done));
+ apt_upgrade_dialog
+ .set_title(Some(&t!("apt_upgrade_dialog_status_failed").to_string()));
apt_upgrade_dialog.set_response_enabled("apt_upgrade_dialog_ok", true);
- apt_upgrade_dialog.set_response_enabled("apt_upgrade_dialog_open_log_file", true);
+ apt_upgrade_dialog
+ .set_response_enabled("apt_upgrade_dialog_open_log_file", true);
}
- _ => apt_upgrade_dialog.set_body(&state)
+ _ => apt_upgrade_dialog.set_body(&state),
+ }
}
}
- }),
- );
+ ));
let retry_signal_action0 = retry_signal_action.clone();
diff --git a/src/bin/gui/build_ui/mod.rs b/src/bin/gui/build_ui/mod.rs
index b1efe3d..13b14fa 100644
--- a/src/bin/gui/build_ui/mod.rs
+++ b/src/bin/gui/build_ui/mod.rs
@@ -3,7 +3,7 @@ use crate::config::{APP_GITHUB, APP_ICON, APP_ID, VERSION};
use adw::prelude::*;
use adw::*;
use gtk::glib::{clone, MainContext};
-use gtk::{License};
+use gtk::License;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
@@ -36,28 +36,28 @@ pub fn build_ui(app: &Application) {
let internet_loop_context = MainContext::default();
// The main loop executes the asynchronous block
- internet_loop_context.spawn_local(clone!(#[weak] window_banner, async move {
- while let Ok(state) = internet_loop_receiver.recv().await {
- let banner_text = t!("banner_text_no_internet").to_string();
- if state == true {
- *internet_connected_status.borrow_mut()=true;
+ internet_loop_context.spawn_local(clone!(
+ #[weak]
+ window_banner,
+ async move {
+ while let Ok(state) = internet_loop_receiver.recv().await {
+ let banner_text = t!("banner_text_no_internet").to_string();
+ if state == true {
+ *internet_connected_status.borrow_mut() = true;
if window_banner.title() == banner_text {
window_banner.set_revealed(false)
}
} else {
- *internet_connected_status.borrow_mut()=false;
+ *internet_connected_status.borrow_mut() = false;
window_banner.set_title(&banner_text);
window_banner.set_revealed(true)
}
+ }
}
- }));
+ ));
let window_headerbar = HeaderBar::builder()
- .title_widget(
- &WindowTitle::builder()
- .title(t!("application_name"))
- .build(),
- )
+ .title_widget(&WindowTitle::builder().title(t!("application_name")).build())
.build();
let window_adw_view_stack = ViewStack::builder()
@@ -121,8 +121,7 @@ pub fn build_ui(app: &Application) {
window_headerbar.pack_end(&refresh_button);
window_headerbar.pack_end(&credits_button);
- credits_button
- .connect_clicked(move |_| credits_window.present());
+ credits_button.connect_clicked(move |_| credits_window.present());
// show the window
@@ -138,9 +137,20 @@ pub fn build_ui(app: &Application) {
))
.build();
- apt_retry_signal_action.connect_activate(clone!(#[weak] window, #[strong] apt_retry_signal_action, #[strong] apt_update_view_stack_bin, move |_, _| {
- apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page(window, &apt_retry_signal_action)));
- }));
+ apt_retry_signal_action.connect_activate(clone!(
+ #[weak]
+ window,
+ #[strong]
+ apt_retry_signal_action,
+ #[strong]
+ apt_update_view_stack_bin,
+ move |_, _| {
+ apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page(
+ window,
+ &apt_retry_signal_action,
+ )));
+ }
+ ));
window_adw_view_stack.add_titled_with_icon(
&apt_update_view_stack_bin,
@@ -150,12 +160,16 @@ pub fn build_ui(app: &Application) {
);
//
- refresh_button.connect_clicked(
- clone!(#[weak] apt_retry_signal_action, #[weak] window_adw_view_stack, move |_| {
+ refresh_button.connect_clicked(clone!(
+ #[weak]
+ apt_retry_signal_action,
+ #[weak]
+ window_adw_view_stack,
+ move |_| {
match window_adw_view_stack.visible_child_name().unwrap().as_str() {
"apt_update_page" => apt_retry_signal_action.activate(None),
_ => {}
}
- }),
- );
+ }
+ ));
}
diff --git a/src/lib/apt_install_progress_socket/mod.rs b/src/lib/apt_install_progress_socket/mod.rs
index 8b989af..9a740af 100644
--- a/src/lib/apt_install_progress_socket/mod.rs
+++ b/src/lib/apt_install_progress_socket/mod.rs
@@ -1,5 +1,5 @@
use crate::pika_unixsocket_tools::*;
-use rust_apt::progress::{DynInstallProgress};
+use rust_apt::progress::DynInstallProgress;
use std::process::exit;
use tokio::io::AsyncWriteExt;
use tokio::net::UnixStream;
diff --git a/src/lib/pika_unixsocket_tools/mod.rs b/src/lib/pika_unixsocket_tools/mod.rs
index a4a9f04..a63b772 100644
--- a/src/lib/pika_unixsocket_tools/mod.rs
+++ b/src/lib/pika_unixsocket_tools/mod.rs
@@ -166,10 +166,7 @@ pub async fn start_socket_server_no_log(
match listener.accept().await {
Ok((stream, _)) => {
// Handle the connection in a separate task
- task::spawn(handle_client_no_log(
- stream,
- buffer_sender.clone(),
- ));
+ task::spawn(handle_client_no_log(stream, buffer_sender.clone()));
}
Err(e) => {
// Print error message if a connection fails