Add fill type concept
This commit is contained in:
parent
8731bf1f7e
commit
ed3c470716
12 changed files with 170 additions and 52 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::guihandler::gui::displayable::DisplayableFillType;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use utilities::prelude::*;
|
use utilities::prelude::*;
|
||||||
|
@ -13,7 +14,8 @@ use std::str::from_utf8;
|
||||||
use std::sync::{Arc, RwLock, Weak};
|
use std::sync::{Arc, RwLock, Weak};
|
||||||
|
|
||||||
use super::validator::{
|
use super::validator::{
|
||||||
cow_to_button_select_mode, cow_to_fill_type, cow_to_str, cow_to_text_alignment, str_into,
|
cow_to_button_select_mode, cow_to_fill_type, cow_to_fill_type_info, cow_to_str,
|
||||||
|
cow_to_text_alignment, str_into,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
|
@ -48,6 +50,8 @@ pub struct ButtonInfo {
|
||||||
pub normal: Option<FillTypeInfo>,
|
pub normal: Option<FillTypeInfo>,
|
||||||
pub selected: Option<FillTypeInfo>,
|
pub selected: Option<FillTypeInfo>,
|
||||||
|
|
||||||
|
background_fill_type: DisplayableFillType,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
pub click_sound: AssetPath,
|
pub click_sound: AssetPath,
|
||||||
|
|
||||||
|
@ -89,6 +93,7 @@ impl ButtonInfo {
|
||||||
|
|
||||||
normal: Self::find_menu_button(grid),
|
normal: Self::find_menu_button(grid),
|
||||||
selected: Self::find_menu_button_selected(grid),
|
selected: Self::find_menu_button_selected(grid),
|
||||||
|
background_fill_type: DisplayableFillType::Expand,
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
click_sound: match Self::find_click_sound(grid) {
|
click_sound: match Self::find_click_sound(grid) {
|
||||||
|
@ -128,8 +133,11 @@ impl ButtonInfo {
|
||||||
b"y_slot" => button_info.y_slot.set(str_into(attribute.value)?),
|
b"y_slot" => button_info.y_slot.set(str_into(attribute.value)?),
|
||||||
b"x_size" => button_info.x_dim = str_into(attribute.value)?,
|
b"x_size" => button_info.x_dim = str_into(attribute.value)?,
|
||||||
b"y_size" => button_info.y_dim = str_into(attribute.value)?,
|
b"y_size" => button_info.y_dim = str_into(attribute.value)?,
|
||||||
b"normal" => button_info.normal = Some(cow_to_fill_type(attribute.value)),
|
b"normal" => button_info.normal = Some(cow_to_fill_type_info(attribute.value)),
|
||||||
b"selected" => button_info.selected = Some(cow_to_fill_type(attribute.value)),
|
b"selected" => button_info.selected = Some(cow_to_fill_type_info(attribute.value)),
|
||||||
|
b"fill_type" => {
|
||||||
|
button_info.background_fill_type = cow_to_fill_type(attribute.value)?;
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "audio")]
|
#[cfg(feature = "audio")]
|
||||||
b"click_sound" => button_info.click_sound = cow_to_path(attribute.value),
|
b"click_sound" => button_info.click_sound = cow_to_path(attribute.value),
|
||||||
|
@ -169,6 +177,30 @@ impl ButtonInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(background_type) = &mut button_info.normal {
|
||||||
|
match background_type {
|
||||||
|
FillTypeInfo::Image(_, fill_type) => {
|
||||||
|
*fill_type = button_info.background_fill_type;
|
||||||
|
}
|
||||||
|
FillTypeInfo::Color(_) => (),
|
||||||
|
FillTypeInfo::Element(_, fill_type) => {
|
||||||
|
*fill_type = button_info.background_fill_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(background_type) = &mut button_info.selected {
|
||||||
|
match background_type {
|
||||||
|
FillTypeInfo::Image(_, fill_type) => {
|
||||||
|
*fill_type = button_info.background_fill_type;
|
||||||
|
}
|
||||||
|
FillTypeInfo::Color(_) => (),
|
||||||
|
FillTypeInfo::Element(_, fill_type) => {
|
||||||
|
*fill_type = button_info.background_fill_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(button_info)
|
Ok(button_info)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ use std::sync::{RwLock, Weak};
|
||||||
|
|
||||||
use super::mandatory::Mandatory;
|
use super::mandatory::Mandatory;
|
||||||
use super::validator::{
|
use super::validator::{
|
||||||
cow_to_fill_type, cow_to_path, cow_to_str, str_into, str_to_hori_align, str_to_vert_align,
|
cow_to_fill_type_info, cow_to_path, cow_to_str, str_into, str_to_hori_align, str_to_vert_align,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct GridInfo {
|
pub struct GridInfo {
|
||||||
|
@ -108,13 +108,13 @@ impl GridInfo {
|
||||||
.horizontal_alignment
|
.horizontal_alignment
|
||||||
.set(str_to_hori_align(attribute.value)?),
|
.set(str_to_hori_align(attribute.value)?),
|
||||||
b"background" => {
|
b"background" => {
|
||||||
grid_info.background_type = Some(cow_to_fill_type(attribute.value))
|
grid_info.background_type = Some(cow_to_fill_type_info(attribute.value))
|
||||||
}
|
}
|
||||||
b"button_normal" => {
|
b"button_normal" => {
|
||||||
grid_info.button_normal = Some(cow_to_fill_type(attribute.value))
|
grid_info.button_normal = Some(cow_to_fill_type_info(attribute.value))
|
||||||
}
|
}
|
||||||
b"button_selected" => {
|
b"button_selected" => {
|
||||||
grid_info.button_selected = Some(cow_to_fill_type(attribute.value))
|
grid_info.button_selected = Some(cow_to_fill_type_info(attribute.value))
|
||||||
}
|
}
|
||||||
b"click_sound" => {
|
b"click_sound" => {
|
||||||
grid_info.click_sound = Some(cow_to_path(attribute.value));
|
grid_info.click_sound = Some(cow_to_path(attribute.value));
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::guihandler::gui::displayable::DisplayableFillType;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
|
@ -12,7 +13,9 @@ use std::{
|
||||||
sync::{Arc, RwLock, Weak},
|
sync::{Arc, RwLock, Weak},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::validator::{cow_to_fill_type, cow_to_path, cow_to_str, str_into};
|
use super::validator::{
|
||||||
|
cow_to_fill_type, cow_to_fill_type_info, cow_to_path, cow_to_str, str_into,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct IconInfo {
|
pub struct IconInfo {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -27,6 +30,7 @@ pub struct IconInfo {
|
||||||
pub margin: Option<u32>,
|
pub margin: Option<u32>,
|
||||||
|
|
||||||
pub background_type: Option<FillTypeInfo>,
|
pub background_type: Option<FillTypeInfo>,
|
||||||
|
background_fill_type: DisplayableFillType,
|
||||||
|
|
||||||
pub text_ratio: Option<f32>,
|
pub text_ratio: Option<f32>,
|
||||||
pub text: RwLock<String>,
|
pub text: RwLock<String>,
|
||||||
|
@ -53,6 +57,7 @@ impl IconInfo {
|
||||||
margin: None,
|
margin: None,
|
||||||
|
|
||||||
background_type: None,
|
background_type: None,
|
||||||
|
background_fill_type: DisplayableFillType::Expand,
|
||||||
|
|
||||||
text_ratio: None,
|
text_ratio: None,
|
||||||
text: RwLock::new(String::new()),
|
text: RwLock::new(String::new()),
|
||||||
|
@ -73,7 +78,10 @@ impl IconInfo {
|
||||||
b"icon" => icon_info.icon = Some(cow_to_path(attribute.value)),
|
b"icon" => icon_info.icon = Some(cow_to_path(attribute.value)),
|
||||||
b"margin" => icon_info.margin = Some(str_into(attribute.value)?),
|
b"margin" => icon_info.margin = Some(str_into(attribute.value)?),
|
||||||
b"background" => {
|
b"background" => {
|
||||||
icon_info.background_type = Some(cow_to_fill_type(attribute.value))
|
icon_info.background_type = Some(cow_to_fill_type_info(attribute.value))
|
||||||
|
}
|
||||||
|
b"fill_type" => {
|
||||||
|
icon_info.background_fill_type = cow_to_fill_type(attribute.value)?;
|
||||||
}
|
}
|
||||||
b"text_color" => {
|
b"text_color" => {
|
||||||
let text = cow_to_str(attribute.value);
|
let text = cow_to_str(attribute.value);
|
||||||
|
@ -89,6 +97,18 @@ impl IconInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(background_type) = &mut icon_info.background_type {
|
||||||
|
match background_type {
|
||||||
|
FillTypeInfo::Image(_, fill_type) => {
|
||||||
|
*fill_type = icon_info.background_fill_type;
|
||||||
|
}
|
||||||
|
FillTypeInfo::Color(_) => (),
|
||||||
|
FillTypeInfo::Element(_, fill_type) => {
|
||||||
|
*fill_type = icon_info.background_fill_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(icon_info)
|
Ok(icon_info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ use std::convert::TryFrom;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use std::sync::{Arc, RwLock, Weak};
|
use std::sync::{Arc, RwLock, Weak};
|
||||||
|
|
||||||
use super::validator::{cow_to_fill_type, cow_to_str, cow_to_text_alignment, str_into};
|
use super::validator::{cow_to_fill_type_info, cow_to_str, cow_to_text_alignment, str_into};
|
||||||
|
|
||||||
pub struct LabelInfo {
|
pub struct LabelInfo {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -72,7 +72,7 @@ impl LabelInfo {
|
||||||
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
||||||
}
|
}
|
||||||
b"background" => {
|
b"background" => {
|
||||||
label_info.background_type = Some(cow_to_fill_type(attribute.value));
|
label_info.background_type = Some(cow_to_fill_type_info(attribute.value));
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(anyhow::Error::msg(format!(
|
return Err(anyhow::Error::msg(format!(
|
||||||
|
|
|
@ -9,7 +9,7 @@ use std::convert::TryFrom;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use std::sync::{Arc, RwLock, Weak};
|
use std::sync::{Arc, RwLock, Weak};
|
||||||
|
|
||||||
use super::validator::{cow_to_fill_type, cow_to_str, cow_to_text_alignment, str_into};
|
use super::validator::{cow_to_fill_type_info, cow_to_str, cow_to_text_alignment, str_into};
|
||||||
|
|
||||||
pub struct MultiLineLabelInfo {
|
pub struct MultiLineLabelInfo {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -77,7 +77,7 @@ impl MultiLineLabelInfo {
|
||||||
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
||||||
}
|
}
|
||||||
b"background" => {
|
b"background" => {
|
||||||
label_info.background_type = Some(cow_to_fill_type(attribute.value));
|
label_info.background_type = Some(cow_to_fill_type_info(attribute.value));
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(anyhow::Error::msg(format!(
|
return Err(anyhow::Error::msg(format!(
|
||||||
|
|
|
@ -9,7 +9,7 @@ use std::convert::TryFrom;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use std::sync::{Arc, RwLock, Weak};
|
use std::sync::{Arc, RwLock, Weak};
|
||||||
|
|
||||||
use super::validator::{cow_to_fill_type, cow_to_str, cow_to_text_alignment, str_into};
|
use super::validator::{cow_to_fill_type_info, cow_to_str, cow_to_text_alignment, str_into};
|
||||||
|
|
||||||
pub struct MultiLineTextFieldInfo {
|
pub struct MultiLineTextFieldInfo {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -77,7 +77,7 @@ impl MultiLineTextFieldInfo {
|
||||||
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
label_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
||||||
}
|
}
|
||||||
b"background" => {
|
b"background" => {
|
||||||
label_info.background_type = Some(cow_to_fill_type(attribute.value));
|
label_info.background_type = Some(cow_to_fill_type_info(attribute.value));
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(anyhow::Error::msg(format!(
|
return Err(anyhow::Error::msg(format!(
|
||||||
|
|
|
@ -12,7 +12,7 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::validator::{
|
use super::validator::{
|
||||||
cow_to_fill_type, cow_to_grow_direction, cow_to_str, cow_to_text_alignment, str_into,
|
cow_to_fill_type_info, cow_to_grow_direction, cow_to_str, cow_to_text_alignment, str_into,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct ProgressBarInfo {
|
pub struct ProgressBarInfo {
|
||||||
|
@ -72,10 +72,10 @@ impl ProgressBarInfo {
|
||||||
b"x_size" => progress_bar_info.x_dim = str_into(attribute.value)?,
|
b"x_size" => progress_bar_info.x_dim = str_into(attribute.value)?,
|
||||||
b"y_size" => progress_bar_info.y_dim = str_into(attribute.value)?,
|
b"y_size" => progress_bar_info.y_dim = str_into(attribute.value)?,
|
||||||
b"background" => {
|
b"background" => {
|
||||||
progress_bar_info.background = Some(cow_to_fill_type(attribute.value))
|
progress_bar_info.background = Some(cow_to_fill_type_info(attribute.value))
|
||||||
}
|
}
|
||||||
b"foreground" => {
|
b"foreground" => {
|
||||||
progress_bar_info.foreground = Some(cow_to_fill_type(attribute.value))
|
progress_bar_info.foreground = Some(cow_to_fill_type_info(attribute.value))
|
||||||
}
|
}
|
||||||
b"direction" => {
|
b"direction" => {
|
||||||
progress_bar_info.direction = Some(cow_to_grow_direction(attribute.value)?)
|
progress_bar_info.direction = Some(cow_to_grow_direction(attribute.value)?)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::guihandler::gui::displayable::DisplayableFillType;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use utilities::prelude::*;
|
use utilities::prelude::*;
|
||||||
|
@ -9,7 +10,9 @@ use std::convert::TryFrom;
|
||||||
use std::str::from_utf8;
|
use std::str::from_utf8;
|
||||||
use std::sync::{Arc, RwLock, Weak};
|
use std::sync::{Arc, RwLock, Weak};
|
||||||
|
|
||||||
use super::validator::{cow_to_fill_type, cow_to_str, cow_to_text_alignment, str_into};
|
use super::validator::{
|
||||||
|
cow_to_fill_type, cow_to_fill_type_info, cow_to_str, cow_to_text_alignment, str_into,
|
||||||
|
};
|
||||||
|
|
||||||
pub struct TextFieldInfo {
|
pub struct TextFieldInfo {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
@ -26,6 +29,7 @@ pub struct TextFieldInfo {
|
||||||
pub text_alignment: TextAlignment,
|
pub text_alignment: TextAlignment,
|
||||||
|
|
||||||
pub background_type: Option<FillTypeInfo>,
|
pub background_type: Option<FillTypeInfo>,
|
||||||
|
background_fill_type: DisplayableFillType,
|
||||||
|
|
||||||
pub parent: Weak<GridInfo>,
|
pub parent: Weak<GridInfo>,
|
||||||
}
|
}
|
||||||
|
@ -50,6 +54,7 @@ impl TextFieldInfo {
|
||||||
text_alignment: TextAlignment::default(),
|
text_alignment: TextAlignment::default(),
|
||||||
|
|
||||||
background_type: None,
|
background_type: None,
|
||||||
|
background_fill_type: DisplayableFillType::Expand,
|
||||||
|
|
||||||
parent: Arc::downgrade(grid),
|
parent: Arc::downgrade(grid),
|
||||||
};
|
};
|
||||||
|
@ -69,7 +74,10 @@ impl TextFieldInfo {
|
||||||
}
|
}
|
||||||
b"text_ratio" => text_field_info.text_ratio = Some(str_into(attribute.value)?),
|
b"text_ratio" => text_field_info.text_ratio = Some(str_into(attribute.value)?),
|
||||||
b"background" => {
|
b"background" => {
|
||||||
text_field_info.background_type = Some(cow_to_fill_type(attribute.value));
|
text_field_info.background_type = Some(cow_to_fill_type_info(attribute.value));
|
||||||
|
}
|
||||||
|
b"fill_type" => {
|
||||||
|
text_field_info.background_fill_type = cow_to_fill_type(attribute.value)?;
|
||||||
}
|
}
|
||||||
b"text_alignment" => {
|
b"text_alignment" => {
|
||||||
text_field_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
text_field_info.text_alignment = cow_to_text_alignment(attribute.value)?
|
||||||
|
@ -83,6 +91,18 @@ impl TextFieldInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(background_type) = &mut text_field_info.background_type {
|
||||||
|
match background_type {
|
||||||
|
FillTypeInfo::Image(_, fill_type) => {
|
||||||
|
*fill_type = text_field_info.background_fill_type;
|
||||||
|
}
|
||||||
|
FillTypeInfo::Color(_) => (),
|
||||||
|
FillTypeInfo::Element(_, fill_type) => {
|
||||||
|
*fill_type = text_field_info.background_fill_type;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(text_field_info)
|
Ok(text_field_info)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
|
use crate::guihandler::gui::displayable::DisplayableFillType;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
use anyhow::anyhow;
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
use serde_json::from_str;
|
use serde_json::from_str;
|
||||||
|
@ -510,14 +512,25 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cow_to_fill_type<'a>(cow: Cow<'a, [u8]>) -> FillTypeInfo {
|
pub fn cow_to_fill_type<'a>(cow: Cow<'a, [u8]>) -> Result<DisplayableFillType> {
|
||||||
|
let text = cow_to_str(cow);
|
||||||
|
|
||||||
|
match text.as_str() {
|
||||||
|
"expand" => Ok(DisplayableFillType::Expand),
|
||||||
|
"square" => Ok(DisplayableFillType::Square),
|
||||||
|
|
||||||
|
_ => Err(anyhow!("failed parsing DisplayableFillType from {text}")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cow_to_fill_type_info<'a>(cow: Cow<'a, [u8]>) -> FillTypeInfo {
|
||||||
let text = cow_to_str(cow);
|
let text = cow_to_str(cow);
|
||||||
|
|
||||||
match Color::try_from(text.as_str()) {
|
match Color::try_from(text.as_str()) {
|
||||||
Ok(color) => FillTypeInfo::Color(color),
|
Ok(color) => FillTypeInfo::Color(color),
|
||||||
Err(_) => match from_str(text.as_str()) {
|
Err(_) => match from_str(text.as_str()) {
|
||||||
Ok(descriptor) => FillTypeInfo::Element(descriptor),
|
Ok(descriptor) => FillTypeInfo::Element(descriptor, DisplayableFillType::Expand),
|
||||||
Err(_) => FillTypeInfo::Image(AssetPath::from(text)),
|
Err(_) => FillTypeInfo::Image(AssetPath::from(text), DisplayableFillType::Expand),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
builder::validator::buttoninfo::ButtonInfo, guihandler::gui::iconizable::IconizablePositioning,
|
builder::validator::buttoninfo::ButtonInfo,
|
||||||
|
guihandler::gui::{displayable::DisplayableFillType, iconizable::IconizablePositioning},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,7 +113,10 @@ impl ButtonBuilder {
|
||||||
framable.clone(),
|
framable.clone(),
|
||||||
match self.normal {
|
match self.normal {
|
||||||
Some(info) => info,
|
Some(info) => info,
|
||||||
None => FillTypeInfo::from(gui_handler.menu_button().clone()),
|
None => FillTypeInfo::from((
|
||||||
|
gui_handler.menu_button().clone(),
|
||||||
|
DisplayableFillType::Expand,
|
||||||
|
)),
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
@ -120,7 +124,10 @@ impl ButtonBuilder {
|
||||||
framable.clone(),
|
framable.clone(),
|
||||||
match self.selected {
|
match self.selected {
|
||||||
Some(info) => info,
|
Some(info) => info,
|
||||||
None => FillTypeInfo::from(gui_handler.menu_button_selected().clone()),
|
None => FillTypeInfo::from((
|
||||||
|
gui_handler.menu_button_selected().clone(),
|
||||||
|
DisplayableFillType::Expand,
|
||||||
|
)),
|
||||||
},
|
},
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
use crate::{guihandler::gui::displayable::DisplayableType, prelude::*};
|
use crate::{
|
||||||
|
guihandler::gui::displayable::{DisplayableFillType, DisplayableType},
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use assetpath::AssetPath;
|
use assetpath::AssetPath;
|
||||||
use utilities::prelude::*;
|
use utilities::prelude::*;
|
||||||
|
@ -10,9 +13,9 @@ use std::sync::{
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum FillTypeInfo {
|
pub enum FillTypeInfo {
|
||||||
Image(AssetPath),
|
Image(AssetPath, DisplayableFillType),
|
||||||
Color(Color),
|
Color(Color),
|
||||||
Element(ElementDescriptor),
|
Element(ElementDescriptor, DisplayableFillType),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Color> for FillTypeInfo {
|
impl From<Color> for FillTypeInfo {
|
||||||
|
@ -21,27 +24,27 @@ impl From<Color> for FillTypeInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<String> for FillTypeInfo {
|
impl From<(String, DisplayableFillType)> for FillTypeInfo {
|
||||||
fn from(s: String) -> Self {
|
fn from((s, fill_type): (String, DisplayableFillType)) -> Self {
|
||||||
Self::Image(AssetPath::from(s))
|
Self::Image(AssetPath::from(s), fill_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&str> for FillTypeInfo {
|
impl From<(&str, DisplayableFillType)> for FillTypeInfo {
|
||||||
fn from(s: &str) -> Self {
|
fn from((s, fill_type): (&str, DisplayableFillType)) -> Self {
|
||||||
Self::Image(AssetPath::from(s))
|
Self::Image(AssetPath::from(s), fill_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&String> for FillTypeInfo {
|
impl From<(&String, DisplayableFillType)> for FillTypeInfo {
|
||||||
fn from(s: &String) -> Self {
|
fn from((s, fill_type): (&String, DisplayableFillType)) -> Self {
|
||||||
Self::Image(AssetPath::from(s.as_str()))
|
Self::Image(AssetPath::from(s.as_str()), fill_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AssetPath> for FillTypeInfo {
|
impl From<(AssetPath, DisplayableFillType)> for FillTypeInfo {
|
||||||
fn from(assetpath: AssetPath) -> Self {
|
fn from((assetpath, fill_type): (AssetPath, DisplayableFillType)) -> Self {
|
||||||
Self::Image(assetpath)
|
Self::Image(assetpath, fill_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,12 +56,12 @@ pub(crate) enum InnerFillType {
|
||||||
impl InnerFillType {
|
impl InnerFillType {
|
||||||
pub(crate) fn new(framable: Arc<Framable>, fill_type_info: FillTypeInfo) -> Result<Self> {
|
pub(crate) fn new(framable: Arc<Framable>, fill_type_info: FillTypeInfo) -> Result<Self> {
|
||||||
match fill_type_info {
|
match fill_type_info {
|
||||||
FillTypeInfo::Element(descriptor) => Ok(InnerFillType::Image(Displayable::new(
|
FillTypeInfo::Element(descriptor, fill_type) => Ok(InnerFillType::Image(
|
||||||
framable, descriptor,
|
Displayable::new(framable, descriptor, fill_type)?,
|
||||||
|
)),
|
||||||
|
FillTypeInfo::Image(path, fill_type) => Ok(InnerFillType::Image(Displayable::new(
|
||||||
|
framable, path, fill_type,
|
||||||
)?)),
|
)?)),
|
||||||
FillTypeInfo::Image(path) => {
|
|
||||||
Ok(InnerFillType::Image(Displayable::new(framable, path)?))
|
|
||||||
}
|
|
||||||
FillTypeInfo::Color(color) => {
|
FillTypeInfo::Color(color) => {
|
||||||
Ok(InnerFillType::Color(Colorable::new(framable, color)?))
|
Ok(InnerFillType::Color(Colorable::new(framable, color)?))
|
||||||
}
|
}
|
||||||
|
@ -152,13 +155,13 @@ impl FillType {
|
||||||
impl PartialEq<FillTypeInfo> for FillType {
|
impl PartialEq<FillTypeInfo> for FillType {
|
||||||
fn eq(&self, info: &FillTypeInfo) -> bool {
|
fn eq(&self, info: &FillTypeInfo) -> bool {
|
||||||
match (&self.inner, info) {
|
match (&self.inner, info) {
|
||||||
(InnerFillType::Image(inner_image), FillTypeInfo::Image(info_image)) => {
|
(InnerFillType::Image(inner_image), FillTypeInfo::Image(info_image, _)) => {
|
||||||
match inner_image.inner_type() {
|
match inner_image.inner_type() {
|
||||||
DisplayableType::Path(path) => path == *info_image,
|
DisplayableType::Path(path) => path == *info_image,
|
||||||
DisplayableType::Descriptor(_) => false,
|
DisplayableType::Descriptor(_) => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(InnerFillType::Image(inner_image), FillTypeInfo::Element(info_descriptor)) => {
|
(InnerFillType::Image(inner_image), FillTypeInfo::Element(info_descriptor, _)) => {
|
||||||
match inner_image.inner_type() {
|
match inner_image.inner_type() {
|
||||||
DisplayableType::Path(_) => false,
|
DisplayableType::Path(_) => false,
|
||||||
DisplayableType::Descriptor(descriptor) => descriptor == *info_descriptor,
|
DisplayableType::Descriptor(descriptor) => descriptor == *info_descriptor,
|
||||||
|
|
|
@ -33,6 +33,12 @@ impl From<ElementDescriptor> for DisplayableType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy)]
|
||||||
|
pub enum DisplayableFillType {
|
||||||
|
Expand,
|
||||||
|
Square,
|
||||||
|
}
|
||||||
|
|
||||||
/// `Displayable` gives the ability to display a texture as background image for an item
|
/// `Displayable` gives the ability to display a texture as background image for an item
|
||||||
pub struct Displayable {
|
pub struct Displayable {
|
||||||
framable: Arc<Framable>,
|
framable: Arc<Framable>,
|
||||||
|
@ -42,6 +48,7 @@ pub struct Displayable {
|
||||||
buffer: Arc<Buffer<TexturedVertex>>,
|
buffer: Arc<Buffer<TexturedVertex>>,
|
||||||
|
|
||||||
displayable_type: RwLock<DisplayableType>,
|
displayable_type: RwLock<DisplayableType>,
|
||||||
|
fill_type: DisplayableFillType,
|
||||||
|
|
||||||
ui_layer: AtomicI32,
|
ui_layer: AtomicI32,
|
||||||
|
|
||||||
|
@ -66,6 +73,7 @@ impl Displayable {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
framable: Arc<Framable>,
|
framable: Arc<Framable>,
|
||||||
displayable_type: impl Into<DisplayableType>,
|
displayable_type: impl Into<DisplayableType>,
|
||||||
|
fill_type: DisplayableFillType,
|
||||||
) -> Result<Arc<Self>> {
|
) -> Result<Arc<Self>> {
|
||||||
let descriptor_set = framable.gui_handler().image_descriptor_set()?;
|
let descriptor_set = framable.gui_handler().image_descriptor_set()?;
|
||||||
|
|
||||||
|
@ -90,6 +98,7 @@ impl Displayable {
|
||||||
buffer,
|
buffer,
|
||||||
|
|
||||||
displayable_type: RwLock::new(displayable_type),
|
displayable_type: RwLock::new(displayable_type),
|
||||||
|
fill_type,
|
||||||
|
|
||||||
ui_layer: AtomicI32::new(0),
|
ui_layer: AtomicI32::new(0),
|
||||||
|
|
||||||
|
@ -236,11 +245,25 @@ impl Displayable {
|
||||||
pub fn update_frame(&self) -> Result<()> {
|
pub fn update_frame(&self) -> Result<()> {
|
||||||
let mut frame = self.buffer.map_complete()?;
|
let mut frame = self.buffer.map_complete()?;
|
||||||
|
|
||||||
let x_start = self.framable.left() as f32;
|
let mut x_start = self.framable.left() as f32;
|
||||||
let y_start = self.framable.top() as f32;
|
let mut y_start = self.framable.top() as f32;
|
||||||
|
|
||||||
let width = (self.framable.right() - self.framable.left()) as f32;
|
let mut width = (self.framable.right() - self.framable.left()) as f32;
|
||||||
let height = (self.framable.bottom() - self.framable.top()) as f32;
|
let mut height = (self.framable.bottom() - self.framable.top()) as f32;
|
||||||
|
|
||||||
|
if let DisplayableFillType::Square = self.fill_type {
|
||||||
|
if width > height {
|
||||||
|
let diff = width - height;
|
||||||
|
|
||||||
|
x_start += diff * 0.5;
|
||||||
|
width = height;
|
||||||
|
} else if height > width {
|
||||||
|
let diff = height - width;
|
||||||
|
|
||||||
|
y_start += diff * 0.5;
|
||||||
|
height = width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let DisplayableType::Descriptor(descriptor) = &*self.displayable_type.read().unwrap() {
|
if let DisplayableType::Descriptor(descriptor) = &*self.displayable_type.read().unwrap() {
|
||||||
if width > 0.0 && height > 0.0 {
|
if width > 0.0 && height > 0.0 {
|
||||||
|
|
Loading…
Reference in a new issue