-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #56 from mitoma/refactor-for-action
Refactor for action
- Loading branch information
Showing
17 changed files
with
851 additions
and
464 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
use stroke_parser::{ActionArgument, CommandName, CommandNamespace}; | ||
use text_buffer::action::EditorOperation; | ||
|
||
use crate::{context::StateContext, layout_engine::World, support::InputResult}; | ||
|
||
use super::ActionProcessor; | ||
|
||
macro_rules! edit_processor { | ||
( $proc_name:ident, $name:expr, $editor_operation:ident ) => { | ||
pub struct $proc_name; | ||
impl ActionProcessor for $proc_name { | ||
fn namespace(&self) -> CommandNamespace { | ||
"edit".into() | ||
} | ||
|
||
fn name(&self) -> CommandName { | ||
$name.into() | ||
} | ||
|
||
fn process( | ||
&self, | ||
_arg: &ActionArgument, | ||
_context: &StateContext, | ||
world: &mut dyn World, | ||
) -> InputResult { | ||
world.editor_operation(&EditorOperation::$editor_operation); | ||
InputResult::InputConsumed | ||
} | ||
} | ||
}; | ||
} | ||
|
||
// 編集系の処理。Copy, Paste, Cut は OS 依存の処理なのでここでは定義しない。 | ||
edit_processor!(EditReturn, "return", InsertEnter); | ||
edit_processor!(EditBackspace, "backspace", Backspace); | ||
edit_processor!(EditBackspaceWord, "backspace-word", BackspaceWord); | ||
edit_processor!(EditDelete, "delete", Delete); | ||
edit_processor!(EditDeleteWord, "delete-word", DeleteWord); | ||
edit_processor!(EditPrevious, "previous", Previous); | ||
edit_processor!(EditNext, "next", Next); | ||
edit_processor!(EditBack, "back", Back); | ||
edit_processor!(EditForward, "forward", Forward); | ||
edit_processor!(EditBackWord, "back-word", BackWord); | ||
edit_processor!(EditForwardWord, "forward-word", ForwardWord); | ||
edit_processor!(EditHead, "head", Head); | ||
edit_processor!(EditLast, "last", Last); | ||
edit_processor!(EditUndo, "undo", Undo); | ||
edit_processor!(EditBufferHead, "buffer-head", BufferHead); | ||
edit_processor!(EditBufferLast, "buffer-last", BufferLast); | ||
edit_processor!(EditMark, "mark", Mark); | ||
edit_processor!(EditUnmark, "unmark", UnMark); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
mod edit; | ||
mod system; | ||
mod world; | ||
pub use edit::*; | ||
pub use system::*; | ||
pub use world::*; | ||
|
||
use stroke_parser::{Action, ActionArgument, CommandName, CommandNamespace}; | ||
|
||
use crate::{context::StateContext, layout_engine::World}; | ||
|
||
use super::InputResult; | ||
|
||
#[derive(Default)] | ||
pub struct ActionProcessorStore { | ||
processors: Vec<Box<dyn ActionProcessor>>, | ||
} | ||
|
||
impl ActionProcessorStore { | ||
pub fn add_default_system_processors(&mut self) { | ||
self.add_processor(Box::new(SystemExit)); | ||
self.add_processor(Box::new(SystemToggleFullscreen)); | ||
self.add_processor(Box::new(SystemToggleTitlebar)); | ||
self.add_processor(Box::new(SystemChangeGlobalDirection)); | ||
self.add_processor(Box::new(SystemChangeThemeUi)); | ||
self.add_processor(Box::new(SystemChangeTheme)); | ||
} | ||
|
||
pub fn add_default_edit_processors(&mut self) { | ||
self.add_processor(Box::new(EditReturn)); | ||
self.add_processor(Box::new(EditBackspace)); | ||
self.add_processor(Box::new(EditBackspaceWord)); | ||
self.add_processor(Box::new(EditDelete)); | ||
self.add_processor(Box::new(EditDeleteWord)); | ||
self.add_processor(Box::new(EditPrevious)); | ||
self.add_processor(Box::new(EditNext)); | ||
self.add_processor(Box::new(EditBack)); | ||
self.add_processor(Box::new(EditForward)); | ||
self.add_processor(Box::new(EditBackWord)); | ||
self.add_processor(Box::new(EditForwardWord)); | ||
self.add_processor(Box::new(EditHead)); | ||
self.add_processor(Box::new(EditLast)); | ||
self.add_processor(Box::new(EditUndo)); | ||
self.add_processor(Box::new(EditBufferHead)); | ||
self.add_processor(Box::new(EditBufferLast)); | ||
self.add_processor(Box::new(EditMark)); | ||
self.add_processor(Box::new(EditUnmark)); | ||
} | ||
|
||
pub fn add_default_world_processors(&mut self) { | ||
self.add_processor(Box::new(WorldRemoveCurrent)); | ||
self.add_processor(Box::new(WorldResetZoom)); | ||
self.add_processor(Box::new(WorldLookCurrent)); | ||
self.add_processor(Box::new(WorldLookNext)); | ||
self.add_processor(Box::new(WorldLookPrev)); | ||
self.add_processor(Box::new(WorldSwapNext)); | ||
self.add_processor(Box::new(WorldSwapPrev)); | ||
self.add_processor(Box::new(WorldFitWidth)); | ||
self.add_processor(Box::new(WorldFitHeight)); | ||
self.add_processor(Box::new(WorldFitByDirection)); | ||
self.add_processor(Box::new(WorldForward)); | ||
self.add_processor(Box::new(WorldBack)); | ||
self.add_processor(Box::new(WorldChangeDirection)); | ||
self.add_processor(Box::new(WorldIncreaseRowInterval)); | ||
self.add_processor(Box::new(WorldDecreaseRowInterval)); | ||
self.add_processor(Box::new(WorldIncreaseColInterval)); | ||
self.add_processor(Box::new(WorldDecreaseColInterval)); | ||
self.add_processor(Box::new(WorldIncreaseRowScale)); | ||
self.add_processor(Box::new(WorldDecreaseRowScale)); | ||
self.add_processor(Box::new(WorldIncreaseColScale)); | ||
self.add_processor(Box::new(WorldDecreaseColScale)); | ||
self.add_processor(Box::new(WorldTogglePsychedelic)); | ||
self.add_processor(Box::new(WorldMoveToClick)); | ||
self.add_processor(Box::new(WorldMoveToClickWithMark)); | ||
} | ||
|
||
pub fn add_lambda_processor( | ||
&mut self, | ||
namespace: &str, | ||
name: &str, | ||
f: fn(&ActionArgument, &StateContext, &mut dyn World) -> InputResult, | ||
) { | ||
self.processors.push(Box::new(LambdaActionProcessor { | ||
namespace: CommandNamespace::from(namespace), | ||
name: CommandName::from(name), | ||
f, | ||
})); | ||
} | ||
|
||
pub fn add_processor(&mut self, processor: Box<dyn ActionProcessor>) { | ||
self.processors.push(processor); | ||
} | ||
|
||
pub fn remove_processor(&mut self, namespace: &CommandNamespace, name: &CommandName) { | ||
self.processors | ||
.retain(|processor| processor.namespace() != *namespace || processor.name() != *name); | ||
} | ||
|
||
pub fn process( | ||
&self, | ||
action: &Action, | ||
context: &StateContext, | ||
world: &mut dyn World, | ||
) -> InputResult { | ||
if let Action::Command(namespace, name, argument) = action { | ||
for processor in &self.processors { | ||
if processor.namespace() == *namespace && processor.name() == *name { | ||
return processor.process(argument, context, world); | ||
} | ||
} | ||
} | ||
InputResult::Noop | ||
} | ||
} | ||
|
||
pub trait ActionProcessor { | ||
fn namespace(&self) -> CommandNamespace; | ||
fn name(&self) -> CommandName; | ||
fn process( | ||
&self, | ||
arg: &ActionArgument, | ||
context: &StateContext, | ||
world: &mut dyn World, | ||
) -> InputResult; | ||
} | ||
|
||
pub struct LambdaActionProcessor<F> | ||
where | ||
F: Fn(&ActionArgument, &StateContext, &mut dyn World) -> InputResult, | ||
{ | ||
namespace: CommandNamespace, | ||
name: CommandName, | ||
f: F, | ||
} | ||
|
||
impl ActionProcessor | ||
for LambdaActionProcessor<fn(&ActionArgument, &StateContext, &mut dyn World) -> InputResult> | ||
{ | ||
fn namespace(&self) -> CommandNamespace { | ||
self.namespace.clone() | ||
} | ||
|
||
fn name(&self) -> CommandName { | ||
self.name.clone() | ||
} | ||
|
||
fn process( | ||
&self, | ||
arg: &ActionArgument, | ||
context: &StateContext, | ||
world: &mut dyn World, | ||
) -> InputResult { | ||
(self.f)(arg, context, world) | ||
} | ||
} |
Oops, something went wrong.