add functionality to open terminal inside toolbox

This commit is contained in:
2024-07-02 18:17:39 +02:00
parent 2f286697d6
commit 74a64fb198
2 changed files with 69 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
use crate::util::toolbox::open_toolbox_container_in_terminal;
use crate::util::toolbox::start_toolbox_container; use crate::util::toolbox::start_toolbox_container;
use crate::util::toolbox::stop_toolbox_container; use crate::util::toolbox::stop_toolbox_container;
use gtk::prelude::ButtonExt; use gtk::prelude::ButtonExt;
@@ -8,6 +9,8 @@ use relm4::factory::{FactoryComponent, FactorySender};
use relm4::gtk; use relm4::gtk;
use relm4::gtk::prelude::WidgetExt; use relm4::gtk::prelude::WidgetExt;
use relm4_icons::icon_names; use relm4_icons::icon_names;
use std::collections::HashSet;
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum ContainerStatus { pub enum ContainerStatus {
Running, Running,
@@ -15,11 +18,17 @@ pub enum ContainerStatus {
Refreshing, Refreshing,
} }
#[derive(Debug, PartialEq, Hash, Eq)]
pub enum ContainerOperation {
LaunchingTerminal,
}
#[derive(Debug)] #[derive(Debug)]
pub struct Container { pub struct Container {
hash: String, hash: String,
value: String, value: String,
status: ContainerStatus, status: ContainerStatus,
running_operations: HashSet<ContainerOperation>,
} }
#[derive(Debug)] #[derive(Debug)]
@@ -33,6 +42,7 @@ pub enum ContainerMsg {
pub enum CommandMessage { pub enum CommandMessage {
SetStarted, SetStarted,
SetStopped, SetStopped,
FinishLaunchTerminal,
} }
pub struct ContainerInit { pub struct ContainerInit {
@@ -103,6 +113,8 @@ impl FactoryComponent for Container {
add_suffix = &gtk::Box{ add_suffix = &gtk::Box{
gtk::AspectFrame{ gtk::AspectFrame{
#[watch]
set_visible: !self.running_operations.contains(&ContainerOperation::LaunchingTerminal),
set_ratio: 1.0, set_ratio: 1.0,
gtk::Button { gtk::Button {
set_icon_name: icon_names::TERMINAL, set_icon_name: icon_names::TERMINAL,
@@ -112,6 +124,23 @@ impl FactoryComponent for Container {
set_css_classes: &["flat"], set_css_classes: &["flat"],
connect_clicked => ContainerMsg::OpenTerminal, connect_clicked => ContainerMsg::OpenTerminal,
}, },
},
gtk::AspectFrame{
#[watch]
set_visible: self.running_operations.contains(&ContainerOperation::LaunchingTerminal),
set_ratio: 1.0,
gtk::Button {
set_margin_start: 10,
set_margin_top: 10,
set_margin_bottom: 10,
set_css_classes: &["flat"],
#[wrap(Some)]
set_child = &gtk::Spinner {
#[watch]
set_spinning: self.running_operations.contains(&ContainerOperation::LaunchingTerminal),
},
},
}, },
}, },
} }
@@ -122,6 +151,7 @@ impl FactoryComponent for Container {
hash: index.clone(), hash: index.clone(),
value: value.name.clone(), value: value.name.clone(),
status: value.status, status: value.status,
running_operations: HashSet::new(),
} }
} }
@@ -143,7 +173,16 @@ impl FactoryComponent for Container {
Err(_) => CommandMessage::SetStarted, Err(_) => CommandMessage::SetStarted,
}); });
} }
ContainerMsg::OpenTerminal => {} ContainerMsg::OpenTerminal => {
self.running_operations
.insert(ContainerOperation::LaunchingTerminal);
let hash = (&self.hash).clone();
sender.spawn_oneshot_command(move || {
match open_toolbox_container_in_terminal(&hash) {
_ => CommandMessage::FinishLaunchTerminal,
}
});
}
} }
} }
@@ -151,6 +190,10 @@ impl FactoryComponent for Container {
match message { match message {
CommandMessage::SetStarted => self.status = ContainerStatus::Running, CommandMessage::SetStarted => self.status = ContainerStatus::Running,
CommandMessage::SetStopped => self.status = ContainerStatus::NotRunning, CommandMessage::SetStopped => self.status = ContainerStatus::NotRunning,
CommandMessage::FinishLaunchTerminal => {
self.running_operations
.remove(&ContainerOperation::LaunchingTerminal);
}
}; };
} }
} }

View File

@@ -149,6 +149,31 @@ impl ToolbxContainer {
} }
} }
pub fn open_toolbox_container_in_terminal(hash: &str) -> Result<(), ToolbxError> {
let output = Command::new("flatpak-spawn")
.arg("--host")
.arg("gnome-terminal")
.arg("--")
.arg("toolbox")
.arg("enter")
.arg(hash)
.output();
if output.is_err() {
return Err(ToolbxError::CommandExecutionError(
output.unwrap_err().to_string(),
));
}
let output = output.unwrap();
if output.status.code() == Some(0) {
Ok(())
} else {
Err(ToolbxError::CommandUnsuccessfulError(
String::from_utf8_lossy(&output.stderr).into_owned(),
))
}
}
pub fn stop_toolbox_container(hash: &str) -> Result<(), ToolbxError> { pub fn stop_toolbox_container(hash: &str) -> Result<(), ToolbxError> {
let output = Command::new("flatpak-spawn") let output = Command::new("flatpak-spawn")
.arg("--host") //Command::new("podman") .arg("--host") //Command::new("podman")