aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml2
-rw-r--r--src/gui.rs109
-rw-r--r--src/main.rs2
3 files changed, 92 insertions, 21 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ae1add9..28123c5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,4 +11,4 @@ license = "GPL-3.0-or-later"
pancurses = "0.16.1"
argparse = "0.2.2"
chrono = "0.4.10"
-fltk = "^0.9"
+fltk = "^0.10"
diff --git a/src/gui.rs b/src/gui.rs
index f539e8b..f4ff501 100644
--- a/src/gui.rs
+++ b/src/gui.rs
@@ -1,11 +1,48 @@
-use fltk::{app::*, button::*, frame::*, text::*, window::*}; // enums::*,
+use fltk::{app::*, button::*, draw::*, frame::*, menu::*, text::*, window::*};
#[derive(Clone, Copy)]
-enum GUIMessage {}
+enum GUIMessage {
+ None,
+ Test,
+}
+
+struct GUIBoard {
+ frame: Frame,
+ test: bool,
+}
+
+impl GUIBoard {
+ fn new(frame: Frame) -> GUIBoard {
+ let mut g = GUIBoard { frame, test: false };
+ g.frame.draw2(g.draw());
+ g
+ }
+
+ fn change(&mut self) {
+ self.test = !self.test;
+
+ self.frame.draw2(self.draw());
+ self.frame.set_damage(true);
+ }
+
+ fn draw(&self) -> impl Fn(&mut Frame) {
+ let tc = self.test;
+ move |frame: &mut Frame| {
+ const BOARD_PAD_INNER: i32 = 5;
+ let bx = frame.x() + BOARD_PAD_INNER;
+ let by = frame.y() + BOARD_PAD_INNER;
+ push_clip(frame.x(), frame.y(), frame.width(), frame.height());
+ set_draw_color(if tc { Color::Blue } else { Color::Red });
+ draw_rectf(bx, by, 100, 30);
+ pop_clip();
+ }
+ }
+}
pub struct GUI {
app: App,
window: Window,
+ board: GUIBoard,
log: TextDisplay,
sender: Sender<GUIMessage>,
receiver: Receiver<GUIMessage>,
@@ -17,34 +54,63 @@ impl GUI {
// TODO: Why is this not the same as
/*
- let mut window = Window::default()
- .with_size(800, 600)
- .with_label("Takwrap")
- .center_screen();
- */
+ let mut window = Window::default()
+ .with_size(800, 600)
+ .with_label("Takwrap")
+ .center_screen();
+ */
// Windows made that way are not resizable?
let mut window = Window::new(0, 0, 800, 600, "Takwrap").center_screen();
- window.make_resizable(true);
+ let (sender, receiver) = channel::<GUIMessage>();
+
+ let mut menu = SysMenuBar::default().with_size(800, 24);
+ // menu.set_text_font(Font::Helvetica);
+ menu.set_color(Color::Light2);
+ menu.add_emit(
+ "&File/New...\t",
+ Shortcut::None,
+ MenuFlag::Normal,
+ sender,
+ GUIMessage::None,
+ );
+ menu.add_emit(
+ "&File/Open...\t",
+ Shortcut::None,
+ MenuFlag::Normal,
+ sender,
+ GUIMessage::Test,
+ );
+
+ const LOG_WIDTH: i32 = 10 * 16;
+ const LOG_PAD: i32 = 0;
let mut log = TextDisplay::default()
- .with_size(10 * 16, 600 - 10 - 10)
- .with_pos(800 - 10 * 16 - 10, 10);
+ .with_size(LOG_WIDTH, 600 - 2 * LOG_PAD - menu.height())
+ .with_pos(800 - LOG_WIDTH - LOG_PAD, menu.height());
log.set_buffer(Some(TextBuffer::default()));
log.insert("test");
- window.draw(Box::new(move || {
- fltk::draw::set_draw_color(Color::White);
- fltk::draw::draw_rectf(20, 20, 30, 30);
- }));
+ const BOARD_PAD: i32 = 0;
+ let mut board_frame = Frame::default()
+ .with_size(
+ 800 - LOG_WIDTH - LOG_PAD * 2 - BOARD_PAD,
+ 600 - 2 * BOARD_PAD - menu.height(),
+ )
+ .below_of(&menu, BOARD_PAD);
+ board_frame.set_frame(FrameType::EmbossedBox);
+ window.resizable(&mut board_frame);
window.end();
+ window.show();
+
+ let board = GUIBoard::new(board_frame);
- let (sender, receiver) = channel::<GUIMessage>();
// button.emit(sender, GUIMessage::Foo);
GUI {
app,
+ board,
window,
log,
sender,
@@ -53,11 +119,16 @@ impl GUI {
}
pub fn run(&mut self) -> Result<(), fltk::prelude::FltkError> {
- self.window.show();
+ // self.window.show();
- while self.app.wait()? {
- match self.receiver.recv() {
- _ => (),
+ while self.app.wait() {
+ if let Some(msg) = self.receiver.recv() {
+ match msg {
+ GUIMessage::Test => {
+ self.board.change();
+ }
+ _ => (),
+ }
}
}
Ok(())
diff --git a/src/main.rs b/src/main.rs
index 88ce6fa..6045d0f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -193,6 +193,6 @@ This program comes with ABSOLUTELY NO WARRANTY; and is made available under the
endwin();
} else {
let mut gui = GUI::new();
- gui.run();
+ gui.run().unwrap();
}
}