improve math mode
This commit is contained in:
parent
b355e67819
commit
ed72037239
1 changed files with 55 additions and 29 deletions
|
@ -168,7 +168,7 @@ impl<T: Clone + Send + Sync> DRunProvider<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone + std::marker::Send + std::marker::Sync> ItemProvider<T> for DRunProvider<T> {
|
impl<T: Clone + Send + Sync> ItemProvider<T> for DRunProvider<T> {
|
||||||
fn get_elements(&mut self, _: Option<&str>) -> Vec<MenuItem<T>> {
|
fn get_elements(&mut self, _: Option<&str>) -> Vec<MenuItem<T>> {
|
||||||
if self.items.is_none() {
|
if self.items.is_none() {
|
||||||
self.items = Some(self.load().clone());
|
self.items = Some(self.load().clone());
|
||||||
|
@ -319,11 +319,15 @@ impl<T: Clone> ItemProvider<T> for FileItemProvider<T> {
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct MathProvider<T: Clone> {
|
struct MathProvider<T: Clone> {
|
||||||
menu_item_data: T,
|
menu_item_data: T,
|
||||||
|
elements: Vec<MenuItem<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> MathProvider<T> {
|
impl<T: Clone> MathProvider<T> {
|
||||||
fn new(menu_item_data: T) -> Self {
|
fn new(menu_item_data: T) -> Self {
|
||||||
Self { menu_item_data }
|
Self {
|
||||||
|
menu_item_data,
|
||||||
|
elements: vec![],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn contains_math_functions_or_starts_with_number(input: &str) -> bool {
|
fn contains_math_functions_or_starts_with_number(input: &str) -> bool {
|
||||||
|
@ -338,6 +342,10 @@ impl<T: Clone> MathProvider<T> {
|
||||||
|
|
||||||
math_regex.is_match(input) || number_regex.is_match(input)
|
math_regex.is_match(input) || number_regex.is_match(input)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn add_elements(&mut self, elements: &mut Vec<MenuItem<T>>) {
|
||||||
|
self.elements.append(elements);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Clone> ItemProvider<T> for MathProvider<T> {
|
impl<T: Clone> ItemProvider<T> for MathProvider<T> {
|
||||||
|
@ -357,9 +365,11 @@ impl<T: Clone> ItemProvider<T> for MathProvider<T> {
|
||||||
0.0,
|
0.0,
|
||||||
Some(self.menu_item_data.clone()),
|
Some(self.menu_item_data.clone()),
|
||||||
);
|
);
|
||||||
vec![item]
|
let mut result = vec![item];
|
||||||
|
result.append(&mut self.elements.clone());
|
||||||
|
result
|
||||||
} else {
|
} else {
|
||||||
vec![]
|
self.elements.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,31 +494,40 @@ pub fn d_run(config: &Config) -> Result<(), ModeError> {
|
||||||
/// Will return `Err`
|
/// Will return `Err`
|
||||||
/// * if it was not able to spawn the process
|
/// * if it was not able to spawn the process
|
||||||
pub fn auto(config: &Config) -> Result<(), ModeError> {
|
pub fn auto(config: &Config) -> Result<(), ModeError> {
|
||||||
let provider = AutoItemProvider::new();
|
let mut provider = AutoItemProvider::new();
|
||||||
let cache_path = provider.drun.cache_path.clone();
|
let cache_path = provider.drun.cache_path.clone();
|
||||||
let mut cache = provider.drun.cache.clone();
|
let mut cache = provider.drun.cache.clone();
|
||||||
|
let mut cfg_clone = config.clone();
|
||||||
|
|
||||||
|
loop {
|
||||||
// todo ues a arc instead of cloning the config
|
// todo ues a arc instead of cloning the config
|
||||||
let selection_result = gui::show(config.clone(), provider, false);
|
let selection_result = gui::show(cfg_clone.clone(), provider.clone(), false);
|
||||||
|
|
||||||
match selection_result {
|
match selection_result {
|
||||||
Ok(selection_result) => {
|
Ok(selection_result) => {
|
||||||
if let Some(data) = &selection_result.data {
|
if let Some(data) = &selection_result.data {
|
||||||
match data {
|
match data {
|
||||||
AutoRunType::Math => {}
|
AutoRunType::Math => {
|
||||||
|
cfg_clone.prompt = Some(selection_result.label.clone());
|
||||||
|
provider.math.elements.push(selection_result);
|
||||||
|
}
|
||||||
AutoRunType::DRun => {
|
AutoRunType::DRun => {
|
||||||
update_drun_cache_and_run(cache_path, &mut cache, selection_result)?;
|
update_drun_cache_and_run(cache_path, &mut cache, selection_result)?;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
AutoRunType::File => {
|
AutoRunType::File => {
|
||||||
if let Some(action) = selection_result.action {
|
if let Some(action) = selection_result.action {
|
||||||
spawn_fork(&action, selection_result.working_dir.as_ref())?;
|
spawn_fork(&action, selection_result.working_dir.as_ref())?;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
log::error!("No item selected");
|
log::error!("No item selected");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,14 +558,21 @@ pub fn file(config: &Config) -> Result<(), ModeError> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn math(config: &Config) {
|
pub fn math(config: &Config) {
|
||||||
let provider = MathProvider::new(String::new);
|
let mut cfg_clone = config.clone();
|
||||||
|
let mut calc: Vec<MenuItem<String>> = vec![];
|
||||||
// todo ues a arc instead of cloning the config
|
loop {
|
||||||
let selection_result = gui::show(config.clone(), provider, false);
|
let mut provider = MathProvider::new(String::new());
|
||||||
|
provider.add_elements(&mut calc.clone());
|
||||||
|
let selection_result = gui::show(cfg_clone.clone(), provider, true);
|
||||||
match selection_result {
|
match selection_result {
|
||||||
Ok(_) => {}
|
Ok(mi) => {
|
||||||
|
cfg_clone.prompt = Some(mi.label.clone());
|
||||||
|
calc.push(mi);
|
||||||
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
log::error!("No item selected");
|
log::error!("No item selected");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue