From df93fe75d03d85d12449884761757ae14244b8ad Mon Sep 17 00:00:00 2001 From: JustAGod Date: Tue, 7 Dec 2021 21:50:33 +0300 Subject: [PATCH] Added some helpful buttons to control panel --- src/model.rs | 1 + src/parse/mc.rs | 8 ++--- src/ui/cells.rs | 17 ++------- src/ui/controls.rs | 90 +++++++++++++++++++++++++++++++++------------- src/ui/gui.rs | 4 ++- 5 files changed, 76 insertions(+), 44 deletions(-) diff --git a/src/model.rs b/src/model.rs index 5ef1e07..409296e 100644 --- a/src/model.rs +++ b/src/model.rs @@ -157,6 +157,7 @@ impl Registers { } +#[derive(Clone)] pub struct Memory> { pub parser: P, pub data: Vec, diff --git a/src/parse/mc.rs b/src/parse/mc.rs index 8854b75..52c59d0 100644 --- a/src/parse/mc.rs +++ b/src/parse/mc.rs @@ -394,28 +394,28 @@ impl MicroCommand for OperationalCommand1 { } #[derive(Eq, PartialEq)] -pub enum Shift { +enum Shift { Left, Right, None, } #[derive(Eq, PartialEq)] -pub enum Complement { +enum Complement { Left, Right, None, } #[derive(Eq, PartialEq)] -pub enum Memory { +enum Memory { Read, Write, None, } #[derive(Eq, PartialEq)] -pub enum Operation { +enum Operation { LeftPlusRight, LeftPlusRightPlusOne, LeftAndRight, diff --git a/src/ui/cells.rs b/src/ui/cells.rs index 8576fd2..817e201 100644 --- a/src/ui/cells.rs +++ b/src/ui/cells.rs @@ -80,22 +80,9 @@ impl, F: Fn(&Computer) -> u16> Tool for CellsTool, F: Fn(&Computer) -> u16> Tool for CellsTool3X}", idx)); ui.same_line(0.0); let t = if current_executed == idx as u16 { - if jump_needed { + if state.jump_requested { ui.set_scroll_here_y(); + state.jump_requested = false; } Some(ui.push_style_color(StyleColor::FrameBg, [1.0, 0.0, 0.0, 1.0])) } else { @@ -169,7 +157,6 @@ impl, F: Fn(&Computer) -> u16> Tool for CellsTool +} + +struct HistoryEntry { + registers: Registers } impl Tool for SmartControlsTool { @@ -18,7 +24,19 @@ impl Tool for SmartControlsTool { impl SmartControlsTool { pub fn new() -> SmartControlsTool { SmartControlsTool { - auto_run: false + auto_run: false, + history: vec![] + } + } + + fn make_history_entry(&mut self, state: &mut GuiState) { + let entry = HistoryEntry { + registers: state.computer.registers.clone() + }; + + self.history.push(entry); + if self.history.len() > 15 { + self.history.remove(0usize); } } @@ -30,16 +48,16 @@ impl SmartControlsTool { } tok.end(ui); } - let computer = &mut state.computer; - let w = ui.content_region_avail().get(0).unwrap() / 2.0 - 4.0; + let w = ui.content_region_avail().get(0).unwrap() / 3.0 - 6.0; let h = ui.content_region_avail().get(1).unwrap() / 2.0 - 3.0; if ui.button(im_str!("Микро шаг"), [w, h]) { - computer.registers.set_execute_by_tick(true); - computer.registers.set_lever(false); - computer.registers.set_program_mode(false); - computer.micro_step(); + self.make_history_entry(state); + state.computer.registers.set_execute_by_tick(true); + state.computer.registers.set_lever(false); + state.computer.registers.set_program_mode(false); + state.computer.micro_step(); } if ui.is_item_hovered() { @@ -49,45 +67,69 @@ impl SmartControlsTool { ui.same_line(0.0); if ui.button(im_str!("Большой шаг"), [w,h]) { - computer.registers.set_execute_by_tick(false); - computer.registers.set_lever(false); - computer.registers.set_program_mode(false); - while !matches!(computer.micro_step(), ExecutionResult::HALTED) {} + self.make_history_entry(state); + state.computer.registers.set_execute_by_tick(false); + state.computer.registers.set_lever(false); + state.computer.registers.set_program_mode(false); + while !matches!(state.computer.micro_step(), ExecutionResult::HALTED) {} } if ui.is_item_hovered() { ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 0.\nУстанавливается флаг \"Программа\" в 0.\nВыполняется полный цикл микрокоманд.\nГрубо говоря выполняется одна команда.") } + ui.same_line(0.0); + + if ui.button(im_str!("Назад"), [w, h]) && !self.history.is_empty(){ + let entry = self.history.pop().unwrap(); + state.computer.registers = entry.registers; + + self.auto_run = false + } + if ui.is_item_hovered() { + ui.tooltip_text("Возвращает регистры к состоянию в котором они были до того как вы нажали последнюю кнопку.") + } if ui.button(im_str!("Пуск"), [w,h]) { - computer.registers.r_micro_command_counter = 0xA8; - computer.registers.set_execute_by_tick(false); - computer.registers.set_lever(true); - computer.registers.set_program_mode(true); + self.make_history_entry(state); + state.computer.registers.r_micro_command_counter = 0xA8; + state.computer.registers.set_execute_by_tick(false); + state.computer.registers.set_lever(true); + state.computer.registers.set_program_mode(true); } if ui.is_item_hovered() { ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 1.\nУстанавливается флаг \"Программа\" в 1.\nУстанавливает СчМК в 0A8 то есть сбрасывает состояние регистров ЭВМ\nЭВМ начинает самостоятельно выполнять команду за командой.") } ui.same_line(0.0); if ui.button(im_str!("Продолжить"), [w,h]) { - computer.registers.set_execute_by_tick(false); - computer.registers.set_lever(true); - computer.registers.set_program_mode(true); + self.make_history_entry(state); + state.computer.registers.set_execute_by_tick(false); + state.computer.registers.set_lever(true); + state.computer.registers.set_program_mode(true); } if ui.is_item_hovered() { ui.tooltip_text("Устанавливает флаг \"Исполнение\" в 0\nУстанавливает флаг \"Состояние тумблера\" в 1.\nУстанавливается флаг \"Программа\" в 1.\nНе изменяет состояние регистров ЭВМ\nЭВМ начинает самостоятельно выполнять команду за командой.") } + ui.same_line(0.0); + if ui.button(im_str!("Прыжок"), [w,h]) { + self.make_history_entry(state); + state.computer.registers.set_execute_by_tick(false); + state.computer.registers.set_lever(true); + state.computer.registers.set_program_mode(true); + } + if ui.is_item_hovered() { + ui.tooltip_text("Проскроливает к текущей исполняемой команде") + } - if computer.registers.get_lever() { + if state.computer.registers.get_lever() { self.auto_run = true; } if self.auto_run { for _ in 0..100 { - if matches!(computer.micro_step(), ExecutionResult::HALTED) { - if computer.registers.get_lever() { + if matches!(state.computer.micro_step(), ExecutionResult::HALTED) { + if state.computer.registers.get_lever() { state.popup_manager.open(PopupMessage::new("Остановочка","ЭВМ завершила свою работу")); } - computer.registers.set_lever(false); + state.computer.registers.set_lever(false); self.auto_run = false; break; } diff --git a/src/ui/gui.rs b/src/ui/gui.rs index 52acc71..04e381c 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -56,6 +56,7 @@ pub struct GuiState { pub theme_requested: Option, pub popup_manager: PopupManager, pub current_command: Option>, + pub jump_requested: bool } impl GuiState { @@ -68,6 +69,7 @@ impl GuiState { computer, popup_manager: PopupManager::new(), current_command: None, + jump_requested: false } } } @@ -133,7 +135,7 @@ impl Gui { 0, LayoutTool::new_horizontal("middle") .append( - 315, + 335, WindowTool::single_tool( 315, 0, "Панель управления", LayoutTool::new_vertical("execandio")