use graphics::*;
use opengl_graphics::GlGraphics;
use crate::core::callbacks::*;
use crate::core::point::{Point, Size};
use crate::widget::config::*;
use crate::widget::widget::*;
pub struct BoxWidget {
config: Configurable,
event_list: Vec<CallbackEvent>,
widget_id: i32,
}
impl BoxWidget {
pub fn new() -> Self {
Self {
config: Configurable::new(),
event_list: vec![],
widget_id: 0,
}
}
fn draw_box(&mut self, c: Context, g: &mut GlGraphics, clip: &DrawState) {
let size: crate::core::point::Size = self.config().get_size(CONFIG_BODY_SIZE);
let border: f64 = self.config().get_numeric(CONFIG_BORDER_WIDTH) as f64;
let color: types::Color = self.config().get_color(CONFIG_BORDER_COLOR);
let fill_color: types::Color = self.config().get_color(CONFIG_MAIN_COLOR);
g.rectangle(
&Rectangle::new(fill_color),
[0.0f64, 0.0f64, size.w as f64, size.h as f64],
clip,
c.transform.clone(),
);
Rectangle::new_border(color, border).draw(
[
0.0 as f64 + border as f64,
0.0 as f64 + border as f64,
size.w as f64 - (border as f64 * 2.0),
size.h as f64 - (border as f64 * 2.0),
],
clip,
c.transform.clone(),
g,
);
}
}
impl Drawable for BoxWidget {
fn draw(&mut self, c: Context, g: &mut GlGraphics, clip: &DrawState) {
self.draw_box(c, g, &clip);
self.clear_invalidate();
}
}
impl InjectableSystemEvents for BoxWidget {
fn inject_system_event(&mut self) -> Option<CallbackEvent> {
self.event_list.pop().clone()
}
}
impl InjectableCustomEvents for BoxWidget {}
impl Widget for BoxWidget {
fn config(&mut self) -> &mut Configurable {
&mut self.config
}
fn set_config(&mut self, config: u8, config_value: Config) {
self.config().set(config, config_value);
self.invalidate();
}
fn set_size(&mut self, config: u8, w: i32, h: i32) {
self.set_config(config, Config::Size(Size { w, h }));
if self.widget_id != 0 {
self.event_list.push(CallbackEvent::WidgetResized {
widget_id: self.widget_id,
size: Size { w, h },
});
}
self.invalidate();
}
fn set_point(&mut self, config: u8, x: i32, y: i32) {
self.set_config(config, Config::Point(Point { x, y }));
if self.widget_id != 0 {
self.event_list.push(CallbackEvent::WidgetMoved {
widget_id: self.widget_id,
point: Point { x, y },
});
}
self.invalidate();
}
fn set_widget_id(&mut self, widget_id: i32) {
self.widget_id = widget_id;
}
fn get_widget_id(&mut self) -> i32 {
self.widget_id
}
fn injects_system_events(&mut self) -> bool {
true
}
fn get_injectable_custom_events(&mut self) -> &mut dyn InjectableCustomEvents {
self
}
fn get_injectable_system_events(&mut self) -> &mut dyn InjectableSystemEvents {
self
}
fn get_drawable(&mut self) -> &mut dyn Drawable {
self
}
}