Improvements by Nova

This commit is contained in:
Nicola Guerrera
2023-03-02 13:55:30 +01:00
parent fd03171429
commit 32e050ca26
4 changed files with 47 additions and 45 deletions

View File

@@ -9,7 +9,7 @@ use protostar::{
use stardust_xr_fusion::{
client::{Client, FrameInfo, RootHandler},
core::values::Transform,
drawable::{Alignment, Bounds, MaterialParameter, Model, ResourceID, Text, TextFit, TextStyle},
drawable::{MaterialParameter, Model, ResourceID},
node::NodeError,
spatial::Spatial,
};
@@ -149,7 +149,6 @@ impl RootHandler for AppHexGrid {
}
}
struct App {
_text: Text,
_desktop_file: DesktopFile,
protostar: ProtoStar,
}
@@ -161,27 +160,9 @@ impl App {
desktop_file: DesktopFile,
) -> Option<Self> {
let position = position.into();
let style = TextStyle {
character_height: (APP_SIZE + PADDING) * 0.1,
bounds: Some(Bounds {
bounds: [(APP_SIZE + PADDING); 2].into(),
fit: TextFit::Wrap,
bounds_align: Alignment::XCenter | Alignment::YCenter,
}),
text_align: Alignment::XCenter | Alignment::YCenter,
..Default::default()
};
let protostar =
ProtoStar::create_from_desktop_file(parent, position, desktop_file.clone()).ok()?;
let text = Text::create(
protostar.content_parent(),
Transform::from_position_rotation([0.0, 0.0, 0.004], Quat::from_rotation_y(PI)),
desktop_file.name.as_deref().unwrap_or("Unknown"),
style,
)
.unwrap();
Some(App {
_text: text,
_desktop_file: desktop_file,
protostar,
})

View File

@@ -42,7 +42,7 @@ async fn main() -> Result<()> {
parse_desktop_file(desktop_file).map_err(|e| Report::msg(e))?,
)?
} else if let Some(command) = args.command {
ProtoStar::new_raw(client.get_root(), [0.0, 0.0, 0.0], None, command)?
ProtoStar::new_raw(client.get_root(), [0.0, 0.0, 0.0], None, None, command)?
} else {
bail!("No command or desktop file, nothing to launch.");
};

View File

@@ -7,7 +7,7 @@ use regex::Regex;
use stardust_xr_fusion::{
client::{Client, FrameInfo, RootHandler},
core::values::Transform,
drawable::{MaterialParameter, Model, ResourceID},
drawable::{Alignment, MaterialParameter, Model, ResourceID, Text, TextStyle},
fields::BoxField,
node::NodeType,
spatial::Spatial,
@@ -62,9 +62,10 @@ pub struct ProtoStar {
grabbable: Grabbable,
field: BoxField,
icon: Model,
label: Option<Text>,
grabbable_shrink: Option<Tweener<f32, f64, QuartInOut>>,
grabbable_grow: Option<Tweener<f32, f64, QuartInOut>>,
grabbabe_move: Option<Tweener<f32, f64, QuartInOut>>,
grabbable_move: Option<Tweener<f32, f64, QuartInOut>>,
execute_command: String,
currently_shown: bool,
}
@@ -98,6 +99,7 @@ impl ProtoStar {
Self::new_raw(
parent,
position,
desktop_file.name.as_deref(),
icon,
desktop_file.command.ok_or_else(|| eyre!("No command"))?,
)
@@ -105,6 +107,7 @@ impl ProtoStar {
pub fn new_raw(
parent: &Spatial,
position: impl Into<Vector3<f32>>,
name: Option<&str>,
icon: Option<Icon>,
execute_command: String,
) -> Result<Self> {
@@ -139,31 +142,50 @@ impl ProtoStar {
&ResourceID::new_namespaced("protostar", "hexagon/hexagon"),
)?)
})?;
let label_style = TextStyle {
character_height: 0.15,
bounds: None,
text_align: Alignment::Center.into(),
..Default::default()
};
let label = name.and_then(|name| {
Text::create(
&icon,
Transform::from_position_rotation(
[0.0, 0.05, -0.6],
Quat::from_rotation_x(PI * 0.5),
),
name,
label_style,
)
.ok()
});
Ok(ProtoStar {
client: parent.client()?,
position,
grabbable,
field,
label,
icon,
grabbable_shrink: None,
grabbable_grow: None,
execute_command,
currently_shown: true,
grabbabe_move: None,
grabbable_move: None,
})
}
pub fn content_parent(&self) -> &Spatial {
self.grabbable.content_parent()
}
pub fn toggle(&mut self) {
self.grabbable.set_enabled(!self.currently_shown).unwrap();
if self.currently_shown {
self.grabbabe_move = Some(Tweener::quart_in_out(1.0, 0.0001, 0.25)); //TODO make the scale a parameter
self.grabbable_move = Some(Tweener::quart_in_out(1.0, 0.0001, 0.25)); //TODO make the scale a parameter
} else {
self.grabbable
.content_parent()
.set_scale(None, Vector3::from([1.0; 3]))
.unwrap();
self.grabbabe_move = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25));
self.icon.set_enabled(true).unwrap();
self.label.as_ref().map(|l| l.set_enabled(true).unwrap());
self.grabbable_move = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25));
}
self.currently_shown = !self.currently_shown;
}
@@ -172,9 +194,9 @@ impl RootHandler for ProtoStar {
fn frame(&mut self, info: FrameInfo) {
self.grabbable.update(&info);
if let Some(grabbabe_move) = &mut self.grabbabe_move {
if !grabbabe_move.is_finished() {
let scale = grabbabe_move.move_by(info.delta);
if let Some(grabbable_move) = &mut self.grabbable_move {
if !grabbable_move.is_finished() {
let scale = grabbable_move.move_by(info.delta);
self.grabbable
.content_parent()
.set_position(
@@ -187,13 +209,11 @@ impl RootHandler for ProtoStar {
)
.unwrap();
} else {
if grabbabe_move.final_value() == 0.0001 {
self.grabbable
.content_parent()
.set_scale(None, Vector3::from([0.001; 3]))
.unwrap();
if grabbable_move.final_value() == 0.0001 {
self.icon.set_enabled(false).unwrap();
self.label.as_ref().map(|l| l.set_enabled(false).unwrap());
}
self.grabbabe_move = None;
self.grabbable_move = None;
}
}
if let Some(grabbable_shrink) = &mut self.grabbable_shrink {

View File

@@ -195,7 +195,9 @@ impl DesktopFile {
let cache_icon_path = get_image_cache_dir().join(icon_name).canonicalize();
if cache_icon_path.is_ok() {
return vec![Icon::from_path(cache_icon_path.unwrap(), 128).unwrap()];
if let Some(icon) = Icon::from_path(cache_icon_path.unwrap(), 128) {
return vec![icon];
}
}
let mut icons_iter = linicon::lookup_icon(icon_name)
@@ -232,12 +234,11 @@ pub enum IconType {
impl Icon {
pub fn from_path(path: PathBuf, size: u16) -> Option<Icon> {
let icon_type = match path.extension().and_then(|ext| ext.to_str()) {
Some("png") => Some(IconType::Png),
Some("svg") => Some(IconType::Svg),
Some("glb") | Some("gltf") => Some(IconType::Gltf),
Some("png") => IconType::Png,
Some("svg") => IconType::Svg,
Some("glb") | Some("gltf") => IconType::Gltf,
_ => return None,
}
.unwrap();
};
return Some(Icon {
icon_type,
path,