Compare commits
5 Commits
17e8bda099
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
5c092cad17 | ||
|
f38165d8d2 | ||
|
49a800fb4b | ||
|
45cbcaf95f | ||
|
8fab1a2c74 |
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "comic_viewer",
|
||||
"private": true,
|
||||
"version": "0.2.5",
|
||||
"version": "0.2.7",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
11
src-tauri/Cargo.lock
generated
11
src-tauri/Cargo.lock
generated
@@ -326,7 +326,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "comic_viewer"
|
||||
version = "0.2.5"
|
||||
version = "0.2.7"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -335,6 +335,7 @@ dependencies = [
|
||||
"mime_guess",
|
||||
"mountpoints",
|
||||
"once_cell",
|
||||
"regex",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_repr",
|
||||
@@ -2285,9 +2286,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.7.1"
|
||||
version = "1.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
|
||||
checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -2305,9 +2306,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.28"
|
||||
version = "0.6.29"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
|
||||
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
|
||||
|
||||
[[package]]
|
||||
name = "rfd"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "comic_viewer"
|
||||
version = "0.2.5"
|
||||
version = "0.2.7"
|
||||
description = "漫画、条漫简易阅读器"
|
||||
authors = ["Khadgar"]
|
||||
license = "MIT"
|
||||
@@ -28,6 +28,7 @@ mountpoints = "0.2.1"
|
||||
md-5 = "0.10.5"
|
||||
urlencoding = "2.1.2"
|
||||
mime_guess = "2.0.4"
|
||||
regex = "1.7.2"
|
||||
|
||||
[features]
|
||||
# this feature is used for production builds or when `devPath` points to the filesystem
|
||||
|
@@ -4,12 +4,21 @@ use std::{
|
||||
};
|
||||
|
||||
use mountpoints::mountinfos;
|
||||
use regex::Regex;
|
||||
use serde::Serialize;
|
||||
use tauri::Runtime;
|
||||
|
||||
use crate::utils;
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
fn compute_all_digits(text: &str) -> usize {
|
||||
let re = Regex::new(r#"\d+"#).unwrap();
|
||||
re.find_iter(&["a", text, "0"].join(" "))
|
||||
.map(|b| b.as_str())
|
||||
.map(|b| usize::from_str_radix(b, 10).unwrap_or(0))
|
||||
.sum::<usize>()
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Serialize)]
|
||||
pub struct FileItem {
|
||||
pub id: String,
|
||||
pub filename: String,
|
||||
@@ -18,7 +27,19 @@ pub struct FileItem {
|
||||
pub width: u32,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
impl PartialOrd for FileItem {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
let this_digit = compute_all_digits(&self.filename);
|
||||
let other_digit = compute_all_digits(&other.filename);
|
||||
if this_digit == other_digit {
|
||||
self.filename.partial_cmp(&other.filename)
|
||||
} else {
|
||||
this_digit.partial_cmp(&other_digit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Serialize)]
|
||||
pub struct DirItem {
|
||||
pub id: String,
|
||||
pub dirname: String,
|
||||
@@ -26,6 +47,18 @@ pub struct DirItem {
|
||||
pub root: bool,
|
||||
}
|
||||
|
||||
impl PartialOrd for DirItem {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||
let this_digit = compute_all_digits(&self.dirname);
|
||||
let other_digit = compute_all_digits(&other.dirname);
|
||||
if this_digit == other_digit {
|
||||
self.dirname.partial_cmp(&other.dirname)
|
||||
} else {
|
||||
this_digit.partial_cmp(&other_digit)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_hidden(entry: &DirEntry) -> bool {
|
||||
entry
|
||||
.file_name()
|
||||
@@ -92,7 +125,7 @@ pub async fn scan_directory(target: String) -> Result<Vec<FileItem>, String> {
|
||||
width,
|
||||
});
|
||||
}
|
||||
file_items.sort_by(|a, b| a.filename.partial_cmp(&b.filename).unwrap());
|
||||
file_items.sort_by(|a, b| a.partial_cmp(&b).unwrap());
|
||||
|
||||
Ok(file_items)
|
||||
}
|
||||
@@ -193,7 +226,7 @@ pub async fn scan_for_child_dirs<R: Runtime>(
|
||||
root: false,
|
||||
});
|
||||
}
|
||||
child_dirs.sort_by(|a, b| a.dirname.partial_cmp(&b.dirname).unwrap());
|
||||
child_dirs.sort_by(|a, b| a.partial_cmp(&b).unwrap());
|
||||
Ok(child_dirs)
|
||||
}
|
||||
|
||||
|
@@ -20,8 +20,8 @@ pub fn update_window_title_with_app<R: Runtime>(
|
||||
ext: Option<String>,
|
||||
) -> anyhow::Result<()> {
|
||||
let app_name = match app {
|
||||
AppHold::Instance(app) => app.package_info().name.clone(),
|
||||
AppHold::Handle(app) => app.package_info().name.clone(),
|
||||
AppHold::Instance(app) => app.config().tauri.windows[0].title.clone(),
|
||||
AppHold::Handle(app) => app.config().tauri.windows[0].title.clone(),
|
||||
};
|
||||
if let Some(ext) = ext {
|
||||
window.set_title(&format!("{} - {}", app_name, ext))?;
|
||||
|
@@ -142,7 +142,8 @@ export const DirTree: FC = () => {
|
||||
h="100%"
|
||||
spacing={8}
|
||||
px={4}
|
||||
py={4}
|
||||
pt={4}
|
||||
pb={40}
|
||||
pos="relative"
|
||||
sx={{ overflow: 'auto' }}
|
||||
ref={viewRef}
|
||||
|
Reference in New Issue
Block a user