From 117ae5df3c10b70a443ee1589b37bdced12977a4 Mon Sep 17 00:00:00 2001 From: z_lenovo Date: Fri, 20 Jun 2025 11:03:06 +0800 Subject: [PATCH] need fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 出现了编译错误,查了好久搞不定,先歇歇 --- Cargo.toml | 29 +++++++++- fonts/LICENSE.txt | 10 ++++ fonts/config.json | 40 +++++++++++++ fonts/icons.ttf | Bin 0 -> 6672 bytes src/main.rs | 2 +- src/ui/home_page.rs | 52 +++++++++++++++++ src/ui/jlc_downloader.rs | 13 +++++ src/ui/main_window.rs | 118 ++++++++++++++++++++++++++++++++++++++ src/utils/app_settings.rs | 10 ++++ src/winsparkle/mod.rs | 1 - 10 files changed, 271 insertions(+), 4 deletions(-) create mode 100644 fonts/LICENSE.txt create mode 100644 fonts/config.json create mode 100644 fonts/icons.ttf diff --git a/Cargo.toml b/Cargo.toml index 4ebdbf3..a75dc77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,33 @@ version = "0.1.0" edition = "2024" [dependencies] +iced = { git = "https://github.com/iced-rs/iced.git", features = [ + "debug", + "advanced", + +] } tokio = { version = "1.45.1", features = ["full"] } -iced = { git = "https://github.com/iced-rs/iced.git" } -iced_aw = { git = "https://github.com/iced-rs/iced_aw.git" } +iced_aw = { git = "https://github.com/iced-rs/iced_aw.git", features = [ + "badge", + "card", + "number_input", + "date_picker", + "color_picker", + "grid", + "tab_bar", + "tabs", + "time_picker", + "slide_bar", + "wrap", + "selection_list", + "quad", + "context_menu", + "spinner", + "drop_down", + "menu", + "sidebar", + "labeled_frame", +] } reqwest = "0.12.20" tracing-subscriber = { version = "0.3.19", features = [ "chrono", @@ -24,3 +48,4 @@ registry = "1.3.0" anyhow = { version = "1.0.98", features = ["backtrace"] } log = "0.4.27" env_logger = "0.11.8" +iced_fonts = { version = "0.2.1", features = ["full"] } diff --git a/fonts/LICENSE.txt b/fonts/LICENSE.txt new file mode 100644 index 0000000..9a34ddc --- /dev/null +++ b/fonts/LICENSE.txt @@ -0,0 +1,10 @@ +Font license info + + +## Font Awesome + + Copyright (C) 2016 by Dave Gandy + + Author: Dave Gandy + License: SIL () + Homepage: http://fortawesome.github.com/Font-Awesome/ diff --git a/fonts/config.json b/fonts/config.json new file mode 100644 index 0000000..5859216 --- /dev/null +++ b/fonts/config.json @@ -0,0 +1,40 @@ +{ + "name": "icons", + "css_prefix_text": "icon-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "8b80d36d4ef43889db10bc1f0dc9a862", + "css": "user", + "code": 59392, + "src": "fontawesome" + }, + { + "uid": "d73eceadda1f594cec0536087539afbf", + "css": "heart", + "code": 59393, + "src": "fontawesome" + }, + { + "uid": "1ee2aeb352153a403df4b441a8bc9bda", + "css": "calc", + "code": 61932, + "src": "fontawesome" + }, + { + "uid": "98687378abd1faf8f6af97c254eb6cd6", + "css": "cog-alt", + "code": 59394, + "src": "fontawesome" + }, + { + "uid": "5211af474d3a9848f67f945e2ccaf143", + "css": "cancel", + "code": 59395, + "src": "fontawesome" + } + ] +} diff --git a/fonts/icons.ttf b/fonts/icons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..abfc4ebec4eb001d864367d3864266653658a8fe GIT binary patch literal 6672 zcmd^CeQaCTbwBrg@k=Bni=t#xlArYS74ngiX-QUWMV3i@*s+($lI)O9lai*s>`J00 z$w8c@ft#j9pk`@@VFii~Lx$Qz*QMB{-40n$48}05gMlIaBkLLz7zPyCJRsl1%?>SQy-0xGB$BymO{(L%~je%n340a{%&3@pIa=F z7gE*;=vXTt5oByj)z`$gNXPikDHw@fsZ#N;v`;9IlCDDffM;r9e2%W)r1#%br*EI9 zGwL*b8!#TJ`oJbuiO9x_amAdgdm2(k*`R($u2C9o11LetP4)fvZr>(i%S`dGw>1t` z&_`o$1^fU1{o$Apop8f|sN4k0FUR+$`(g>{ru*`G+;m@FllR}NzKAFgw=2pGwT2p~ zl{!b;Nf&xq6+#nb(iE)>gi?m-h5E+2y2iAj?@4q<46CiZYoLEbZH%T5q+3-rVzj5k zV5?AWOzgYWv2ViP6dy?*yYXl|)79+#=JP*#PJ8k7m&S*4x#7Oq)5AUD=+Ul`+0){B z?u8fRCFOa?^V=2mCj4low$au)K|)L_0tC)rbU}>`!2mUjW=)SI^!9Giol*z-2Qj+R z2tU%%h({RW!%*PX<*+~AzUS31w;vrz)ko~n3G2(RUb=O~|F~aFh5dtrQ=PxJC7R;x z4UvwXJ>r#*F5Rm5xh`(6YrX0*RLL%i(R1`y^gjLZ=y!hoj-rLmKc(p2pZ#P_CH-$+ zf9=BbiE*pNC+OOrjH-$_m{bhqk1i!ZNe^ObIu%GUgfd%$iF#DwDUccnsI#Q1fgA*B9Z!CVJw5_?`k(9(e$9+-xU&#%&9DD73o1wL&OLR!xL>pTtcF~7d(Cm zfo1FN>h>7z-B`Z^BjP|;uSkhUME~GnF?gV>yNiYU(|ggt?~q7G_ljuafx&cRv?1bH z+$&mzXo$cZBp$L<0PI&aW8Wf)>%#_%^QV?u9e3Dg8UwkpQd7Qbg^#^Y~M z`)h?3_tw=lH)={&Y4$lM{!l9b9rX3IKy4S90iUx((v!w4J^;#hP-r+qCGO&-4n$g-2jMdjD z-dk@y=JSR_heL|e6YCTr&@Xxv1?{lc_n6OD8)QwZuOCU+(Sk3< zzoQ9-edy%f=@by6d#4kQ9MtOV|5V;qzD^y~IvQ)=UF*?E5tAxT6{U{4}2our27u8`^vH24dR^JFL}Rsf zQIcRnB03_v9f`vAeMb;N`3>HyaRrV>4D_c^>kSbIc{gx`2L}4Puwxr7A`;!-hTXw6 zTwmwzK(T&{?Zlv;`0>Z2l0b(uF8LQk#9$8|7S21 zjfRvP;V73Z+kez<{^Zw4_!f0nOWXs7#asqVKWdFTec$|4`-5${OSjv%)_&d+S5h(O zD}L%~-})vG%AYH)M7;RPpE+Zm!I$%t--o~VZ{Pc3c=#i1w$1_i%fC2}vyrGuZ=c7B zFpZ{{&q?P&ALrgfS}(WpWlMKI23t~Y00+t_wXVuLpfP$$=~32I9C=PpgFfK=#G_C@ zjnM|U9|qPO3E?FAmmT{9kX6SLIJXB}ULg-1ba|Xkbj0QPwlv}LItA#s%NvlNc6mP~ z=t-9kP(5y%xS?r2jB}p8_`n4{)Gd3AGsdAXb_ zl~>M{%BvgG^NSaji|Y>Wd`{1=Z=5Tyn)_0HPJ42Gb$-3LIX}l1H=bEcZ*DG_3+v?- zbHcS{uC15P&zCk+OPiZ(2YY+(9)q$}rZu`q>vWD5X^A$;q#j5g0!`x@&aX*lfiQur zqR!DO6|t3=_+CJdB}cP?_9)&3v{oUV2Vxm~ic0vdz&_JeEc!Hbi|DzG{%mnueup~^ z#5$1YoE|3agO$F!kdx4_I+&s}(j3OE`nW;Qz;+taO?blItUIHdNRWH|GBIz~orj$g z&?#s3n~)x)Ui?059>|#O`oPWpfe&suLdB(0$0f}}+J%kzbshglt#5it<;7%idDAEr zS4;EDTB*2Pf(6`;@LxdqK3h%X{I~}Bm1LWePUXh)rg{7g3Y|PIjhQn!*&mZV`ND#^ zbt)&7&f;HtQNpE?bvD-4CMho|YmHsS7}-K5DTOV~!a`CiwmE0Y>r+zeI&-y0__O1s z@#!aXZB|=sD`(27sa%^J&BshR#N1FmZ&s?H;+*V($ZeUjkM(_wygrpP;lx(al>Vt) z0TPpSe&z<58!W^M`FuVmMIxWKBu(Y!^ZBGyZFAg|T4xas>Dj5A)UAv(tPI@GOHoKl z&9>l|IakroW=z&p2j?&J<0Yxa+aS-HTjmyQSNil$OzUK>Fcm9K=W|vb+R>RDR56~E zJ91L$w)A8ZSFxNh7rAtLnAQ0msiiV8r;IR>FsM0GMFq3_lHynLnmjbf3IFyuWJJmRxl>0vqiVQ0O-jAiA zXs4MnC%G~a!ed)olh!15f*kg2?0G2H{rqny#vi~I5=Hjo&w)r^HZi}IvP^S$3$_OD zsLfQ>hSXpaC{q@=m`6|Mt|_K!#;z${>YjXtH#jf0N{ojQtqGJCR`K3CK~alDbthM{ zg*i*A+2S1b7$sYbfiL7yn4j)bgiF|Ut%>4L%)$s0m=}mM3hX^#5IDj+p@!;4>~$m( z_U%u30*gg-?sS~M7sm*1VRyztmK@+1m>6B}a${f(BQ!&fSb9;tra56v@?gAL4?7{_ z3AhoZ*<8vT#=*xPyFwVd6LO;ytz%H_9Ie%bx<9!Jmb)_WF)0ta9%Q$drodD5R zl!t7~OmWmEupzwxw#8}Nc;zxGG4tl%mJ(v+&4kWfU_ZU5F%fZAJa)^^< z3*~s+tKCZvQQN%6iL;`BiJmkLGNVh_Iy7-6(=8*7{5*Saol)c z8McOEZFjAATi*3C!@<}NYL@5U#*t?i-FfUxc??r-s1_%Va@1jcO724~j(>)H0(-59 z)XOw5leX*!Im%HRM_kPboLSp(I%ab^%A*MDqxMyzBVdk$5zL&huL?)@f$rxt7 zz!+wpVhl4+Gv+XuFEWOi0%MpdGKQJ6wmh&C<`OsLA&BQ3ZW!FWlTQ#og2sX^hj!45 z+;GrK4#((o4#&{*wtRR8`Xz2S&}D~X=!(NJbk&vzcc5i%IM6kRW9aWX97EUbYd%fc zz8Pf_(mOBJj;Uw)s7Vqo+5a$&3y63Xn{xG9y;dPTgV|G@nQMMUc&l899L~tRsa%KJ z2dO9XCXH5kmBuO^;^mXLHNKpysB>eLE^fW)y@Y>4M_(@C>I4Wb$N6hDil~XdA#Q(7 MYQK+zVvOj20kw&X-v9sr literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index 79c39d0..efc50fb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,6 @@ mod ui; mod utils; mod winsparkle; fn main() { - #[cfg(debug_assertions)] tracing_subscriber::fmt::init(); + ui::main_window::main_window(); } diff --git a/src/ui/home_page.rs b/src/ui/home_page.rs index e69de29..e48d136 100644 --- a/src/ui/home_page.rs +++ b/src/ui/home_page.rs @@ -0,0 +1,52 @@ +use iced::{ + Alignment, Element, + alignment::{Horizontal, Vertical}, + widget::{Column, Container}, +}; + +use crate::ui::main_window::{MainWindowMsg, TabFrame}; +pub struct HomePage {} + +impl Default for HomePage { + fn default() -> Self { + Self {} + } +} +impl HomePage { + pub fn update(&mut self, msg: HomePageMsg) { + match msg { + HomePageMsg::Nothing => { + println!("HomePage::Message::Nothing"); + } + } + } +} + +#[derive(Debug, Clone)] +pub enum HomePageMsg { + Nothing, +} + +impl TabFrame for HomePage { + type Message = MainWindowMsg; + + fn title(&self) -> String { + "HomePage".to_owned() + } + + fn tab_label(&self) -> iced_aw::TabLabel { + iced_aw::TabLabel::Text("HomePage".to_owned()) + } + + fn container(&self) -> iced::Element<'_, Self::Message> { + let content: Element<'_, HomePageMsg> = Container::new( + Column::new() + .align_x(Alignment::Center) + .push(iced::widget::button("Homepage Button").on_press(HomePageMsg::Nothing)), + ) + .align_x(Horizontal::Center) + .align_y(Vertical::Center) + .into(); + content.map(MainWindowMsg::HomePageMsg) + } +} diff --git a/src/ui/jlc_downloader.rs b/src/ui/jlc_downloader.rs index e69de29..526f4a8 100644 --- a/src/ui/jlc_downloader.rs +++ b/src/ui/jlc_downloader.rs @@ -0,0 +1,13 @@ +use iced::{ + Alignment, Element, + alignment::{Horizontal, Vertical}, + widget::{Column, Container}, +}; + +use crate::ui::main_window::{MainWindowMsg, TabFrame}; + +pub struct JlcDownloader {} + +pub enum JlcDownloaderMsg { + Nothing, +} diff --git a/src/ui/main_window.rs b/src/ui/main_window.rs index 8b13789..3c5fbc8 100644 --- a/src/ui/main_window.rs +++ b/src/ui/main_window.rs @@ -1 +1,119 @@ +use super::db_browser; +use super::home_page; +use super::jlc_downloader; +use super::part_viewer; +use iced::widget as w; +use iced::{ + Element, Length, + alignment::{Horizontal, Vertical}, + widget::{Column, Container, Text}, +}; +use iced_aw::Tabs; +use iced_aw::iced_fonts; +struct MainWindow { + title: String, + theme: iced::Theme, + curr_tab: TabId, + tab_pos: iced_aw::tabs::TabBarPosition, + home_page: home_page::HomePage, +} +impl Default for MainWindow { + fn default() -> Self { + Self { + title: Default::default(), + theme: Default::default(), + curr_tab: Default::default(), + tab_pos: iced_aw::tabs::TabBarPosition::Top, + home_page: Default::default(), + } + } +} + +const ICON_BYTES: &[u8] = include_bytes!("./../../fonts/icons.ttf"); +const ICON: iced::Font = iced::Font::with_name("icons"); + +pub fn main_window() { + iced::application(MainWindow::default, MainWindow::update, MainWindow::view) + .title(MainWindow::title) + .font(iced_fonts::REQUIRED_FONT_BYTES) + .font(ICON_BYTES) + .run(); +} + +#[derive(Debug, Clone)] +pub enum MainWindowMsg { + TabSelected(TabId), + TabClosed(TabId), + ThemeChanged(iced::Theme), + TitleChanged(String), + HomePageMsg(home_page::HomePageMsg), + Nothing, +} + +#[derive(Debug, Default, Clone, PartialEq, Eq)] +enum TabId { + #[default] + HomePage, + JlcDownloader, + DbBrowser, + PartViewer, +} + +impl MainWindow { + fn title(&self) -> String { + self.title.clone() + } + fn update(&mut self, msg: MainWindowMsg) { + match msg { + MainWindowMsg::ThemeChanged(theme) => { + self.theme = theme; + } + MainWindowMsg::TitleChanged(title) => { + self.title = title; + } + MainWindowMsg::Nothing => { + println!("Nothing"); + iced::debug::time("Test".to_owned()); + } + MainWindowMsg::HomePageMsg(message) => { + self.home_page.update(message); + } + MainWindowMsg::TabSelected(tab_id) => { + self.curr_tab = tab_id; + } + MainWindowMsg::TabClosed(tab_id) => todo!(), + } + } + fn view(&self) -> Element<'_, MainWindowMsg> { + let t = Tabs::new(MainWindowMsg::TabSelected) + .tab_icon_position(iced_aw::tabs::Position::Left) + .on_close(MainWindowMsg::TabClosed) + .push( + TabId::HomePage, + self.home_page.tab_label(), + self.home_page.view(), + ) + .set_active_tab(&self.curr_tab) + .icon_font(ICON) + .tab_bar_style(Box::new(iced_aw::style::tab_bar::primary)) + .tab_bar_position(self.tab_pos.clone()); + w::button("ClickMe").on_press(MainWindowMsg::Nothing).into() + } +} + +pub trait TabFrame { + type Message; + fn title(&self) -> String; + fn tab_label(&self) -> iced_aw::TabLabel; + fn container(&self) -> Element<'_, Self::Message>; + fn view(&self) -> Element<'_, Self::Message> { + w::Container::new(self.container()) + .width(Length::Fill) + .height(Length::Fill) + .align_x(Horizontal::Left) + .align_y(Vertical::Top) + .padding(5) + .into() + } +} diff --git a/src/utils/app_settings.rs b/src/utils/app_settings.rs index 7023c96..6f1a849 100644 --- a/src/utils/app_settings.rs +++ b/src/utils/app_settings.rs @@ -1,12 +1,14 @@ use registry::Security; const APP_REG_PATH: &str = r"Software\HardwareToolkit\"; +#[allow(dead_code)] pub fn get_lib_dir() -> Result { let reg = registry::Hive::CurrentUser.open(APP_REG_PATH, Security::AllAccess)?; let path = reg.value("lib_path")?; Ok(path.to_string()) } +#[allow(dead_code)] pub fn set_lib_dir(path: &str) -> Result<(), anyhow::Error> { let path = utfx::U16CString::from_str(path)?; let reg = registry::Hive::CurrentUser.create(APP_REG_PATH, Security::AllAccess)?; @@ -14,12 +16,14 @@ pub fn set_lib_dir(path: &str) -> Result<(), anyhow::Error> { Ok(()) } +#[allow(dead_code)] pub fn get_odbc_name() -> Result { let reg = registry::Hive::CurrentUser.open(APP_REG_PATH, Security::AllAccess)?; let name = reg.value("odbc_name")?; Ok(name.to_string()) } +#[allow(dead_code)] pub fn set_odbc_name(name: &str) -> Result<(), anyhow::Error> { let name = utfx::U16CString::from_str(name)?; registry::Hive::CurrentUser @@ -28,12 +32,14 @@ pub fn set_odbc_name(name: &str) -> Result<(), anyhow::Error> { Ok(()) } +#[allow(dead_code)] pub fn get_step_dir() -> Result { let reg = registry::Hive::CurrentUser.open(APP_REG_PATH, Security::AllAccess)?; let path = reg.value("step_path")?; Ok(path.to_string()) } +#[allow(dead_code)] pub fn set_step_dir(path: &str) -> Result<(), anyhow::Error> { let path = utfx::U16CString::from_str(path)?; let reg = registry::Hive::CurrentUser.create(APP_REG_PATH, Security::AllAccess)?; @@ -41,11 +47,14 @@ pub fn set_step_dir(path: &str) -> Result<(), anyhow::Error> { Ok(()) } +#[allow(dead_code)] pub fn set_curr_page(c: u32) -> Result<(), anyhow::Error> { let reg = registry::Hive::CurrentUser.create(APP_REG_PATH, Security::AllAccess)?; reg.set_value("curr_page", ®istry::Data::U32(c))?; Ok(()) } + +#[allow(dead_code)] pub fn get_curr_page() -> Result { let reg = registry::Hive::CurrentUser.open(APP_REG_PATH, Security::AllAccess)?; match reg.value("curr_page")? { @@ -59,6 +68,7 @@ pub fn get_curr_page() -> Result { Ok(0) } +#[allow(dead_code)] #[cfg(test)] mod app_settings_test { use crate::utils::app_settings::{get_step_dir, set_step_dir}; diff --git a/src/winsparkle/mod.rs b/src/winsparkle/mod.rs index d0bf91f..e69de29 100644 --- a/src/winsparkle/mod.rs +++ b/src/winsparkle/mod.rs @@ -1 +0,0 @@ -pub mod winsparkle;