Fix Warnings and fmt

This commit is contained in:
Ward from fusion-voyager-3 2024-10-04 19:15:50 +03:00
parent f5dcfc455a
commit c2010b7136
14 changed files with 2185 additions and 2080 deletions

View File

@ -1,403 +1,416 @@
use crate::apt_package_row::AptPackageRow;
use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use apt_deb822_tools::Deb822Repository;
use regex::Regex; use gtk::glib::clone;
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*; use gtk::*;
use std::cell::Ref; use regex::Regex;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
pub fn add_dialog_fn( pub fn add_dialog_fn(
window: adw::ApplicationWindow, window: adw::ApplicationWindow,
reload_action: &gio::SimpleAction, reload_action: &gio::SimpleAction,
apt_retry_signal_action: &gio::SimpleAction, apt_retry_signal_action: &gio::SimpleAction,
) ) {
{
let unofficial_source_add_dialog_child_box = Box::builder() let unofficial_source_add_dialog_child_box = Box::builder()
.hexpand(true) .hexpand(true)
.orientation(Orientation::Vertical) .orientation(Orientation::Vertical)
.build(); .build();
let unofficial_source_add_name_entry = gtk::Entry::builder() let unofficial_source_add_name_entry = gtk::Entry::builder()
.placeholder_text("WineHQ Debian") .placeholder_text("WineHQ Debian")
.build(); .build();
let unofficial_source_add_name_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_name_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_name_prefrencesgroup_title")) .title(t!("unofficial_source_add_name_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_name_prefrencesgroup.add(&unofficial_source_add_name_entry); unofficial_source_add_name_prefrencesgroup.add(&unofficial_source_add_name_entry);
let unofficial_source_add_uri_entry = gtk::Entry::builder() let unofficial_source_add_uri_entry = gtk::Entry::builder()
.placeholder_text("https://dl.winehq.org/wine-builds/debian") .placeholder_text("https://dl.winehq.org/wine-builds/debian")
.build(); .build();
let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_uri_prefrencesgroup_title")) .title(t!("unofficial_source_add_uri_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry); unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry);
let unofficial_source_add_suites_entry = gtk::Entry::builder() let unofficial_source_add_suites_entry = gtk::Entry::builder()
.placeholder_text("trixie bookworm sid") .placeholder_text("trixie bookworm sid")
.build(); .build();
let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_suites_prefrencesgroup_title")) .title(t!("unofficial_source_add_suites_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry); unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry);
let unofficial_source_add_components_entry = gtk::Entry::builder() let unofficial_source_add_components_entry = gtk::Entry::builder()
.placeholder_text("main proprietary") .placeholder_text("main proprietary")
.build(); .build();
let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_components_prefrencesgroup_title")) .title(t!("unofficial_source_add_components_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry); unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry);
let unofficial_source_add_signed_entry = gtk::Entry::builder() let unofficial_source_add_signed_entry = gtk::Entry::builder().sensitive(false).build();
.sensitive(false)
.build();
let unofficial_source_add_signed_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_signed_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_signed_prefrencesgroup_title")) .title(t!("unofficial_source_add_signed_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_signed_prefrencesgroup.add(&unofficial_source_add_signed_entry); unofficial_source_add_signed_prefrencesgroup.add(&unofficial_source_add_signed_entry);
let unofficial_source_add_archs_entry = gtk::Entry::builder() let unofficial_source_add_archs_entry = gtk::Entry::builder()
.placeholder_text("amd64 arm64 i386") .placeholder_text("amd64 arm64 i386")
.build(); .build();
let unofficial_source_add_archs_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_archs_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_archs_prefrencesgroup_title")) .title(t!("unofficial_source_add_archs_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_archs_prefrencesgroup.add(&unofficial_source_add_archs_entry); unofficial_source_add_archs_prefrencesgroup.add(&unofficial_source_add_archs_entry);
let unofficial_source_add_box2 = gtk::Box::builder() let unofficial_source_add_box2 = gtk::Box::builder()
.margin_top(10) .margin_top(10)
.orientation(Orientation::Horizontal) .orientation(Orientation::Horizontal)
.hexpand(true) .hexpand(true)
.spacing(5) .spacing(5)
.build(); .build();
let unofficial_source_add_is_source_label = gtk::Label::builder() let unofficial_source_add_is_source_label = gtk::Label::builder()
.label(t!("unofficial_source_add_is_source_label_label")) .label(t!("unofficial_source_add_is_source_label_label"))
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_add_is_source_switch = gtk::Switch::builder() let unofficial_source_add_is_source_switch = gtk::Switch::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_signed_keyring_checkbutton = gtk::CheckButton::builder() let unofficial_source_signed_keyring_checkbutton = gtk::CheckButton::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.label(t!("unofficial_source_signed_keyring_checkbutton_label")) .label(t!("unofficial_source_signed_keyring_checkbutton_label"))
.active(true) .active(true)
.build(); .build();
let unofficial_source_signed_file_checkbutton = gtk::CheckButton::builder() let unofficial_source_signed_file_checkbutton = gtk::CheckButton::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.label(t!("unofficial_source_signed_file_checkbutton_label")) .label(t!("unofficial_source_signed_file_checkbutton_label"))
.group(&unofficial_source_signed_keyring_checkbutton) .group(&unofficial_source_signed_keyring_checkbutton)
.build(); .build();
let unofficial_source_signed_url_checkbutton = gtk::CheckButton::builder() let unofficial_source_signed_url_checkbutton = gtk::CheckButton::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.label(t!("unofficial_source_signed_url_checkbutton_label")) .label(t!("unofficial_source_signed_url_checkbutton_label"))
.group(&unofficial_source_signed_keyring_checkbutton) .group(&unofficial_source_signed_keyring_checkbutton)
.build(); .build();
// //
let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder() let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder()
.child(&unofficial_source_add_dialog_child_box) .child(&unofficial_source_add_dialog_child_box)
.maximum_size(500) .maximum_size(500)
.build(); .build();
let unofficial_source_add_viewport = gtk::ScrolledWindow::builder() let unofficial_source_add_viewport = gtk::ScrolledWindow::builder()
.hexpand(true) .hexpand(true)
.vexpand(true) .vexpand(true)
.child(&unofficial_source_add_dialog_child_clamp) .child(&unofficial_source_add_dialog_child_clamp)
.hscrollbar_policy(PolicyType::Never) .hscrollbar_policy(PolicyType::Never)
.build(); .build();
let unofficial_source_add_dialog = adw::MessageDialog::builder() let unofficial_source_add_dialog = adw::MessageDialog::builder()
.transient_for(&window) .transient_for(&window)
.extra_child(&unofficial_source_add_viewport) .extra_child(&unofficial_source_add_viewport)
.heading(t!("unofficial_source_add_dialog_heading")) .heading(t!("unofficial_source_add_dialog_heading"))
.width_request(700) .width_request(700)
.height_request(500) .height_request(500)
.build(); .build();
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.add_response(
"unofficial_source_add_dialog_add", "unofficial_source_add_dialog_add",
&t!("unofficial_source_add_dialog_add_label").to_string(), &t!("unofficial_source_add_dialog_add_label").to_string(),
); );
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.add_response(
"unofficial_source_add_dialog_cancel", "unofficial_source_add_dialog_cancel",
&t!("unofficial_source_add_dialog_cancel_label").to_string(), &t!("unofficial_source_add_dialog_cancel_label").to_string(),
); );
unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false); unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false);
unofficial_source_add_dialog.set_response_appearance( unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_cancel", "unofficial_source_add_dialog_cancel",
adw::ResponseAppearance::Destructive, adw::ResponseAppearance::Destructive,
); );
unofficial_source_add_dialog.set_response_appearance( unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_add", "unofficial_source_add_dialog_add",
adw::ResponseAppearance::Suggested, adw::ResponseAppearance::Suggested,
); );
// //
let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone(); let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone();
let unofficial_source_add_name_entry_clone0 = unofficial_source_add_name_entry.clone(); let unofficial_source_add_name_entry_clone0 = unofficial_source_add_name_entry.clone();
let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone(); let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone();
let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone(); let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone();
let unofficial_source_add_components_entry_clone0 = unofficial_source_add_components_entry.clone(); let unofficial_source_add_components_entry_clone0 =
let unofficial_source_add_signed_entry_clone0 = unofficial_source_add_signed_entry.clone(); unofficial_source_add_components_entry.clone();
let unofficial_source_signed_keyring_checkbutton_clone0 = unofficial_source_signed_keyring_checkbutton.clone(); let unofficial_source_add_signed_entry_clone0 = unofficial_source_add_signed_entry.clone();
let unofficial_source_signed_keyring_checkbutton_clone0 =
unofficial_source_signed_keyring_checkbutton.clone();
let add_button_update_state = move || { let add_button_update_state = move || {
if if !unofficial_source_add_name_entry_clone0.text().is_empty()
!unofficial_source_add_name_entry_clone0.text().is_empty() && && !unofficial_source_add_uri_entry_clone0.text().is_empty()
!unofficial_source_add_uri_entry_clone0.text().is_empty() && && !unofficial_source_add_suites_entry_clone0.text().is_empty()
!unofficial_source_add_suites_entry_clone0.text().is_empty() && && !unofficial_source_add_components_entry_clone0
!unofficial_source_add_components_entry_clone0.text().is_empty() .text()
{ .is_empty()
if unofficial_source_signed_keyring_checkbutton_clone0.is_active() { {
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", true); if unofficial_source_signed_keyring_checkbutton_clone0.is_active() {
} else if !unofficial_source_add_signed_entry_clone0.text().is_empty() { unofficial_source_add_dialog_clone0
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", true); .set_response_enabled("unofficial_source_add_dialog_add", true);
} else { } else if !unofficial_source_add_signed_entry_clone0.text().is_empty() {
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", false); unofficial_source_add_dialog_clone0
} .set_response_enabled("unofficial_source_add_dialog_add", true);
} else {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", false);
}
} else {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", false);
}
};
//
for entry in [
&unofficial_source_add_name_entry,
&unofficial_source_add_uri_entry,
&unofficial_source_add_suites_entry,
&unofficial_source_add_components_entry,
&unofficial_source_add_signed_entry,
] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_| {
add_button_update_state();
}
));
}
//
unofficial_source_signed_keyring_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton| {
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(false);
unofficial_source_add_signed_entry.set_placeholder_text(Some(""));
add_button_update_state();
}
}
));
unofficial_source_signed_file_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton| {
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(true);
unofficial_source_add_signed_entry
.set_placeholder_text(Some("/etc/apt/keyrings/winehq-archive.key"));
add_button_update_state();
}
}
));
unofficial_source_signed_url_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton| {
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(true);
unofficial_source_add_signed_entry
.set_placeholder_text(Some("https://dl.winehq.org/wine-builds/winehq.key"));
add_button_update_state();
}
}
));
unofficial_source_add_box2.append(&unofficial_source_add_is_source_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch);
unofficial_source_add_box2.append(&unofficial_source_signed_keyring_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_file_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_url_checkbutton);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_name_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
unofficial_source_add_dialog_child_box
.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_archs_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_signed_prefrencesgroup);
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog
.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_add_dialog_add" => {
let non_alphanum_regex = Regex::new(r"[^a-zA-Z0-9]").unwrap();
let sign_method = if unofficial_source_signed_file_checkbutton.is_active() {
1
} else if unofficial_source_signed_url_checkbutton.is_active() {
2
} else { } else {
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", false); 0
} };
}; let repo_file_name = non_alphanum_regex
.replace_all(unofficial_source_add_name_entry.text().as_str(), "_")
// .to_string()
.to_lowercase();
for entry in [ let new_repo = Deb822Repository {
&unofficial_source_add_name_entry, repolib_name: Some(unofficial_source_add_name_entry.text().to_string()),
&unofficial_source_add_uri_entry, filepath: format!("/etc/apt/sources.list.d/{}.source", repo_file_name),
&unofficial_source_add_suites_entry, uris: Some(unofficial_source_add_uri_entry.text().to_string()),
&unofficial_source_add_components_entry, types: if unofficial_source_add_is_source_switch.is_active() {
&unofficial_source_add_signed_entry, Some("deb deb-src".to_string())
] { } else {
entry.connect_text_notify(clone!( Some("deb".to_string())
#[strong] },
add_button_update_state, suites: Some(unofficial_source_add_suites_entry.text().to_string()),
move |_| components: Some(unofficial_source_add_components_entry.text().to_string()),
{ architectures: if unofficial_source_add_archs_entry.text().is_empty() {
add_button_update_state(); None
} } else {
) Some(unofficial_source_add_archs_entry.text().to_string())
); },
} signed_by: match sign_method {
1 => Some(unofficial_source_add_signed_entry.text().to_string()),
// 2 => Some(format!("/etc/apt/keyrings/{}.gpg.key", repo_file_name)),
_ => None,
unofficial_source_signed_keyring_checkbutton.connect_toggled(clone!( },
#[weak] ..Default::default()
unofficial_source_add_signed_entry, };
#[strong] if sign_method == 2 {
add_button_update_state, match Deb822Repository::write_to_file(
move |checkbutton| new_repo.clone(),
{ format!("/tmp/{}.sources", repo_file_name).into(),
if checkbutton.is_active() { ) {
unofficial_source_add_signed_entry.set_sensitive(false); Ok(_) => {
unofficial_source_add_signed_entry.set_placeholder_text(Some("")); match duct::cmd!(
add_button_update_state(); "pkexec",
} "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
} "deb822_move_with_wget",
) &repo_file_name,
); &unofficial_source_add_signed_entry.text().to_string(),
&format!("/etc/apt/keyrings/{}.gpg.key", &repo_file_name)
unofficial_source_signed_file_checkbutton.connect_toggled(clone!( )
#[weak] .run()
unofficial_source_add_signed_entry, {
#[strong] Ok(_) => {
add_button_update_state, reload_action_clone0.activate(None);
move |checkbutton| apt_retry_signal_action_clone0.activate(None);
{ }
if checkbutton.is_active() { Err(e) => {
unofficial_source_add_signed_entry.set_sensitive(true); let apt_src_create_error_dialog =
unofficial_source_add_signed_entry.set_placeholder_text(Some("/etc/apt/keyrings/winehq-archive.key")); adw::MessageDialog::builder()
add_button_update_state();
}
}
)
);
unofficial_source_signed_url_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton|
{
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(true);
unofficial_source_add_signed_entry.set_placeholder_text(Some("https://dl.winehq.org/wine-builds/winehq.key"));
add_button_update_state();
}
}
)
);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch);
unofficial_source_add_box2.append(&unofficial_source_signed_keyring_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_file_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_url_checkbutton);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_name_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_archs_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_signed_prefrencesgroup);
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_add_dialog_add" => {
let non_alphanum_regex = Regex::new(r"[^a-zA-Z0-9]").unwrap();
let sign_method = if unofficial_source_signed_file_checkbutton.is_active() {
1
} else if unofficial_source_signed_url_checkbutton.is_active() {
2
} else {
0
};
let repo_file_name = non_alphanum_regex.replace_all(unofficial_source_add_name_entry.text().as_str(), "_").to_string().to_lowercase();
let new_repo = Deb822Repository {
repolib_name: Some(unofficial_source_add_name_entry.text().to_string()),
filepath: format!("/etc/apt/sources.list.d/{}.source", repo_file_name),
uris: Some(unofficial_source_add_uri_entry.text().to_string()),
types: if unofficial_source_add_is_source_switch.is_active() {
Some("deb deb-src".to_string())
} else {
Some("deb".to_string())
},
suites: Some(unofficial_source_add_suites_entry.text().to_string()),
components: Some(unofficial_source_add_components_entry.text().to_string()),
architectures: if unofficial_source_add_archs_entry.text().is_empty() {
None
} else {
Some(unofficial_source_add_archs_entry.text().to_string())
},
signed_by: match sign_method {
1 => Some(unofficial_source_add_signed_entry.text().to_string()),
2 => Some(format!("/etc/apt/keyrings/{}.gpg.key", repo_file_name)),
_ => None
},
..Default::default()
};
if sign_method == 2 {
match Deb822Repository::write_to_file(new_repo.clone(), format!("/tmp/{}.sources", repo_file_name).into()) {
Ok(_) => {
match duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "deb822_move_with_wget", &repo_file_name, &unofficial_source_add_signed_entry.text().to_string(), &format!("/etc/apt/keyrings/{}.gpg.key", &repo_file_name)).run() {
Ok(_) => {
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
}
}
} else {
match Deb822Repository::write_to_file(new_repo.clone(), format!("/tmp/{}.sources", repo_file_name).into()) {
Ok(_) => {
match duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "deb822_move", repo_file_name).run() {
Ok(_) => {
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading")) .heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string()) .body(e.to_string())
.build(); .build();
apt_src_create_error_dialog.add_response( apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok", "apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(), &t!("apt_src_create_error_dialog_ok_label").to_string(),
); );
apt_src_create_error_dialog.present(); apt_src_create_error_dialog.present();
reload_action_clone0.activate(None); reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None); apt_retry_signal_action_clone0.activate(None);
}
} }
} }
} }
_ => {} Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
}
} }
}); } else {
match Deb822Repository::write_to_file(
new_repo.clone(),
format!("/tmp/{}.sources", repo_file_name).into(),
) {
Ok(_) => {
match duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"deb822_move",
repo_file_name
)
.run()
{
Ok(_) => {
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let apt_src_create_error_dialog =
adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
}
_ => {}
}
});
} }

View File

@ -1,21 +1,8 @@
use crate::apt_package_row::AptPackageRow;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use apt_deb822_tools::Deb822Repository;
use regex::Regex; use gtk::glib::clone;
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*; use gtk::*;
use std::cell::Ref;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
use std::path::Path; use std::path::Path;
pub fn deb822_edit_dialog_fn( pub fn deb822_edit_dialog_fn(
@ -24,398 +11,399 @@ pub fn deb822_edit_dialog_fn(
reload_action: &gio::SimpleAction, reload_action: &gio::SimpleAction,
apt_retry_signal_action: &SimpleAction, apt_retry_signal_action: &SimpleAction,
) { ) {
let repofile_path = Path::new(&deb822_repo.filepath); let repofile_path = Path::new(&deb822_repo.filepath);
let repo_file_name = repofile_path let repo_file_name = repofile_path
.file_name() .file_name()
.unwrap() .unwrap()
.to_str() .to_str()
.unwrap() .unwrap()
.trim_end_matches(".sources") .trim_end_matches(".sources")
.to_owned(); .to_owned();
let unofficial_source_add_dialog_child_box = Box::builder() let unofficial_source_add_dialog_child_box = Box::builder()
.hexpand(true) .hexpand(true)
.orientation(Orientation::Vertical) .orientation(Orientation::Vertical)
.build(); .build();
let unofficial_source_add_name_entry = gtk::Entry::builder() let unofficial_source_add_name_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_name_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_name_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_name_prefrencesgroup_title")) .title(t!("unofficial_source_add_name_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_name_prefrencesgroup.add(&unofficial_source_add_name_entry); unofficial_source_add_name_prefrencesgroup.add(&unofficial_source_add_name_entry);
let unofficial_source_add_uri_entry = gtk::Entry::builder() let unofficial_source_add_uri_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_uri_prefrencesgroup_title")) .title(t!("unofficial_source_add_uri_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry); unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry);
let unofficial_source_add_suites_entry = gtk::Entry::builder() let unofficial_source_add_suites_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_suites_prefrencesgroup_title")) .title(t!("unofficial_source_add_suites_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry); unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry);
let unofficial_source_add_components_entry = gtk::Entry::builder() let unofficial_source_add_components_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_components_prefrencesgroup_title")) .title(t!("unofficial_source_add_components_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry); unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry);
let unofficial_source_add_signed_entry = gtk::Entry::builder() let unofficial_source_add_signed_entry = gtk::Entry::builder().sensitive(false).build();
.sensitive(false)
.build();
let unofficial_source_add_signed_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_signed_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_signed_prefrencesgroup_title")) .title(t!("unofficial_source_add_signed_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_signed_prefrencesgroup.add(&unofficial_source_add_signed_entry); unofficial_source_add_signed_prefrencesgroup.add(&unofficial_source_add_signed_entry);
let unofficial_source_add_archs_entry = gtk::Entry::builder() let unofficial_source_add_archs_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_archs_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_archs_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_archs_prefrencesgroup_title")) .title(t!("unofficial_source_add_archs_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_archs_prefrencesgroup.add(&unofficial_source_add_archs_entry); unofficial_source_add_archs_prefrencesgroup.add(&unofficial_source_add_archs_entry);
let unofficial_source_add_box2 = gtk::Box::builder() let unofficial_source_add_box2 = gtk::Box::builder()
.margin_top(10) .margin_top(10)
.orientation(Orientation::Horizontal) .orientation(Orientation::Horizontal)
.hexpand(true) .hexpand(true)
.spacing(5) .spacing(5)
.build(); .build();
let unofficial_source_add_is_source_label = gtk::Label::builder() let unofficial_source_add_is_source_label = gtk::Label::builder()
.label(t!("unofficial_source_add_is_source_label_label")) .label(t!("unofficial_source_add_is_source_label_label"))
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_add_is_enabled_label = gtk::Label::builder()
.label(t!("unofficial_source_add_is_enabled_label_label"))
.halign(Align::Start)
.valign(Align::Center)
.build();
let unofficial_source_add_is_enabled_label = gtk::Label::builder() let unofficial_source_add_is_source_switch = gtk::Switch::builder()
.label(t!("unofficial_source_add_is_enabled_label_label")) .halign(Align::Start)
.halign(Align::Start) .valign(Align::Center)
.valign(Align::Center) .build();
.build();
let unofficial_source_add_is_source_switch = gtk::Switch::builder() let unofficial_source_add_is_enabled_switch = gtk::Switch::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_add_is_enabled_switch = gtk::Switch::builder() let unofficial_source_signed_keyring_checkbutton = gtk::CheckButton::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .label(t!("unofficial_source_signed_keyring_checkbutton_label"))
.active(true)
.build();
let unofficial_source_signed_keyring_checkbutton = gtk::CheckButton::builder() let unofficial_source_signed_file_checkbutton = gtk::CheckButton::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.label(t!("unofficial_source_signed_keyring_checkbutton_label")) .label(t!("unofficial_source_signed_file_checkbutton_label"))
.active(true) .group(&unofficial_source_signed_keyring_checkbutton)
.build(); .build();
//
let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder()
.child(&unofficial_source_add_dialog_child_box)
.maximum_size(500)
.build();
let unofficial_source_signed_file_checkbutton = gtk::CheckButton::builder() let unofficial_source_add_viewport = gtk::ScrolledWindow::builder()
.halign(Align::Start) .hexpand(true)
.valign(Align::Center) .vexpand(true)
.label(t!("unofficial_source_signed_file_checkbutton_label")) .child(&unofficial_source_add_dialog_child_clamp)
.group(&unofficial_source_signed_keyring_checkbutton) .hscrollbar_policy(PolicyType::Never)
.build(); .build();
//
let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder()
.child(&unofficial_source_add_dialog_child_box)
.maximum_size(500)
.build();
let unofficial_source_add_viewport = gtk::ScrolledWindow::builder() let unofficial_source_add_dialog = adw::MessageDialog::builder()
.hexpand(true) .transient_for(&window)
.vexpand(true) .extra_child(&unofficial_source_add_viewport)
.child(&unofficial_source_add_dialog_child_clamp) .heading(t!("unofficial_source_edit_dialog_heading").to_string() + " " + &repo_file_name)
.hscrollbar_policy(PolicyType::Never) .width_request(700)
.build(); .height_request(500)
.build();
let unofficial_source_add_dialog = adw::MessageDialog::builder() unofficial_source_add_dialog.add_response(
.transient_for(&window) "unofficial_source_edit_dialog_edit",
.extra_child(&unofficial_source_add_viewport) &t!("unofficial_source_edit_dialog_add_edit").to_string(),
.heading(t!("unofficial_source_edit_dialog_heading").to_string() + " " + &repo_file_name) );
.width_request(700)
.height_request(500)
.build();
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.add_response(
"unofficial_source_edit_dialog_edit", "unofficial_source_add_dialog_cancel",
&t!("unofficial_source_edit_dialog_add_edit").to_string(), &t!("unofficial_source_add_dialog_cancel_label").to_string(),
); );
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false);
"unofficial_source_add_dialog_cancel",
&t!("unofficial_source_add_dialog_cancel_label").to_string(),
);
unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false); unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_cancel",
adw::ResponseAppearance::Destructive,
);
unofficial_source_add_dialog.set_response_appearance( unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_cancel", "unofficial_source_edit_dialog_edit",
adw::ResponseAppearance::Destructive, adw::ResponseAppearance::Suggested,
); );
unofficial_source_add_dialog.set_response_appearance( //
"unofficial_source_edit_dialog_edit",
adw::ResponseAppearance::Suggested,
);
// let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone();
let unofficial_source_add_name_entry_clone0 = unofficial_source_add_name_entry.clone();
let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone();
let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone();
let unofficial_source_add_components_entry_clone0 =
unofficial_source_add_components_entry.clone();
let unofficial_source_add_signed_entry_clone0 = unofficial_source_add_signed_entry.clone();
let unofficial_source_signed_keyring_checkbutton_clone0 =
unofficial_source_signed_keyring_checkbutton.clone();
let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone(); let add_button_update_state = move || {
let unofficial_source_add_name_entry_clone0 = unofficial_source_add_name_entry.clone(); if !unofficial_source_add_name_entry_clone0.text().is_empty()
let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone(); && !unofficial_source_add_uri_entry_clone0.text().is_empty()
let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone(); && !unofficial_source_add_suites_entry_clone0.text().is_empty()
let unofficial_source_add_components_entry_clone0 = unofficial_source_add_components_entry.clone(); && !unofficial_source_add_components_entry_clone0
let unofficial_source_add_signed_entry_clone0 = unofficial_source_add_signed_entry.clone(); .text()
let unofficial_source_signed_keyring_checkbutton_clone0 = unofficial_source_signed_keyring_checkbutton.clone(); .is_empty()
{
if unofficial_source_signed_keyring_checkbutton_clone0.is_active() {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", true);
} else if !unofficial_source_add_signed_entry_clone0.text().is_empty() {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", true);
} else {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", false);
}
} else {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", false);
}
};
let add_button_update_state = move || { //
if
!unofficial_source_add_name_entry_clone0.text().is_empty() && for entry in [
!unofficial_source_add_uri_entry_clone0.text().is_empty() && &unofficial_source_add_name_entry,
!unofficial_source_add_suites_entry_clone0.text().is_empty() && &unofficial_source_add_uri_entry,
!unofficial_source_add_components_entry_clone0.text().is_empty() &unofficial_source_add_suites_entry,
{ &unofficial_source_add_components_entry,
if unofficial_source_signed_keyring_checkbutton_clone0.is_active() { &unofficial_source_add_signed_entry,
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", true); ] {
} else if !unofficial_source_add_signed_entry_clone0.text().is_empty() { entry.connect_text_notify(clone!(
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", true); #[strong]
} else { add_button_update_state,
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", false); move |_| {
} add_button_update_state();
}
));
}
//
unofficial_source_signed_keyring_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton| {
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(false);
add_button_update_state();
}
}
));
unofficial_source_signed_file_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton| {
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(true);
add_button_update_state();
}
}
));
unofficial_source_add_box2.append(&unofficial_source_add_is_source_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch);
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_switch);
unofficial_source_add_box2.append(&unofficial_source_signed_keyring_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_file_checkbutton);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_name_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
unofficial_source_add_dialog_child_box
.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_archs_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_signed_prefrencesgroup);
//
match &deb822_repo.repolib_name {
Some(t) => {
unofficial_source_add_name_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.uris {
Some(t) => {
unofficial_source_add_uri_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.suites {
Some(t) => {
unofficial_source_add_suites_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.components {
Some(t) => {
unofficial_source_add_components_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.signed_by {
Some(t) => {
unofficial_source_signed_file_checkbutton.set_active(true);
unofficial_source_add_signed_entry.set_text(&t);
}
None => unofficial_source_signed_keyring_checkbutton.set_active(true),
}
match &deb822_repo.architectures {
Some(t) => {
unofficial_source_add_archs_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.enabled {
Some(t) => {
unofficial_source_add_is_enabled_switch.set_active(match t.to_lowercase().as_str() {
"yes" => true,
"true" => true,
"no" => false,
"false" => false,
_ => true,
});
}
None => {
unofficial_source_add_is_enabled_switch.set_active(true);
}
}
match &deb822_repo.types {
Some(t) => {
unofficial_source_add_is_source_switch.set_active(t.contains("deb-src"));
}
None => {}
}
//
let deb822_repo_clone0 = deb822_repo.clone();
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog
.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_edit_dialog_edit" => {
let sign_method = if unofficial_source_signed_file_checkbutton.is_active() {
1
} else { } else {
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", false); 0
} };
}; let new_repo = Deb822Repository {
repolib_name: Some(unofficial_source_add_name_entry.text().to_string()),
// filepath: format!("/etc/apt/sources.list.d/{}.source", repo_file_name),
uris: Some(unofficial_source_add_uri_entry.text().to_string()),
for entry in [ types: if unofficial_source_add_is_source_switch.is_active() {
&unofficial_source_add_name_entry, Some("deb deb-src".to_string())
&unofficial_source_add_uri_entry, } else {
&unofficial_source_add_suites_entry, Some("deb".to_string())
&unofficial_source_add_components_entry, },
&unofficial_source_add_signed_entry, suites: Some(unofficial_source_add_suites_entry.text().to_string()),
] { components: Some(unofficial_source_add_components_entry.text().to_string()),
entry.connect_text_notify(clone!( architectures: if unofficial_source_add_archs_entry.text().is_empty() {
#[strong] None
add_button_update_state, } else {
move |_| Some(unofficial_source_add_archs_entry.text().to_string())
},
signed_by: match sign_method {
1 => Some(unofficial_source_add_signed_entry.text().to_string()),
_ => None,
},
enabled: match unofficial_source_add_is_enabled_switch.is_active() {
true => Some("yes".to_string()),
false => Some("no".to_string()),
},
..deb822_repo_clone0
};
match Deb822Repository::write_to_file(
new_repo.clone(),
format!("/tmp/{}.sources", repo_file_name).into(),
) {
Ok(_) => {
match duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"deb822_move",
repo_file_name
)
.run()
{ {
add_button_update_state(); Ok(_) => {}
} Err(e) => {
) let apt_src_create_error_dialog = adw::MessageDialog::builder()
); .heading(t!("apt_src_create_error_dialog_heading"))
} .body(e.to_string())
.build();
// apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
unofficial_source_signed_keyring_checkbutton.connect_toggled(clone!( &t!("apt_src_create_error_dialog_ok_label").to_string(),
#[weak] );
unofficial_source_add_signed_entry, apt_src_create_error_dialog.present();
#[strong]
add_button_update_state,
move |checkbutton|
{
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(false);
add_button_update_state();
}
}
)
);
unofficial_source_signed_file_checkbutton.connect_toggled(clone!(
#[weak]
unofficial_source_add_signed_entry,
#[strong]
add_button_update_state,
move |checkbutton|
{
if checkbutton.is_active() {
unofficial_source_add_signed_entry.set_sensitive(true);
add_button_update_state();
}
}
)
);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch);
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_label);
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_switch);
unofficial_source_add_box2.append(&unofficial_source_signed_keyring_checkbutton);
unofficial_source_add_box2.append(&unofficial_source_signed_file_checkbutton);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_name_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_archs_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_signed_prefrencesgroup);
//
match &deb822_repo.repolib_name {
Some(t) => {
unofficial_source_add_name_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.uris {
Some(t) => {
unofficial_source_add_uri_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.suites {
Some(t) => {
unofficial_source_add_suites_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.components {
Some(t) => {
unofficial_source_add_components_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.signed_by {
Some(t) => {
unofficial_source_signed_file_checkbutton.set_active(true);
unofficial_source_add_signed_entry.set_text(&t);
}
None => {
unofficial_source_signed_keyring_checkbutton.set_active(true)
}
}
match &deb822_repo.architectures {
Some(t) => {
unofficial_source_add_archs_entry.set_text(&t);
}
None => {}
}
match &deb822_repo.enabled {
Some(t) => {
unofficial_source_add_is_enabled_switch.set_active(match t.to_lowercase().as_str() {
"yes" => true,
"true" => true,
"no" => false,
"false" => false,
_ => true,
});
}
None => {
unofficial_source_add_is_enabled_switch.set_active(true);
}
}
match &deb822_repo.types {
Some(t) => {
unofficial_source_add_is_source_switch.set_active(t.contains("deb-src"));
}
None => {}
}
//
let deb822_repo_clone0 = deb822_repo.clone();
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_edit_dialog_edit" => {
let sign_method = if unofficial_source_signed_file_checkbutton.is_active() {
1
} else {
0
};
let new_repo = Deb822Repository {
repolib_name: Some(unofficial_source_add_name_entry.text().to_string()),
filepath: format!("/etc/apt/sources.list.d/{}.source", repo_file_name),
uris: Some(unofficial_source_add_uri_entry.text().to_string()),
types: if unofficial_source_add_is_source_switch.is_active() {
Some("deb deb-src".to_string())
} else {
Some("deb".to_string())
},
suites: Some(unofficial_source_add_suites_entry.text().to_string()),
components: Some(unofficial_source_add_components_entry.text().to_string()),
architectures: if unofficial_source_add_archs_entry.text().is_empty() {
None
} else {
Some(unofficial_source_add_archs_entry.text().to_string())
},
signed_by: match sign_method {
1 => Some(unofficial_source_add_signed_entry.text().to_string()),
_ => None
},
enabled: match unofficial_source_add_is_enabled_switch.is_active() {
true => Some("yes".to_string()),
false => Some("no".to_string())
},
..deb822_repo_clone0
};
match Deb822Repository::write_to_file(new_repo.clone(), format!("/tmp/{}.sources", repo_file_name).into()) {
Ok(_) => {
match duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "deb822_move", repo_file_name).run() {
Ok(_) => {}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
}
}
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
} }
_ => {} }
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
} }
}); Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
_ => {}
}
});
} }

View File

@ -1,21 +1,8 @@
use crate::apt_package_row::AptPackageRow;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_legacy_tools::LegacyAptSource; use apt_legacy_tools::LegacyAptSource;
use regex::Regex; use gtk::glib::clone;
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*; use gtk::*;
use std::cell::Ref;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
use std::path::Path; use std::path::Path;
pub fn legacy_edit_dialog_fn( pub fn legacy_edit_dialog_fn(
@ -24,253 +11,270 @@ pub fn legacy_edit_dialog_fn(
reload_action: &gio::SimpleAction, reload_action: &gio::SimpleAction,
apt_retry_signal_action: &SimpleAction, apt_retry_signal_action: &SimpleAction,
) { ) {
let repofile_path = Path::new(&legacy_repo.filepath); let repofile_path = Path::new(&legacy_repo.filepath);
let repo_file_name = repofile_path let repo_file_name = repofile_path
.file_name() .file_name()
.unwrap() .unwrap()
.to_str() .to_str()
.unwrap() .unwrap()
.trim_end_matches(".list") .trim_end_matches(".list")
.to_owned(); .to_owned();
let unofficial_source_add_dialog_child_box = Box::builder() let unofficial_source_add_dialog_child_box = Box::builder()
.hexpand(true) .hexpand(true)
.orientation(Orientation::Vertical) .orientation(Orientation::Vertical)
.build(); .build();
let unofficial_source_add_uri_entry = gtk::Entry::builder() let unofficial_source_add_uri_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_uri_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_uri_prefrencesgroup_title")) .title(t!("unofficial_source_add_uri_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry); unofficial_source_add_uri_prefrencesgroup.add(&unofficial_source_add_uri_entry);
let unofficial_source_add_suites_entry = gtk::Entry::builder() let unofficial_source_add_suites_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_suites_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_suites_prefrencesgroup_title")) .title(t!("unofficial_source_add_suites_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry); unofficial_source_add_suites_prefrencesgroup.add(&unofficial_source_add_suites_entry);
let unofficial_source_add_components_entry = gtk::Entry::builder() let unofficial_source_add_components_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_components_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_components_prefrencesgroup_title")) .title(t!("unofficial_source_add_components_prefrencesgroup_title"))
.build(); .build();
unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry); unofficial_source_add_components_prefrencesgroup.add(&unofficial_source_add_components_entry);
let unofficial_source_add_legacy_options_entry = gtk::Entry::builder() let unofficial_source_add_legacy_options_entry = gtk::Entry::builder().build();
.build();
let unofficial_source_add_legacy_options_prefrencesgroup = adw::PreferencesGroup::builder() let unofficial_source_add_legacy_options_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("unofficial_source_add_legacy_options_prefrencesgroup_title")) .title(t!(
.build(); "unofficial_source_add_legacy_options_prefrencesgroup_title"
))
.build();
unofficial_source_add_legacy_options_prefrencesgroup.add(&unofficial_source_add_legacy_options_entry); unofficial_source_add_legacy_options_prefrencesgroup
.add(&unofficial_source_add_legacy_options_entry);
let unofficial_source_add_box2 = gtk::Box::builder() let unofficial_source_add_box2 = gtk::Box::builder()
.margin_top(10) .margin_top(10)
.orientation(Orientation::Horizontal) .orientation(Orientation::Horizontal)
.hexpand(true) .hexpand(true)
.spacing(5) .spacing(5)
.build(); .build();
let unofficial_source_add_is_source_label = gtk::Label::builder() let unofficial_source_add_is_source_label = gtk::Label::builder()
.label(t!("unofficial_source_add_is_legacy_source_label_label")) .label(t!("unofficial_source_add_is_legacy_source_label_label"))
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_add_is_enabled_label = gtk::Label::builder()
.label(t!("unofficial_source_add_is_enabled_label_label"))
.halign(Align::Start)
.valign(Align::Center)
.build();
let unofficial_source_add_is_enabled_label = gtk::Label::builder() let unofficial_source_add_is_source_switch = gtk::Switch::builder()
.label(t!("unofficial_source_add_is_enabled_label_label")) .halign(Align::Start)
.halign(Align::Start) .valign(Align::Center)
.valign(Align::Center) .build();
.build();
let unofficial_source_add_is_source_switch = gtk::Switch::builder() let unofficial_source_add_is_enabled_switch = gtk::Switch::builder()
.halign(Align::Start) .halign(Align::Start)
.valign(Align::Center) .valign(Align::Center)
.build(); .build();
let unofficial_source_add_is_enabled_switch = gtk::Switch::builder() //
.halign(Align::Start) let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder()
.valign(Align::Center) .child(&unofficial_source_add_dialog_child_box)
.build(); .maximum_size(500)
.build();
// let unofficial_source_add_viewport = gtk::ScrolledWindow::builder()
let unofficial_source_add_dialog_child_clamp = adw::Clamp::builder() .hexpand(true)
.child(&unofficial_source_add_dialog_child_box) .vexpand(true)
.maximum_size(500) .child(&unofficial_source_add_dialog_child_clamp)
.build(); .hscrollbar_policy(PolicyType::Never)
.build();
let unofficial_source_add_viewport = gtk::ScrolledWindow::builder() let unofficial_source_add_dialog = adw::MessageDialog::builder()
.hexpand(true) .transient_for(&window)
.vexpand(true) .extra_child(&unofficial_source_add_viewport)
.child(&unofficial_source_add_dialog_child_clamp) .heading(t!("unofficial_source_edit_dialog_heading").to_string() + " " + &repo_file_name)
.hscrollbar_policy(PolicyType::Never) .width_request(700)
.build(); .height_request(500)
.build();
let unofficial_source_add_dialog = adw::MessageDialog::builder() unofficial_source_add_dialog.add_response(
.transient_for(&window) "unofficial_source_edit_dialog_edit",
.extra_child(&unofficial_source_add_viewport) &t!("unofficial_source_edit_dialog_add_edit").to_string(),
.heading(t!("unofficial_source_edit_dialog_heading").to_string() + " " + &repo_file_name) );
.width_request(700)
.height_request(500)
.build();
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.add_response(
"unofficial_source_edit_dialog_edit", "unofficial_source_add_dialog_cancel",
&t!("unofficial_source_edit_dialog_add_edit").to_string(), &t!("unofficial_source_add_dialog_cancel_label").to_string(),
); );
unofficial_source_add_dialog.add_response( unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false);
"unofficial_source_add_dialog_cancel",
&t!("unofficial_source_add_dialog_cancel_label").to_string(),
);
unofficial_source_add_dialog.set_response_enabled("unofficial_source_add_dialog_add", false); unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_cancel",
adw::ResponseAppearance::Destructive,
);
unofficial_source_add_dialog.set_response_appearance( unofficial_source_add_dialog.set_response_appearance(
"unofficial_source_add_dialog_cancel", "unofficial_source_edit_dialog_edit",
adw::ResponseAppearance::Destructive, adw::ResponseAppearance::Suggested,
); );
unofficial_source_add_dialog.set_response_appearance( //
"unofficial_source_edit_dialog_edit",
adw::ResponseAppearance::Suggested,
);
// let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone();
let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone();
let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone();
let unofficial_source_add_components_entry_clone0 =
unofficial_source_add_components_entry.clone();
let unofficial_source_add_dialog_clone0 = unofficial_source_add_dialog.clone(); let add_button_update_state = move || {
let unofficial_source_add_uri_entry_clone0 = unofficial_source_add_uri_entry.clone(); if !unofficial_source_add_uri_entry_clone0.text().is_empty()
let unofficial_source_add_suites_entry_clone0 = unofficial_source_add_suites_entry.clone(); && !unofficial_source_add_suites_entry_clone0.text().is_empty()
let unofficial_source_add_components_entry_clone0 = unofficial_source_add_components_entry.clone(); && !unofficial_source_add_components_entry_clone0
.text()
.is_empty()
{
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", true);
} else {
unofficial_source_add_dialog_clone0
.set_response_enabled("unofficial_source_add_dialog_add", false);
}
};
let add_button_update_state = move || { //
if
!unofficial_source_add_uri_entry_clone0.text().is_empty() &&
!unofficial_source_add_suites_entry_clone0.text().is_empty() &&
!unofficial_source_add_components_entry_clone0.text().is_empty()
{
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", true);
} else {
unofficial_source_add_dialog_clone0.set_response_enabled("unofficial_source_add_dialog_add", false);
}
};
// for entry in [
&unofficial_source_add_uri_entry,
&unofficial_source_add_suites_entry,
&unofficial_source_add_components_entry,
&unofficial_source_add_legacy_options_entry,
] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_| {
add_button_update_state();
}
));
}
for entry in [ //
&unofficial_source_add_uri_entry,
&unofficial_source_add_suites_entry, unofficial_source_add_box2.append(&unofficial_source_add_is_source_label);
&unofficial_source_add_components_entry, unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch);
&unofficial_source_add_legacy_options_entry, unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_label);
] { unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_switch);
entry.connect_text_notify(clone!(
#[strong] unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
add_button_update_state, unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
move |_| unofficial_source_add_dialog_child_box
.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box
.append(&unofficial_source_add_legacy_options_prefrencesgroup);
//
unofficial_source_add_uri_entry.set_text(&legacy_repo.url);
unofficial_source_add_suites_entry.set_text(&legacy_repo.suite);
unofficial_source_add_components_entry.set_text(&legacy_repo.components);
match &legacy_repo.options {
Some(t) => {
unofficial_source_add_legacy_options_entry.set_text(&t);
}
None => {}
}
unofficial_source_add_is_enabled_switch.set_active(legacy_repo.enabled);
unofficial_source_add_is_source_switch.set_active(legacy_repo.is_source);
//
let legacy_repo_clone0 = legacy_repo.clone();
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog
.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_edit_dialog_edit" => {
let mut new_apt_legacy_vec = LegacyAptSource::get_legacy_sources().unwrap();
new_apt_legacy_vec.retain(|x| x != &legacy_repo_clone0);
let new_repo = LegacyAptSource {
url: unofficial_source_add_uri_entry.text().to_string(),
is_source: unofficial_source_add_is_source_switch.is_active(),
suite: unofficial_source_add_suites_entry.text().to_string(),
components: unofficial_source_add_components_entry.text().to_string(),
options: Some(
unofficial_source_add_legacy_options_entry
.text()
.to_string(),
),
enabled: unofficial_source_add_is_enabled_switch.is_active(),
..legacy_repo_clone0
};
new_apt_legacy_vec.push(new_repo.clone());
match LegacyAptSource::save_to_file(
new_repo,
new_apt_legacy_vec,
&format!("/tmp/{}.list", repo_file_name),
) {
Ok(_) => {
match duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"legacy_move",
repo_file_name
)
.run()
{ {
add_button_update_state(); Ok(_) => {}
} Err(e) => {
) let apt_src_create_error_dialog = adw::MessageDialog::builder()
); .heading(t!("apt_src_create_error_dialog_heading"))
} .body(e.to_string())
.build();
// apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
unofficial_source_add_box2.append(&unofficial_source_add_is_source_label); &t!("apt_src_create_error_dialog_ok_label").to_string(),
unofficial_source_add_box2.append(&unofficial_source_add_is_source_switch); );
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_label); apt_src_create_error_dialog.present();
unofficial_source_add_box2.append(&unofficial_source_add_is_enabled_switch);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_uri_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_suites_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_components_prefrencesgroup);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_box2);
unofficial_source_add_dialog_child_box.append(&unofficial_source_add_legacy_options_prefrencesgroup);
//
unofficial_source_add_uri_entry.set_text(&legacy_repo.url);
unofficial_source_add_suites_entry.set_text(&legacy_repo.suite);
unofficial_source_add_components_entry.set_text(&legacy_repo.components);
match &legacy_repo.options {
Some(t) => {
unofficial_source_add_legacy_options_entry.set_text(&t);
}
None => {}
}
unofficial_source_add_is_enabled_switch.set_active(legacy_repo.enabled);
unofficial_source_add_is_source_switch.set_active(legacy_repo.is_source);
//
let legacy_repo_clone0 = legacy_repo.clone();
let reload_action_clone0 = reload_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
unofficial_source_add_dialog.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"unofficial_source_edit_dialog_edit" => {
let mut new_apt_legacy_vec = LegacyAptSource::get_legacy_sources().unwrap();
new_apt_legacy_vec.retain(|x| x != &legacy_repo_clone0);
let new_repo = LegacyAptSource {
url: unofficial_source_add_uri_entry.text().to_string(),
is_source: unofficial_source_add_is_source_switch.is_active(),
suite: unofficial_source_add_suites_entry.text().to_string(),
components: unofficial_source_add_components_entry.text().to_string(),
options: Some(unofficial_source_add_legacy_options_entry.text().to_string()),
enabled: unofficial_source_add_is_enabled_switch.is_active(),
..legacy_repo_clone0
};
new_apt_legacy_vec.push(new_repo.clone());
match LegacyAptSource::save_to_file(new_repo, new_apt_legacy_vec, &format!("/tmp/{}.list", repo_file_name)) {
Ok(_) => {
match duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "legacy_move", repo_file_name).run() {
Ok(_) => {}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
}
}
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
} }
_ => {} }
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
} }
}); Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
reload_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None);
}
}
}
_ => {}
}
});
} }

View File

@ -1,22 +1,12 @@
use crate::apt_package_row::AptPackageRow;
use add_dialog::add_dialog_fn;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use apt_deb822_tools::Deb822Repository;
use regex::Regex; use gtk::glib::{clone, BoxedAnyObject};
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*; use gtk::*;
use std::cell::Ref; use std::cell::Ref;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell; use std::cell::RefCell;
use std::process::Command; use std::ops::Deref;
use std::rc::Rc; use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
mod add_dialog; mod add_dialog;
mod deb822_edit_dialog; mod deb822_edit_dialog;
@ -24,7 +14,7 @@ mod legacy_edit_dialog;
enum AptSourceConfig { enum AptSourceConfig {
Legacy(apt_legacy_tools::LegacyAptSource), Legacy(apt_legacy_tools::LegacyAptSource),
DEB822(apt_deb822_tools::Deb822Repository) DEB822(apt_deb822_tools::Deb822Repository),
} }
pub fn apt_manage_page( pub fn apt_manage_page(
@ -35,16 +25,22 @@ pub fn apt_manage_page(
let deb822_sources = Deb822Repository::get_deb822_sources().unwrap(); let deb822_sources = Deb822Repository::get_deb822_sources().unwrap();
let system_source = deb822_sources.iter().filter(|x| { let system_source = deb822_sources
match &x.repolib_id { .iter()
Some(t) => { .filter(|x| match &x.repolib_id {
t == "system" Some(t) => t == "system",
} None => false,
None => false })
} .next()
}).next().unwrap(); .unwrap();
let system_mirror_refcell = Rc::new(RefCell::new(system_source.repolib_default_mirror.as_deref().unwrap().to_string())); let system_mirror_refcell = Rc::new(RefCell::new(
system_source
.repolib_default_mirror
.as_deref()
.unwrap()
.to_string(),
));
let main_box = Box::builder() let main_box = Box::builder()
.hexpand(true) .hexpand(true)
@ -105,7 +101,9 @@ pub fn apt_manage_page(
#[strong] #[strong]
system_mirror_refcell, system_mirror_refcell,
move |entry| { move |entry| {
system_mirror_save_button.set_sensitive(!(entry.text().to_string() == system_mirror_refcell.borrow().to_string())); system_mirror_save_button.set_sensitive(
!(entry.text().to_string() == system_mirror_refcell.borrow().to_string()),
);
} }
)); ));
@ -123,12 +121,24 @@ pub fn apt_manage_page(
uris: (Some(system_mirror_entry.text().to_string())), uris: (Some(system_mirror_entry.text().to_string())),
..system_source.clone() ..system_source.clone()
}; };
match Deb822Repository::write_to_file(new_repo.clone(), std::path::Path::new("/tmp/system.sources").to_path_buf()) { match Deb822Repository::write_to_file(
new_repo.clone(),
std::path::Path::new("/tmp/system.sources").to_path_buf(),
) {
Ok(_) => { Ok(_) => {
match duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "deb822_move", "system", "system").run() { match duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"deb822_move",
"system",
"system"
)
.run()
{
Ok(_) => { Ok(_) => {
retry_signal_action.activate(None); retry_signal_action.activate(None);
*system_mirror_refcell.borrow_mut() = system_mirror_entry.text().to_string(); *system_mirror_refcell.borrow_mut() =
system_mirror_entry.text().to_string();
button.set_sensitive(false); button.set_sensitive(false);
} }
Err(e) => { Err(e) => {
@ -139,7 +149,7 @@ pub fn apt_manage_page(
apt_src_create_error_dialog.add_response( apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok", "apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(), &t!("apt_src_create_error_dialog_ok_label").to_string(),
); );
apt_src_create_error_dialog.present(); apt_src_create_error_dialog.present();
retry_signal_action.activate(None); retry_signal_action.activate(None);
} }
@ -153,7 +163,7 @@ pub fn apt_manage_page(
apt_src_create_error_dialog.add_response( apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok", "apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(), &t!("apt_src_create_error_dialog_ok_label").to_string(),
); );
apt_src_create_error_dialog.present(); apt_src_create_error_dialog.present();
} }
} }
@ -182,9 +192,11 @@ pub fn apt_manage_page(
.margin_end(15) .margin_end(15)
.build(); .build();
let unofficial_sources_selection_model_rc: Rc<RefCell<gtk::SingleSelection>> = Rc::new(RefCell::default()); let unofficial_sources_selection_model_rc: Rc<RefCell<gtk::SingleSelection>> =
Rc::new(RefCell::default());
let unofficial_sources_selection_model_rc_clone0 = Rc::clone(&unofficial_sources_selection_model_rc); let unofficial_sources_selection_model_rc_clone0 =
Rc::clone(&unofficial_sources_selection_model_rc);
let unofficial_sources_columnview_bin = adw::Bin::new(); let unofficial_sources_columnview_bin = adw::Bin::new();
@ -194,79 +206,70 @@ pub fn apt_manage_page(
#[weak] #[weak]
unofficial_sources_columnview_bin_clone0, unofficial_sources_columnview_bin_clone0,
move |_, _| { move |_, _| {
let mut unofficial_deb822_sources = Deb822Repository::get_deb822_sources().unwrap();
let mut unofficial_deb822_sources = Deb822Repository::get_deb822_sources().unwrap(); unofficial_deb822_sources.retain(|x| match &x.repolib_id {
Some(t) => !(t == "system"),
unofficial_deb822_sources.retain(|x| { None => true,
match &x.repolib_id {
Some(t) => {
!(t == "system")
}
None => true
}
}); });
let legacy_apt_repos = apt_legacy_tools::LegacyAptSource::get_legacy_sources(); let legacy_apt_repos = apt_legacy_tools::LegacyAptSource::get_legacy_sources();
let unofficial_sources_list_store = gio::ListStore::new::<BoxedAnyObject>(); let unofficial_sources_list_store = gio::ListStore::new::<BoxedAnyObject>();
for deb822_source in unofficial_deb822_sources { for deb822_source in unofficial_deb822_sources {
unofficial_sources_list_store.append(&BoxedAnyObject::new(AptSourceConfig::DEB822(deb822_source))); unofficial_sources_list_store
}; .append(&BoxedAnyObject::new(AptSourceConfig::DEB822(deb822_source)));
match legacy_apt_repos {
Ok(vec) => {
for legacy_repo in vec {
unofficial_sources_list_store.append(&BoxedAnyObject::new(AptSourceConfig::Legacy(legacy_repo)));
};
} }
Err(_) => {}
}
let unofficial_sources_selection_model = SingleSelection::new(Some(unofficial_sources_list_store));
(*unofficial_sources_selection_model_rc_clone0.borrow_mut() = unofficial_sources_selection_model.clone());
let unofficial_sources_columnview = ColumnView::builder()
.vexpand(true)
.model(&unofficial_sources_selection_model)
.build();
//
let unofficial_sources_columnview_factory0 = gtk::SignalListItemFactory::new();
unofficial_sources_columnview_factory0.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder()
.halign(Align::Start)
.build();
item.set_child(Some(&row));
});
unofficial_sources_columnview_factory0.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<AptSourceConfig>();
let repo_name = match entry_borrow.deref() {
AptSourceConfig::DEB822(src) => {
match &src.repolib_name {
Some(name) => name,
None => match(&src.uris, &src.suites, &src.components) {
(Some(uris),Some(suites),Some(components)) => {
&format!("{} {} {}", uris, suites, components)
}
(_,_,_) => {
&t!("apt_source_parse_error").to_string()
}
}
match legacy_apt_repos {
Ok(vec) => {
for legacy_repo in vec {
unofficial_sources_list_store
.append(&BoxedAnyObject::new(AptSourceConfig::Legacy(legacy_repo)));
} }
} }
AptSourceConfig::Legacy(src) => { Err(_) => {}
&format!("{} {} {} {}", }
let unofficial_sources_selection_model =
SingleSelection::new(Some(unofficial_sources_list_store));
(*unofficial_sources_selection_model_rc_clone0.borrow_mut() =
unofficial_sources_selection_model.clone());
let unofficial_sources_columnview = ColumnView::builder()
.vexpand(true)
.model(&unofficial_sources_selection_model)
.build();
//
let unofficial_sources_columnview_factory0 = gtk::SignalListItemFactory::new();
unofficial_sources_columnview_factory0.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder().halign(Align::Start).build();
item.set_child(Some(&row));
});
unofficial_sources_columnview_factory0.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<AptSourceConfig>();
let repo_name = match entry_borrow.deref() {
AptSourceConfig::DEB822(src) => match &src.repolib_name {
Some(name) => name,
None => match (&src.uris, &src.suites, &src.components) {
(Some(uris), Some(suites), Some(components)) => {
&format!("{} {} {}", uris, suites, components)
}
(_, _, _) => &t!("apt_source_parse_error").to_string(),
},
},
AptSourceConfig::Legacy(src) => &format!(
"{} {} {} {}",
if src.is_source { if src.is_source {
"(Legacy Src)" "(Legacy Src)"
} else { } else {
@ -275,69 +278,64 @@ pub fn apt_manage_page(
&src.url, &src.url,
&src.suite, &src.suite,
&src.components &src.components
) ),
} };
}; child.set_label(&repo_name);
child.set_label(&repo_name); });
});
let unofficial_sources_columnview_col0 = gtk::ColumnViewColumn::builder() let unofficial_sources_columnview_col0 = gtk::ColumnViewColumn::builder()
.title(t!("unofficial_sources_columnview_col0_title")) .title(t!("unofficial_sources_columnview_col0_title"))
.factory(&unofficial_sources_columnview_factory0) .factory(&unofficial_sources_columnview_factory0)
.expand(true) .expand(true)
.build();
//
let unofficial_sources_columnview_factory1 = gtk::SignalListItemFactory::new();
unofficial_sources_columnview_factory1.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder()
.halign(Align::Start)
.build(); .build();
item.set_child(Some(&row));
});
unofficial_sources_columnview_factory1.connect_bind(move |_factory, item| { //
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap(); let unofficial_sources_columnview_factory1 = gtk::SignalListItemFactory::new();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<AptSourceConfig>(); unofficial_sources_columnview_factory1.connect_setup(move |_factory, item| {
let repo_enabled = match entry_borrow.deref() { let item = item.downcast_ref::<gtk::ListItem>().unwrap();
AptSourceConfig::DEB822(src) => { let row = Label::builder().halign(Align::Start).build();
match &src.enabled { item.set_child(Some(&row));
});
unofficial_sources_columnview_factory1.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<AptSourceConfig>();
let repo_enabled = match entry_borrow.deref() {
AptSourceConfig::DEB822(src) => match &src.enabled {
Some(t) => match t.to_lowercase().as_str() { Some(t) => match t.to_lowercase().as_str() {
"yes" => true, "yes" => true,
"true" => true, "true" => true,
"no" => false, "no" => false,
"false" => false, "false" => false,
_ => true, _ => true,
} },
None => true, None => true,
} },
AptSourceConfig::Legacy(src) => src.enabled,
};
if repo_enabled {
child.set_label(&t!("apt_repo_enabled"));
} else {
child.set_label(&t!("apt_repo_disabled"));
} }
AptSourceConfig::Legacy(src) => { });
src.enabled
}
};
if repo_enabled {
child.set_label(&t!("apt_repo_enabled"));
} else {
child.set_label(&t!("apt_repo_disabled"));
}
});
let unofficial_sources_columnview_col1 = gtk::ColumnViewColumn::builder() let unofficial_sources_columnview_col1 = gtk::ColumnViewColumn::builder()
.title(t!("unofficial_sources_columnview_col1_title")) .title(t!("unofficial_sources_columnview_col1_title"))
.factory(&unofficial_sources_columnview_factory1) .factory(&unofficial_sources_columnview_factory1)
.build(); .build();
// //
unofficial_sources_columnview.append_column(&unofficial_sources_columnview_col0); unofficial_sources_columnview.append_column(&unofficial_sources_columnview_col0);
unofficial_sources_columnview.append_column(&unofficial_sources_columnview_col1); unofficial_sources_columnview.append_column(&unofficial_sources_columnview_col1);
unofficial_sources_columnview_bin_clone0.set_child(Some(&unofficial_sources_columnview)); unofficial_sources_columnview_bin_clone0
})); .set_child(Some(&unofficial_sources_columnview));
}
));
retry_signal_action.activate(None); retry_signal_action.activate(None);
@ -398,17 +396,14 @@ pub fn apt_manage_page(
retry_signal_action, retry_signal_action,
#[strong] #[strong]
apt_retry_signal_action, apt_retry_signal_action,
move move |_| {
|_| add_dialog::add_dialog_fn(
{ window.clone(),
add_dialog::add_dialog_fn( &retry_signal_action,
window.clone(), &apt_retry_signal_action,
&retry_signal_action, );
&apt_retry_signal_action }
); ));
}
)
);
unofficial_source_edit_button.connect_clicked(clone!( unofficial_source_edit_button.connect_clicked(clone!(
#[strong] #[strong]
@ -419,25 +414,29 @@ pub fn apt_manage_page(
retry_signal_action, retry_signal_action,
#[strong] #[strong]
apt_retry_signal_action, apt_retry_signal_action,
move move |_| {
|_| let unofficial_sources_selection_model = unofficial_sources_selection_model_rc.borrow();
{ let selection = unofficial_sources_selection_model.selected_item().unwrap();
let unofficial_sources_selection_model = unofficial_sources_selection_model_rc.borrow(); let item = selection.downcast_ref::<BoxedAnyObject>().unwrap();
let selection = unofficial_sources_selection_model.selected_item().unwrap(); let apt_src: Ref<AptSourceConfig> = item.borrow();
let item = selection.downcast_ref::<BoxedAnyObject>().unwrap(); match apt_src.deref() {
let apt_src: Ref<AptSourceConfig> = item.borrow(); AptSourceConfig::DEB822(src) => {
match apt_src.deref() { deb822_edit_dialog::deb822_edit_dialog_fn(
AptSourceConfig::DEB822(src) => { window.clone(),
deb822_edit_dialog::deb822_edit_dialog_fn(window.clone(), src, &retry_signal_action, &apt_retry_signal_action); src,
} &retry_signal_action,
AptSourceConfig::Legacy(list) => { &apt_retry_signal_action,
legacy_edit_dialog::legacy_edit_dialog_fn(window.clone(), list, &retry_signal_action, &apt_retry_signal_action) );
} }
}; AptSourceConfig::Legacy(list) => legacy_edit_dialog::legacy_edit_dialog_fn(
window.clone(),
} list,
) &retry_signal_action,
); &apt_retry_signal_action,
),
};
}
));
unofficial_source_remove_button.connect_clicked(clone!( unofficial_source_remove_button.connect_clicked(clone!(
#[strong] #[strong]
@ -448,73 +447,90 @@ pub fn apt_manage_page(
retry_signal_action, retry_signal_action,
#[strong] #[strong]
apt_retry_signal_action, apt_retry_signal_action,
move move |_| {
|_|
{ {
let mut _command = duct::cmd!("");
{ {
let mut command = duct::cmd!(""); let unofficial_sources_selection_model =
{ unofficial_sources_selection_model_rc.borrow();
let unofficial_sources_selection_model = unofficial_sources_selection_model_rc.borrow();
let selection = unofficial_sources_selection_model.selected_item().unwrap(); let selection = unofficial_sources_selection_model.selected_item().unwrap();
let item = selection.downcast_ref::<BoxedAnyObject>().unwrap(); let item = selection.downcast_ref::<BoxedAnyObject>().unwrap();
let apt_src: Ref<AptSourceConfig> = item.borrow(); let apt_src: Ref<AptSourceConfig> = item.borrow();
match apt_src.deref() { match apt_src.deref() {
AptSourceConfig::DEB822(src) => { AptSourceConfig::DEB822(src) => {
match &src.signed_by { match &src.signed_by {
Some(t) => {command = duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "delete_deb822", &src.filepath, t)} Some(t) => _command = duct::cmd!(
None => {command = duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "delete_legacy", &src.filepath)} "pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"delete_deb822",
&src.filepath,
t
),
None => _command = duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"delete_legacy",
&src.filepath
),
} }
} }
AptSourceConfig::Legacy(list) => {command = duct::cmd!("pkexec", "/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh", "delete_legacy", &list.filepath)} AptSourceConfig::Legacy(list) => {
_command = duct::cmd!(
"pkexec",
"/usr/lib/pika/pikman-update-manager/scripts/modify_repo.sh",
"delete_legacy",
&list.filepath
)
}
}; };
}
let apt_src_remove_warning_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_remove_warning_dialog_heading"))
.body(t!("apt_src_remove_warning_dialog_body"))
.transient_for(&window)
.build();
apt_src_remove_warning_dialog.add_response(
"apt_src_remove_warning_dialog_cancel",
&t!("apt_src_remove_warning_dialog_cancel_label").to_string(),
);
apt_src_remove_warning_dialog.add_response(
"apt_src_remove_warning_dialog_ok",
&t!("apt_src_remove_warning_dialog_ok_label").to_string(),
);
apt_src_remove_warning_dialog.set_response_appearance("apt_src_remove_warning_dialog_ok", adw::ResponseAppearance::Destructive);
let retry_signal_action_clone0 = retry_signal_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
apt_src_remove_warning_dialog.clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"apt_src_remove_warning_dialog_ok" => {
match command.run() {
Ok(_) => {
retry_signal_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None)
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
retry_signal_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None)
}
}
}
_ => {}
}
});
} }
let apt_src_remove_warning_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_remove_warning_dialog_heading"))
.body(t!("apt_src_remove_warning_dialog_body"))
.transient_for(&window)
.build();
apt_src_remove_warning_dialog.add_response(
"apt_src_remove_warning_dialog_cancel",
&t!("apt_src_remove_warning_dialog_cancel_label").to_string(),
);
apt_src_remove_warning_dialog.add_response(
"apt_src_remove_warning_dialog_ok",
&t!("apt_src_remove_warning_dialog_ok_label").to_string(),
);
apt_src_remove_warning_dialog.set_response_appearance(
"apt_src_remove_warning_dialog_ok",
adw::ResponseAppearance::Destructive,
);
let retry_signal_action_clone0 = retry_signal_action.clone();
let apt_retry_signal_action_clone0 = apt_retry_signal_action.clone();
apt_src_remove_warning_dialog.clone().choose(
None::<&gio::Cancellable>,
move |choice| match choice.as_str() {
"apt_src_remove_warning_dialog_ok" => match _command.run() {
Ok(_) => {
retry_signal_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None)
}
Err(e) => {
let apt_src_create_error_dialog = adw::MessageDialog::builder()
.heading(t!("apt_src_create_error_dialog_heading"))
.body(e.to_string())
.build();
apt_src_create_error_dialog.add_response(
"apt_src_create_error_dialog_ok",
&t!("apt_src_create_error_dialog_ok_label").to_string(),
);
apt_src_create_error_dialog.present();
retry_signal_action_clone0.activate(None);
apt_retry_signal_action_clone0.activate(None)
}
},
_ => {}
},
);
} }
) }
); ));
// //

View File

@ -66,9 +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([ .args(["/usr/lib/pika/pikman-update-manager/scripts/apt_update"])
"/usr/lib/pika/pikman-update-manager/scripts/apt_update",
])
.status() .status()
.unwrap(); .unwrap();
match apt_update_command.code().unwrap() { match apt_update_command.code().unwrap() {
@ -182,8 +180,6 @@ pub fn apt_update_page(
apt_update_dialog.set_response_enabled("apt_update_dialog_retry", false); apt_update_dialog.set_response_enabled("apt_update_dialog_retry", false);
apt_update_dialog.set_response_enabled("apt_update_dialog_ignore", false); apt_update_dialog.set_response_enabled("apt_update_dialog_ignore", false);
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();
@ -455,7 +451,10 @@ pub fn apt_update_page(
(*apt_update_count.borrow_mut() += 1); (*apt_update_count.borrow_mut() += 1);
if state.is_last { if state.is_last {
packages_boxedlist.set_sensitive(true); packages_boxedlist.set_sensitive(true);
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[*apt_update_count.borrow(),*flatpak_update_count.borrow()]))); update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[
*apt_update_count.borrow(),
*flatpak_update_count.borrow(),
])));
} }
} }
} }

View File

@ -412,9 +412,7 @@ fn apt_full_upgrade_from_socket(
thread::spawn(move || { thread::spawn(move || {
let apt_upgrade_command = Command::new("pkexec") let apt_upgrade_command = Command::new("pkexec")
.args([ .args(["/usr/lib/pika/pikman-update-manager/scripts/apt_full_upgrade"])
"/usr/lib/pika/pikman-update-manager/scripts/apt_full_upgrade",
])
.status() .status()
.unwrap(); .unwrap();
match apt_upgrade_command.code().unwrap() { match apt_upgrade_command.code().unwrap() {

View File

@ -1,22 +1,17 @@
use crate::apt_manage_page::apt_manage_page; use crate::apt_manage_page::apt_manage_page;
use crate::flatpak_manage_page::flatpak_manage_page;
use crate::apt_update_page; use crate::apt_update_page;
use crate::config::{APP_GITHUB, APP_ICON, APP_ID, VERSION}; use crate::config::{APP_GITHUB, APP_ICON, APP_ID, VERSION};
use crate::flatpak_manage_page::flatpak_manage_page;
use crate::flatpak_update_page; use crate::flatpak_update_page;
use adw::prelude::*; use adw::prelude::*;
use adw::*; use adw::*;
use async_channel::Sender;
use futures::task::SpawnExt;
use gtk::glib::{clone, MainContext}; use gtk::glib::{clone, MainContext};
use gtk::{License, WindowControls}; use gtk::{License, WindowControls};
use ksni;
use std::cell::RefCell; use std::cell::RefCell;
use std::ops::Index;
use std::process::Command; use std::process::Command;
use std::rc::Rc; use std::rc::Rc;
use std::sync::atomic::AtomicBool;
use std::thread; use std::thread;
use std::sync::Arc;
use ksni;
#[derive(Debug)] #[derive(Debug)]
struct PikmanTray { struct PikmanTray {
@ -30,11 +25,11 @@ impl ksni::Tray for PikmanTray {
fn icon_name(&self) -> String { fn icon_name(&self) -> String {
match &self.icon_name { match &self.icon_name {
Some(t) => t.into(), Some(t) => t.into(),
None => "help-about".into() None => "help-about".into(),
} }
} }
fn title(&self) -> String { fn title(&self) -> String {
t!("application_name").to_string() t!("application_name").to_string()
} }
// NOTE: On some system trays, `id` is a required property to avoid unexpected behaviors // NOTE: On some system trays, `id` is a required property to avoid unexpected behaviors
fn id(&self) -> String { fn id(&self) -> String {
@ -46,8 +41,9 @@ impl ksni::Tray for PikmanTray {
StandardItem { StandardItem {
label: match &self.apt_item_label { label: match &self.apt_item_label {
Some(t) => t, Some(t) => t,
None => "?" None => "?",
}.into(), }
.into(),
icon_name: "application-vnd.debian.binary-package".into(), icon_name: "application-vnd.debian.binary-package".into(),
enabled: false, enabled: false,
..Default::default() ..Default::default()
@ -56,8 +52,9 @@ impl ksni::Tray for PikmanTray {
StandardItem { StandardItem {
label: match &self.flatpak_item_label { label: match &self.flatpak_item_label {
Some(t) => t, Some(t) => t,
None => "?" None => "?",
}.into(), }
.into(),
icon_name: "application-vnd.flatpak".into(), icon_name: "application-vnd.flatpak".into(),
enabled: false, enabled: false,
..Default::default() ..Default::default()
@ -68,7 +65,9 @@ impl ksni::Tray for PikmanTray {
label: t!("pikman_indicator_open_item_label").into(), label: t!("pikman_indicator_open_item_label").into(),
icon_name: "view-paged-symbolic".into(), icon_name: "view-paged-symbolic".into(),
activate: Box::new(|_| { activate: Box::new(|_| {
self.action_sender.send_blocking(String::from("open")).unwrap() self.action_sender
.send_blocking(String::from("open"))
.unwrap()
}), }),
..Default::default() ..Default::default()
} }
@ -117,7 +116,7 @@ pub fn build_ui(app: &Application) {
update_sys_tray.connect_activate(clone!( update_sys_tray.connect_activate(clone!(
#[strong] #[strong]
tray_handle, tray_handle,
move |_,param| { move |_, param| {
let array: &[i32] = param.unwrap().fixed_array().unwrap(); let array: &[i32] = param.unwrap().fixed_array().unwrap();
let vec = array.to_vec(); let vec = array.to_vec();
let apt_update_count = vec[0]; let apt_update_count = vec[0];
@ -129,35 +128,36 @@ pub fn build_ui(app: &Application) {
}; };
tray_handle.update(|tray: &mut PikmanTray| { tray_handle.update(|tray: &mut PikmanTray| {
tray.icon_name = tray_icon; tray.icon_name = tray_icon;
tray.apt_item_label = Some(strfmt::strfmt( tray.apt_item_label = Some(
&t!("pikman_indicator_apt_count_item_label").to_string(), strfmt::strfmt(
&std::collections::HashMap::from([ &t!("pikman_indicator_apt_count_item_label").to_string(),
( &std::collections::HashMap::from([(
"NUM".to_string(), "NUM".to_string(),
match apt_update_count { match apt_update_count {
-1 => t!("pikman_indicator_flatpak_item_label_calculating").into(), -1 => t!("pikman_indicator_flatpak_item_label_calculating").into(),
_ => apt_update_count.to_string(), _ => apt_update_count.to_string(),
}, },
), )]),
]), )
) .unwrap(),
.unwrap()); );
tray.flatpak_item_label = Some(strfmt::strfmt( tray.flatpak_item_label = Some(
&t!("pikman_indicator_flatpak_count_item_label").to_string(), strfmt::strfmt(
&std::collections::HashMap::from([ &t!("pikman_indicator_flatpak_count_item_label").to_string(),
( &std::collections::HashMap::from([(
"NUM".to_string(), "NUM".to_string(),
match flatpak_update_count { match flatpak_update_count {
-1 => t!("pikman_indicator_flatpak_item_label_calculating").into(), -1 => t!("pikman_indicator_flatpak_item_label_calculating").into(),
_ => flatpak_update_count.to_string(), _ => flatpak_update_count.to_string(),
}, },
), )]),
]), )
) .unwrap(),
.unwrap()); );
}); });
})); }
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[-1,-1]))); ));
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[-1, -1])));
thread::spawn(move || loop { thread::spawn(move || loop {
match Command::new("ping").arg("google.com").arg("-c 1").output() { match Command::new("ping").arg("google.com").arg("-c 1").output() {
@ -228,17 +228,28 @@ pub fn build_ui(app: &Application) {
.margin_end(5) .margin_end(5)
.hexpand(true) .hexpand(true)
.build(); .build();
window_adw_view_switcher_sidebar_control_box.append(&WindowControls::builder().halign(gtk::Align::Start).valign(gtk::Align::Center).build()); window_adw_view_switcher_sidebar_control_box.append(
window_adw_view_switcher_sidebar_control_box.append(&WindowTitle::builder().halign(gtk::Align::Center).margin_top(10).margin_bottom(20).valign(gtk::Align::Center).hexpand(true).title(t!("application_name")).build()); &WindowControls::builder()
.halign(gtk::Align::Start)
.valign(gtk::Align::Center)
.build(),
);
window_adw_view_switcher_sidebar_control_box.append(
&WindowTitle::builder()
.halign(gtk::Align::Center)
.margin_top(10)
.margin_bottom(20)
.valign(gtk::Align::Center)
.hexpand(true)
.title(t!("application_name"))
.build(),
);
let window_adw_view_switcher_sidebar_box = gtk::Box::new(gtk::Orientation::Vertical, 0); let window_adw_view_switcher_sidebar_box = gtk::Box::new(gtk::Orientation::Vertical, 0);
window_adw_view_switcher_sidebar_box.append(&window_adw_view_switcher_sidebar_control_box); window_adw_view_switcher_sidebar_box.append(&window_adw_view_switcher_sidebar_control_box);
let null_toggle_button: gtk::ToggleButton = gtk::ToggleButton::new(); let null_toggle_button: gtk::ToggleButton = gtk::ToggleButton::new();
let window_adw_stack_clone0 = window_adw_stack.clone();
let window_adw_view_switcher_sidebar_box_clone0 = window_adw_view_switcher_sidebar_box.clone();
let sidebar_toggle_button = gtk::ToggleButton::builder() let sidebar_toggle_button = gtk::ToggleButton::builder()
.icon_name("view-right-pane-symbolic") .icon_name("view-right-pane-symbolic")
.visible(false) .visible(false)
@ -266,16 +277,8 @@ pub fn build_ui(app: &Application) {
"collapsed", "collapsed",
Some(&true.to_value()), Some(&true.to_value()),
); );
window_breakpoint.add_setter( window_breakpoint.add_setter(&sidebar_toggle_button, "visible", Some(&true.to_value()));
&sidebar_toggle_button, window_breakpoint.add_setter(&window_headerbar, "show_title", Some(&true.to_value()));
"visible",
Some(&true.to_value()),
);
window_breakpoint.add_setter(
&window_headerbar,
"show_title",
Some(&true.to_value()),
);
window_headerbar.pack_end(&sidebar_toggle_button); window_headerbar.pack_end(&sidebar_toggle_button);
@ -312,12 +315,10 @@ pub fn build_ui(app: &Application) {
} }
window.connect_close_request(move |window| { window.connect_close_request(move |window| {
if let Some(application) = window.application() { let size = window.default_size();
let size = window.default_size(); let _ = glib_settings.set_int("window-width", size.0);
let _ = glib_settings.set_int("window-width", size.0); let _ = glib_settings.set_int("window-height", size.1);
let _ = glib_settings.set_int("window-height", size.1); let _ = glib_settings.set_boolean("is-maximized", window.is_maximized());
let _ = glib_settings.set_boolean("is-maximized", window.is_maximized());
}
glib::Propagation::Proceed glib::Propagation::Proceed
}); });
@ -353,8 +354,7 @@ pub fn build_ui(app: &Application) {
let flatpak_retry_signal_action = gio::SimpleAction::new("retry", None); let flatpak_retry_signal_action = gio::SimpleAction::new("retry", None);
let flatpak_update_view_stack_bin = Bin::builder() let flatpak_update_view_stack_bin = Bin::builder().build();
.build();
flatpak_retry_signal_action.connect_activate(clone!( flatpak_retry_signal_action.connect_activate(clone!(
#[weak] #[weak]
@ -370,13 +370,15 @@ pub fn build_ui(app: &Application) {
#[strong] #[strong]
flatpak_update_count, flatpak_update_count,
move |_, _| { move |_, _| {
flatpak_update_view_stack_bin.set_child(Some(&flatpak_update_page::flatpak_update_page( flatpak_update_view_stack_bin.set_child(Some(
window, &flatpak_update_page::flatpak_update_page(
&flatpak_retry_signal_action, window,
&update_sys_tray, &flatpak_retry_signal_action,
&apt_update_count, &update_sys_tray,
&flatpak_update_count, &apt_update_count,
))); &flatpak_update_count,
),
));
} }
)); ));
@ -388,34 +390,34 @@ pub fn build_ui(app: &Application) {
let apt_update_view_stack_bin = Bin::builder().build(); let apt_update_view_stack_bin = Bin::builder().build();
apt_retry_signal_action.connect_activate(clone!( apt_retry_signal_action.connect_activate(clone!(
#[weak] #[weak]
window, window,
#[strong] #[strong]
apt_retry_signal_action, apt_retry_signal_action,
#[strong] #[strong]
flatpak_retry_signal_action, flatpak_retry_signal_action,
#[strong] #[strong]
apt_update_view_stack_bin, apt_update_view_stack_bin,
#[weak] #[weak]
flatpak_ran_once, flatpak_ran_once,
#[strong] #[strong]
update_sys_tray, update_sys_tray,
#[strong] #[strong]
apt_update_count, apt_update_count,
#[strong] #[strong]
flatpak_update_count, flatpak_update_count,
move |_, _| { move |_, _| {
apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page( apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page(
window, window,
&apt_retry_signal_action, &apt_retry_signal_action,
&flatpak_retry_signal_action, &flatpak_retry_signal_action,
flatpak_ran_once, flatpak_ran_once,
&update_sys_tray, &update_sys_tray,
&apt_update_count, &apt_update_count,
&flatpak_update_count, &flatpak_update_count,
))); )));
} }
)); ));
apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page( apt_update_view_stack_bin.set_child(Some(&apt_update_page::apt_update_page(
window.clone(), window.clone(),
@ -435,7 +437,13 @@ pub fn build_ui(app: &Application) {
&t!("apt_update_page_title"), &t!("apt_update_page_title"),
); );
let apt_update_page_toggle_button = add_content_button(&window_adw_stack, true, "apt_update_page".to_string(), t!("apt_update_page_title").to_string(), &null_toggle_button); let apt_update_page_toggle_button = add_content_button(
&window_adw_stack,
true,
"apt_update_page".to_string(),
t!("apt_update_page_title").to_string(),
&null_toggle_button,
);
window_adw_view_switcher_sidebar_box.append(&apt_update_page_toggle_button); window_adw_view_switcher_sidebar_box.append(&apt_update_page_toggle_button);
window_adw_stack.add_titled( window_adw_stack.add_titled(
@ -444,7 +452,13 @@ pub fn build_ui(app: &Application) {
&t!("flatpak_update_page_title"), &t!("flatpak_update_page_title"),
); );
let flatpak_update_page_toggle_button = add_content_button(&window_adw_stack, false, "flatpak_update_page".to_string(), t!("flatpak_update_page_title").to_string(), &null_toggle_button); let flatpak_update_page_toggle_button = add_content_button(
&window_adw_stack,
false,
"flatpak_update_page".to_string(),
t!("flatpak_update_page_title").to_string(),
&null_toggle_button,
);
window_adw_view_switcher_sidebar_box.append(&flatpak_update_page_toggle_button); window_adw_view_switcher_sidebar_box.append(&flatpak_update_page_toggle_button);
window_adw_stack.add_titled( window_adw_stack.add_titled(
@ -453,10 +467,17 @@ pub fn build_ui(app: &Application) {
&t!("apt_manage_page_title"), &t!("apt_manage_page_title"),
); );
let apt_manage_page_toggle_button = add_content_button(&window_adw_stack, false, "apt_manage_page".to_string(), t!("apt_manage_page_title").to_string(), &null_toggle_button); let apt_manage_page_toggle_button = add_content_button(
&window_adw_stack,
false,
"apt_manage_page".to_string(),
t!("apt_manage_page_title").to_string(),
&null_toggle_button,
);
window_adw_view_switcher_sidebar_box.append(&apt_manage_page_toggle_button); window_adw_view_switcher_sidebar_box.append(&apt_manage_page_toggle_button);
let flatpak_entry_signal_action = gio::SimpleAction::new("entry-change", Some(glib::VariantTy::STRING)); let flatpak_entry_signal_action =
gio::SimpleAction::new("entry-change", Some(glib::VariantTy::STRING));
let flatpak_flatref_install_button = gtk::Button::builder() let flatpak_flatref_install_button = gtk::Button::builder()
.icon_name("document-open-symbolic") .icon_name("document-open-symbolic")
@ -466,12 +487,23 @@ pub fn build_ui(app: &Application) {
.build(); .build();
window_adw_stack.add_titled( window_adw_stack.add_titled(
&flatpak_manage_page(window.clone(), &flatpak_retry_signal_action, &flatpak_entry_signal_action, &flatpak_flatref_install_button), &flatpak_manage_page(
window.clone(),
&flatpak_retry_signal_action,
&flatpak_entry_signal_action,
&flatpak_flatref_install_button,
),
Some("flatpak_manage_page"), Some("flatpak_manage_page"),
&t!("flatpak_manage_page_title"), &t!("flatpak_manage_page_title"),
); );
let flatpak_manage_page_toggle_button = add_content_button(&window_adw_stack, false, "flatpak_manage_page".to_string(), t!("flatpak_manage_page_title").to_string(), &null_toggle_button); let flatpak_manage_page_toggle_button = add_content_button(
&window_adw_stack,
false,
"flatpak_manage_page".to_string(),
t!("flatpak_manage_page_title").to_string(),
&null_toggle_button,
);
window_adw_view_switcher_sidebar_box.append(&flatpak_manage_page_toggle_button); window_adw_view_switcher_sidebar_box.append(&flatpak_manage_page_toggle_button);
app.connect_command_line(clone!( app.connect_command_line(clone!(
@ -486,37 +518,45 @@ pub fn build_ui(app: &Application) {
#[strong] #[strong]
flatpak_entry_signal_action, flatpak_entry_signal_action,
move |_, cmdline| { move |_, cmdline| {
// Create Vec from cmdline // Create Vec from cmdline
let mut gtk_application_args = Vec::new(); let mut gtk_application_args = Vec::new();
for arg in cmdline.arguments() { for arg in cmdline.arguments() {
match arg.to_str() { match arg.to_str() {
Some(a) => gtk_application_args.push(a.to_string()), Some(a) => gtk_application_args.push(a.to_string()),
None => {} None => {}
}
} }
}
// Check for cmd lines // Check for cmd lines
if !(gtk_application_args.contains(&"--hidden".to_string())) && !(gtk_application_args.contains(&"--flatpak-installer".to_string())) && !window.is_visible() { if !(gtk_application_args.contains(&"--hidden".to_string()))
window.present(); && !(gtk_application_args.contains(&"--flatpak-installer".to_string()))
} && !window.is_visible()
{
window.present();
}
if gtk_application_args.contains(&"--software-properties".to_string()) { if gtk_application_args.contains(&"--software-properties".to_string()) {
apt_manage_page_toggle_button.set_active(true); apt_manage_page_toggle_button.set_active(true);
apt_manage_page_toggle_button.emit_clicked(); apt_manage_page_toggle_button.emit_clicked();
} }
if gtk_application_args.contains(&"--flatpak-settings".to_string()) { if gtk_application_args.contains(&"--flatpak-settings".to_string()) {
flatpak_manage_page_toggle_button.set_active(true); flatpak_manage_page_toggle_button.set_active(true);
flatpak_manage_page_toggle_button.emit_clicked(); flatpak_manage_page_toggle_button.emit_clicked();
} }
if gtk_application_args.contains(&"--flatpak-installer".to_string()) { if gtk_application_args.contains(&"--flatpak-installer".to_string()) {
flatpak_flatref_install_button.emit_clicked(); flatpak_flatref_install_button.emit_clicked();
let index = ((gtk_application_args.iter().position(|r| r == "--flatpak-installer").unwrap() as i32) +1) as usize; let index = ((gtk_application_args
flatpak_entry_signal_action.activate(Some(&glib::Variant::from(&gtk_application_args[index]))); .iter()
} .position(|r| r == "--flatpak-installer")
.unwrap() as i32)
0 + 1) as usize;
})); flatpak_entry_signal_action
.activate(Some(&glib::Variant::from(&gtk_application_args[index])));
}
0
}
));
// Refresh button // Refresh button
@ -551,15 +591,20 @@ pub fn build_ui(app: &Application) {
window.present(); window.present();
} }
} }
_ => todo!() _ => todo!(),
} }
} }
} }
)); ));
} }
fn add_content_button(window_adw_stack: &gtk::Stack, active: bool, name: String, title: String, null_toggle_button: &gtk::ToggleButton) -> gtk::ToggleButton { fn add_content_button(
window_adw_stack: &gtk::Stack,
active: bool,
name: String,
title: String,
null_toggle_button: &gtk::ToggleButton,
) -> gtk::ToggleButton {
let toggle_button = gtk::ToggleButton::builder() let toggle_button = gtk::ToggleButton::builder()
.group(null_toggle_button) .group(null_toggle_button)
.label(&title) .label(&title)
@ -571,10 +616,14 @@ fn add_content_button(window_adw_stack: &gtk::Stack, active: bool, name: String,
.valign(gtk::Align::Start) .valign(gtk::Align::Start)
.build(); .build();
toggle_button.add_css_class("flat"); toggle_button.add_css_class("flat");
toggle_button.connect_clicked(clone!(#[weak] window_adw_stack,move |toggle_button| { toggle_button.connect_clicked(clone!(
if toggle_button.is_active() { #[weak]
window_adw_stack.set_visible_child_name(&name); window_adw_stack,
move |toggle_button| {
if toggle_button.is_active() {
window_adw_stack.set_visible_child_name(&name);
}
} }
})); ));
toggle_button toggle_button
} }

View File

@ -1,235 +1,224 @@
use crate::apt_package_row::AptPackageRow;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use gtk::glib::clone;
use libflatpak::builders::RemoteRefBuilder;
use regex::{bytes, Regex};
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*; use gtk::*;
use std::cell::Ref;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
use libflatpak::prelude::*;
use libflatpak::InstalledRef;
pub fn add_dialog_fn( pub fn add_dialog_fn(
window: adw::ApplicationWindow, window: adw::ApplicationWindow,
reload_action: &gio::SimpleAction, reload_action: &gio::SimpleAction,
flatpak_retry_signal_action: &SimpleAction, flatpak_retry_signal_action: &SimpleAction,
) ) {
{ let flatpak_remote_add_dialog_child_box = Box::builder()
let flatpak_remote_add_dialog_child_box = Box::builder() .hexpand(true)
.hexpand(true) .orientation(Orientation::Vertical)
.orientation(Orientation::Vertical) .build();
.build();
let flatpak_remote_add_name_entry = gtk::Entry::builder() let flatpak_remote_add_name_entry = gtk::Entry::builder().placeholder_text("Flathub").build();
.placeholder_text("Flathub")
.build();
let flatpak_remote_add_name_prefrencesgroup = adw::PreferencesGroup::builder() let flatpak_remote_add_name_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("flatpak_remote_add_name_prefrencesgroup_title")) .title(t!("flatpak_remote_add_name_prefrencesgroup_title"))
.build(); .build();
flatpak_remote_add_name_prefrencesgroup.add(&flatpak_remote_add_name_entry); flatpak_remote_add_name_prefrencesgroup.add(&flatpak_remote_add_name_entry);
let flatpak_remote_add_url_entry = gtk::Entry::builder() let flatpak_remote_add_url_entry = gtk::Entry::builder()
.placeholder_text("https://dl.flathub.org/repo/flathub.flatpakrepo") .placeholder_text("https://dl.flathub.org/repo/flathub.flatpakrepo")
.build(); .build();
let flatpak_remote_add_url_prefrencesgroup = adw::PreferencesGroup::builder() let flatpak_remote_add_url_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("flatpak_remote_add_url_prefrencesgroup_title")) .title(t!("flatpak_remote_add_url_prefrencesgroup_title"))
.build(); .build();
flatpak_remote_add_url_prefrencesgroup.add(&flatpak_remote_add_url_entry); flatpak_remote_add_url_prefrencesgroup.add(&flatpak_remote_add_url_entry);
let flatpak_remote_add_box2 = gtk::Box::builder() let flatpak_remote_add_box2 = gtk::Box::builder()
.margin_top(10) .margin_top(10)
.orientation(Orientation::Horizontal) .orientation(Orientation::Horizontal)
.hexpand(true) .hexpand(true)
.spacing(5) .spacing(5)
.build(); .build();
let flatpak_remote_user_togglebutton = gtk::ToggleButton::builder() let flatpak_remote_user_togglebutton = gtk::ToggleButton::builder()
.valign(Align::Center) .valign(Align::Center)
.hexpand(true) .hexpand(true)
.label(t!("flatpak_remotes_columnview_user")) .label(t!("flatpak_remotes_columnview_user"))
.active(true) .active(true)
.build(); .build();
let flatpak_remote_system_togglebutton = gtk::ToggleButton::builder() let flatpak_remote_system_togglebutton = gtk::ToggleButton::builder()
.valign(Align::Center) .valign(Align::Center)
.hexpand(true) .hexpand(true)
.label(t!("flatpak_remotes_columnview_system")) .label(t!("flatpak_remotes_columnview_system"))
.group(&flatpak_remote_user_togglebutton) .group(&flatpak_remote_user_togglebutton)
.build(); .build();
// //
let flatpak_remote_add_dialog_child_clamp = adw::Clamp::builder() let flatpak_remote_add_dialog_child_clamp = adw::Clamp::builder()
.child(&flatpak_remote_add_dialog_child_box) .child(&flatpak_remote_add_dialog_child_box)
.maximum_size(500) .maximum_size(500)
.build(); .build();
let flatpak_remote_add_viewport = gtk::ScrolledWindow::builder() let flatpak_remote_add_viewport = gtk::ScrolledWindow::builder()
.hexpand(true) .hexpand(true)
.vexpand(true) .vexpand(true)
.child(&flatpak_remote_add_dialog_child_clamp) .child(&flatpak_remote_add_dialog_child_clamp)
.hscrollbar_policy(PolicyType::Never) .hscrollbar_policy(PolicyType::Never)
.build(); .build();
let flatpak_remote_add_dialog = adw::MessageDialog::builder() let flatpak_remote_add_dialog = adw::MessageDialog::builder()
.transient_for(&window) .transient_for(&window)
.extra_child(&flatpak_remote_add_viewport) .extra_child(&flatpak_remote_add_viewport)
.heading(t!("flatpak_remote_add_dialog_heading")) .heading(t!("flatpak_remote_add_dialog_heading"))
.width_request(700) .width_request(700)
.height_request(400) .height_request(400)
.build(); .build();
flatpak_remote_add_dialog.add_response( flatpak_remote_add_dialog.add_response(
"flatpak_remote_add_dialog_add", "flatpak_remote_add_dialog_add",
&t!("flatpak_remote_add_dialog_add_label").to_string(), &t!("flatpak_remote_add_dialog_add_label").to_string(),
); );
flatpak_remote_add_dialog.add_response( flatpak_remote_add_dialog.add_response(
"flatpak_remote_add_dialog_cancel", "flatpak_remote_add_dialog_cancel",
&t!("flatpak_remote_add_dialog_cancel_label").to_string(), &t!("flatpak_remote_add_dialog_cancel_label").to_string(),
); );
flatpak_remote_add_dialog.set_response_enabled("flatpak_remote_add_dialog_add", false); flatpak_remote_add_dialog.set_response_enabled("flatpak_remote_add_dialog_add", false);
flatpak_remote_add_dialog.set_response_appearance( flatpak_remote_add_dialog.set_response_appearance(
"flatpak_remote_add_dialog_cancel", "flatpak_remote_add_dialog_cancel",
adw::ResponseAppearance::Destructive, adw::ResponseAppearance::Destructive,
); );
flatpak_remote_add_dialog.set_response_appearance( flatpak_remote_add_dialog.set_response_appearance(
"flatpak_remote_add_dialog_add", "flatpak_remote_add_dialog_add",
adw::ResponseAppearance::Suggested, adw::ResponseAppearance::Suggested,
); );
// //
let flatpak_remote_add_dialog_clone0 = flatpak_remote_add_dialog.clone(); let flatpak_remote_add_dialog_clone0 = flatpak_remote_add_dialog.clone();
let flatpak_remote_add_name_entry_clone0 = flatpak_remote_add_name_entry.clone(); let flatpak_remote_add_name_entry_clone0 = flatpak_remote_add_name_entry.clone();
let flatpak_remote_add_url_entry_clone0 = flatpak_remote_add_url_entry.clone(); let flatpak_remote_add_url_entry_clone0 = flatpak_remote_add_url_entry.clone();
let add_button_update_state = move || {
if !flatpak_remote_add_name_entry_clone0.text().is_empty()
&& !flatpak_remote_add_url_entry_clone0.text().is_empty()
{
flatpak_remote_add_dialog_clone0
.set_response_enabled("flatpak_remote_add_dialog_add", true);
} else {
flatpak_remote_add_dialog_clone0
.set_response_enabled("flatpak_remote_add_dialog_add", false);
}
};
let add_button_update_state = move || { //
if
!flatpak_remote_add_name_entry_clone0.text().is_empty() &&
!flatpak_remote_add_url_entry_clone0.text().is_empty()
{
flatpak_remote_add_dialog_clone0.set_response_enabled("flatpak_remote_add_dialog_add", true);
} else {
flatpak_remote_add_dialog_clone0.set_response_enabled("flatpak_remote_add_dialog_add", false);
}
};
// for entry in [
&flatpak_remote_add_name_entry,
&flatpak_remote_add_url_entry,
] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_| {
add_button_update_state();
}
));
}
for entry in [ //
&flatpak_remote_add_name_entry,
&flatpak_remote_add_url_entry,
] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_|
{
add_button_update_state();
}
)
);
}
// flatpak_remote_add_box2.append(&flatpak_remote_user_togglebutton);
flatpak_remote_add_box2.append(&flatpak_remote_system_togglebutton);
flatpak_remote_add_box2.append(&flatpak_remote_user_togglebutton); flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_name_prefrencesgroup);
flatpak_remote_add_box2.append(&flatpak_remote_system_togglebutton); flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_url_prefrencesgroup);
flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_box2);
flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_name_prefrencesgroup); let reload_action_clone0 = reload_action.clone();
flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_url_prefrencesgroup); let flatpak_retry_signal_action_clone0 = flatpak_retry_signal_action.clone();
flatpak_remote_add_dialog_child_box.append(&flatpak_remote_add_box2);
let reload_action_clone0 = reload_action.clone(); flatpak_remote_add_dialog
let flatpak_retry_signal_action_clone0 = flatpak_retry_signal_action.clone(); .clone()
.choose(None::<&gio::Cancellable>, move |choice| {
match choice.as_str() {
"flatpak_remote_add_dialog_add" => {
/*let cancellable_no = libflatpak::gio::Cancellable::NONE;
flatpak_remote_add_dialog.clone() let flatpak_installation = match flatpak_remote_system_togglebutton.is_active() {
.choose(None::<&gio::Cancellable>, move |choice| { true => libflatpak::Installation::new_system(cancellable_no).unwrap(),
match choice.as_str() { false => libflatpak::Installation::new_user(cancellable_no).unwrap(),
"flatpak_remote_add_dialog_add" => { };
let cancellable_no = libflatpak::gio::Cancellable::NONE;
/*let flatpak_installation = match flatpak_remote_system_togglebutton.is_active() { match libflatpak::Remote::from_file(&flatpak_remote_add_name_entry.text(), &get_data_from_url(&flatpak_remote_add_url_entry.text()).unwrap()) {
true => libflatpak::Installation::new_system(cancellable_no).unwrap(), Ok(remote) => {
false => libflatpak::Installation::new_user(cancellable_no).unwrap(), match libflatpak::Installation::add_remote(&flatpak_installation, &remote, true, cancellable_no) {
}; Ok(_) => {
reload_action_clone0.activate(None);
match libflatpak::Remote::from_file(&flatpak_remote_add_name_entry.text(), &get_data_from_url(&flatpak_remote_add_url_entry.text()).unwrap()) { }
Ok(remote) => { Err(e) => {
match libflatpak::Installation::add_remote(&flatpak_installation, &remote, true, cancellable_no) { let flatpak_remote_add_error_dialog = adw::MessageDialog::builder()
Ok(_) => { .heading(t!("flatpak_remote_add_error_dialog_heading"))
reload_action_clone0.activate(None); .body(e.to_string())
} .build();
Err(e) => { flatpak_remote_add_error_dialog.add_response(
let flatpak_remote_add_error_dialog = adw::MessageDialog::builder() "flatpak_remote_add_error_dialog_ok",
.heading(t!("flatpak_remote_add_error_dialog_heading")) &t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
.body(e.to_string())
.build();
flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
);
flatpak_remote_add_error_dialog.present();
}
}
}
Err(e) => {
let flatpak_remote_add_error_dialog = adw::MessageDialog::builder()
.heading(t!("flatpak_remote_add_error_dialog_heading"))
.body(e.to_string())
.build();
flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
); );
} flatpak_remote_add_error_dialog.present();
}*/
let flatpak_installation = match flatpak_remote_system_togglebutton.is_active() {
true => "--system",
false => "--user"
};
match duct::cmd!("flatpak", "remote-add", "--if-not-exists", &flatpak_installation, &flatpak_remote_add_name_entry.text(), &flatpak_remote_add_url_entry.text()).run() {
Ok(_) => {
reload_action_clone0.activate(None);
flatpak_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let flatpak_remote_add_error_dialog = adw::MessageDialog::builder()
.heading(t!("flatpak_remote_add_error_dialog_heading"))
.body(e.to_string())
.build();
flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
);
flatpak_remote_add_error_dialog.present();
}
} }
} }
_ => {}
} }
}); Err(e) => {
let flatpak_remote_add_error_dialog = adw::MessageDialog::builder()
.heading(t!("flatpak_remote_add_error_dialog_heading"))
.body(e.to_string())
.build();
flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
);
}
}*/
let flatpak_installation = match flatpak_remote_system_togglebutton.is_active()
{
true => "--system",
false => "--user",
};
match duct::cmd!(
"flatpak",
"remote-add",
"--if-not-exists",
&flatpak_installation,
&flatpak_remote_add_name_entry.text(),
&flatpak_remote_add_url_entry.text()
)
.run()
{
Ok(_) => {
reload_action_clone0.activate(None);
flatpak_retry_signal_action_clone0.activate(None);
}
Err(e) => {
let flatpak_remote_add_error_dialog = adw::MessageDialog::builder()
.heading(t!("flatpak_remote_add_error_dialog_heading"))
.body(e.to_string())
.build();
flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
);
flatpak_remote_add_error_dialog.present();
}
}
}
_ => {}
}
});
} }
/* /*

View File

@ -1,318 +1,332 @@
use crate::apt_package_row::AptPackageRow;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use configparser::ini::Ini;
use libflatpak::builders::RemoteRefBuilder; use gtk::glib::{clone, MainContext};
use regex::{bytes, Regex};
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject, MainContext};
use gtk::*; use gtk::*;
use std::cell::Ref; use libflatpak::prelude::*;
use std::ops::Deref; use pretty_bytes::converter::convert;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell; use std::cell::RefCell;
use std::fs::OpenOptions;
use std::io::Write;
use std::ops::Deref;
use std::process::Command; use std::process::Command;
use std::rc::Rc; use std::rc::Rc;
use std::thread; use std::thread;
use tokio::runtime::Runtime;
use libflatpak::prelude::*;
use std::io::Write;
use libflatpak::InstalledRef;
use std::fs::OpenOptions;
use pretty_bytes::converter::convert;
use configparser::ini::Ini;
pub fn install_ref_dialog_fn( pub fn install_ref_dialog_fn(
window: adw::ApplicationWindow, window: adw::ApplicationWindow,
reload_action: &gio::SimpleAction, reload_action: &gio::SimpleAction,
flatpak_retry_signal_action: &SimpleAction, flatpak_retry_signal_action: &SimpleAction,
flatpak_ref_entry_action: &SimpleAction, flatpak_ref_entry_action: &SimpleAction,
) ) {
{ let flatpak_ref_install_dialog_child_box = Box::builder()
let flatpak_ref_install_dialog_child_box = Box::builder() .hexpand(true)
.hexpand(true) .orientation(Orientation::Vertical)
.orientation(Orientation::Vertical) .build();
.build();
let flatpak_ref_install_flatref_path_file_dialog_filter = FileFilter::new(); let flatpak_ref_install_flatref_path_file_dialog_filter = FileFilter::new();
flatpak_ref_install_flatref_path_file_dialog_filter.add_pattern("*.flatpakref"); flatpak_ref_install_flatref_path_file_dialog_filter.add_pattern("*.flatpakref");
#[allow(deprecated)] #[allow(deprecated)]
let flatpak_ref_install_flatref_path_file_dialog = gtk::FileChooserNative::builder() let flatpak_ref_install_flatref_path_file_dialog = gtk::FileChooserNative::builder()
.title(t!("flatpak_ref_install_flatref_path_file_dialog_title")) .title(t!("flatpak_ref_install_flatref_path_file_dialog_title"))
.accept_label(t!("flatpak_ref_install_flatref_path_file_dialog_accept_label")) .accept_label(t!(
.cancel_label(t!("flatpak_ref_install_flatref_path_file_dialog_cancel_label")) "flatpak_ref_install_flatref_path_file_dialog_accept_label"
.action(gtk::FileChooserAction::Open) ))
.filter(&flatpak_ref_install_flatref_path_file_dialog_filter) .cancel_label(t!(
.build(); "flatpak_ref_install_flatref_path_file_dialog_cancel_label"
))
.action(gtk::FileChooserAction::Open)
.filter(&flatpak_ref_install_flatref_path_file_dialog_filter)
.build();
let flatpak_ref_install_flatref_path_entry = gtk::Entry::builder() let flatpak_ref_install_flatref_path_entry = gtk::Entry::builder()
.placeholder_text("/home/andy/Downloads/com.visualstudio.code.flatpakref") .placeholder_text("/home/andy/Downloads/com.visualstudio.code.flatpakref")
.hexpand(true) .hexpand(true)
.build(); .build();
flatpak_ref_entry_action.connect_activate(clone!( flatpak_ref_entry_action.connect_activate(clone!(
#[strong] #[strong]
flatpak_ref_install_flatref_path_entry, flatpak_ref_install_flatref_path_entry,
move |_ , param| move |_, param| {
{ flatpak_ref_install_flatref_path_entry
flatpak_ref_install_flatref_path_entry.set_text(&param.unwrap().get::<String>().unwrap()); .set_text(&param.unwrap().get::<String>().unwrap());
}
));
let flatpak_ref_install_flatref_path_entry_open_file_dialog = gtk::Button::builder()
.tooltip_text(t!(
"flatpak_ref_install_flatref_path_entry_open_file_dialog_text"
))
.halign(gtk::Align::End)
.icon_name("document-open-symbolic")
.build();
let flatpak_ref_install_flatref_path_entry_box = gtk::Box::builder()
.orientation(gtk::Orientation::Horizontal)
.hexpand(true)
.build();
flatpak_ref_install_flatref_path_entry_box.add_css_class("linked");
flatpak_ref_install_flatref_path_entry_open_file_dialog.connect_clicked(clone!(
#[strong]
flatpak_ref_install_flatref_path_file_dialog,
move |_| {
flatpak_ref_install_flatref_path_file_dialog.set_visible(true);
}
));
flatpak_ref_install_flatref_path_entry_box.append(&flatpak_ref_install_flatref_path_entry);
flatpak_ref_install_flatref_path_entry_box
.append(&flatpak_ref_install_flatref_path_entry_open_file_dialog);
let flatpak_ref_install_flatref_path_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("flatpak_ref_install_flatref_path_prefrencesgroup_title"))
.build();
#[allow(deprecated)]
flatpak_ref_install_flatref_path_file_dialog.connect_response(clone!(
#[weak]
flatpak_ref_install_flatref_path_entry,
move |dialog, response| {
if response == gtk::ResponseType::Accept {
match dialog.file() {
Some(f) => match f.path() {
Some(p) => {
flatpak_ref_install_flatref_path_entry.set_text(p.to_str().unwrap())
} }
) None => {}
); },
None => {}
let flatpak_ref_install_flatref_path_entry_open_file_dialog = gtk::Button::builder()
.tooltip_text(t!("flatpak_ref_install_flatref_path_entry_open_file_dialog_text"))
.halign(gtk::Align::End)
.icon_name("document-open-symbolic")
.build();
let flatpak_ref_install_flatref_path_entry_box = gtk::Box::builder()
.orientation(gtk::Orientation::Horizontal)
.hexpand(true)
.build();
flatpak_ref_install_flatref_path_entry_box.add_css_class("linked");
flatpak_ref_install_flatref_path_entry_open_file_dialog.connect_clicked(clone!(
#[strong]
flatpak_ref_install_flatref_path_file_dialog,
move |_| {
flatpak_ref_install_flatref_path_file_dialog.set_visible(true);
}
));
flatpak_ref_install_flatref_path_entry_box.append(&flatpak_ref_install_flatref_path_entry);
flatpak_ref_install_flatref_path_entry_box.append(&flatpak_ref_install_flatref_path_entry_open_file_dialog);
let flatpak_ref_install_flatref_path_prefrencesgroup = adw::PreferencesGroup::builder()
.title(t!("flatpak_ref_install_flatref_path_prefrencesgroup_title"))
.build();
#[allow(deprecated)]
flatpak_ref_install_flatref_path_file_dialog.connect_response(
clone!(
#[weak]
flatpak_ref_install_flatref_path_entry,
move |dialog, response|
{
if response == gtk::ResponseType::Accept {
match dialog.file() {
Some(f) => {
match f.path() {
Some(p) => flatpak_ref_install_flatref_path_entry.set_text(p.to_str().unwrap()),
None => {}
}
}
None => {}
}
}
}
)
);
flatpak_ref_install_flatref_path_prefrencesgroup.add(&flatpak_ref_install_flatref_path_entry_box);
let flatpak_ref_install_box2 = gtk::Box::builder()
.margin_top(10)
.orientation(Orientation::Horizontal)
.hexpand(true)
.spacing(5)
.build();
let flatpak_ref_install_label0 = gtk::Label::builder()
.margin_top(10)
.margin_bottom(10)
.build();
let flatpak_remote_user_togglebutton = gtk::ToggleButton::builder()
.valign(Align::Center)
.hexpand(true)
.label(t!("flatpak_remotes_columnview_user"))
.active(true)
.build();
let flatpak_remote_system_togglebutton = gtk::ToggleButton::builder()
.valign(Align::Center)
.hexpand(true)
.label(t!("flatpak_remotes_columnview_system"))
.group(&flatpak_remote_user_togglebutton)
.build();
//
let flatpak_ref_install_dialog_child_clamp = adw::Clamp::builder()
.child(&flatpak_ref_install_dialog_child_box)
.maximum_size(500)
.build();
let flatpak_ref_install_viewport = gtk::ScrolledWindow::builder()
.hexpand(true)
.vexpand(true)
.child(&flatpak_ref_install_dialog_child_clamp)
.hscrollbar_policy(PolicyType::Never)
.build();
let flatpak_ref_install_dialog = adw::MessageDialog::builder()
.transient_for(&window)
.extra_child(&flatpak_ref_install_viewport)
.heading(t!("flatpak_ref_install_dialog_heading"))
.width_request(700)
.height_request(400)
.build();
flatpak_ref_install_flatref_path_file_dialog.set_transient_for(Some(&flatpak_ref_install_dialog));
flatpak_ref_install_dialog.add_response(
"flatpak_ref_install_dialog_add",
&t!("flatpak_ref_install_dialog_add_label").to_string(),
);
flatpak_ref_install_dialog.add_response(
"flatpak_ref_install_dialog_cancel",
&t!("flatpak_ref_install_dialog_cancel_label").to_string(),
);
flatpak_ref_install_dialog.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_dialog.set_response_appearance(
"flatpak_ref_install_dialog_cancel",
adw::ResponseAppearance::Destructive,
);
flatpak_ref_install_dialog.set_response_appearance(
"flatpak_ref_install_dialog_add",
adw::ResponseAppearance::Suggested,
);
//
let flatpak_ref_install_dialog_clone0 = flatpak_ref_install_dialog.clone();
let flatpak_ref_install_flatref_path_entry_clone0 = flatpak_ref_install_flatref_path_entry.clone();
let flatpak_ref_install_label0_clone0 = flatpak_ref_install_label0.clone();
let tbi_remote_name = Rc::new(RefCell::new(None));
let tbi_remote_url = Rc::new(RefCell::new(None));
let tbi_remote_name_clone0 = tbi_remote_name.clone();
let tbi_remote_url_clone0 = tbi_remote_url.clone();
let add_button_update_state = move || {
if
!flatpak_ref_install_flatref_path_entry_clone0.text().is_empty()
{
match std::fs::read_to_string(flatpak_ref_install_flatref_path_entry_clone0.text()) {
Ok(t) => {
let mut flatref_file = Ini::new();
match flatref_file.read(t) {
Ok(_) => {
let ref_name = flatref_file.get("Flatpak Ref", "Name");
let ref_remote_name = flatref_file.get("Flatpak Ref", "SuggestRemoteName");
let ref_remote_url = flatref_file.get("Flatpak Ref", "RuntimeRepo");
match (ref_name, ref_remote_name.clone()) {
(Some(name), Some(remote_name)) => {
flatpak_ref_install_label0_clone0.set_label(&strfmt::strfmt(
&t!("flatpak_ref_install_label").to_string(),
&std::collections::HashMap::from([
(
"NAME".to_string(),
name,
),
(
"REMOTE".to_string(),
remote_name,
),
]),
)
.unwrap());
{
*tbi_remote_name_clone0.borrow_mut() = ref_remote_name;
*tbi_remote_url_clone0.borrow_mut() = ref_remote_url;
}
}
(_, _) => {
flatpak_ref_install_dialog_clone0.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
}
flatpak_ref_install_dialog_clone0.set_response_enabled("flatpak_ref_install_dialog_add", true);
}
Err(_) => {
flatpak_ref_install_dialog_clone0.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
}
}
Err(_) => {
flatpak_ref_install_dialog_clone0.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
}
} else {
flatpak_ref_install_dialog_clone0.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
};
//
for entry in [
&flatpak_ref_install_flatref_path_entry,
] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_|
{
add_button_update_state();
}
)
);
} }
}
}
));
// flatpak_ref_install_flatref_path_prefrencesgroup
.add(&flatpak_ref_install_flatref_path_entry_box);
flatpak_ref_install_box2.append(&flatpak_remote_user_togglebutton); let flatpak_ref_install_box2 = gtk::Box::builder()
flatpak_ref_install_box2.append(&flatpak_remote_system_togglebutton); .margin_top(10)
.orientation(Orientation::Horizontal)
.hexpand(true)
.spacing(5)
.build();
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_flatref_path_prefrencesgroup); let flatpak_ref_install_label0 = gtk::Label::builder()
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_box2); .margin_top(10)
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_label0); .margin_bottom(10)
.build();
let reload_action_clone0 = reload_action.clone(); let flatpak_remote_user_togglebutton = gtk::ToggleButton::builder()
let flatpak_retry_signal_action_clone0 = flatpak_retry_signal_action.clone(); .valign(Align::Center)
let flatpak_ref_install_flatref_path_entry_clone0 = flatpak_ref_install_flatref_path_entry.clone(); .hexpand(true)
let tbi_remote_name_clone0 = tbi_remote_name.clone(); .label(t!("flatpak_remotes_columnview_user"))
let tbi_remote_url_clone0 = tbi_remote_url.clone(); .active(true)
.build();
flatpak_ref_install_dialog.clone() let flatpak_remote_system_togglebutton = gtk::ToggleButton::builder()
.choose(None::<&gio::Cancellable>, move |choice| { .valign(Align::Center)
match choice.as_str() { .hexpand(true)
"flatpak_ref_install_dialog_add" => { .label(t!("flatpak_remotes_columnview_system"))
match (tbi_remote_name_clone0.borrow().deref(), tbi_remote_url_clone0.borrow().deref()) { .group(&flatpak_remote_user_togglebutton)
(Some(remote_name), Some(remote_url)) => { .build();
add_flatpakref_remote(&reload_action_clone0, &remote_name, &remote_url, flatpak_remote_system_togglebutton.is_active());
//
let flatpak_ref_install_dialog_child_clamp = adw::Clamp::builder()
.child(&flatpak_ref_install_dialog_child_box)
.maximum_size(500)
.build();
let flatpak_ref_install_viewport = gtk::ScrolledWindow::builder()
.hexpand(true)
.vexpand(true)
.child(&flatpak_ref_install_dialog_child_clamp)
.hscrollbar_policy(PolicyType::Never)
.build();
let flatpak_ref_install_dialog = adw::MessageDialog::builder()
.transient_for(&window)
.extra_child(&flatpak_ref_install_viewport)
.heading(t!("flatpak_ref_install_dialog_heading"))
.width_request(700)
.height_request(400)
.build();
flatpak_ref_install_flatref_path_file_dialog
.set_transient_for(Some(&flatpak_ref_install_dialog));
flatpak_ref_install_dialog.add_response(
"flatpak_ref_install_dialog_add",
&t!("flatpak_ref_install_dialog_add_label").to_string(),
);
flatpak_ref_install_dialog.add_response(
"flatpak_ref_install_dialog_cancel",
&t!("flatpak_ref_install_dialog_cancel_label").to_string(),
);
flatpak_ref_install_dialog.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_dialog.set_response_appearance(
"flatpak_ref_install_dialog_cancel",
adw::ResponseAppearance::Destructive,
);
flatpak_ref_install_dialog.set_response_appearance(
"flatpak_ref_install_dialog_add",
adw::ResponseAppearance::Suggested,
);
//
let flatpak_ref_install_dialog_clone0 = flatpak_ref_install_dialog.clone();
let flatpak_ref_install_flatref_path_entry_clone0 =
flatpak_ref_install_flatref_path_entry.clone();
let flatpak_ref_install_label0_clone0 = flatpak_ref_install_label0.clone();
let tbi_remote_name = Rc::new(RefCell::new(None));
let tbi_remote_url = Rc::new(RefCell::new(None));
let tbi_remote_name_clone0 = tbi_remote_name.clone();
let tbi_remote_url_clone0 = tbi_remote_url.clone();
let add_button_update_state = move || {
if !flatpak_ref_install_flatref_path_entry_clone0
.text()
.is_empty()
{
match std::fs::read_to_string(flatpak_ref_install_flatref_path_entry_clone0.text()) {
Ok(t) => {
let mut flatref_file = Ini::new();
match flatref_file.read(t) {
Ok(_) => {
let ref_name = flatref_file.get("Flatpak Ref", "Name");
let ref_remote_name =
flatref_file.get("Flatpak Ref", "SuggestRemoteName");
let ref_remote_url = flatref_file.get("Flatpak Ref", "RuntimeRepo");
match (ref_name, ref_remote_name.clone()) {
(Some(name), Some(remote_name)) => {
flatpak_ref_install_label0_clone0.set_label(
&strfmt::strfmt(
&t!("flatpak_ref_install_label").to_string(),
&std::collections::HashMap::from([
("NAME".to_string(), name),
("REMOTE".to_string(), remote_name),
]),
)
.unwrap(),
);
{
*tbi_remote_name_clone0.borrow_mut() = ref_remote_name;
*tbi_remote_url_clone0.borrow_mut() = ref_remote_url;
} }
(_,_) => {}
} }
run_flatpak_ref_install_transaction(&flatpak_retry_signal_action_clone0, &reload_action_clone0, flatpak_remote_system_togglebutton.is_active(), window, &flatpak_ref_install_flatref_path_entry_clone0.text()); (_, _) => {
flatpak_ref_install_dialog_clone0.set_response_enabled(
"flatpak_ref_install_dialog_add",
false,
);
flatpak_ref_install_label0_clone0.set_label("");
}
} }
_ => {} flatpak_ref_install_dialog_clone0
.set_response_enabled("flatpak_ref_install_dialog_add", true);
} }
}); Err(_) => {
flatpak_ref_install_dialog_clone0
.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
}
}
Err(_) => {
flatpak_ref_install_dialog_clone0
.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
}
} else {
flatpak_ref_install_dialog_clone0
.set_response_enabled("flatpak_ref_install_dialog_add", false);
flatpak_ref_install_label0_clone0.set_label("");
}
};
//
for entry in [&flatpak_ref_install_flatref_path_entry] {
entry.connect_text_notify(clone!(
#[strong]
add_button_update_state,
move |_| {
add_button_update_state();
}
));
}
//
flatpak_ref_install_box2.append(&flatpak_remote_user_togglebutton);
flatpak_ref_install_box2.append(&flatpak_remote_system_togglebutton);
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_flatref_path_prefrencesgroup);
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_box2);
flatpak_ref_install_dialog_child_box.append(&flatpak_ref_install_label0);
let reload_action_clone0 = reload_action.clone();
let flatpak_retry_signal_action_clone0 = flatpak_retry_signal_action.clone();
let flatpak_ref_install_flatref_path_entry_clone0 =
flatpak_ref_install_flatref_path_entry.clone();
let tbi_remote_name_clone0 = tbi_remote_name.clone();
let tbi_remote_url_clone0 = tbi_remote_url.clone();
flatpak_ref_install_dialog.clone().choose(
None::<&gio::Cancellable>,
move |choice| match choice.as_str() {
"flatpak_ref_install_dialog_add" => {
match (
tbi_remote_name_clone0.borrow().deref(),
tbi_remote_url_clone0.borrow().deref(),
) {
(Some(remote_name), Some(remote_url)) => {
add_flatpakref_remote(
&reload_action_clone0,
&remote_name,
&remote_url,
flatpak_remote_system_togglebutton.is_active(),
);
}
(_, _) => {}
}
run_flatpak_ref_install_transaction(
&flatpak_retry_signal_action_clone0,
&reload_action_clone0,
flatpak_remote_system_togglebutton.is_active(),
window,
&flatpak_ref_install_flatref_path_entry_clone0.text(),
);
}
_ => {}
},
);
} }
pub fn run_flatpak_ref_install_transaction(flatpak_retry_signal_action: &gio::SimpleAction, retry_signal_action: &gio::SimpleAction, is_system: bool, window: adw::ApplicationWindow, flatref_path: &str) { pub fn run_flatpak_ref_install_transaction(
flatpak_retry_signal_action: &gio::SimpleAction,
retry_signal_action: &gio::SimpleAction,
is_system: bool,
window: adw::ApplicationWindow,
flatref_path: &str,
) {
let (transaction_percent_sender, transaction_percent_receiver) = let (transaction_percent_sender, transaction_percent_receiver) =
async_channel::unbounded::<u32>(); async_channel::unbounded::<u32>();
let transaction_percent_sender = transaction_percent_sender.clone(); let transaction_percent_sender = transaction_percent_sender.clone();
let (transaction_status_sender, transaction_status_receiver) = let (transaction_status_sender, transaction_status_receiver) =
async_channel::unbounded::<String>(); async_channel::unbounded::<String>();
let transaction_status_sender = transaction_status_sender.clone(); let transaction_status_sender = transaction_status_sender.clone();
let flatref_path_clone0 = flatref_path.clone().to_owned(); let flatref_path_clone0 = flatref_path.to_owned();
thread::spawn(move || { thread::spawn(move || {
let cancellable_no = libflatpak::gio::Cancellable::NONE; let cancellable_no = libflatpak::gio::Cancellable::NONE;
@ -321,30 +335,63 @@ pub fn run_flatpak_ref_install_transaction(flatpak_retry_signal_action: &gio::Si
let transaction_percent_sender0 = transaction_percent_sender.clone(); let transaction_percent_sender0 = transaction_percent_sender.clone();
let transaction_run_closure = let transaction_run_closure =
move |transaction: &libflatpak::Transaction, move |_: &libflatpak::Transaction,
transaction_operation: &libflatpak::TransactionOperation, transaction_operation: &libflatpak::TransactionOperation,
transaction_progress: &libflatpak::TransactionProgress| { transaction_progress: &libflatpak::TransactionProgress| {
let transaction_status_sender = transaction_status_sender0.clone(); let transaction_status_sender = transaction_status_sender0.clone();
let transaction_percent_sender = transaction_percent_sender0.clone(); let transaction_percent_sender = transaction_percent_sender0.clone();
transaction_progress.connect_changed(clone!(@strong transaction_progress, @strong transaction_operation => move |_| { transaction_progress.connect_changed(clone!(
let status_message = format!("{}: {}\n{}: {}\n{}: {}/{}\n{}: {}", t!("flatpak_ref"), transaction_operation.get_ref().unwrap_or(libflatpak::glib::GString::from_string_unchecked("Unknown".to_owned())), t!("flatpak_status") ,transaction_progress.status().unwrap_or(libflatpak::glib::GString::from_string_unchecked("Unknown".to_owned())), t!("flatpak_transaction_bytes_transferred"), convert(transaction_progress.bytes_transferred() as f64), convert(transaction_operation.download_size() as f64), t!("flatpak_transaction_installed_size"), convert(transaction_operation.installed_size() as f64)); #[strong]
transaction_status_sender.send_blocking(status_message).expect("transaction_status_receiver closed!"); transaction_progress,
transaction_percent_sender.send_blocking(transaction_progress.progress().try_into().unwrap_or(0)).expect("transaction_percent_receiver closed!"); #[strong]
})); transaction_operation,
move |_| {
let status_message = format!(
"{}: {}\n{}: {}\n{}: {}/{}\n{}: {}",
t!("flatpak_ref"),
transaction_operation.get_ref().unwrap_or(
libflatpak::glib::GString::from_string_unchecked(
"Unknown".to_owned()
)
),
t!("flatpak_status"),
transaction_progress.status().unwrap_or(
libflatpak::glib::GString::from_string_unchecked(
"Unknown".to_owned()
)
),
t!("flatpak_transaction_bytes_transferred"),
convert(transaction_progress.bytes_transferred() as f64),
convert(transaction_operation.download_size() as f64),
t!("flatpak_transaction_installed_size"),
convert(transaction_operation.installed_size() as f64)
);
transaction_status_sender
.send_blocking(status_message)
.expect("transaction_status_receiver closed!");
transaction_percent_sender
.send_blocking(transaction_progress.progress().try_into().unwrap_or(0))
.expect("transaction_percent_receiver closed!");
}
));
}; };
// //
let (flatpak_installation, flatpak_transaction) = match is_system { let flatpak_transaction = match is_system {
true => { true => {
let installation = libflatpak::Installation::new_system(cancellable_no).unwrap(); let installation = libflatpak::Installation::new_system(cancellable_no).unwrap();
let transaction = libflatpak::Transaction::for_installation(&installation, cancellable_no).unwrap(); let transaction =
(installation, transaction) libflatpak::Transaction::for_installation(&installation, cancellable_no)
.unwrap();
transaction
} }
false => { false => {
let installation = libflatpak::Installation::new_user(cancellable_no).unwrap(); let installation = libflatpak::Installation::new_user(cancellable_no).unwrap();
let transaction = libflatpak::Transaction::for_installation(&installation, cancellable_no).unwrap(); let transaction =
(installation, transaction) libflatpak::Transaction::for_installation(&installation, cancellable_no)
.unwrap();
transaction
} }
}; };
@ -419,13 +466,12 @@ pub fn run_flatpak_ref_install_transaction(flatpak_retry_signal_action: &gio::Si
flatpak_transaction_dialog_child_box.append(&flatpak_transaction_dialog_spinner); flatpak_transaction_dialog_child_box.append(&flatpak_transaction_dialog_spinner);
flatpak_transaction_dialog_child_box.append(&flatpak_transaction_dialog_progress_bar); flatpak_transaction_dialog_child_box.append(&flatpak_transaction_dialog_progress_bar);
let flatpak_transaction_dialog = let flatpak_transaction_dialog = adw::MessageDialog::builder()
adw::MessageDialog::builder() .transient_for(&window)
.transient_for(&window) .extra_child(&flatpak_transaction_dialog_child_box)
.extra_child(&flatpak_transaction_dialog_child_box) .heading(t!("flatpak_transaction_dialog_heading"))
.heading(t!("flatpak_transaction_dialog_heading")) .width_request(500)
.width_request(500) .build();
.build();
flatpak_transaction_dialog.add_response( flatpak_transaction_dialog.add_response(
"flatpak_transaction_dialog_ok", "flatpak_transaction_dialog_ok",
@ -556,13 +602,27 @@ fn get_data_from_filepath(filepath: &str) -> Result<libflatpak::glib::Bytes, std
Ok(glib_bytes) Ok(glib_bytes)
} }
fn add_flatpakref_remote(reload_action: &gio::SimpleAction, remote_name: &str, remote_url: &str, is_system: bool) { fn add_flatpakref_remote(
reload_action: &gio::SimpleAction,
remote_name: &str,
remote_url: &str,
is_system: bool,
) {
let flatpak_installation = match is_system { let flatpak_installation = match is_system {
true => "--system", true => "--system",
false => "--user" false => "--user",
}; };
match duct::cmd!("flatpak", "remote-add", "--if-not-exists", &flatpak_installation, remote_name, remote_url).run() { match duct::cmd!(
"flatpak",
"remote-add",
"--if-not-exists",
&flatpak_installation,
remote_name,
remote_url
)
.run()
{
Ok(_) => { Ok(_) => {
reload_action.activate(None); reload_action.activate(None);
} }
@ -574,7 +634,7 @@ fn add_flatpakref_remote(reload_action: &gio::SimpleAction, remote_name: &str, r
flatpak_remote_add_error_dialog.add_response( flatpak_remote_add_error_dialog.add_response(
"flatpak_remote_add_error_dialog_ok", "flatpak_remote_add_error_dialog_ok",
&t!("flatpak_remote_add_error_dialog_ok_label").to_string(), &t!("flatpak_remote_add_error_dialog_ok_label").to_string(),
); );
flatpak_remote_add_error_dialog.present(); flatpak_remote_add_error_dialog.present();
} }
} }

View File

@ -1,34 +1,19 @@
use crate::apt_package_row::AptPackageRow;
use add_dialog::add_dialog_fn;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use apt_deb822_tools::Deb822Repository; use gtk::glib::{clone, BoxedAnyObject};
use gtk::glib::{property::PropertyGet, clone, BoxedAnyObject};
use gtk::*;
use std::cell::Ref;
use std::ops::Deref;
use pika_unixsocket_tools::pika_unixsocket_tools::*;
use rust_apt::cache::*;
use rust_apt::new_cache;
use rust_apt::records::RecordField;
use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc;
use std::thread;
use tokio::runtime::Runtime;
use crate::flatpak_ref_row::FlatpakRefRow;
use adw::prelude::*;
use gtk::glib::*;
use gtk::*; use gtk::*;
use libflatpak::prelude::*; use libflatpak::prelude::*;
use libflatpak::InstalledRef; use std::cell::Ref;
use std::cell::RefCell;
use std::ops::Deref;
use std::rc::Rc;
mod add_dialog; mod add_dialog;
mod install_ref_dialog; mod install_ref_dialog;
enum FlatpakRemote { enum FlatpakRemote {
System(libflatpak::Remote), System(libflatpak::Remote),
User(libflatpak::Remote) User(libflatpak::Remote),
} }
pub fn flatpak_manage_page( pub fn flatpak_manage_page(
@ -69,7 +54,8 @@ pub fn flatpak_manage_page(
.margin_end(15) .margin_end(15)
.build(); .build();
let flatpak_remotes_selection_model_rc: Rc<RefCell<gtk::SingleSelection>> = Rc::new(RefCell::default()); let flatpak_remotes_selection_model_rc: Rc<RefCell<gtk::SingleSelection>> =
Rc::new(RefCell::default());
let flatpak_remotes_selection_model_rc_clone0 = Rc::clone(&flatpak_remotes_selection_model_rc); let flatpak_remotes_selection_model_rc_clone0 = Rc::clone(&flatpak_remotes_selection_model_rc);
@ -83,180 +69,170 @@ pub fn flatpak_manage_page(
#[strong] #[strong]
cancellable_no, cancellable_no,
move |_, _| { move |_, _| {
let flatpak_system_installation = let flatpak_system_installation =
libflatpak::Installation::new_system(cancellable_no).unwrap(); libflatpak::Installation::new_system(cancellable_no).unwrap();
let flatpak_user_installation = let flatpak_user_installation =
libflatpak::Installation::new_user(cancellable_no).unwrap(); libflatpak::Installation::new_user(cancellable_no).unwrap();
let system_remotes = match libflatpak::Installation::list_remotes(&flatpak_system_installation, cancellable_no) { let system_remotes = match libflatpak::Installation::list_remotes(
&flatpak_system_installation,
cancellable_no,
) {
Ok(t) => t, Ok(t) => t,
Err(_) => Vec::new() Err(_) => Vec::new(),
}; };
let user_remotes = match libflatpak::Installation::list_remotes(&flatpak_user_installation, cancellable_no) { let user_remotes = match libflatpak::Installation::list_remotes(
&flatpak_user_installation,
cancellable_no,
) {
Ok(t) => t, Ok(t) => t,
Err(_) => Vec::new() Err(_) => Vec::new(),
}; };
let flatpak_remotes_list_store = gio::ListStore::new::<BoxedAnyObject>(); let flatpak_remotes_list_store = gio::ListStore::new::<BoxedAnyObject>();
for remote in system_remotes { for remote in system_remotes {
flatpak_remotes_list_store.append(&BoxedAnyObject::new(FlatpakRemote::System(remote))); flatpak_remotes_list_store
}; .append(&BoxedAnyObject::new(FlatpakRemote::System(remote)));
}
for remote in user_remotes { for remote in user_remotes {
flatpak_remotes_list_store.append(&BoxedAnyObject::new(FlatpakRemote::User(remote))); flatpak_remotes_list_store
}; .append(&BoxedAnyObject::new(FlatpakRemote::User(remote)));
}
let flatpak_remotes_selection_model = SingleSelection::new(Some(flatpak_remotes_list_store)); let flatpak_remotes_selection_model =
SingleSelection::new(Some(flatpak_remotes_list_store));
(*flatpak_remotes_selection_model_rc_clone0.borrow_mut() = flatpak_remotes_selection_model.clone()); (*flatpak_remotes_selection_model_rc_clone0.borrow_mut() =
flatpak_remotes_selection_model.clone());
let flatpak_remotes_columnview = ColumnView::builder() let flatpak_remotes_columnview = ColumnView::builder()
.vexpand(true) .vexpand(true)
.model(&flatpak_remotes_selection_model) .model(&flatpak_remotes_selection_model)
.build();
//
let flatpak_remotes_columnview_factory0 = gtk::SignalListItemFactory::new();
flatpak_remotes_columnview_factory0.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder()
.halign(Align::Start)
.build(); .build();
item.set_child(Some(&row));
});
flatpak_remotes_columnview_factory0.connect_bind(move |_factory, item| { //
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_name = match entry_borrow.deref() {
FlatpakRemote::System(remote) => {
remote.name().unwrap_or_default()
}
FlatpakRemote::User(remote) => {
remote.name().unwrap_or_default()
}
};
child.set_label(&remote_name);
});
let flatpak_remotes_columnview_col1 = gtk::ColumnViewColumn::builder() let flatpak_remotes_columnview_factory0 = gtk::SignalListItemFactory::new();
.title(t!("flatpak_remotes_columnview_col0_title"))
.factory(&flatpak_remotes_columnview_factory0)
.build();
// flatpak_remotes_columnview_factory0.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder().halign(Align::Start).build();
item.set_child(Some(&row));
});
let flatpak_remotes_columnview_factory1 = gtk::SignalListItemFactory::new(); flatpak_remotes_columnview_factory0.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_name = match entry_borrow.deref() {
FlatpakRemote::System(remote) => remote.name().unwrap_or_default(),
FlatpakRemote::User(remote) => remote.name().unwrap_or_default(),
};
child.set_label(&remote_name);
});
flatpak_remotes_columnview_factory1.connect_setup(move |_factory, item| { let flatpak_remotes_columnview_col1 = gtk::ColumnViewColumn::builder()
let item = item.downcast_ref::<gtk::ListItem>().unwrap(); .title(t!("flatpak_remotes_columnview_col0_title"))
let row = Label::builder() .factory(&flatpak_remotes_columnview_factory0)
.halign(Align::Start)
.build(); .build();
item.set_child(Some(&row));
});
flatpak_remotes_columnview_factory1.connect_bind(move |_factory, item| { //
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_title = match entry_borrow.deref() {
FlatpakRemote::System(remote) => {
remote.title().unwrap_or_default()
}
FlatpakRemote::User(remote) => {
remote.title().unwrap_or_default()
}
};
child.set_label(&remote_title);
});
let flatpak_remotes_columnview_col0 = gtk::ColumnViewColumn::builder() let flatpak_remotes_columnview_factory1 = gtk::SignalListItemFactory::new();
.title(t!("flatpak_remotes_columnview_col1_title"))
.factory(&flatpak_remotes_columnview_factory1)
.build();
// flatpak_remotes_columnview_factory1.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder().halign(Align::Start).build();
item.set_child(Some(&row));
});
let flatpak_remotes_columnview_factory2 = gtk::SignalListItemFactory::new(); flatpak_remotes_columnview_factory1.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_title = match entry_borrow.deref() {
FlatpakRemote::System(remote) => remote.title().unwrap_or_default(),
FlatpakRemote::User(remote) => remote.title().unwrap_or_default(),
};
child.set_label(&remote_title);
});
flatpak_remotes_columnview_factory2.connect_setup(move |_factory, item| { let flatpak_remotes_columnview_col0 = gtk::ColumnViewColumn::builder()
let item = item.downcast_ref::<gtk::ListItem>().unwrap(); .title(t!("flatpak_remotes_columnview_col1_title"))
let row = Label::builder() .factory(&flatpak_remotes_columnview_factory1)
.halign(Align::Start)
.build(); .build();
item.set_child(Some(&row));
});
flatpak_remotes_columnview_factory2.connect_bind(move |_factory, item| { //
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_url = match entry_borrow.deref() {
FlatpakRemote::System(remote) => {
remote.url().unwrap_or_default()
}
FlatpakRemote::User(remote) => {
remote.url().unwrap_or_default()
}
};
child.set_label(&remote_url);
});
let flatpak_remotes_columnview_col2 = gtk::ColumnViewColumn::builder() let flatpak_remotes_columnview_factory2 = gtk::SignalListItemFactory::new();
.title(t!("flatpak_remotes_columnview_col2_title"))
.factory(&flatpak_remotes_columnview_factory2)
.expand(true)
.build();
// flatpak_remotes_columnview_factory2.connect_setup(move |_factory, item| {
let item = item.downcast_ref::<gtk::ListItem>().unwrap();
let row = Label::builder().halign(Align::Start).build();
item.set_child(Some(&row));
});
let flatpak_remotes_columnview_factory3 = gtk::SignalListItemFactory::new(); flatpak_remotes_columnview_factory2.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
let remote_url = match entry_borrow.deref() {
FlatpakRemote::System(remote) => remote.url().unwrap_or_default(),
FlatpakRemote::User(remote) => remote.url().unwrap_or_default(),
};
child.set_label(&remote_url);
});
flatpak_remotes_columnview_factory3.connect_setup(move |_factory, item| { let flatpak_remotes_columnview_col2 = gtk::ColumnViewColumn::builder()
let item = item.downcast_ref::<gtk::ListItem>().unwrap(); .title(t!("flatpak_remotes_columnview_col2_title"))
let row = Label::builder() .factory(&flatpak_remotes_columnview_factory2)
.halign(Align::Start) .expand(true)
.build(); .build();
item.set_child(Some(&row));
});
flatpak_remotes_columnview_factory3.connect_bind(move |_factory, item| { //
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
match entry_borrow.deref() {
FlatpakRemote::System(remote) => {
child.set_label(&t!("flatpak_remotes_columnview_system").to_string());
}
FlatpakRemote::User(remote) => {
child.set_label(&t!("flatpak_remotes_columnview_user").to_string());
}
};
});
let flatpak_remotes_columnview_col3 = gtk::ColumnViewColumn::builder() let flatpak_remotes_columnview_factory3 = gtk::SignalListItemFactory::new();
.title(t!("flatpak_remotes_columnview_col3_title"))
.factory(&flatpak_remotes_columnview_factory3)
.build();
// flatpak_remotes_columnview_factory3.connect_setup(move |_factory, item| {
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col0); let item = item.downcast_ref::<gtk::ListItem>().unwrap();
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col1); let row = Label::builder().halign(Align::Start).build();
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col2); item.set_child(Some(&row));
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col3); });
flatpak_remotes_columnview_bin_clone0.set_child(Some(&flatpak_remotes_columnview));
})); flatpak_remotes_columnview_factory3.connect_bind(move |_factory, item| {
let item: &ListItem = item.downcast_ref::<gtk::ListItem>().unwrap();
let child = item.child().and_downcast::<Label>().unwrap();
let entry: BoxedAnyObject = item.item().and_downcast::<BoxedAnyObject>().unwrap();
let entry_borrow = entry.borrow::<FlatpakRemote>();
match entry_borrow.deref() {
FlatpakRemote::System(_) => {
child.set_label(&t!("flatpak_remotes_columnview_system").to_string());
}
FlatpakRemote::User(_) => {
child.set_label(&t!("flatpak_remotes_columnview_user").to_string());
}
};
});
let flatpak_remotes_columnview_col3 = gtk::ColumnViewColumn::builder()
.title(t!("flatpak_remotes_columnview_col3_title"))
.factory(&flatpak_remotes_columnview_factory3)
.build();
//
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col0);
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col1);
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col2);
flatpak_remotes_columnview.append_column(&flatpak_remotes_columnview_col3);
flatpak_remotes_columnview_bin_clone0.set_child(Some(&flatpak_remotes_columnview));
}
));
retry_signal_action.activate(None); retry_signal_action.activate(None);
@ -310,17 +286,14 @@ pub fn flatpak_manage_page(
retry_signal_action, retry_signal_action,
#[strong] #[strong]
flatpak_retry_signal_action, flatpak_retry_signal_action,
move move |_| {
|_| add_dialog::add_dialog_fn(
{ window.clone(),
add_dialog::add_dialog_fn( &retry_signal_action,
window.clone(), &flatpak_retry_signal_action,
&retry_signal_action, );
&flatpak_retry_signal_action, }
); ));
}
)
);
flatpak_flatref_install_button.connect_clicked(clone!( flatpak_flatref_install_button.connect_clicked(clone!(
#[strong] #[strong]
@ -331,18 +304,15 @@ pub fn flatpak_manage_page(
flatpak_retry_signal_action, flatpak_retry_signal_action,
#[strong] #[strong]
flatpak_ref_entry_action, flatpak_ref_entry_action,
move move |_| {
|_| install_ref_dialog::install_ref_dialog_fn(
{ window.clone(),
install_ref_dialog::install_ref_dialog_fn( &retry_signal_action,
window.clone(), &flatpak_retry_signal_action,
&retry_signal_action, &flatpak_ref_entry_action,
&flatpak_retry_signal_action, );
&flatpak_ref_entry_action }
); ));
}
)
);
flatpak_remote_remove_button.connect_clicked(clone!( flatpak_remote_remove_button.connect_clicked(clone!(
#[strong] #[strong]
@ -357,7 +327,7 @@ pub fn flatpak_manage_page(
|_| |_|
{ {
{ {
let (mut installation, mut remote_name, mut cmd_installation): (libflatpak::Installation, libflatpak::glib::GString, String); let (installation, remote_name, cmd_installation): (libflatpak::Installation, libflatpak::glib::GString, String);
{ {
let flatpak_remotes_selection_model = flatpak_remotes_selection_model_rc.borrow(); let flatpak_remotes_selection_model = flatpak_remotes_selection_model_rc.borrow();
let selection = flatpak_remotes_selection_model.selected_item().unwrap(); let selection = flatpak_remotes_selection_model.selected_item().unwrap();

View File

@ -96,12 +96,12 @@ impl ObjectImpl for FlatpakRefRow {
let flatref_ref_name = obj.flatref_ref_name(); let flatref_ref_name = obj.flatref_ref_name();
let flatref_summary = obj.flatref_summary(); let flatref_summary = obj.flatref_summary();
let flatref_remote_name = obj.flatref_remote_name(); let flatref_remote_name = obj.flatref_remote_name();
let flatref_installed_size_installed = obj.flatref_installed_size_installed(); //let flatref_installed_size_installed = obj.flatref_installed_size_installed();
let flatref_installed_size_remote = obj.flatref_installed_size_remote(); let flatref_installed_size_remote = obj.flatref_installed_size_remote();
let flatref_download_size = obj.flatref_download_size(); let flatref_download_size = obj.flatref_download_size();
let flatref_ref_format = obj.flatref_download_size(); //let flatref_ref_format = obj.flatref_download_size();
let flatref_is_system = obj.flatref_is_system(); let flatref_is_system = obj.flatref_is_system();
let flatref_marked = obj.flatref_marked(); //let flatref_marked = obj.flatref_marked();
// //
create_prefix_content( create_prefix_content(
&prefix_box, &prefix_box,

View File

@ -1,15 +1,12 @@
mod process; mod process;
use crate::apt_package_row::AptPackageRow;
use crate::flatpak_ref_row::FlatpakRefRow; use crate::flatpak_ref_row::FlatpakRefRow;
use adw::gio::SimpleAction; use adw::gio::SimpleAction;
use adw::prelude::*; use adw::prelude::*;
use gtk::glib::*; use gtk::glib::*;
use gtk::*; use gtk::*;
use libflatpak::prelude::*; use libflatpak::prelude::*;
use libflatpak::InstalledRef;
use std::cell::RefCell; use std::cell::RefCell;
use std::process::Command;
use std::rc::Rc; use std::rc::Rc;
use std::thread; use std::thread;
@ -42,7 +39,6 @@ pub fn flatpak_update_page(
let (appstream_sync_status_sender, appstream_sync_status_receiver) = let (appstream_sync_status_sender, appstream_sync_status_receiver) =
async_channel::unbounded::<String>(); async_channel::unbounded::<String>();
let appstream_sync_status_sender = appstream_sync_status_sender.clone(); let appstream_sync_status_sender = appstream_sync_status_sender.clone();
let appstream_sync_status_sender_clone0 = appstream_sync_status_sender.clone();
let system_refs_for_upgrade_vec: Rc<RefCell<Vec<FlatpakRefRow>>> = let system_refs_for_upgrade_vec: Rc<RefCell<Vec<FlatpakRefRow>>> =
Rc::new(RefCell::new(Vec::new())); Rc::new(RefCell::new(Vec::new()));
@ -400,8 +396,8 @@ pub fn flatpak_update_page(
let mut user_last_triggered = false; let mut user_last_triggered = false;
// //
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() {
@ -551,8 +547,7 @@ pub fn flatpak_update_page(
packages_boxedlist.append(&flatpak_row); packages_boxedlist.append(&flatpak_row);
(*flatpak_update_count.borrow_mut() += 1); (*flatpak_update_count.borrow_mut() += 1);
if flatref_struct.is_system && flatref_struct.is_last if flatref_struct.is_system && flatref_struct.is_last {
{
system_last_triggered = true system_last_triggered = true
} }
} }
@ -705,8 +700,7 @@ pub fn flatpak_update_page(
); );
packages_boxedlist.append(&flatpak_row); packages_boxedlist.append(&flatpak_row);
(*flatpak_update_count.borrow_mut() += 1); (*flatpak_update_count.borrow_mut() += 1);
if !flatref_struct.is_system && flatref_struct.is_last if !flatref_struct.is_system && flatref_struct.is_last {
{
user_last_triggered = true user_last_triggered = true
} }
} }
@ -715,7 +709,9 @@ pub fn flatpak_update_page(
} }
if user_last_triggered && system_last_triggered { if user_last_triggered && system_last_triggered {
packages_boxedlist.set_sensitive(true); packages_boxedlist.set_sensitive(true);
update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(&[*apt_update_count.borrow(),*flatpak_update_count.borrow()]))); update_sys_tray.activate(Some(&glib::Variant::array_from_fixed_array(
&[*apt_update_count.borrow(), *flatpak_update_count.borrow()],
)));
} }
flatpak_update_dialog.close(); flatpak_update_dialog.close();
} }
@ -733,7 +729,8 @@ pub fn flatpak_update_page(
)); ));
flatpak_update_dialog flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_retry", true); .set_response_enabled("flatpak_update_dialog_retry", true);
flatpak_update_dialog.set_response_enabled("flatpak_update_dialog_ignore", true); flatpak_update_dialog
.set_response_enabled("flatpak_update_dialog_ignore", true);
} }
_ => flatpak_update_dialog.set_body(&state), _ => flatpak_update_dialog.set_body(&state),
} }

View File

@ -4,19 +4,12 @@ use adw::prelude::*;
use gtk::glib::*; use gtk::glib::*;
use gtk::*; use gtk::*;
use libflatpak::prelude::*; use libflatpak::prelude::*;
use libflatpak::Transaction;
use pretty_bytes::converter::convert; use pretty_bytes::converter::convert;
use serde::Serialize;
use serde_json::Value;
use std::cell::RefCell;
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io::Write; use std::io::Write;
use std::path::Path; use std::path::Path;
use std::process::Command; use std::process::Command;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::{fs, thread}; use std::{fs, thread};
use tokio::runtime::Runtime;
struct FlatpakChangesInfo { struct FlatpakChangesInfo {
system_flatref_count: u64, system_flatref_count: u64,
@ -58,7 +51,6 @@ pub fn flatpak_process_update(
window: adw::ApplicationWindow, window: adw::ApplicationWindow,
retry_signal_action: &SimpleAction, retry_signal_action: &SimpleAction,
) { ) {
let cancellable = libflatpak::gio::Cancellable::NONE;
// Emulate Flatpak Full Upgrade to get transaction info // Emulate Flatpak Full Upgrade to get transaction info
let mut flatpak_changes_struct = FlatpakChangesInfo { let mut flatpak_changes_struct = FlatpakChangesInfo {
system_flatref_count: 0, system_flatref_count: 0,
@ -248,16 +240,45 @@ fn flatpak_run_transactions(
let transaction_percent_sender0 = transaction_percent_sender.clone(); let transaction_percent_sender0 = transaction_percent_sender.clone();
let transaction_run_closure = let transaction_run_closure =
move |transaction: &libflatpak::Transaction, move |_: &libflatpak::Transaction,
transaction_operation: &libflatpak::TransactionOperation, transaction_operation: &libflatpak::TransactionOperation,
transaction_progress: &libflatpak::TransactionProgress| { transaction_progress: &libflatpak::TransactionProgress| {
let transaction_status_sender = transaction_status_sender0.clone(); let transaction_status_sender = transaction_status_sender0.clone();
let transaction_percent_sender = transaction_percent_sender0.clone(); let transaction_percent_sender = transaction_percent_sender0.clone();
transaction_progress.connect_changed(clone!(@strong transaction_progress, @strong transaction_operation => move |_| { transaction_progress.connect_changed(clone!(
let status_message = format!("{}: {}\n{}: {}\n{}: {}/{}\n{}: {}", t!("flatpak_ref"), transaction_operation.get_ref().unwrap_or(libflatpak::glib::GString::from_string_unchecked("Unknown".to_owned())), t!("flatpak_status") ,transaction_progress.status().unwrap_or(libflatpak::glib::GString::from_string_unchecked("Unknown".to_owned())), t!("flatpak_transaction_bytes_transferred"), convert(transaction_progress.bytes_transferred() as f64), convert(transaction_operation.download_size() as f64), t!("flatpak_transaction_installed_size"), convert(transaction_operation.installed_size() as f64)); #[strong]
transaction_status_sender.send_blocking(status_message).expect("transaction_status_receiver closed!"); transaction_progress,
transaction_percent_sender.send_blocking(transaction_progress.progress().try_into().unwrap_or(0)).expect("transaction_percent_receiver closed!"); #[strong]
})); transaction_operation,
move |_| {
let status_message = format!(
"{}: {}\n{}: {}\n{}: {}/{}\n{}: {}",
t!("flatpak_ref"),
transaction_operation.get_ref().unwrap_or(
libflatpak::glib::GString::from_string_unchecked(
"Unknown".to_owned()
)
),
t!("flatpak_status"),
transaction_progress.status().unwrap_or(
libflatpak::glib::GString::from_string_unchecked(
"Unknown".to_owned()
)
),
t!("flatpak_transaction_bytes_transferred"),
convert(transaction_progress.bytes_transferred() as f64),
convert(transaction_operation.download_size() as f64),
t!("flatpak_transaction_installed_size"),
convert(transaction_operation.installed_size() as f64)
);
transaction_status_sender
.send_blocking(status_message)
.expect("transaction_status_receiver closed!");
transaction_percent_sender
.send_blocking(transaction_progress.progress().try_into().unwrap_or(0))
.expect("transaction_percent_receiver closed!");
}
));
}; };
// //

View File

@ -1,11 +1,11 @@
mod apt_manage_page;
mod apt_package_row; mod apt_package_row;
mod apt_update_page; mod apt_update_page;
mod apt_manage_page;
mod build_ui; mod build_ui;
mod config; mod config;
mod flatpak_manage_page;
mod flatpak_ref_row; mod flatpak_ref_row;
mod flatpak_update_page; mod flatpak_update_page;
mod flatpak_manage_page;
use crate::config::APP_ID; use crate::config::APP_ID;
use adw::prelude::*; use adw::prelude::*;
@ -33,7 +33,8 @@ fn main() {
None => panic!("$LANG is not set"), None => panic!("$LANG is not set"),
}; };
rust_i18n::set_locale(&current_locale); rust_i18n::set_locale(&current_locale);
let application = adw::Application::new(Some(APP_ID), gio::ApplicationFlags::HANDLES_COMMAND_LINE); let application =
adw::Application::new(Some(APP_ID), gio::ApplicationFlags::HANDLES_COMMAND_LINE);
application.connect_startup(|app| { application.connect_startup(|app| {
// The CSS "magic" happens here. // The CSS "magic" happens here.
let provider = CssProvider::new(); let provider = CssProvider::new();