diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index d0e2f7f..b0a230b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -8,9 +8,9 @@
-
-
+
+
@@ -107,7 +107,8 @@
-
+
+
diff --git a/src/apt_package_row/imp.rs b/src/apt_package_row/imp.rs
index 09913bd..949421b 100644
--- a/src/apt_package_row/imp.rs
+++ b/src/apt_package_row/imp.rs
@@ -1,11 +1,11 @@
use std::{cell::RefCell, default, sync::OnceLock};
+use crate::apt_update_page::AptPackageSocket;
use adw::*;
use adw::{prelude::*, subclass::prelude::*};
-use glib::{subclass::Signal, Properties, clone};
-use gtk::{*};
+use glib::{clone, subclass::Signal, Properties};
use gtk::Orientation::Horizontal;
-use crate::apt_update_page::AptPackageSocket;
+use gtk::*;
use pretty_bytes::converter::convert;
use std::env;
use std::os::unix::raw::nlink_t;
@@ -54,7 +54,10 @@ impl ObjectImpl for AptPackageRow {
}
fn constructed(&self) {
let current_locale = match env::var_os("LANG") {
- Some(v) => v.into_string().unwrap().chars()
+ Some(v) => v
+ .into_string()
+ .unwrap()
+ .chars()
.take_while(|&ch| ch != '.')
.collect::(),
None => panic!("$LANG is not set"),
@@ -111,7 +114,8 @@ impl PreferencesRowImpl for AptPackageRow {}
impl ExpanderRowImpl for AptPackageRow {}
fn create_version_badge(installed_version: &str, candidate_version: &str) -> gtk::ListBox {
- let (base_version, installed_diff, candidate_diff) = get_diff_by_prefix(installed_version, candidate_version);
+ let (base_version, installed_diff, candidate_diff) =
+ get_diff_by_prefix(installed_version, candidate_version);
let badge_box = gtk::Box::builder()
.halign(Align::Start)
@@ -131,7 +135,11 @@ fn create_version_badge(installed_version: &str, candidate_version: &str) -> gtk
.build();
let installed_version_base_version_label = gtk::Label::builder()
- .label(format!("{}: {}", t!("installed_version_badge_text"), &base_version))
+ .label(format!(
+ "{}: {}",
+ t!("installed_version_badge_text"),
+ &base_version
+ ))
.valign(Align::Center)
.halign(Align::Start)
.hexpand(false)
@@ -163,7 +171,11 @@ fn create_version_badge(installed_version: &str, candidate_version: &str) -> gtk
.build();
let candidate_version_base_version_label = gtk::Label::builder()
- .label(format!("{}: {}", t!("candidate_version_badge_text"), &base_version))
+ .label(format!(
+ "{}: {}",
+ t!("candidate_version_badge_text"),
+ &base_version
+ ))
.valign(Align::Center)
.halign(Align::Start)
.hexpand(false)
@@ -231,7 +243,13 @@ fn remove_all_children_from_box(parent: >k::Box) {
}
}
-fn create_prefix_content(prefix_box: >k::Box, package_name: &str ,package_arch: &str, package_installed_version: &str, package_candidate_version: &str) {
+fn create_prefix_content(
+ prefix_box: >k::Box,
+ package_name: &str,
+ package_arch: &str,
+ package_installed_version: &str,
+ package_candidate_version: &str,
+) {
let package_label = gtk::Label::builder()
.halign(Align::Start)
.margin_start(5)
@@ -242,13 +260,24 @@ fn create_prefix_content(prefix_box: >k::Box, package_name: &str ,package_arch
.build();
package_label.add_css_class("size-20-bold-text");
let version_box = gtk::Box::new(Orientation::Horizontal, 0);
- version_box.append(&create_version_badge(package_installed_version, package_candidate_version));
+ version_box.append(&create_version_badge(
+ package_installed_version,
+ package_candidate_version,
+ ));
version_box.append(&create_arch_badge(package_arch));
prefix_box.append(&package_label);
prefix_box.append(&version_box);
}
-fn create_expandable_content(apt_package_row: &impl IsA, expandable_box: >k::Box, package_description: String, package_source_uri: String, package_maintainer: String, package_size: u64, package_installed_size: u64) {
+fn create_expandable_content(
+ apt_package_row: &impl IsA,
+ expandable_box: >k::Box,
+ package_description: String,
+ package_source_uri: String,
+ package_maintainer: String,
+ package_size: u64,
+ package_installed_size: u64,
+) {
let expandable_page_selection_box = gtk::Box::builder()
.orientation(Orientation::Horizontal)
.hexpand(false)
@@ -287,16 +316,15 @@ fn create_expandable_content(apt_package_row: &impl IsA, expandable
//
expandable_box.append(&expandable_page_selection_box);
//
- let expandable_bin = adw::Bin::builder()
- .hexpand(true)
- .vexpand(true)
- .build();
+ let expandable_bin = adw::Bin::builder().hexpand(true).vexpand(true).build();
//
- 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)));
- }
- }));
+ 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() {
@@ -304,11 +332,13 @@ fn create_expandable_content(apt_package_row: &impl IsA, expandable
}
}));
- 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)));
- }
- }));
+ 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 |apt_package_row| {
if apt_package_row.property("expanded") {
@@ -330,7 +360,7 @@ fn uris_stack_page(package_source_uri: &str) -> gtk::Box {
.orientation(Orientation::Vertical)
.build();
let uris_text_buffer = gtk::TextBuffer::builder()
- .text(package_source_uri.to_owned()+"\n")
+ .text(package_source_uri.to_owned() + "\n")
.build();
let uris_text_view = gtk::TextView::builder()
.buffer(&uris_text_buffer)
@@ -354,7 +384,7 @@ fn description_stack_page(package_description: &str) -> gtk::Box {
.orientation(Orientation::Vertical)
.build();
let description_text_buffer = gtk::TextBuffer::builder()
- .text(package_description.to_owned()+"\n")
+ .text(package_description.to_owned() + "\n")
.build();
let description_text_view = gtk::TextView::builder()
.buffer(&description_text_buffer)
@@ -371,7 +401,11 @@ fn description_stack_page(package_description: &str) -> gtk::Box {
description_content_box
}
-fn extra_info_stack_page(package_maintainer: &str, package_size: u64, package_installed_size: u64) -> gtk::Box {
+fn extra_info_stack_page(
+ package_maintainer: &str,
+ package_size: u64,
+ package_installed_size: u64,
+) -> gtk::Box {
let extra_info_badges_content_box = gtk::Box::builder()
.hexpand(true)
.vexpand(true)
@@ -382,9 +416,30 @@ fn extra_info_stack_page(package_maintainer: &str, package_size: u64, package_in
let extra_info_badges_size_group1 = gtk::SizeGroup::new(SizeGroupMode::Both);
let package_size = package_size as f64;
let package_installed_size = package_installed_size as f64;
- extra_info_badges_content_box.append(&create_color_badge(&t!("extra_info_maintainer").to_string(), package_maintainer, "background-accent-bg", &extra_info_badges_size_group, &extra_info_badges_size_group0, &extra_info_badges_size_group1));
- extra_info_badges_content_box.append(&create_color_badge(&t!("extra_info_download_size").to_string(), &convert(package_size), "background-accent-bg", &extra_info_badges_size_group, &extra_info_badges_size_group0, &extra_info_badges_size_group1));
- extra_info_badges_content_box.append(&create_color_badge(&t!("extra_info_installed_size").to_string(), &convert(package_installed_size), "background-accent-bg", &extra_info_badges_size_group, &extra_info_badges_size_group0, &extra_info_badges_size_group1));
+ extra_info_badges_content_box.append(&create_color_badge(
+ &t!("extra_info_maintainer").to_string(),
+ package_maintainer,
+ "background-accent-bg",
+ &extra_info_badges_size_group,
+ &extra_info_badges_size_group0,
+ &extra_info_badges_size_group1,
+ ));
+ extra_info_badges_content_box.append(&create_color_badge(
+ &t!("extra_info_download_size").to_string(),
+ &convert(package_size),
+ "background-accent-bg",
+ &extra_info_badges_size_group,
+ &extra_info_badges_size_group0,
+ &extra_info_badges_size_group1,
+ ));
+ extra_info_badges_content_box.append(&create_color_badge(
+ &t!("extra_info_installed_size").to_string(),
+ &convert(package_installed_size),
+ "background-accent-bg",
+ &extra_info_badges_size_group,
+ &extra_info_badges_size_group0,
+ &extra_info_badges_size_group1,
+ ));
extra_info_badges_content_box
}
fn create_color_badge(
@@ -449,13 +504,17 @@ fn create_color_badge(
pub fn get_diff_by_prefix(xs: &str, ys: &str) -> (String, String, String) {
let mut count = String::new();
- for (x,y) in xs.chars().zip(ys.chars()) {
+ for (x, y) in xs.chars().zip(ys.chars()) {
if x == y {
count.push(x)
} else {
- break
+ break;
}
}
let count_clone0 = count.clone();
- return(count_clone0, xs.trim_start_matches(&count.as_str()).to_string(), ys.trim_start_matches(&count.as_str()).to_string())
-}
\ No newline at end of file
+ return (
+ count_clone0,
+ xs.trim_start_matches(&count.as_str()).to_string(),
+ ys.trim_start_matches(&count.as_str()).to_string(),
+ );
+}
diff --git a/src/apt_package_row/mod.rs b/src/apt_package_row/mod.rs
index 1048dbc..e04e3f0 100644
--- a/src/apt_package_row/mod.rs
+++ b/src/apt_package_row/mod.rs
@@ -39,6 +39,7 @@ impl Default for AptPackageRow {
maintainer: "??".to_string(),
size: 0,
installed_size: 0,
+ is_last: false,
})
}
}
diff --git a/src/apt_update_page/mod.rs b/src/apt_update_page/mod.rs
index 9181898..d33f76a 100644
--- a/src/apt_update_page/mod.rs
+++ b/src/apt_update_page/mod.rs
@@ -1,5 +1,7 @@
use crate::apt_package_row::AptPackageRow;
+use adw::gio::Action;
use adw::prelude::*;
+use adw::ActionRow;
use gtk::glib::*;
use gtk::*;
use pika_unixsocket_tools::*;
@@ -28,6 +30,7 @@ pub struct AptPackageSocket {
pub maintainer: String,
pub size: u64,
pub installed_size: u64,
+ pub is_last: bool,
}
pub fn apt_update_page(window: adw::ApplicationWindow) -> gtk::Box {
@@ -121,25 +124,21 @@ pub fn apt_update_page(window: adw::ApplicationWindow) -> gtk::Box {
.width_request(500)
.build();
- let mut updates_parsed = Arc::new(AtomicBool::new(false));
-
- let update_parsed_clone0 = Arc::clone(&updates_parsed);
-
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, @weak apt_update_dialog, @strong get_upgradable_sender, @strong update_parsed_clone0 => async move {
+ update_percent_server_context.spawn_local(clone!(@weak apt_update_dialog_progress_bar, @weak apt_update_dialog, @strong get_upgradable_sender => async move {
while let Ok(state) = update_percent_receiver.recv().await {
match state.as_ref() {
"FN_OVERRIDE_SUCCESSFUL" => {
let get_upgradable_sender = get_upgradable_sender.clone();
- let update_parsed_clone = Arc::clone(&update_parsed_clone0);
thread::spawn(move || {
// Create upgradable list cache
let upgradable_cache = new_cache!().unwrap();
// Create pack sort from upgradable_cache
let upgradable_sort = PackageSort::default().upgradable().names();
- for pkg in upgradable_cache.packages(&upgradable_sort) {
+ let mut upgradeable_iter = upgradable_cache.packages(&upgradable_sort).peekable();
+ while let Some(pkg) = upgradeable_iter.next() {
let candidate_version_pkg = pkg.candidate().unwrap();
let package_struct = AptPackageSocket {
name: pkg.name().to_string(),
@@ -156,11 +155,11 @@ pub fn apt_update_page(window: adw::ApplicationWindow) -> gtk::Box {
_ => t!("apt_pkg_property_unknown").to_string()
},
size: candidate_version_pkg.size(),
- installed_size: candidate_version_pkg.installed_size()
+ installed_size: candidate_version_pkg.installed_size(),
+ is_last: upgradeable_iter.peek().is_none()
};
get_upgradable_sender.send_blocking(package_struct).unwrap()
}
- update_parsed_clone.store(true, std::sync::atomic::Ordering::Relaxed)
});
apt_update_dialog.close();
}
@@ -188,11 +187,10 @@ pub fn apt_update_page(window: adw::ApplicationWindow) -> gtk::Box {
}),
);
- let update_parsed_clone1 = Arc::clone(&updates_parsed);
let get_upgradable_server_context = MainContext::default();
// The main loop executes the asynchronous block
get_upgradable_server_context.spawn_local(
- clone!(@weak packages_boxedlist, @strong update_parsed_clone1 => async move {
+ clone!(@weak packages_boxedlist => async move {
while let Ok(state) = get_upgradable_receiver.recv().await {
packages_boxedlist.append(&AptPackageRow::new(AptPackageSocket {
name: state.name,
@@ -203,12 +201,19 @@ pub fn apt_update_page(window: adw::ApplicationWindow) -> gtk::Box {
source_uri: state.source_uri,
maintainer: state.maintainer,
size: state.size,
- installed_size: state.installed_size
+ installed_size: state.installed_size,
+ is_last: state.is_last
}));
- if update_parsed_clone1.load(std::sync::atomic::Ordering::Relaxed) {
- packages_boxedlist.set_sensitive(true)
+ if state.is_last {
+ packages_boxedlist.set_sensitive(true);
+ let mut counter = packages_boxedlist.first_child();
+ while let Some(row) = counter {
+ let row_next_sibling = row.next_sibling();
+ row.downcast::().unwrap().add_suffix(>k::Button::builder().label("gg").build());
+ counter = row_next_sibling;
+ }
+ }
}
- }
}),
);