Visual changes

This commit is contained in:
2026-08-01 23:40:56 +03:00
parent 20cb50574c
commit 64fbfb5a32
10 changed files with 55 additions and 68 deletions
Generated
+1 -15
View File
@@ -765,7 +765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737" checksum = "173852283a9a57a3cbe365d86e74dc428a09c50421477d5ad6fe9d9509e37737"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"fontdb 0.23.0", "fontdb",
"harfrust", "harfrust",
"linebender_resource_handle", "linebender_resource_handle",
"log", "log",
@@ -1200,19 +1200,6 @@ dependencies = [
"ttf-parser", "ttf-parser",
] ]
[[package]]
name = "fontdb"
version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2660c5e9157bf76d2db1294e4a9feba604ef610819a3b591088d0d8392a3290f"
dependencies = [
"fontconfig-parser",
"log",
"memmap2",
"slotmap",
"tinyvec",
]
[[package]] [[package]]
name = "foreign-types" name = "foreign-types"
version = "0.3.2" version = "0.3.2"
@@ -2110,7 +2097,6 @@ dependencies = [
"chrono", "chrono",
"criterion", "criterion",
"dirs", "dirs",
"fontdb 0.24.0",
"hex", "hex",
"iced", "iced",
"iced_core", "iced_core",
+1 -1
View File
@@ -19,7 +19,7 @@ sha2 = "0.11.0"
tokio = { version = "1.50.0", features = ["rt", "rt-multi-thread", "macros"] } tokio = { version = "1.50.0", features = ["rt", "rt-multi-thread", "macros"] }
hex = "0.4.3" hex = "0.4.3"
zstd = "0.13.3" zstd = "0.13.3"
fontdb = "0.24.0"
[dev-dependencies] [dev-dependencies]
criterion = "0.8.2" criterion = "0.8.2"
+19 -19
View File
@@ -64,29 +64,29 @@ pub fn add_stat_list(stat: &mut Vec<CardStatistics>, connection: &Connection) {
let mut index = 0; let mut index = 0;
for id in start_index..=last_index { for id in start_index..=last_index {
stat[index].id = id as u32; stat[index].id = id;
index += 1; index += 1;
} }
} }
pub fn add_stat(stat: &mut CardStatistics, connection: &Connection) { // pub fn add_stat(stat: &mut CardStatistics, connection: &Connection) {
let time = Instant::now(); // let time = Instant::now();
let index = connection // let index = connection
.query_row( // .query_row(
"INSERT INTO card_stats (word_id, set_id, score, last_opened) VALUES (?1, ?2, ?3, ?4) RETURNING id", // "INSERT INTO card_stats (word_id, set_id, score, last_opened) VALUES (?1, ?2, ?3, ?4) RETURNING id",
( // (
&stat.word_id, // &stat.word_id,
&stat.set_id, // &stat.set_id,
&stat.score, // &stat.score,
&stat.last_open.timestamp(), // &stat.last_open.timestamp(),
), // ),
|row| row.get(0) // |row| row.get(0)
) // )
.unwrap_or_else(|e| {println!("{}", e); 0}); // .unwrap_or_else(|e| {println!("{}", e); 0});
//
stat.id = index; // stat.id = index;
println!("Added stat: {}", time.elapsed().as_millis()); // println!("Added stat: {}", time.elapsed().as_millis());
} // }
pub fn update_stat_score(stat: &CardStatistics, connection: &Connection) { pub fn update_stat_score(stat: &CardStatistics, connection: &Connection) {
let time = Instant::now(); let time = Instant::now();
+1 -5
View File
@@ -6,17 +6,13 @@ use std::io::Write;
use std::io::{BufRead, BufReader}; use std::io::{BufRead, BufReader};
use std::path::PathBuf; use std::path::PathBuf;
const MAX_HISTORY_LENGTH: usize = 1000;
pub fn get_history_of_set(id: u32) -> Vec<HistoryItem> { pub fn get_history_of_set(id: u32) -> Vec<HistoryItem> {
let app_dir = app_data_dir(); let app_dir = app_data_dir();
let head = app_dir.clone().join(format!("set_{}_history.csv", id)); let head = app_dir.clone().join(format!("set_{}_history.csv", id));
let tail = app_dir.clone().join(format!("set_{}_history_tail.csv", id));
let mut lines = Vec::new(); let mut lines = Vec::new();
append_lines_if_exists(tail, &mut lines);
append_lines_if_exists(head, &mut lines); append_lines_if_exists(head, &mut lines);
lines.reverse();
parse_history_items(lines) parse_history_items(lines)
} }
+1 -1
View File
@@ -17,7 +17,7 @@ pub fn create_db() {
} }
} }
fn ensure_db_schema(conn: &Connection) {} fn ensure_db_schema(_: &Connection) {}
fn create_tables(conn: &Connection) { fn create_tables(conn: &Connection) {
make_card_set(conn).unwrap(); make_card_set(conn).unwrap();
+6 -16
View File
@@ -293,13 +293,14 @@ impl DictionaryState {
row![ row![
iced::widget::column![ iced::widget::column![
self.groups_panel(), self.groups_panel(),
self.words_list(), row![horizontal().width(8),
self.words_list(),],
button("Добавить слово").style(jl_button).on_press(NewWord), button("Добавить слово").style(jl_button).on_press(NewWord),
] ]
.spacing(5), .spacing(5),
self.filters(), self.filters(),
] ]
.spacing(5) .spacing(DEFAULT_SPACING)
.into(), .into(),
Back, Back,
) )
@@ -337,8 +338,7 @@ impl DictionaryState {
let mut line = Row::new().width(Length::Fill).align_y(Center); let mut line = Row::new().width(Length::Fill).align_y(Center);
line = line line = line
.push(checkbox(self.include_map[i]).on_toggle(move |b| Include(i, b))) .push(checkbox(self.include_map[i]).label("").spacing(15).on_toggle(move |b| Include(i, b)));
.push(space().width(10));
line = line.push( line = line.push(
text_input("Слово", &word.key) text_input("Слово", &word.key)
@@ -536,7 +536,7 @@ impl DictionaryState {
iced::widget::column![ iced::widget::column![
scrollable(row).width(Length::Fill).horizontal(), scrollable(row).width(Length::Fill).horizontal(),
row![ row![
button("").on_press(ChangeDirection), button("").on_press(ChangeDirection).style(jl_button),
text_input("Название группы слов", &group.name) text_input("Название группы слов", &group.name)
.on_input(EditGroup) .on_input(EditGroup)
.width(250) .width(250)
@@ -544,7 +544,7 @@ impl DictionaryState {
horizontal(), horizontal(),
button("Удалить").style(danger).on_press(DeleteGroup), button("Удалить").style(danger).on_press(DeleteGroup),
] ]
.spacing(DEFAULT_SPACING) .spacing(DEFAULT_SPACING / 2.0)
] ]
.into() .into()
} }
@@ -566,13 +566,3 @@ pub fn app_data_dir() -> PathBuf {
dir dir
} }
// pub fn app_cache_dir() -> PathBuf {
// let mut dir = dirs::cache_dir().unwrap();
// dir.push("jap_learn");
// if !dir.exists() {
// fs::create_dir(dir.clone()).unwrap();
// }
//
// dir
// }
+5 -3
View File
@@ -1,14 +1,15 @@
use crate::data_provider::history::{get_history_of_set, HistoryItem}; use crate::data_provider::history::{HistoryItem, get_history_of_set};
use crate::lang::WordData; use crate::lang::WordData;
use crate::navigation::{NavigatedPage, Page}; use crate::navigation::{NavigatedPage, Page};
use crate::styling::*; use crate::styling::*;
use crate::{AppState, RootMessage}; use crate::{AppState, RootMessage};
use HistoryMessage::Back;
use chrono::Local;
use iced::alignment::Horizontal::Center; use iced::alignment::Horizontal::Center;
use iced::widget::space::horizontal; use iced::widget::space::horizontal;
use iced::widget::*; use iced::widget::*;
use iced::{Element, Fill, FillPortion, Task}; use iced::{Element, Fill, FillPortion, Task};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use HistoryMessage::Back;
#[derive(Clone)] #[derive(Clone)]
pub struct HistoryState { pub struct HistoryState {
@@ -82,10 +83,11 @@ impl HistoryState {
.align_x(Center), .align_x(Center),
iced::widget::column![ iced::widget::column![
text!("{} ➞ {}", item.before, item.after), text!("{} ➞ {}", item.before, item.after),
text!("{}", item.timestamp.format("%d.%m %H:%M")) text!("{}", item.timestamp.with_timezone(&Local).format("%d.%m %H:%M"))
] ]
.spacing(5) .spacing(5)
.align_x(Center) .align_x(Center)
] ]
.spacing(5), .spacing(5),
); );
+2 -2
View File
@@ -1,4 +1,4 @@
// #![windows_subsystem = "windows"] #![windows_subsystem = "windows"]
mod data_provider; mod data_provider;
mod dictionary; mod dictionary;
mod dictionary_test; mod dictionary_test;
@@ -25,7 +25,7 @@ use crate::quiz::*;
use crate::repetitions::CardSetSettings; use crate::repetitions::CardSetSettings;
use crate::RootMessage::Keyboard; use crate::RootMessage::Keyboard;
use iced::Font; use iced::Font;
use iced::{keyboard, Program, Subscription, Theme}; use iced::{keyboard, Subscription, Theme};
use rusqlite::Connection; use rusqlite::Connection;
const USER_FONT: Font = Font::with_name("Noto Sans JP"); const USER_FONT: Font = Font::with_name("Noto Sans JP");
+18 -5
View File
@@ -9,8 +9,10 @@ use crate::styling::*;
use crate::sync::SyncState; use crate::sync::SyncState;
use crate::writing::WritingState; use crate::writing::WritingState;
use crate::{AppState, QuizState, RootMessage}; use crate::{AppState, QuizState, RootMessage};
use iced::widget::button::{Status, Style};
use iced::widget::*; use iced::widget::*;
use iced::{alignment, Element, Task}; use iced::{Element, Task, alignment};
use iced_core::{Background, Color};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
pub struct SelectorState { pub struct SelectorState {
@@ -80,6 +82,17 @@ impl SelectorState {
Task::none() Task::none()
} }
fn nav_style(theme: &Theme, status: Status) -> Style {
let mut basic = button::text(theme, status);
basic.background = if status == Status::Hovered {
Some(Background::Color(Color::WHITE.scale_alpha(0.1)))
} else {
None
};
basic.border.radius = BUTTON_RADIUS.into();
basic
}
pub fn view(&self) -> Element<'_, SelectorMessage> { pub fn view(&self) -> Element<'_, SelectorMessage> {
container( container(
iced::widget::column![ iced::widget::column![
@@ -89,16 +102,16 @@ impl SelectorState {
.style(jl_button), .style(jl_button),
button("Словарь") button("Словарь")
.on_press(SelectorMessage::ToDictionary) .on_press(SelectorMessage::ToDictionary)
.style(button::text), .style(Self::nav_style),
button("Рандомайзер") button("Рандомайзер")
.on_press(SelectorMessage::ToRandomize) .on_press(SelectorMessage::ToRandomize)
.style(button::text), .style(Self::nav_style),
button("Повторение") button("Повторение")
.on_press(SelectorMessage::ToRepetitions) .on_press(SelectorMessage::ToRepetitions)
.style(button::text), .style(Self::nav_style),
button("Синхронизация") button("Синхронизация")
.on_press(SelectorMessage::ToSync) .on_press(SelectorMessage::ToSync)
.style(button::text) .style(Self::nav_style)
] ]
.spacing(DEFAULT_SPACING), .spacing(DEFAULT_SPACING),
self.rows_selector(), self.rows_selector(),
+1 -1
View File
@@ -9,7 +9,7 @@ use iced_core::{Border, Theme};
pub const DEFAULT_SPACING: f32 = 16.0; pub const DEFAULT_SPACING: f32 = 16.0;
pub const ACCENT_FONT_SIZE: f32 = 22.0; pub const ACCENT_FONT_SIZE: f32 = 22.0;
const BUTTON_RADIUS: f32 = 8.0; pub const BUTTON_RADIUS: f32 = 8.0;
pub fn jl_button(theme: &Theme, status: Status) -> Style { pub fn jl_button(theme: &Theme, status: Status) -> Style {
let mut style = primary(theme, status); let mut style = primary(theme, status);