Use PositionSpecifier for skill position

This commit is contained in:
juliancoffee 2021-08-23 00:42:18 +03:00
parent 9aacc33495
commit 39b02411e9
2 changed files with 91 additions and 83 deletions

View File

@ -1,7 +1,8 @@
use super::{
img_ids::{Imgs, ImgsRot},
item_imgs::{animate_by_pulse, ItemImgs, ItemKey::Tool},
Show, CRITICAL_HP_COLOR, HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, XP_COLOR,
Position, PositionSpecifier, Show, CRITICAL_HP_COLOR, HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0,
UI_MAIN, XP_COLOR,
};
use crate::ui::{fonts::Fonts, ImageFrame, Tooltip, TooltipManager, Tooltipable};
use conrod_core::{
@ -624,101 +625,92 @@ impl<'a> Widget for Diary<'a> {
// 8 2 7
//
//
// TOP-LEFT Skills
let offset_0 = 22.0;
let offset_1 = -122.0;
let offset_2 = offset_1 - -20.0;
while self.created_btns_top_l < skills_top_l {
let mut img = Button::image(self.imgs.wpn_icon_border_skills).w_h(80.0, 100.0);
match self.created_btns_top_l {
0 => img = img.middle_of(state.skills_top_l_align), // Central Skill
1 => img = img.up_from(state.skills_top_l[0], offset_0), // 12:00
2 => img = img.down_from(state.skills_top_l[0], offset_0), // 6:00
3 => img = img.left_from(state.skills_top_l[0], offset_0), // 3:00
4 => img = img.right_from(state.skills_top_l[0], offset_0), // 9:00
5 => img = img.top_left_with_margins_on(state.skills_top_l[0], offset_1, offset_2), /* 10:30 */
6 => img = img.top_right_with_margins_on(state.skills_top_l[0], offset_1, offset_2), /* 1:30 */
7 => {
img = img.bottom_left_with_margins_on(state.skills_top_l[0], offset_1, offset_2)
}, /* 4:30 */
8 => {
img =
img.bottom_right_with_margins_on(state.skills_top_l[0], offset_1, offset_2)
}, /* 7:30 */
_ => {},
let skill_pos = |idx, align, cental_skill| {
use PositionSpecifier::*;
match idx {
// Central skill
0 => MiddleOf(align),
// 12:00
1 => UpFrom(central_skill, offset_0),
// 6:00
2 => DownFrom(central_skill, offset_0),
// 3:00
3 => LeftFrom(central_skill, offset_0),
// 9:00
4 => RightFrom(central_skill, offset_0),
// 10:30
5 => TopLeftWithMarginsOn(central_skill, offset_1, offset_2),
// 1:30
6 => TopRightWithMarginsOn(central_skill, offset_1, offset_2),
// 4:30
7 => BottomLeftWithMarginsOn(central_skill, offset_1, offset_2),
// 7:30
8 => BottomRightWithMarginsOn(central_skill, offset_1, offset_2),
buttons => {
panic!("{} > 8 position number", buttons);
},
}
img.set(state.skills_top_l[self.created_btns_top_l], ui);
};
// TOP-LEFT Skills
//
// Why this uses while loop on field of struct and not just
// `for i in 0..skils_top_l`
while self.created_btns_top_l < skills_top_l {
let pos = skill_pos(
self.created_btns_top_l,
state.skills_top_l_align,
state.skills_top_l[0],
);
Button::image(self.imgs.wpn_icon_border_skills)
.w_h(80.0, 100.0)
.position(pos)
.set(state.skills_top_l[self.created_btns_top_l], ui);
self.created_btns_top_l += 1;
}
// TOP-RIGHT Skills
while self.created_btns_top_r < skills_top_r {
let mut img = Button::image(self.imgs.wpn_icon_border_skills).w_h(80.0, 100.0);
match self.created_btns_top_r {
0 => img = img.middle_of(state.skills_top_r_align), // Central Skill
1 => img = img.up_from(state.skills_top_r[0], offset_0), // 12:00
2 => img = img.down_from(state.skills_top_r[0], offset_0), // 6:00
3 => img = img.left_from(state.skills_top_r[0], offset_0), // 3:00
4 => img = img.right_from(state.skills_top_r[0], offset_0), // 9:00
5 => img = img.top_left_with_margins_on(state.skills_top_r[0], offset_1, offset_2), /* 10:30 */
6 => img = img.top_right_with_margins_on(state.skills_top_r[0], offset_1, offset_2), /* 1:30 */
7 => {
img = img.bottom_left_with_margins_on(state.skills_top_r[0], offset_1, offset_2)
}, /* 4:30 */
8 => {
img =
img.bottom_right_with_margins_on(state.skills_top_r[0], offset_1, offset_2)
}, /* 7:30 */
_ => {},
}
img.set(state.skills_top_r[self.created_btns_top_r], ui);
let pos = skill_pos(
self.created_btns_top_r,
state.skills_top_r_align,
state.skills_top_r[0],
);
Button::image(self.imgs.wpn_icon_border_skills)
.w_h(80.0, 100.0)
.position(pos)
.set(state.skills_top_r[self.created_btns_top_r], ui);
self.created_btns_top_r += 1;
}
// BOTTOM-LEFT Skills
while self.created_btns_bot_l < skills_bot_l {
let mut img = Button::image(self.imgs.wpn_icon_border_skills).w_h(80.0, 100.0);
match self.created_btns_bot_l {
0 => img = img.middle_of(state.skills_bot_l_align), // Central Skill
1 => img = img.up_from(state.skills_bot_l[0], offset_0), // 12:00
2 => img = img.down_from(state.skills_bot_l[0], offset_0), // 6:00
3 => img = img.left_from(state.skills_bot_l[0], offset_0), // 3:00
4 => img = img.right_from(state.skills_bot_l[0], offset_0), // 9:00
5 => img = img.top_left_with_margins_on(state.skills_bot_l[0], offset_1, offset_2), /* 10:30 */
6 => img = img.top_right_with_margins_on(state.skills_bot_l[0], offset_1, offset_2), /* 1:30 */
7 => {
img = img.bottom_left_with_margins_on(state.skills_bot_l[0], offset_1, offset_2)
}, /* 4:30 */
8 => {
img =
img.bottom_right_with_margins_on(state.skills_bot_l[0], offset_1, offset_2)
}, /* 7:30 */
_ => {},
}
img.set(state.skills_bot_l[self.created_btns_bot_l], ui);
let pos = skill_pos(
self.created_btns_bot_l,
state.skills_bot_l_align,
state.skills_bot_l[0],
);
Button::image(self.imgs.wpn_icon_border_skills)
.w_h(80.0, 100.0)
.position(pos)
.set(state.skills_bot_l[self.created_btns_bot_l], ui);
self.created_btns_bot_l += 1;
}
// BOTTOM-RIGHT Skills
while self.created_btns_bot_r < skills_bot_r {
let mut img = Image::new(self.imgs.wpn_icon_border_skills).w_h(80.0, 100.0);
match self.created_btns_bot_r {
0 => img = img.middle_of(state.skills_bot_r_align), // Central Skill
1 => img = img.up_from(state.skills_bot_r[0], offset_0), // 12:00
2 => img = img.down_from(state.skills_bot_r[0], offset_0), // 6:00
3 => img = img.left_from(state.skills_bot_r[0], offset_0), // 3:00
4 => img = img.right_from(state.skills_bot_r[0], offset_0), // 9:00
5 => img = img.top_left_with_margins_on(state.skills_bot_r[0], offset_1, offset_2), /* 10:30 */
6 => img = img.top_right_with_margins_on(state.skills_bot_r[0], offset_1, offset_2), /* 1:30 */
7 => {
img = img.bottom_left_with_margins_on(state.skills_bot_r[0], offset_1, offset_2)
}, /* 4:30 */
8 => {
img =
img.bottom_right_with_margins_on(state.skills_bot_r[0], offset_1, offset_2)
}, /* 7:30 */
_ => {},
}
img.set(state.skills_bot_r[self.created_btns_bot_r], ui);
let pos = skill_pos(
self.created_btns_bot_r,
state.skills_bot_r_align,
state.skills_bot_r[0],
);
Button::image(self.imgs.wpn_icon_border_skills)
.w_h(80.0, 100.0)
.position(pos)
.set(state.skills_bot_r[self.created_btns_bot_r], ui);
self.created_btns_bot_r += 1;
}
// Skill-Icons and Functionality
// Art dimensions
let art_size = [320.0, 320.0];
@ -2191,7 +2183,7 @@ impl<'a> Diary<'a> {
};
}
// FIXME: inline before merge
// FIXME: inline this before merge
fn create_skill_button<'b>(
image: Id,
state: widget::Id,

View File

@ -325,10 +325,17 @@ widget_ids! {
// TODO: extend as you need it
#[derive(Clone, Copy)]
pub enum PositionSpecifier {
MidBottomWithMarginOn(widget::Id, f64),
// Place the widget near other widget with the given margins
TopLeftWithMarginsOn(widget::Id, f64, f64),
TopRightWithMarginsOn(widget::Id, f64, f64),
BottomRightWithMarginsOn(widget::Id, f64, f64),
MidBottomWithMarginOn(widget::Id, f64),
BottomLeftWithMarginsOn(widget::Id, f64, f64),
BottomRightWithMarginsOn(widget::Id, f64, f64),
// Place the widget near other widget at given distance
MiddleOf(widget::Id),
UpFrom(widget::Id, f64),
DownFrom(widget::Id, f64),
LeftFrom(widget::Id, f64),
RightFrom(widget::Id, f64),
}
@ -385,18 +392,27 @@ pub trait Position {
impl<W: Positionable> Position for W {
fn position(self, request: PositionSpecifier) -> Self {
match request {
PositionSpecifier::MidBottomWithMarginOn(other, margin) => {
self.mid_bottom_with_margin_on(other, margin)
// Place the widget near other widget with the given margins
PositionSpecifier::TopLeftWithMarginsOn(other, top, right) => {
self.top_left_with_margins_on(other, top, right)
},
PositionSpecifier::TopRightWithMarginsOn(other, top, right) => {
self.top_right_with_margins_on(other, top, right)
},
PositionSpecifier::MidBottomWithMarginOn(other, margin) => {
self.mid_bottom_with_margin_on(other, margin)
},
PositionSpecifier::BottomRightWithMarginsOn(other, bottom, right) => {
self.bottom_right_with_margins_on(other, bottom, right)
},
PositionSpecifier::BottomLeftWithMarginsOn(other, bottom, left) => {
self.bottom_left_with_margins_on(other, bottom, left)
},
// Place the widget near other widget at given distance
PositionSpecifier::MiddleOf(other) => self.middle_of(other),
PositionSpecifier::UpFrom(other, offset) => self.up_from(other, offset),
PositionSpecifier::DownFrom(other, offset) => self.down_from(other, offset),
PositionSpecifier::LeftFrom(other, offset) => self.left_from(other, offset),
PositionSpecifier::RightFrom(other, offset) => self.right_from(other, offset),
}
}