Rudimentary RectButton
This commit is contained in:
parent
97b993e470
commit
58d9945e40
|
@ -48,7 +48,7 @@ pub struct Color {
|
||||||
pub a: f32,
|
pub a: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||||
pub enum CursorEventKind {
|
pub enum CursorEventKind {
|
||||||
Hover,
|
Hover,
|
||||||
Select,
|
Select,
|
||||||
|
|
141
src/widgets.rs
141
src/widgets.rs
|
@ -90,6 +90,57 @@ impl Widget for RoundButton {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct RectButton {
|
||||||
|
pub pos: Vec2,
|
||||||
|
pub size: Vec2,
|
||||||
|
pub was_clicked: bool,
|
||||||
|
pub color: Color,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Button for RectButton {
|
||||||
|
fn was_clicked(&self) -> bool {
|
||||||
|
self.was_clicked
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RectButton {
|
||||||
|
pub fn new(pos: Vec2, size: Vec2) -> Self {
|
||||||
|
Self {
|
||||||
|
pos,
|
||||||
|
size,
|
||||||
|
was_clicked: true,
|
||||||
|
color: Color {
|
||||||
|
r: 1.0,
|
||||||
|
g: 1.0,
|
||||||
|
b: 1.0,
|
||||||
|
a: 0.2,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Widget for RectButton {
|
||||||
|
fn update(&mut self, dt: f32) {
|
||||||
|
self.was_clicked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn draw(&mut self, ctx: &DrawContext) {
|
||||||
|
ctx.draw_rect(self.pos, self.size, self.color);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn on_cursor_event(&mut self, kind: CursorEventKind, at: Vec2) {
|
||||||
|
let local = at - self.pos;
|
||||||
|
if kind == CursorEventKind::Deselect
|
||||||
|
&& local.x > 0.0
|
||||||
|
&& local.y > 0.0
|
||||||
|
&& local.x < self.size.x
|
||||||
|
&& local.y < self.size.y
|
||||||
|
{
|
||||||
|
self.was_clicked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Eq, PartialEq)]
|
#[derive(Eq, PartialEq)]
|
||||||
pub enum ScrollMenuState {
|
pub enum ScrollMenuState {
|
||||||
Opening,
|
Opening,
|
||||||
|
@ -412,29 +463,47 @@ impl Widget for MainMenu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Inventory;
|
pub struct Inventory {
|
||||||
|
tabs: Vec<RectButton>,
|
||||||
|
}
|
||||||
|
|
||||||
impl Inventory {
|
impl Inventory {
|
||||||
|
const HEAD_RADIUS: f32 = 0.025;
|
||||||
|
const HEAD_HEIGHT: f32 = 0.03;
|
||||||
|
const TAB_WIDTH: f32 = 0.04;
|
||||||
|
const TAB_HEIGHT: f32 = 0.06;
|
||||||
|
const TAB_NUM: usize = 6;
|
||||||
|
const SEPARATOR_WIDTH: f32 = 0.015;
|
||||||
|
const BOX_SIZE: f32 = 0.025;
|
||||||
|
const BOX_MARGIN: f32 = 0.01;
|
||||||
|
const BOX_PADDING: f32 = 0.005;
|
||||||
|
const BOX_GRID_WIDTH: usize = 12;
|
||||||
|
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self
|
let tab_size = Vec2::new(Self::TAB_WIDTH, Self::TAB_HEIGHT);
|
||||||
|
|
||||||
|
let mut tabs = Vec::new();
|
||||||
|
for i in 0..Self::TAB_NUM {
|
||||||
|
let y = (i + 1) as f32 * Self::TAB_HEIGHT;
|
||||||
|
let pos = Vec2::new(0.0, -y);
|
||||||
|
tabs.push(RectButton::new(pos, tab_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
Self { tabs }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Widget for Inventory {
|
impl Widget for Inventory {
|
||||||
fn update(&mut self, dt: f32) {}
|
fn update(&mut self, dt: f32) {
|
||||||
|
for tab in self.tabs.iter_mut() {
|
||||||
|
tab.update(dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn draw(&mut self, ctx: &DrawContext) {
|
fn draw(&mut self, ctx: &DrawContext) {
|
||||||
// style constants
|
for tab in self.tabs.iter_mut() {
|
||||||
let head_radius = 0.025;
|
tab.draw(ctx);
|
||||||
let head_height = 0.03;
|
}
|
||||||
let tab_width = 0.04;
|
|
||||||
let tab_height = 0.06;
|
|
||||||
let tab_num = 6;
|
|
||||||
let separator_width = 0.015;
|
|
||||||
let box_size = 0.025;
|
|
||||||
let box_margin = 0.01;
|
|
||||||
let box_padding = 0.005;
|
|
||||||
let box_grid_width = 12;
|
|
||||||
|
|
||||||
let head_color = Color {
|
let head_color = Color {
|
||||||
r: 1.0,
|
r: 1.0,
|
||||||
|
@ -444,16 +513,20 @@ impl Widget for Inventory {
|
||||||
};
|
};
|
||||||
|
|
||||||
// alignment variables
|
// alignment variables
|
||||||
let tab_list_height = tab_num as f32 * tab_height;
|
let tab_list_height = Self::TAB_NUM as f32 * Self::TAB_HEIGHT;
|
||||||
let separator_xy = Vec2::new(tab_width, separator_width - tab_list_height);
|
let separator_xy = Vec2::new(Self::TAB_WIDTH, Self::SEPARATOR_WIDTH - tab_list_height);
|
||||||
let separator_size = Vec2::new(separator_width, tab_list_height - separator_width);
|
let separator_size = Vec2::new(
|
||||||
let body_width = box_grid_width as f32 * (box_size + box_padding) + box_margin * 2.0;
|
Self::SEPARATOR_WIDTH,
|
||||||
let body_height = tab_list_height - box_margin * 2.0;
|
tab_list_height - Self::SEPARATOR_WIDTH,
|
||||||
let head_width = tab_width + separator_width + body_width;
|
);
|
||||||
|
let body_width = Self::BOX_GRID_WIDTH as f32 * (Self::BOX_SIZE + Self::BOX_PADDING)
|
||||||
|
+ Self::BOX_MARGIN * 2.0;
|
||||||
|
let body_height = tab_list_height - Self::BOX_MARGIN * 2.0;
|
||||||
|
let head_width = Self::TAB_WIDTH + Self::SEPARATOR_WIDTH + body_width;
|
||||||
let head_inner_xy = Vec2::ZERO;
|
let head_inner_xy = Vec2::ZERO;
|
||||||
let head_inner_size = Vec2::new(head_width, head_height - head_radius);
|
let head_inner_size = Vec2::new(head_width, Self::HEAD_HEIGHT - Self::HEAD_RADIUS);
|
||||||
let head_edge_xy = Vec2::new(head_radius, head_height - head_radius);
|
let head_edge_xy = Vec2::new(Self::HEAD_RADIUS, Self::HEAD_HEIGHT - Self::HEAD_RADIUS);
|
||||||
let head_edge_size = Vec2::new(head_width - head_radius * 2.0, head_radius);
|
let head_edge_size = Vec2::new(head_width - Self::HEAD_RADIUS * 2.0, Self::HEAD_RADIUS);
|
||||||
let head_tl_xy = head_edge_xy;
|
let head_tl_xy = head_edge_xy;
|
||||||
let head_tr_xy = head_tl_xy + Vec2::new(head_edge_size.x, 0.0);
|
let head_tr_xy = head_tl_xy + Vec2::new(head_edge_size.x, 0.0);
|
||||||
|
|
||||||
|
@ -462,26 +535,26 @@ impl Widget for Inventory {
|
||||||
ctx.draw_quarter_circle(
|
ctx.draw_quarter_circle(
|
||||||
Corner::BottomRight,
|
Corner::BottomRight,
|
||||||
separator_xy,
|
separator_xy,
|
||||||
separator_width,
|
Self::SEPARATOR_WIDTH,
|
||||||
head_color,
|
head_color,
|
||||||
);
|
);
|
||||||
|
|
||||||
ctx.draw_rect(head_inner_xy, head_inner_size, head_color);
|
ctx.draw_rect(head_inner_xy, head_inner_size, head_color);
|
||||||
ctx.draw_rect(head_edge_xy, head_edge_size, head_color);
|
ctx.draw_rect(head_edge_xy, head_edge_size, head_color);
|
||||||
ctx.draw_quarter_circle(Corner::TopLeft, head_tl_xy, head_radius, head_color);
|
ctx.draw_quarter_circle(Corner::TopLeft, head_tl_xy, Self::HEAD_RADIUS, head_color);
|
||||||
ctx.draw_quarter_circle(Corner::TopRight, head_tr_xy, head_radius, head_color);
|
ctx.draw_quarter_circle(Corner::TopRight, head_tr_xy, Self::HEAD_RADIUS, head_color);
|
||||||
|
|
||||||
// placeholder inventory item boxes
|
// placeholder inventory item boxes
|
||||||
let box_grid_stride = box_size + box_padding;
|
let box_grid_stride = Self::BOX_SIZE + Self::BOX_PADDING;
|
||||||
let box_grid_height = (body_height / box_grid_stride).floor() as usize;
|
let box_grid_height = (body_height / box_grid_stride).floor() as usize;
|
||||||
let box_rect_size = Vec2::new(box_size, box_size);
|
let box_rect_size = Vec2::new(Self::BOX_SIZE, Self::BOX_SIZE);
|
||||||
let box_grid_xy = Vec2::new(
|
let box_grid_xy = Vec2::new(
|
||||||
tab_width + separator_width + box_margin,
|
Self::TAB_WIDTH + Self::SEPARATOR_WIDTH + Self::BOX_MARGIN,
|
||||||
-box_margin - box_size,
|
-Self::BOX_MARGIN - Self::BOX_SIZE,
|
||||||
);
|
);
|
||||||
let box_radius = 0.005;
|
let box_radius = 0.005;
|
||||||
|
|
||||||
for x in 0..box_grid_width {
|
for x in 0..Self::BOX_GRID_WIDTH {
|
||||||
for y in 0..box_grid_height {
|
for y in 0..box_grid_height {
|
||||||
let box_rect_xy = Vec2::new(x as f32, -(y as f32)) * box_grid_stride + box_grid_xy;
|
let box_rect_xy = Vec2::new(x as f32, -(y as f32)) * box_grid_stride + box_grid_xy;
|
||||||
ctx.draw_rounded_rect(box_rect_xy, box_rect_size, box_radius, head_color);
|
ctx.draw_rounded_rect(box_rect_xy, box_rect_size, box_radius, head_color);
|
||||||
|
@ -489,5 +562,9 @@ impl Widget for Inventory {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_cursor_event(&mut self, kind: CursorEventKind, at: Vec2) {}
|
fn on_cursor_event(&mut self, kind: CursorEventKind, at: Vec2) {
|
||||||
|
for tab in self.tabs.iter_mut() {
|
||||||
|
tab.on_cursor_event(kind, at);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue