piston2d-scroll_controller 0.12.0

A Piston library for handling scroll areas
Documentation
extern crate piston;
extern crate sdl2_window;
extern crate opengl_graphics;
extern crate graphics;
extern crate scroll_controller;

use piston::event_loop::{Events, EventSettings};
use piston::window::WindowSettings;
use piston::input::RenderEvent;
use graphics::*;
use graphics::draw_state::DrawState;
use sdl2_window::Sdl2Window;
use opengl_graphics::{OpenGL, GlGraphics};
use scroll_controller::{ScrollController, ScrollSettings};

fn main() {
    let opengl = OpenGL::V3_2;
    let settings = WindowSettings::new("scroll_test", [512; 2])
        .graphics_api(opengl)
        .exit_on_esc(true);
    let mut window: Sdl2Window = settings.build().unwrap();
    let mut events = Events::new(EventSettings::new());
    let mut gl = GlGraphics::new(opengl);

    let mut scroll = {
        let scroll_settings = ScrollSettings::new().speed(5.0);
        let scroll_layout = [10.0, 10.0, 100.0, 200.0];
        ScrollController::new(scroll_layout, [250.0; 2], &scroll_settings)
    };

    let black = color::hex("000000");
    let violet = color::hex("ff00ff");
    let circle_red = Ellipse::new(color::hex("ff000033")).resolution(8);
    let circle_blue = Ellipse::new(color::hex("0000ff33")).resolution(8);

    while let Some(e) = events.next(&mut window) {
        scroll.event(&e);

        if let Some(args) = e.render_args() {
            gl.draw(args.viewport(), |c, g| {
                clear([1.0; 4], g);

                Rectangle::new([0.0, 0.0, 1.0, 1.0])
                    .draw(scroll.bounds, &DrawState::new_clip(), c.transform, g);

                let mat = c.transform
                    .trans(scroll.bounds[0], scroll.bounds[0])
                    .trans(scroll.offset[0], scroll.offset[1]);
                let size = 10.0;
                for y in 0..(scroll.area[0]/size) as u32 {
                    for x in 0..(scroll.area[1]/size) as u32 {
                        let rect = [x as f64 * size, y as f64 * size, size, size];
                        circle_red.draw(rect, &DrawState::new_inside(), mat, g);
                        circle_blue.draw(rect, &DrawState::new_outside(), mat, g);
                    }
                }

                Rectangle::new_border(black, 1.0)
                    .draw(scroll.bounds, &c.draw_state, c.transform, g);

                let rect = scroll.rect_from_area_to_view(scroll.visible_area_rect());
                Rectangle::new_border(violet, 1.0)
                    .draw(rect, &c.draw_state, c.transform, g);
            });
        }
    }
}