release repetitions
This commit is contained in:
+4
-18
@@ -2,7 +2,7 @@ use crate::data_provider::words::{delete_word, update_word};
|
|||||||
use crate::dictionary::DictionaryMessage::Test;
|
use crate::dictionary::DictionaryMessage::Test;
|
||||||
use crate::dictionary_test::DictionaryQuizState;
|
use crate::dictionary_test::DictionaryQuizState;
|
||||||
use crate::lang::DictionaryElement;
|
use crate::lang::DictionaryElement;
|
||||||
use crate::{AppState, NavigatedPage, Page, RootMessage};
|
use crate::{AppState, NavigatedPage, Page, RootMessage, DEFAULT_SPACING};
|
||||||
use iced::alignment::Vertical::Center;
|
use iced::alignment::Vertical::Center;
|
||||||
use iced::widget::button::Style;
|
use iced::widget::button::Style;
|
||||||
use iced::widget::*;
|
use iced::widget::*;
|
||||||
@@ -34,7 +34,6 @@ pub enum DictionaryMessage {
|
|||||||
NewWord,
|
NewWord,
|
||||||
Include(usize, bool),
|
Include(usize, bool),
|
||||||
IncludeTag(String, bool),
|
IncludeTag(String, bool),
|
||||||
Save,
|
|
||||||
Test,
|
Test,
|
||||||
ResetTags,
|
ResetTags,
|
||||||
SetReverse(bool),
|
SetReverse(bool),
|
||||||
@@ -126,15 +125,6 @@ impl DictionaryState {
|
|||||||
self.tag_map.iter_mut().for_each(|(_, v)| *v = false);
|
self.tag_map.iter_mut().for_each(|(_, v)| *v = false);
|
||||||
self.include_map.iter_mut().for_each(|x| *x = false)
|
self.include_map.iter_mut().for_each(|x| *x = false)
|
||||||
}
|
}
|
||||||
|
|
||||||
DictionaryMessage::Save => {
|
|
||||||
/* let dir = dict_file();
|
|
||||||
let dict = &self.state.lock().unwrap().dictionary;
|
|
||||||
|
|
||||||
let content = serde_json::to_string_pretty(&dict.clone()).unwrap();
|
|
||||||
fs::write(dir, content.clone())
|
|
||||||
.unwrap_or_else(|e| println!("Can't write file: {}", e));*/
|
|
||||||
}
|
|
||||||
DictionaryMessage::SetReverse(v) => self.reverse = v,
|
DictionaryMessage::SetReverse(v) => self.reverse = v,
|
||||||
DictionaryMessage::Search(s) => {
|
DictionaryMessage::Search(s) => {
|
||||||
self.search = s;
|
self.search = s;
|
||||||
@@ -160,16 +150,12 @@ impl DictionaryState {
|
|||||||
iced::widget::column![
|
iced::widget::column![
|
||||||
button("Назад").on_press(Back),
|
button("Назад").on_press(Back),
|
||||||
self.words_list(),
|
self.words_list(),
|
||||||
row![
|
button("Добавить слово").on_press(DictionaryMessage::NewWord),
|
||||||
button("Добавить слово").on_press(DictionaryMessage::NewWord),
|
|
||||||
button("Сохранить словарь").on_press(DictionaryMessage::Save),
|
|
||||||
]
|
|
||||||
.spacing(10)
|
|
||||||
]
|
]
|
||||||
.spacing(5),
|
.spacing(5),
|
||||||
self.filters()
|
self.filters()
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
)
|
)
|
||||||
.padding(10)
|
.padding(10)
|
||||||
.into()
|
.into()
|
||||||
@@ -266,7 +252,7 @@ impl DictionaryState {
|
|||||||
.width(Length::Fill),
|
.width(Length::Fill),
|
||||||
]
|
]
|
||||||
.width(250)
|
.width(250)
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
use crate::dictionary::{split_with_coma};
|
use crate::dictionary::{split_with_coma};
|
||||||
use crate::quiz::Score;
|
use crate::quiz::Score;
|
||||||
use crate::Page::PreviousPage;
|
use crate::Page::PreviousPage;
|
||||||
use crate::RootMessage;
|
use crate::{RootMessage, DEFAULT_SPACING};
|
||||||
use crate::{NavigatedPage, Page};
|
use crate::{NavigatedPage, Page};
|
||||||
use iced::border::Radius;
|
use iced::border::Radius;
|
||||||
use iced::widget::container::Style;
|
use iced::widget::container::Style;
|
||||||
@@ -102,14 +102,14 @@ impl DictionaryQuizState {
|
|||||||
.color(iced::Color::from_rgb8(255, 79, 0))
|
.color(iced::Color::from_rgb8(255, 79, 0))
|
||||||
.size(25),
|
.size(25),
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
row![
|
row![
|
||||||
button("Закончить").on_press(DictionaryQuizMessage::Back),
|
button("Закончить").on_press(DictionaryQuizMessage::Back),
|
||||||
self.appeal_button()
|
self.appeal_button()
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.align_x(alignment::Horizontal::Center),
|
.align_x(alignment::Horizontal::Center),
|
||||||
)
|
)
|
||||||
.center_y(Fill)
|
.center_y(Fill)
|
||||||
@@ -199,7 +199,7 @@ impl DictionaryQuizState {
|
|||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
col.spacing(10).into()
|
col.spacing(DEFAULT_SPACING).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn appeal_button(&self) -> Element<'_, DictionaryQuizMessage> {
|
fn appeal_button(&self) -> Element<'_, DictionaryQuizMessage> {
|
||||||
|
|||||||
+4
-3
@@ -257,7 +257,6 @@ pub struct CardStatistics {
|
|||||||
|
|
||||||
impl CardStatistics {
|
impl CardStatistics {
|
||||||
pub fn update(&mut self, status: WordOpenMode) {
|
pub fn update(&mut self, status: WordOpenMode) {
|
||||||
self.last_open = Utc::now();
|
|
||||||
match status {
|
match status {
|
||||||
WordOpenMode::Easy => {
|
WordOpenMode::Easy => {
|
||||||
self.score = (self.calculated_score() + 5.0).round() as i32;
|
self.score = (self.calculated_score() + 5.0).round() as i32;
|
||||||
@@ -278,6 +277,8 @@ impl CardStatistics {
|
|||||||
} else if self.score > MAX_SCORE {
|
} else if self.score > MAX_SCORE {
|
||||||
self.score = MAX_SCORE
|
self.score = MAX_SCORE
|
||||||
}
|
}
|
||||||
|
self.last_open = Utc::now();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn calculated_score(&self) -> f32 {
|
pub fn calculated_score(&self) -> f32 {
|
||||||
@@ -340,7 +341,7 @@ impl CardSet {
|
|||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let weights = current_set.iter().map(|s| (100.0 / s.calculated_score()).powi(2)).collect::<Vec<f32>>();
|
let weights = current_set.iter().map(|s| (100.0 / s.calculated_score()).powf(1.5)).collect::<Vec<f32>>();
|
||||||
let indexes = WeightedIndex::new(weights).unwrap();
|
let indexes = WeightedIndex::new(weights).unwrap();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
@@ -366,7 +367,7 @@ impl CardSet {
|
|||||||
|
|
||||||
let word = &mut self.set[self.current_word_index.unwrap()];
|
let word = &mut self.set[self.current_word_index.unwrap()];
|
||||||
word.update(status);
|
word.update(status);
|
||||||
let new_weight = (100.0 / word.calculated_score()).powi(2);
|
let new_weight = (100.0 / word.calculated_score()).powf(1.5);
|
||||||
self.last_weights.update_weights(&[(self.current_word_index.unwrap(), &new_weight)]).unwrap();
|
self.last_weights.update_weights(&[(self.current_word_index.unwrap(), &new_weight)]).unwrap();
|
||||||
{
|
{
|
||||||
update_stat_score(word, &self.state.lock().unwrap().connection)
|
update_stat_score(word, &self.state.lock().unwrap().connection)
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ use std::sync::{Arc, Mutex};
|
|||||||
use iced::keyboard::Event;
|
use iced::keyboard::Event;
|
||||||
use crate::RootMessage::Keyboard;
|
use crate::RootMessage::Keyboard;
|
||||||
|
|
||||||
|
const DEFAULT_SPACING: f32 = 10.0;
|
||||||
|
|
||||||
fn main() -> iced::Result {
|
fn main() -> iced::Result {
|
||||||
iced::application(ScreenState::boot, ScreenState::update, ScreenState::view).subscription(subscription)
|
iced::application(ScreenState::boot, ScreenState::update, ScreenState::view).subscription(subscription)
|
||||||
.title("Kana learn app")
|
.title("Kana learn app")
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
use crate::lang::KanaSet;
|
use crate::lang::KanaSet;
|
||||||
use crate::Page::PreviousPage;
|
use crate::Page::PreviousPage;
|
||||||
use crate::{NavigatedPage, Page, RootMessage};
|
use crate::{NavigatedPage, Page, RootMessage, DEFAULT_SPACING};
|
||||||
use iced::widget::*;
|
use iced::widget::*;
|
||||||
use iced::{alignment, Element, Fill, Task};
|
use iced::{alignment, Element, Fill, Task};
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
@@ -126,10 +126,10 @@ impl QuizState {
|
|||||||
.color(iced::Color::from_rgb8(255, 79, 0))
|
.color(iced::Color::from_rgb8(255, 79, 0))
|
||||||
.size(25),
|
.size(25),
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
button("Закончить").on_press(QuizMessage::Back),
|
button("Закончить").on_press(QuizMessage::Back),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.align_x(alignment::Horizontal::Center),
|
.align_x(alignment::Horizontal::Center),
|
||||||
)
|
)
|
||||||
.center_y(Fill)
|
.center_y(Fill)
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
use crate::lang::{CardSet, DictionaryElement, WordOpenMode};
|
use crate::lang::{CardSet, DictionaryElement, WordOpenMode};
|
||||||
use crate::repetitions::CardSetSettings;
|
use crate::repetitions::CardSetSettings;
|
||||||
use crate::Page::PreviousPage;
|
use crate::Page::PreviousPage;
|
||||||
use crate::{AppState, KeyPressedPage, NavigatedPage, Page, RootMessage};
|
use crate::{AppState, KeyPressedPage, NavigatedPage, Page, RootMessage, DEFAULT_SPACING};
|
||||||
use iced::alignment::Horizontal::Center;
|
use iced::alignment::Horizontal::Center;
|
||||||
use iced::keyboard::key::Physical::Code;
|
use iced::keyboard::key::Physical::Code;
|
||||||
use iced::widget::container::rounded_box;
|
use iced::widget::container::rounded_box;
|
||||||
@@ -139,7 +139,7 @@ impl RepetitionState {
|
|||||||
button("Нормально").on_press(RepetitionMessage::Answer(WordOpenMode::Ok)),
|
button("Нормально").on_press(RepetitionMessage::Answer(WordOpenMode::Ok)),
|
||||||
button("Легко").on_press(RepetitionMessage::Answer(WordOpenMode::Easy)),
|
button("Легко").on_press(RepetitionMessage::Answer(WordOpenMode::Easy)),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -2,7 +2,7 @@ use crate::data_provider::card_sets::{delete_set, update_card_set};
|
|||||||
use crate::lang::DictionaryElement;
|
use crate::lang::DictionaryElement;
|
||||||
use crate::repetition::RepetitionState;
|
use crate::repetition::RepetitionState;
|
||||||
use crate::Page::{PreviousPage, Repetition};
|
use crate::Page::{PreviousPage, Repetition};
|
||||||
use crate::{AppState, NavigatedPage, Page, RootMessage};
|
use crate::{AppState, NavigatedPage, Page, RootMessage, DEFAULT_SPACING};
|
||||||
pub use iced::widget::button::{Catalog, Style};
|
pub use iced::widget::button::{Catalog, Style};
|
||||||
use iced::widget::{button, column, container, row, scrollable, space, text, text_input, Column};
|
use iced::widget::{button, column, container, row, scrollable, space, text, text_input, Column};
|
||||||
use iced::Background::Color;
|
use iced::Background::Color;
|
||||||
@@ -112,14 +112,14 @@ impl RepetitionsState {
|
|||||||
.width(Fill)
|
.width(Fill)
|
||||||
.on_press(RepetitionsMessage::CreateSet),
|
.on_press(RepetitionsMessage::CreateSet),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.width(Length::FillPortion(1)),
|
.width(Length::FillPortion(1)),
|
||||||
self.selected_set_view(),
|
self.selected_set_view(),
|
||||||
self.launch_button()
|
self.launch_button()
|
||||||
]
|
]
|
||||||
.align_y(Center)
|
.align_y(Center)
|
||||||
.padding(10)
|
.padding(10)
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.width(Fill)
|
.width(Fill)
|
||||||
.height(Fill)
|
.height(Fill)
|
||||||
]
|
]
|
||||||
@@ -159,7 +159,7 @@ impl RepetitionsState {
|
|||||||
button("Проверить фильтр").on_press(RepetitionsMessage::TryFilter),
|
button("Проверить фильтр").on_press(RepetitionsMessage::TryFilter),
|
||||||
self.count_view(&sets[index])
|
self.count_view(&sets[index])
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
)
|
)
|
||||||
.height(Fill),
|
.height(Fill),
|
||||||
row![
|
row![
|
||||||
@@ -174,9 +174,9 @@ impl RepetitionsState {
|
|||||||
})
|
})
|
||||||
.on_press(RepetitionsMessage::DeleteSet)
|
.on_press(RepetitionsMessage::DeleteSet)
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.width(Length::FillPortion(2))
|
.width(Length::FillPortion(2))
|
||||||
.into();
|
.into();
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-5
@@ -6,7 +6,7 @@ use crate::repetitions::RepetitionsState;
|
|||||||
use crate::selector::SelectorMessage::ChangeMode;
|
use crate::selector::SelectorMessage::ChangeMode;
|
||||||
use crate::writing::WritingState;
|
use crate::writing::WritingState;
|
||||||
use crate::Page::{Quiz, Writing};
|
use crate::Page::{Quiz, Writing};
|
||||||
use crate::{AppState, NavigatedPage, Page, QuizState, RootMessage};
|
use crate::{AppState, NavigatedPage, Page, QuizState, RootMessage, DEFAULT_SPACING};
|
||||||
use iced::widget::*;
|
use iced::widget::*;
|
||||||
use iced::{alignment, Element, Task};
|
use iced::{alignment, Element, Task};
|
||||||
|
|
||||||
@@ -82,14 +82,14 @@ impl SelectorState {
|
|||||||
button("Рандомайзер").on_press(SelectorMessage::ToRandomize),
|
button("Рандомайзер").on_press(SelectorMessage::ToRandomize),
|
||||||
button("Повторение").on_press(SelectorMessage::ToRepetitions)
|
button("Повторение").on_press(SelectorMessage::ToRepetitions)
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
self.rows_selector(),
|
self.rows_selector(),
|
||||||
toggler(self.is_writing)
|
toggler(self.is_writing)
|
||||||
.label("Режим письма")
|
.label("Режим письма")
|
||||||
.on_toggle(ChangeMode),
|
.on_toggle(ChangeMode),
|
||||||
button("К тесту").on_press(SelectorMessage::Goto),
|
button("К тесту").on_press(SelectorMessage::Goto),
|
||||||
]
|
]
|
||||||
.spacing(10),
|
.spacing(DEFAULT_SPACING),
|
||||||
)
|
)
|
||||||
.padding(10)
|
.padding(10)
|
||||||
.into()
|
.into()
|
||||||
@@ -115,11 +115,11 @@ impl SelectorState {
|
|||||||
|
|
||||||
row = row.push(
|
row = row.push(
|
||||||
chars_column
|
chars_column
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.align_x(alignment::Horizontal::Center),
|
.align_x(alignment::Horizontal::Center),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
row.spacing(10).into()
|
row.spacing(DEFAULT_SPACING).into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
use crate::lang::KanaSet;
|
use crate::lang::KanaSet;
|
||||||
use crate::Page::PreviousPage;
|
use crate::Page::PreviousPage;
|
||||||
use crate::{NavigatedPage, Page, RootMessage};
|
use crate::{NavigatedPage, Page, RootMessage, DEFAULT_SPACING};
|
||||||
use iced::widget::*;
|
use iced::widget::*;
|
||||||
use iced::{alignment, Element, Fill, Task};
|
use iced::{alignment, Element, Fill, Task};
|
||||||
use rand::seq::SliceRandom;
|
use rand::seq::SliceRandom;
|
||||||
@@ -96,9 +96,9 @@ impl WritingState {
|
|||||||
button(text!("{}", self.next_text)).on_press(WritingMessage::Next),
|
button(text!("{}", self.next_text)).on_press(WritingMessage::Next),
|
||||||
button("Закончить").on_press(WritingMessage::Back),
|
button("Закончить").on_press(WritingMessage::Back),
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
]
|
]
|
||||||
.spacing(10)
|
.spacing(DEFAULT_SPACING)
|
||||||
.align_x(alignment::Horizontal::Center),
|
.align_x(alignment::Horizontal::Center),
|
||||||
)
|
)
|
||||||
.center_x(Fill)
|
.center_x(Fill)
|
||||||
|
|||||||
Reference in New Issue
Block a user