slight re-structure
This commit is contained in:
@@ -3,7 +3,9 @@ use std::{
|
|||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::Close;
|
use crate::event;
|
||||||
|
|
||||||
|
event!(Close);
|
||||||
|
|
||||||
pub trait Event {
|
pub trait Event {
|
||||||
fn as_any(self: Box<Self>) -> Box<dyn Any>;
|
fn as_any(self: Box<Self>) -> Box<dyn Any>;
|
||||||
@@ -1,14 +1,13 @@
|
|||||||
use crossterm::event::{KeyCode, KeyModifiers};
|
use crossterm::event::{KeyCode, KeyModifiers};
|
||||||
|
|
||||||
use crate::{event_manager::EventManager, Close, Event, Extension, Screen};
|
use crate::{
|
||||||
|
event,
|
||||||
|
events::{Close, EventManager},
|
||||||
|
extensions::Extension,
|
||||||
|
Screen,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Clone)]
|
event!(KeyPress(pub crossterm::event::KeyEvent));
|
||||||
pub struct KeyPress(pub crossterm::event::KeyEvent);
|
|
||||||
impl Event for KeyPress {
|
|
||||||
fn as_any(self: Box<Self>) -> Box<dyn std::any::Any> {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait KeyPressEventHandler {
|
pub trait KeyPressEventHandler {
|
||||||
fn on_keypress(&mut self, event: KeyPress);
|
fn on_keypress(&mut self, event: KeyPress);
|
||||||
|
|||||||
@@ -1 +1,40 @@
|
|||||||
pub mod keypress;
|
pub mod keypress;
|
||||||
|
|
||||||
|
use crate::{events::EventManager, Screen};
|
||||||
|
|
||||||
|
pub trait Extension {
|
||||||
|
fn init(&mut self, screen: &mut Screen, events: &mut EventManager);
|
||||||
|
fn tick_start(&mut self, screen: &mut Screen, events: &mut EventManager);
|
||||||
|
fn tick_end(&mut self, screen: &mut Screen, events: &mut EventManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ExtensionManager(Vec<Box<dyn Extension>>);
|
||||||
|
|
||||||
|
impl Extension for ExtensionManager {
|
||||||
|
fn init(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
||||||
|
for ext in &mut self.0 {
|
||||||
|
ext.init(screen, events);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tick_start(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
||||||
|
for ext in &mut self.0 {
|
||||||
|
ext.tick_start(screen, events);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tick_end(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
||||||
|
for ext in &mut self.0 {
|
||||||
|
ext.tick_end(screen, events);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ExtensionManager {
|
||||||
|
pub fn new() -> ExtensionManager {
|
||||||
|
ExtensionManager(Vec::new())
|
||||||
|
}
|
||||||
|
pub fn add<E: Extension + 'static>(&mut self, extension: E) {
|
||||||
|
self.0.push(Box::new(extension));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+8
-60
@@ -1,12 +1,14 @@
|
|||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
event_manager::{Event, EventManager},
|
events::EventManager,
|
||||||
|
extensions::{Extension, ExtensionManager},
|
||||||
render_scope::RenderScope,
|
render_scope::RenderScope,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub mod event_manager;
|
pub mod events;
|
||||||
pub mod extensions;
|
pub mod extensions;
|
||||||
|
pub mod macros;
|
||||||
pub mod render_scope;
|
pub mod render_scope;
|
||||||
pub mod text;
|
pub mod text;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
@@ -19,60 +21,6 @@ pub trait Element {
|
|||||||
fn as_any(self: Box<Self>) -> Box<dyn Any>;
|
fn as_any(self: Box<Self>) -> Box<dyn Any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Extension {
|
|
||||||
fn init(&mut self, screen: &mut Screen, events: &mut EventManager);
|
|
||||||
fn tick_start(&mut self, screen: &mut Screen, events: &mut EventManager);
|
|
||||||
fn tick_end(&mut self, screen: &mut Screen, events: &mut EventManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ExtensionManager(Vec<Box<dyn Extension>>);
|
|
||||||
|
|
||||||
impl Extension for ExtensionManager {
|
|
||||||
fn init(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
|
||||||
for ext in &mut self.0 {
|
|
||||||
ext.init(screen, events);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn tick_start(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
|
||||||
for ext in &mut self.0 {
|
|
||||||
ext.tick_start(screen, events);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn tick_end(&mut self, screen: &mut Screen, events: &mut EventManager) {
|
|
||||||
for ext in &mut self.0 {
|
|
||||||
ext.tick_end(screen, events);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ExtensionManager {
|
|
||||||
pub fn new() -> ExtensionManager {
|
|
||||||
ExtensionManager(Vec::new())
|
|
||||||
}
|
|
||||||
pub fn add<E: Extension + 'static>(&mut self, extension: E) {
|
|
||||||
self.0.push(Box::new(extension));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct EventHandlerFn(pub Box<dyn FnMut(Box<dyn Event>)>);
|
|
||||||
|
|
||||||
impl std::fmt::Debug for EventHandlerFn {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "FnMut()")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub struct Close;
|
|
||||||
|
|
||||||
impl Event for Close {
|
|
||||||
fn as_any(self: Box<Self>) -> Box<dyn Any> {
|
|
||||||
self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Screen {
|
pub struct Screen {
|
||||||
pub elements: Vec<Box<dyn Element>>,
|
pub elements: Vec<Box<dyn Element>>,
|
||||||
}
|
}
|
||||||
@@ -91,7 +39,7 @@ impl Screen {
|
|||||||
pub fn run(
|
pub fn run(
|
||||||
&mut self,
|
&mut self,
|
||||||
events: &mut EventManager,
|
events: &mut EventManager,
|
||||||
extension_manager: &mut ExtensionManager,
|
extensions: &mut ExtensionManager,
|
||||||
) -> std::io::Result<()> {
|
) -> std::io::Result<()> {
|
||||||
let mut scope = RenderScope {};
|
let mut scope = RenderScope {};
|
||||||
|
|
||||||
@@ -99,16 +47,16 @@ impl Screen {
|
|||||||
elem.init(events);
|
elem.init(events);
|
||||||
}
|
}
|
||||||
|
|
||||||
extension_manager.init(self, events);
|
extensions.init(self, events);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
extension_manager.tick_start(self, events);
|
extensions.tick_start(self, events);
|
||||||
|
|
||||||
for elem in &mut self.elements {
|
for elem in &mut self.elements {
|
||||||
elem.render(&mut scope);
|
elem.render(&mut scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
extension_manager.tick_end(self, events);
|
extensions.tick_end(self, events);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
#[macro_export]
|
||||||
|
macro_rules! event {
|
||||||
|
($name:ident) => {
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct $name;
|
||||||
|
|
||||||
|
impl $crate::events::Event for $name {
|
||||||
|
fn as_any(self: Box<Self>) -> Box<dyn std::any::Any> {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
($name:ident {$($inner:tt)*}) => {
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct $name {
|
||||||
|
$($inner)*
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $crate::events::Event for $name {
|
||||||
|
fn as_any(self: Box<Self>) -> Box<dyn std::any::Any> {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
($name:ident ($($inner:tt)*)) => {
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct $name ($($inner)*);
|
||||||
|
|
||||||
|
impl $crate::events::Event for $name {
|
||||||
|
fn as_any(self: Box<Self>) -> Box<dyn std::any::Any> {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
+3
-1
@@ -1,5 +1,7 @@
|
|||||||
use osui::{
|
use osui::{
|
||||||
event_manager::EventManager, extensions::keypress::KeyPressExtension, ExtensionManager, Screen,
|
events::EventManager,
|
||||||
|
extensions::{keypress::KeyPressExtension, ExtensionManager},
|
||||||
|
Screen,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|||||||
Reference in New Issue
Block a user