Compare commits
1 commit
8ff523d50c
...
8ad53e456f
Author | SHA1 | Date | |
---|---|---|---|
8ad53e456f |
5 changed files with 96 additions and 90 deletions
|
@ -54,10 +54,10 @@ pub struct ButtonInfo {
|
||||||
background_fill_type: DisplayableFillType,
|
background_fill_type: DisplayableFillType,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub click_sound: Option<AssetPath>,
|
pub click_sound: AssetPath,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub hover_sound: Option<AssetPath>,
|
pub hover_sound: AssetPath,
|
||||||
|
|
||||||
pub text: RwLock<String>,
|
pub text: RwLock<String>,
|
||||||
pub text_color: Color,
|
pub text_color: Color,
|
||||||
|
@ -98,12 +98,16 @@ impl ButtonInfo {
|
||||||
background_fill_type: DisplayableFillType::Expand,
|
background_fill_type: DisplayableFillType::Expand,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
click_sound: Self::find_click_sound(grid)
|
click_sound: match Self::find_click_sound(grid) {
|
||||||
.or(gui_handler.click_sound().map(|p| p.clone())),
|
Some(sound) => sound,
|
||||||
|
None => gui_handler.click_sound().clone(),
|
||||||
|
},
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
hover_sound: Self::find_hover_sound(grid)
|
hover_sound: match Self::find_hover_sound(grid) {
|
||||||
.or(gui_handler.hover_sound().map(|p| p.clone())),
|
Some(sound) => sound,
|
||||||
|
None => gui_handler.hover_sound().clone(),
|
||||||
|
},
|
||||||
|
|
||||||
text: RwLock::default(),
|
text: RwLock::default(),
|
||||||
text_color: Color::Black,
|
text_color: Color::Black,
|
||||||
|
@ -139,10 +143,10 @@ impl ButtonInfo {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
b"click_sound" => button_info.click_sound = Some(cow_to_path(attribute.value)),
|
b"click_sound" => button_info.click_sound = cow_to_path(attribute.value),
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
b"hover_sound" => button_info.hover_sound = Some(cow_to_path(attribute.value)),
|
b"hover_sound" => button_info.hover_sound = cow_to_path(attribute.value),
|
||||||
|
|
||||||
b"select_mode" => {
|
b"select_mode" => {
|
||||||
button_info.select_mode = cow_to_button_select_mode(attribute.value)?
|
button_info.select_mode = cow_to_button_select_mode(attribute.value)?
|
||||||
|
@ -172,7 +176,7 @@ impl ButtonInfo {
|
||||||
return Err(anyhow::Error::msg(format!(
|
return Err(anyhow::Error::msg(format!(
|
||||||
"Unsupported attribute in Button: {}",
|
"Unsupported attribute in Button: {}",
|
||||||
from_utf8(attribute.key.into_inner())?
|
from_utf8(attribute.key.into_inner())?
|
||||||
)));
|
)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,23 +3,23 @@ use crate::{
|
||||||
gui_handler::gui::iconizable::IconizablePositioning, prelude::*,
|
gui_handler::gui::iconizable::IconizablePositioning, prelude::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::Result;
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
use utilities::prelude::*;
|
use utilities::prelude::*;
|
||||||
use vulkan_rs::prelude::*;
|
use vulkan_rs::prelude::*;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
IconBuilderType,
|
|
||||||
fill_type::{FillType, InnerFillType},
|
fill_type::{FillType, InnerFillType},
|
||||||
wrapper::{IconizableWrapper, TextableWrapper},
|
wrapper::{IconizableWrapper, TextableWrapper},
|
||||||
|
IconBuilderType,
|
||||||
};
|
};
|
||||||
use cgmath::{vec2, vec4};
|
use cgmath::{vec2, vec4};
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
ops::Deref,
|
ops::Deref,
|
||||||
sync::{
|
sync::{
|
||||||
Arc, Mutex,
|
|
||||||
atomic::{AtomicBool, Ordering::SeqCst},
|
atomic::{AtomicBool, Ordering::SeqCst},
|
||||||
|
Arc, Mutex,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -121,14 +121,18 @@ impl ButtonBuilder {
|
||||||
|
|
||||||
let normal = FillType::new(
|
let normal = FillType::new(
|
||||||
framable.clone(),
|
framable.clone(),
|
||||||
self.normal
|
match self.normal {
|
||||||
.ok_or(anyhow!("normal button layout not set!"))?,
|
Some(info) => info,
|
||||||
|
None => FillTypeInfo::from(gui_handler.menu_button().clone()),
|
||||||
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let selected = FillType::new(
|
let selected = FillType::new(
|
||||||
framable.clone(),
|
framable.clone(),
|
||||||
self.selected
|
match self.selected {
|
||||||
.ok_or(anyhow!("selected button layout not set!"))?,
|
Some(info) => info,
|
||||||
|
None => FillTypeInfo::from(gui_handler.menu_button_selected().clone()),
|
||||||
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let click_executable = Executable::new(&gui_handler);
|
let click_executable = Executable::new(&gui_handler);
|
||||||
|
@ -389,13 +393,13 @@ impl Button {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
if let Some(click_sound) = &button_info.click_sound {
|
if !button_info.click_sound.is_empty() {
|
||||||
button_builder = button_builder.set_click_sound(click_sound.clone());
|
button_builder = button_builder.set_click_sound(button_info.click_sound.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
if let Some(hover_sound) = &button_info.hover_sound {
|
if !button_info.hover_sound.is_empty() {
|
||||||
button_builder = button_builder.set_hover_sound(hover_sound.clone());
|
button_builder = button_builder.set_hover_sound(button_info.hover_sound.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
button_builder = button_builder.set_icon(
|
button_builder = button_builder.set_icon(
|
||||||
|
@ -404,10 +408,7 @@ impl Button {
|
||||||
.clone()
|
.clone()
|
||||||
.map(|icon| {
|
.map(|icon| {
|
||||||
Image::from_file(AssetPath::from((
|
Image::from_file(AssetPath::from((
|
||||||
gui_handler
|
gui_handler.resource_base_path().full_path(),
|
||||||
.resource_base_path()
|
|
||||||
.ok_or(anyhow!("resource base path not set!"))?
|
|
||||||
.full_path(),
|
|
||||||
icon,
|
icon,
|
||||||
)))?
|
)))?
|
||||||
.attach_sampler(Sampler::nearest_sampler().build(gui_handler.device())?)
|
.attach_sampler(Sampler::nearest_sampler().build(gui_handler.device())?)
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 61 KiB |
|
@ -1,7 +1,7 @@
|
||||||
//! `Audible` is a property to play a sound
|
//! `Audible` is a property to play a sound
|
||||||
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::Result;
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
|
|
||||||
// #[cfg(feature = "audio")]
|
// #[cfg(feature = "audio")]
|
||||||
|
@ -18,12 +18,7 @@ pub struct Audible {
|
||||||
impl Audible {
|
impl Audible {
|
||||||
pub fn new(gui_handler: Arc<GuiHandler>, mut path: AssetPath) -> Result<Arc<Self>> {
|
pub fn new(gui_handler: Arc<GuiHandler>, mut path: AssetPath) -> Result<Arc<Self>> {
|
||||||
if !path.has_prefix() {
|
if !path.has_prefix() {
|
||||||
path.set_prefix(
|
path.set_prefix(&gui_handler.resource_base_path().full_path());
|
||||||
&gui_handler
|
|
||||||
.resource_base_path()
|
|
||||||
.ok_or(anyhow!("resource base path not set!"))?
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use anyhow::{Result, anyhow};
|
use anyhow::Result;
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use utilities::{impl_reprc, prelude::*};
|
use utilities::{impl_reprc, prelude::*};
|
||||||
|
@ -35,36 +35,44 @@ impl Default for Font<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Clone, Debug)]
|
#[derive(Deserialize, Serialize, Clone, Debug, Default)]
|
||||||
pub struct GuiHandlerCreateInfo<'a> {
|
pub struct GuiHandlerCreateInfo<'a> {
|
||||||
|
// default button textures
|
||||||
|
pub menu_button: AssetPath,
|
||||||
|
pub menu_button_selected: AssetPath,
|
||||||
|
|
||||||
// path to the alphabet image
|
// path to the alphabet image
|
||||||
#[serde(borrow)]
|
#[serde(borrow)]
|
||||||
pub font: Font<'a>,
|
pub font: Font<'a>,
|
||||||
|
|
||||||
// sound info
|
// sound info
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub click_sound: Option<AssetPath>,
|
pub click_sound: AssetPath,
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub hover_sound: Option<AssetPath>,
|
pub hover_sound: AssetPath,
|
||||||
|
|
||||||
// resource base directory
|
// resource base directory
|
||||||
pub resource_directory: Option<AssetPath>,
|
pub resource_directory: AssetPath,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> GuiHandlerCreateInfo<'a> {
|
impl<'a> GuiHandlerCreateInfo<'a> {
|
||||||
pub const fn new() -> Self {
|
pub const fn new() -> Self {
|
||||||
GuiHandlerCreateInfo {
|
GuiHandlerCreateInfo {
|
||||||
|
// default button textures
|
||||||
|
menu_button: AssetPath::new(),
|
||||||
|
menu_button_selected: AssetPath::new(),
|
||||||
|
|
||||||
// path to the alphabet image
|
// path to the alphabet image
|
||||||
font: Font::Bytes(include_bytes!("default_font.png")),
|
font: Font::Path(AssetPath::new()),
|
||||||
|
|
||||||
// sound info
|
// sound info
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
click_sound: None,
|
click_sound: AssetPath::new(),
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
hover_sound: None,
|
hover_sound: AssetPath::new(),
|
||||||
|
|
||||||
// resource base directory
|
// resource base directory
|
||||||
resource_directory: None,
|
resource_directory: AssetPath::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,7 +197,7 @@ pub struct GuiHandler {
|
||||||
width: AtomicU32,
|
width: AtomicU32,
|
||||||
height: AtomicU32,
|
height: AtomicU32,
|
||||||
|
|
||||||
resource_base_path: Option<AssetPath>,
|
resource_base_path: AssetPath,
|
||||||
|
|
||||||
top_ui: RwLock<Option<Arc<dyn TopGui>>>,
|
top_ui: RwLock<Option<Arc<dyn TopGui>>>,
|
||||||
tooltip_ui: RwLock<Option<Arc<dyn TopGui>>>,
|
tooltip_ui: RwLock<Option<Arc<dyn TopGui>>>,
|
||||||
|
@ -224,11 +232,14 @@ pub struct GuiHandler {
|
||||||
|
|
||||||
on_selected: RwLock<Option<Box<dyn Fn() -> Result<()> + Send + Sync>>>,
|
on_selected: RwLock<Option<Box<dyn Fn() -> Result<()> + Send + Sync>>>,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
menu_button: AssetPath,
|
||||||
click_sound: Option<AssetPath>,
|
menu_button_selected: AssetPath,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
hover_sound: Option<AssetPath>,
|
click_sound: AssetPath,
|
||||||
|
|
||||||
|
#[cfg(feature = "audio")]
|
||||||
|
hover_sound: AssetPath,
|
||||||
|
|
||||||
// ----- gui handling -----
|
// ----- gui handling -----
|
||||||
layers: Mutex<Vec<(i32, Elements)>>,
|
layers: Mutex<Vec<(i32, Elements)>>,
|
||||||
|
@ -285,7 +296,7 @@ impl GuiHandler {
|
||||||
}
|
}
|
||||||
._descriptor_layout
|
._descriptor_layout
|
||||||
.clone(),
|
.clone(),
|
||||||
gui_handler_create_info.font,
|
gui_handler_create_info.font.clone(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
let icon_descriptor_layout = DescriptorSetLayout::builder()
|
let icon_descriptor_layout = DescriptorSetLayout::builder()
|
||||||
|
@ -304,31 +315,36 @@ impl GuiHandler {
|
||||||
width: AtomicU32::new(context.width()),
|
width: AtomicU32::new(context.width()),
|
||||||
height: AtomicU32::new(context.height()),
|
height: AtomicU32::new(context.height()),
|
||||||
|
|
||||||
|
menu_button: {
|
||||||
|
let mut menu_button = gui_handler_create_info.menu_button;
|
||||||
|
menu_button.set_prefix(&gui_handler_create_info.resource_directory.full_path());
|
||||||
|
|
||||||
|
menu_button
|
||||||
|
},
|
||||||
|
|
||||||
|
menu_button_selected: {
|
||||||
|
let mut menu_button_selected = gui_handler_create_info.menu_button_selected;
|
||||||
|
menu_button_selected
|
||||||
|
.set_prefix(&gui_handler_create_info.resource_directory.full_path());
|
||||||
|
|
||||||
|
menu_button_selected
|
||||||
|
},
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
click_sound: gui_handler_create_info.click_sound.map(|mut click_sound| {
|
click_sound: {
|
||||||
click_sound.set_prefix(
|
let mut click_sound = gui_handler_create_info.click_sound;
|
||||||
&gui_handler_create_info
|
click_sound.set_prefix(&gui_handler_create_info.resource_directory.full_path());
|
||||||
.resource_directory
|
|
||||||
.as_ref()
|
|
||||||
.expect("missing resource directory")
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
|
|
||||||
click_sound
|
click_sound
|
||||||
}),
|
},
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
hover_sound: gui_handler_create_info.hover_sound.map(|mut hover_sound| {
|
hover_sound: {
|
||||||
hover_sound.set_prefix(
|
let mut hover_sound = gui_handler_create_info.hover_sound;
|
||||||
&gui_handler_create_info
|
hover_sound.set_prefix(&gui_handler_create_info.resource_directory.full_path());
|
||||||
.resource_directory
|
|
||||||
.as_ref()
|
|
||||||
.expect("missing resource directory")
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
|
|
||||||
hover_sound
|
hover_sound
|
||||||
}),
|
},
|
||||||
|
|
||||||
resource_base_path: gui_handler_create_info.resource_directory,
|
resource_base_path: gui_handler_create_info.resource_directory,
|
||||||
|
|
||||||
|
@ -435,13 +451,7 @@ impl GuiHandler {
|
||||||
Some(image) => Ok(image),
|
Some(image) => Ok(image),
|
||||||
None => {
|
None => {
|
||||||
if !path.has_prefix() {
|
if !path.has_prefix() {
|
||||||
path.set_prefix(
|
path.set_prefix(&self.resource_base_path().full_path());
|
||||||
&self
|
|
||||||
.resource_base_path
|
|
||||||
.as_ref()
|
|
||||||
.ok_or(anyhow!("resource base path not set!"))?
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let image = Image::from_file(path)?
|
let image = Image::from_file(path)?
|
||||||
|
@ -456,13 +466,7 @@ impl GuiHandler {
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
if !path.has_prefix() {
|
if !path.has_prefix() {
|
||||||
path.set_prefix(
|
path.set_prefix(&self.resource_base_path().full_path());
|
||||||
&self
|
|
||||||
.resource_base_path
|
|
||||||
.as_ref()
|
|
||||||
.ok_or(anyhow!("resource base path not set!"))?
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let image = Image::from_file(path.clone())?
|
let image = Image::from_file(path.clone())?
|
||||||
|
@ -509,13 +513,7 @@ impl GuiHandler {
|
||||||
|
|
||||||
pub(crate) fn displayable_image_from_path(&self, mut path: AssetPath) -> Result<Arc<Image>> {
|
pub(crate) fn displayable_image_from_path(&self, mut path: AssetPath) -> Result<Arc<Image>> {
|
||||||
if !path.has_prefix() {
|
if !path.has_prefix() {
|
||||||
path.set_prefix(
|
path.set_prefix(&self.resource_base_path.full_path());
|
||||||
&self
|
|
||||||
.resource_base_path
|
|
||||||
.as_ref()
|
|
||||||
.ok_or(anyhow!("resource base path not set!"))?
|
|
||||||
.full_path(),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.internal_textures.read().unwrap().contains_key(&path) {
|
if self.internal_textures.read().unwrap().contains_key(&path) {
|
||||||
|
@ -587,18 +585,26 @@ impl GuiHandler {
|
||||||
*self.ortho.read().unwrap()
|
*self.ortho.read().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn resource_base_path(&self) -> Option<&AssetPath> {
|
pub(crate) fn resource_base_path(&self) -> &AssetPath {
|
||||||
self.resource_base_path.as_ref()
|
&self.resource_base_path
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn menu_button(&self) -> &AssetPath {
|
||||||
|
&self.menu_button
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn menu_button_selected(&self) -> &AssetPath {
|
||||||
|
&self.menu_button_selected
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub fn click_sound(&self) -> Option<&AssetPath> {
|
pub fn click_sound(&self) -> &AssetPath {
|
||||||
self.click_sound.as_ref()
|
&self.click_sound
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub fn hover_sound(&self) -> Option<&AssetPath> {
|
pub fn hover_sound(&self) -> &AssetPath {
|
||||||
self.hover_sound.as_ref()
|
&self.hover_sound
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_on_selected_event<F>(&self, f: F) -> Result<()>
|
pub fn set_on_selected_event<F>(&self, f: F) -> Result<()>
|
||||||
|
|
Loading…
Reference in a new issue