1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
use UiCell;

use {UiElem, UiFixSize, UiPos};
use elements::UiFill;

use sdl2::{EventPump, Sdl, VideoSubsystem};
use sdl2::event::{Event, WindowEvent};
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::render::{BlendMode, Canvas};
use sdl2::video::Window;

pub struct UiApp {
    name: String,
    size: UiFixSize,
    main_element: UiCell<UiElem>,
    context: Sdl,
    subsystem: VideoSubsystem,
}

impl UiApp {
    pub fn new() -> Self {
        let sdl_context = ::sdl2::init().unwrap();
        let video_subsystem = sdl_context.video().unwrap();
        UiApp {
            context: sdl_context,
            subsystem: video_subsystem,
            name: String::from("Ui Application"),
            size: UiFixSize { x: 400, y: 400 },
            main_element: ::new_ui_cell(UiFill::new()),
        }
    }

    pub fn set_title(&mut self, name: String) {
        self.name = name;
    }

    pub fn set_main_element(&mut self, main_element: UiCell<UiElem>) {
        self.main_element = main_element;
    }

    pub fn run(&mut self) {
        let window = self.subsystem
            .window(&self.name, 500, 500)
            .resizable()
            .build()
            .unwrap();

        let mut canvas = window.into_canvas().build().unwrap();

        canvas.set_blend_mode(BlendMode::Blend);

        let mut event_pump = self.context.event_pump().unwrap();

        self.handle_loop(&mut event_pump, &mut canvas);
    }

    #[inline(always)]
    fn handle_loop(&mut self, event_pump: &mut EventPump, mut canvas: &mut Canvas<Window>) {
        let position = UiPos::new();

        self.set_size();
        self.draw(&mut canvas, &position);

        'running: loop {
            for event in event_pump.poll_iter() {
                match event {
                    Event::Quit { .. } |
                    Event::KeyDown {
                        keycode: Some(Keycode::Escape),
                        ..
                    } => break 'running,
                    Event::Window {
                        win_event: WindowEvent::Resized(x_val, y_val),
                        ..
                    } => {
                        self.size = UiFixSize {
                            x: x_val as u32,
                            y: y_val as u32,
                        };
                        self.set_size();
                        self.draw(&mut canvas, &position);
                    }
                    _ => {}
                }
            }

            canvas.present();

            ::std::thread::sleep(::std::time::Duration::new(0, 1_000_000_000u32 / 60));
        }
    }

    fn draw(&mut self, canvas: &mut Canvas<Window>, position: &UiPos) {
        canvas.set_draw_color(Color::RGBA(0, 0, 0, 0));
        canvas.clear();
        let elem = self.main_element.write().unwrap();
        elem.draw(canvas, position);
    }

    pub fn set_size(&mut self) {
        self.main_element.write().unwrap().set_fix_size(UiFixSize {
            x: self.size.x,
            y: self.size.y,
        });
    }
}