bundle path correctly
This commit is contained in:
parent
c1ab31054c
commit
6d4dcda574
5 changed files with 74 additions and 19 deletions
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::HashMap;
|
use std::{collections::HashMap, path::PathBuf};
|
||||||
|
|
||||||
use sqlx::{sqlite::SqliteRow, Encode, Row, SqlitePool, Type};
|
use sqlx::{sqlite::SqliteRow, Encode, Row, SqlitePool, Type};
|
||||||
use tauri::State;
|
use tauri::State;
|
||||||
|
@ -8,7 +8,7 @@ use crate::{
|
||||||
utils::{EpochMs, Ticks},
|
utils::{EpochMs, Ticks},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct KanjiDb(pub SqlitePool);
|
pub struct KanjiDb(pub SqlitePool, pub PathBuf);
|
||||||
|
|
||||||
#[derive(Debug, Derivative, Serialize, Deserialize)]
|
#[derive(Debug, Derivative, Serialize, Deserialize)]
|
||||||
#[derivative(Default)]
|
#[derivative(Default)]
|
||||||
|
|
|
@ -16,7 +16,7 @@ use std::str::FromStr;
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
|
use sqlx::sqlite::{SqliteConnectOptions, SqlitePoolOptions};
|
||||||
use tauri::{
|
use tauri::{
|
||||||
CustomMenuItem, SystemTray, SystemTrayEvent, SystemTrayMenu,
|
CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu,
|
||||||
SystemTrayMenuItem, WindowEvent,
|
SystemTrayMenuItem, WindowEvent,
|
||||||
};
|
};
|
||||||
use tokio::fs;
|
use tokio::fs;
|
||||||
|
@ -26,27 +26,21 @@ use crate::srs::SrsDb;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> Result<()> {
|
async fn main() -> Result<()> {
|
||||||
let app_dir = dirs::state_dir().unwrap().join("houhou");
|
let app_dir = dirs::data_dir().unwrap().join("houhou");
|
||||||
fs::create_dir_all(&app_dir).await?;
|
fs::create_dir_all(&app_dir).await?;
|
||||||
|
|
||||||
// Open kanji db
|
|
||||||
let kanji_db_options =
|
|
||||||
SqliteConnectOptions::from_str("./KanjiDatabase.sqlite")?.read_only(true);
|
|
||||||
let kanji_pool = SqlitePoolOptions::new()
|
|
||||||
.connect_with(kanji_db_options)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
// Open SRS db
|
// Open SRS db
|
||||||
let srs_db_path = app_dir.join("srs_db.sqlite");
|
let srs_db_path = app_dir.join("srs_db.sqlite");
|
||||||
|
let srs_db_path_str = srs_db_path.display().to_string();
|
||||||
let srs_db_options =
|
let srs_db_options =
|
||||||
SqliteConnectOptions::from_str(&srs_db_path.display().to_string())?
|
SqliteConnectOptions::from_str(&srs_db_path_str)?.create_if_missing(true);
|
||||||
.create_if_missing(true);
|
|
||||||
println!("Opening srs database at {} ...", srs_db_path.display());
|
println!("Opening srs database at {} ...", srs_db_path.display());
|
||||||
let srs_pool = SqlitePoolOptions::new()
|
let srs_pool = SqlitePoolOptions::new()
|
||||||
.connect_with(srs_db_options)
|
.connect_with(srs_db_options)
|
||||||
.await?;
|
.await?;
|
||||||
println!("Running migrations...");
|
println!("Running migrations...");
|
||||||
sqlx::migrate!().run(&srs_pool).await?;
|
sqlx::migrate!().run(&srs_pool).await?;
|
||||||
|
let srs_db = SrsDb(srs_pool, srs_db_path);
|
||||||
|
|
||||||
// System tray
|
// System tray
|
||||||
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
|
let quit = CustomMenuItem::new("quit".to_string(), "Quit");
|
||||||
|
@ -57,15 +51,22 @@ async fn main() -> Result<()> {
|
||||||
|
|
||||||
// Build tauri
|
// Build tauri
|
||||||
tauri::Builder::default()
|
tauri::Builder::default()
|
||||||
.manage(KanjiDb(kanji_pool))
|
.manage(srs_db)
|
||||||
.manage(SrsDb(srs_pool))
|
|
||||||
.system_tray(tray)
|
.system_tray(tray)
|
||||||
.setup(|app| {
|
.setup(|app| {
|
||||||
let resource_path = app
|
let resource_path = app
|
||||||
.path_resolver()
|
.path_resolver()
|
||||||
.resolve_resource("./KanjiDatabase.sqlite")
|
.resolve_resource("./KanjiDatabase.sqlite")
|
||||||
.expect("failed to resolve resource");
|
.expect("failed to resolve resource");
|
||||||
println!("Resource path: {}", resource_path.display());
|
|
||||||
|
// Open kanji db
|
||||||
|
let resource_path_str = resource_path.display().to_string();
|
||||||
|
let kanji_db_options =
|
||||||
|
SqliteConnectOptions::from_str(&resource_path_str)?.read_only(true);
|
||||||
|
let kanji_pool =
|
||||||
|
SqlitePoolOptions::new().connect_lazy_with(kanji_db_options);
|
||||||
|
|
||||||
|
app.manage(KanjiDb(kanji_pool, resource_path));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
|
@ -75,6 +76,7 @@ async fn main() -> Result<()> {
|
||||||
srs::generate_review_batch,
|
srs::generate_review_batch,
|
||||||
srs::update_srs_item,
|
srs::update_srs_item,
|
||||||
kanji::get_kanji,
|
kanji::get_kanji,
|
||||||
|
utils::application_info,
|
||||||
])
|
])
|
||||||
.on_window_event(|event| match event.event() {
|
.on_window_event(|event| match event.event() {
|
||||||
WindowEvent::CloseRequested { api, .. } => {
|
WindowEvent::CloseRequested { api, .. } => {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::time::Duration;
|
use std::{path::PathBuf, time::Duration};
|
||||||
|
|
||||||
use sqlx::{Row, SqlitePool};
|
use sqlx::{Row, SqlitePool};
|
||||||
use tauri::State;
|
use tauri::State;
|
||||||
|
@ -8,7 +8,7 @@ use crate::{
|
||||||
utils::{Ticks, TICK_MULTIPLIER},
|
utils::{Ticks, TICK_MULTIPLIER},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct SrsDb(pub SqlitePool);
|
pub struct SrsDb(pub SqlitePool, pub PathBuf);
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct SrsStats {
|
pub struct SrsStats {
|
||||||
|
|
|
@ -9,6 +9,33 @@ use sqlx::{
|
||||||
error::BoxDynError,
|
error::BoxDynError,
|
||||||
Decode, Encode, Sqlite, Type,
|
Decode, Encode, Sqlite, Type,
|
||||||
};
|
};
|
||||||
|
use tauri::State;
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
kanji::KanjiDb,
|
||||||
|
srs::{self, SrsDb},
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
pub struct ApplicationInfo {
|
||||||
|
kanji_db_path: String,
|
||||||
|
srs_db_path: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tauri::command]
|
||||||
|
pub async fn application_info(
|
||||||
|
kanji_db: State<'_, KanjiDb>,
|
||||||
|
srs_db: State<'_, SrsDb>,
|
||||||
|
) -> Result<ApplicationInfo, String> {
|
||||||
|
Ok(ApplicationInfo {
|
||||||
|
kanji_db_path: kanji_db.1.display().to_string(),
|
||||||
|
srs_db_path: srs_db.1.display().to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// *****************************************************
|
||||||
|
// Ticks
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
pub const TICK_MULTIPLIER: i64 = 1_000_000_000;
|
pub const TICK_MULTIPLIER: i64 = 1_000_000_000;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,31 @@
|
||||||
|
import { invoke } from "@tauri-apps/api/tauri";
|
||||||
|
import useSWR, { useSWRConfig } from "swr";
|
||||||
|
import SelectOnClick from "../components/utils/SelectOnClick";
|
||||||
|
|
||||||
|
interface ApplicationInfo {
|
||||||
|
kanji_db_path: string;
|
||||||
|
srs_db_path: string;
|
||||||
|
}
|
||||||
|
|
||||||
export function Component() {
|
export function Component() {
|
||||||
return <></>;
|
const { data: info } = useSWR("application_info", () =>
|
||||||
|
invoke<ApplicationInfo>("application_info"),
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Kanji DB path:
|
||||||
|
<SelectOnClick>{info?.kanji_db_path}</SelectOnClick>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
SRS DB path:
|
||||||
|
<SelectOnClick>{info?.srs_db_path}</SelectOnClick>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.displayName = "SettingsPane";
|
Component.displayName = "SettingsPane";
|
||||||
|
|
Loading…
Reference in a new issue