From 74102ae71719c86f65d7db2f1fdb4508fab60d04 Mon Sep 17 00:00:00 2001 From: liquidhelium Date: Tue, 4 Feb 2025 21:52:57 +0800 Subject: [PATCH 1/5] feat: hide gui button --- phira/src/scene/song.rs | 63 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/phira/src/scene/song.rs b/phira/src/scene/song.rs index 2a6a22df..65d0e43f 100644 --- a/phira/src/scene/song.rs +++ b/phira/src/scene/song.rs @@ -256,6 +256,9 @@ pub struct SongScene { should_delete: Arc, menu_options: Vec<&'static str>, + hide_gui_btn: RectButton, + hide_gui: bool, + info_edit: Option, edit_btn: RectButton, edit_scroll: Scroll, @@ -283,6 +286,7 @@ pub struct SongScene { info_scroll: Scroll, review_task: Option>>, + report_task: Option>>, chart_should_delete: Arc, edit_tags_task: Option>>, @@ -310,6 +314,7 @@ pub struct SongScene { tr_start: f32, open_web_btn: DRectButton, + report_btn: DRectButton, // Imported chart for overwriting overwrite_from: Option, @@ -409,6 +414,9 @@ impl SongScene { fetch_best_task, + hide_gui_btn: RectButton::new(), + hide_gui: false, + menu: Popup::new(), menu_btn: RectButton::new(), need_show_menu: false, @@ -444,6 +452,8 @@ impl SongScene { review_task: None, chart_should_delete: Arc::default(), + report_task: None, + edit_tags_task: None, tags: TagsDialog::new(false), @@ -483,6 +493,8 @@ impl SongScene { open_web_btn: DRectButton::new(), + report_btn: DRectButton::new(), + overwrite_from: None, overwrite_task: None, @@ -917,8 +929,8 @@ impl SongScene { { warn!("this build does not support unlock video."); LoadingScene::new(mode, info, config, fs, player, upload_fn, update_fn, Some(preload)) - .await - .map(|it| NextScene::Overlay(Box::new(it))) + .await + .map(|it| NextScene::Overlay(Box::new(it))) } #[cfg(feature = "video")] { @@ -1090,6 +1102,8 @@ impl SongScene { let r = Rect::new(0.03, 0., mw, 0.12).nonuniform_feather(-0.03, -0.01); self.open_web_btn.render_text(ui, r, rt, ttl!("open-in-web"), 0.6, true); dy!(r.h + 0.04); + self.report_btn.render_text(ui, r, rt, ttl!("open-in-web"), 0.6, true); + dy!(r.h + 0.04); } if let Some(uploader) = &self.info.uploader { let c = 0.06; @@ -1368,6 +1382,10 @@ impl Scene for SongScene { { return Ok(true); } + if self.hide_gui { + self.hide_gui = false; + return Ok(true); + } if self.downloading.is_some() { if let Some(dl) = &mut self.downloading { if dl.touch(touch, t) { @@ -1378,6 +1396,10 @@ impl Scene for SongScene { return Ok(false); } let rt = tm.real_time() as f32; + if self.hide_gui_btn.touch(touch) { + self.hide_gui = true; + return Ok(true); + } if self.tags.touch(touch, rt) { return Ok(true); } @@ -1446,6 +1468,10 @@ impl Scene for SongScene { open_url(&format!("https://phira.moe/chart/{}", self.info.id.unwrap()))?; return Ok(true); } + if self.report_btn.touch(touch, rt) { + request_input("report_reason", tl!("report-reason").as_ref()); + return Ok(true); + } } SideContent::Mods => { if self.mod_scroll.touch(touch, t) { @@ -2021,6 +2047,19 @@ impl Scene for SongScene { .into()) })); } + "report-reason" => { + let id = self.info.id.unwrap(); + self.report_task = Some(Task::new(async move { + recv_raw(Client::post( + format!("/chart/{id}/report"), + &json!({ + "reason": text, + }), + )) + .await?; + Ok(()) + })); + } _ => return_input(id, text), } } @@ -2107,6 +2146,19 @@ impl Scene for SongScene { self.review_task = None; } } + if let Some(task) = &mut self.report_task { + if let Some(res) = task.take() { + match res { + Err(err) => { + show_error(err.context(tl!("report-failed"))); + } + Ok(_) => { + show_message(tl!("report-requested")).ok(); + } + } + self.review_task = None; + } + } if let Some(task) = &mut self.edit_tags_task { if let Some(res) = task.take() { match res { @@ -2169,7 +2221,9 @@ impl Scene for SongScene { let t = tm.now() as f32; ui.fill_rect(ui.screen_rect(), (*self.illu.texture.1, ui.screen_rect())); ui.fill_rect(ui.screen_rect(), semi_black(0.55)); - + if self.hide_gui { + return Ok(()); + } let r = ui.back_rect(); self.back_btn.set(ui, r); ui.fill_rect(r, (*self.icons.back, r, ScaleType::Fit)); @@ -2267,6 +2321,9 @@ impl Scene for SongScene { let r = Rect::new(-s, 0., s, s); let cc = semi_white(0.4); ui.fill_rect(r, (*self.icons.menu, r, ScaleType::Fit, if self.menu_options.is_empty() { cc } else { WHITE })); + self.hide_gui_btn.set(ui, r); + ui.dx(-r.w - 0.03); + ui.fill_rect(r, (*self.icons.menu, r, ScaleType::Fit, if self.menu_options.is_empty() { cc } else { WHITE })); self.menu_btn.set(ui, r); if self.need_show_menu { self.need_show_menu = false; From dea7700ae2ab7d41eae1015c87d196105fc6da5a Mon Sep 17 00:00:00 2001 From: liquidhelium Date: Tue, 4 Feb 2025 22:28:33 +0800 Subject: [PATCH 2/5] feat: better bg viewing --- assets/invisible.png | Bin 0 -> 8027 bytes phira/src/icons.rs | 2 ++ phira/src/scene/song.rs | 59 +++++++++++++++++++++++++++------------- 3 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 assets/invisible.png diff --git a/assets/invisible.png b/assets/invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..2547b3f08f7eb4a104a00e27edacf648c0ed1147 GIT binary patch literal 8027 zcmd6M=U-FL6Yfbu@4bToLK7?ydK2jZq=QIPK|+ln9VrGCX#z3SNDp0l?+}zus45T; zMBZREd>dTX@I$cvf}K1lKyGPtriqaVx(H9jiXxtV>BER9?8suru) zq8!GmZ>kcJT;+f#ven)jK?ZDqF?TRE;wZ0b{l9>E8utMf<__-={kIhB7 z+oRW^R1yY%tInOCnTFh(Trku>_CtA?AfJb`M&D+4mG3gK< zinv3wL@uXyfBgh*x)RRYjdytYgu@bW8sddp`EN-Rz=U!6$8rx!!{;Q!$0#H-ys;WA z$>tT}e9Q(9@5SX(F6T@%)6!u+QT?uGJU&kWu=M<&l4>kLazoZIC3s^jg%%CRTyl#~ zFa7qTO&R!Q94;5K9PU)U2o?|xqP%bdB2+T}azfcN7~Kz2E0OQ)LqElomU%_J^K%Lx*@Nn4s8GnJp#?l2;c z2e~_cRcgKATJ7u!TjHA2_%0<#K#Ho??YqOWIdCII!4l~g0VZVBcgRb%?ju>S_L{Uj z7d{L9lFbt)^j&lWW7j>Mqg>u+1rwA%3hbQTW;omhgwKzG*NX}YhSf?R!L?LB@OGCN z^*-Wh+_ikW{Zv3G%dX7gFbKqgy$~baYKxYa)2)`D1J^t7xBTCia?v`fOmxt`H$OO$;_mNzMoW;VVenM; zTuuKmE@%{JxmP1yJj?<9(IA$ssQ2U=OY@smV3QzfWZ1Jr%oDIt?w)c7eBL;ZmkmAu zv@NgG)zbEsYZm!_OK|>`_`%=_Z9XN`z1LK%?W2c^+{Kq`w+mN6y1l!&KH>1MO1DGK z@Gk(Gk!OmHnQbYW-F*kttv^^LuLA{HhtBkfYoCwtTTQ;)@XkYq7&9=m_JySIxgtE= z$ojuy?eCCH^)Cf;0If02IA4lMYpplqxnMkM)fy17;%TC=7gRY*>OAe`*J{c{A^kRE z4PtNR8vBB@Et!ANz^$tExsMuU%_H8?QyLxf5*ifHVLl?2*1};qI1Po=sCI}RrcAl~HHe0$Y0MhEGu;H>puVs&$ zJepA{o?D(mt5MS+rrn)y#hyqka9n$x{F*ZPpVZX1<-@ED68#C2WNrl;Qdg^?-z5ui3Dj;3;fdTObuids$g+7p`gjr2(>!S>qp< zS+J0OQhp!ompQKrHfT#>Q*k`}K2NJf7rm+nI164vz1qjFVR!}ZQx#NMSjbT^rO#RX z4hG1Fm`MVp7*LLSfDDJQocW|v&|}nXTa3%GmdDb-K8M3Yut1TQOVBeIy6WZURaGuZ zLy%uwcf@_*TT&!T^Or%~Di1u|Ry;g{lOX82mI608~0zx0*A7#1#Qb6(t;J9x! zWJ5<(D&Z|ZrSHPMZ>nv-p8Wd#X!Kh`3X582Hb#I>S>N?99=A93YF&0VRFCYX2&XiZ zROT+N76-hW9jlf_D$>DZ&OJGGAKxuP1_v)XUV)`3HoCjZ<$Nc~R^YMUcheT{UsuyI z^s-7%jahL9G&8qA5=zEL9l}BHTacwG+>*#Gd_i>z4rhs_y?H;*<|$#Bhtc8|8yL~T z^0EpT5h$xtC?`xOqQ$TwH{q-T!zgtn$(gpC2xb(u zeVqibZH98(%F{8Wf(D;Xh`ns}iWl*7EE0`zrd@Wck4#k`CFZd^Xx2L-{9aodi)0z{ znsK2q)*DbamQmqY;Mb4te0Kdqv&}AFWlV=CVlva8gMk&NV{vs5U%wQ6~|x*hUWYK|~Y8 z*8qw|iF(vpD6L^arBReqWP#w*YiRDlwMgOKP*<^1>s^R)pmAsO_X7K- zlVD(4-C74cG;f0aaK%Kbsu}DdQ%zQ6M}1F2oeVzA8=LD@$qwi?mZox$oC6!Ob=@4@ zlcnH@pyQK%bgxW}9pHbsugldhoHi?!E*Wh zceLv+wejCzqx$b+{(94v#=$8WF!UpP`;&*?-lSsgG3#7E_dl6x7`fJGTB?Jc9c(_OW)W|)3;qwQSd?h^B>Z`t3t?{i;F`VRY?H4F5 z)3{nk>7y2kJfDl?-I=)-e$0UN^epkXd5~I1!|!DAa_tohTekHLeBFNRT4YsZQl$(; zc`(EN0>o}uv;9bSe1kbTNjnKlGg6t2b3toVh@^@v=e%xw$BRw)YqbFJ4Wk8?m^$eZ zg12`hRbvBts@^I}V(G5^czvQwPdJsOdQBOpt-^o5#l&Lm51<;tD^c-CqDzC8BygyB-=ri?G2#d<9vGq3sm@|0h!``-Am@^o8E3|q(PZ_J8x8aU`i3s`7Qkg z;R?Hre(mlYl|e>b%S+a4ca@CgzU;owjIpY2FN>1}RHljQtG!p4mzPXm_L-R5XsklFhMS`XjbwgdJ8(`Rnm^+qnM7cLmP*x#t+? z`LED*(J##Ch=MOAzRNUHG>>z#M{W*cqTk!x@~3a5k=>I*umI~197V0vpi(VNC}KCw zRKp>c9^V63S!`!Ej{444ETAsZ{4eVW#w^?Dkyn|eI5Y~I6aWc$tw;f1-^}07Sb-@t zieK7}n{Vu_@Bsx$msfF=ER(NGSJoo|^s`Bqihg}Tl2H1|@M58<(i+_@8y+tvPYBai z03Glo??l`1D$(J;uR?MPj~_9T1NvkkyU>lW>%g?*skY(Y_tA|zjsWwKkoja^;eUVW zw3vDt^-EzDi92T5B=ICZJ10bAERuCxoZpR4OFl;5pzfNv3`vFfumGM7ZP&9?ZQ0vE z0Hz*`!=aJbBggRp9#ZfI&)uLMfqnQL)K=GB2llgGG9L&UUBj(-Ndu9EW79_itD66j zGe4$)<0@iFcE91YoHu_Pz>H?HS5tl4|<=~SA+s}Nf{D5q-=b&4v zQff3G!PeiikB{bgNKE2fKb?pHUCx93|C!t{J=#Jlo^ZUoOEb=V%Y{?I19!k(aqF42yC7OeCyW98abaHAzzMs+@A+Z> zNnf`=m>!GYkDu^veej@$-_A@Fn>L4BEFxV3%DolNI}`$ZJ(eix!Jd$nh!0U1KxE?} zCR&s=gJn3-^=o2Ibn1m_$;(brbgllp%bhnt6ii9gtx~Os?HTjNID_MzEpS|hApXo( zx)Y*Yff8-sR;xDi{rvI)-hJ8Jr&VsXA zy#bV2yvtC&V{);`^g><@if);?KKG1K00dPn{X01?OOy<`iXLk55p_6W5&x?f%hV%< zmi+zMwQdN^a;bYGrr1t)VKd|=8sb7dXW&PHmP~t?uH(F$H8?8B1m$itf&|T0adpuM zeU(5iTlC#oVB>0mLY2 zRd>3zf*y!bi55y59Ahrb&-sZ9>#>ze0i_Tj>h#LYPo6SLX&L zU`o#_Z7olwi@=KBt*2<`K@T-+rA4~ZskE~ubzERwUg-~=r-H1)-;xexjr7vu#c7f~ z#!6^L^h|LTVZ#BF0wGjC+%x;`MYe01?I5FeqSijGmY&uh^2_J?1E}_E-fbg z-}+Bg%DQX^Yi(YVv-Kl$_@$vJYR>io>G#acf6{L|{0lH?_WddOm-%28su%p|RyFJcw3bkYEkDbl(#071PqVvO(N zMbByd%$Y1BwHTHEfd%%>2N|x?(#;6mu+P=^idnBWwbS^5DE>eK`l*$yTmX?4cBi^9 z#LSy_cgrgF7z6|i-jaS=4yl(#e4l(>tQ|wiWH$377BnTZC;)wjusrOZ-sfgzMw$Ua zDykwKMmH=0fwKv{$G0u_wa@NcIU(}-8*%KM&j~D=JRTjP59_+WUU&bOXoDXWEx@|o zZOQ*lHtf+y>4+PTI{vg+g+CtW0AhbfMD3LNdBhc4Vn^-_XY)T8*jse?mUe3Rv_q@H zJLZ+QYtPiGIvo@Q!;5ihRAfFHoBCwk2VS1Kap?PYTdC67u;ty@(vE6t_3HVxjzARi z<6V3ErQs(&;h<1&lkjPP7HW~T{#BOIAOmrfljPHAQ4e1Bdp2!&wG*qjvZ%y&ykcYq zxj7bsdV-2&Gxd>Qed`0%xmI~q0MqRq8TKg1l;ag!_Ogsn?HWU2WKzwRxI{O3=(glZ0xnuNpn;U5nxErY{H;(`9j z9M~O@Nb8ep&3~^~w4TQ#{$G&zU_1{4ViaWF;~R;YNLfZazS(G?#<$w}(DUTaCq;e` zj3^@Hvz2D#%FIv41oQfMY2F~;4E5$ zMjH$6?>~_EW2EPH97J^b@8P}zj8Z76v}qc1C|63KX%k1U_1<`M&$$}8o>AzxGzep( zL?)B7R!<_ks8n!RJ@M?eBOA7bH_o-{cQM}(FkhDRxTqtK>>S-Ilr2BZeX1Cp?Dwd& zoXPtG5O9F}LcF$wb-$Q&>BzM~iUvH$)?fIglTQbgiPP$zQm~4?laY+ArfLimNq)6o8p(B*Q+QBYF}vH9MZ4RsFpiv5qxQ7wD0K^XK$OCGkq|E zuWtjxx)@xR5|7dxi@(hGO0+wYtp!HmL!-DcpT)8Yf-D3_5(DP<);;m8h%m}Ekpn-8 z<^XC#AiiPa>63>ii~`IljJy*pLsM(H981{QHB>;q(pI>QAoec2@m9-YkEamC0iuej z9q=!yyW(lggOT3^!((S#ZpF!7ACY)VikEeRr(2ZP7J))v87tYQ7lYe-KDR}mbEaC_ z6mMcE$=l$~P{nMAzq+@G4ppqb=G8M-ZvWeWe&%vcj*7n%q&&Z>>%u|Cw=QPCl?9E<$sMR*iS5OFL6NER^b3mU8(^}(EfIa3o#T6=b#RUYJy<8hZF5%& zE{#-9t+nOtaSa}KxpAWOvh+(C!JyfQGf~j`R zxbf-r(I0jkr&4dZ7VhdhEdW*i_S&47RM+4^jfR4P2eP(b0i8G+=e5Y zGldFjS$~z43tGVd&|Mro62g7{DFh^3aSHjLb`UF`OFBpJzWG~ukrlyR6f3rq`oS8~ z?hRueB>_IB)#RiGF>HF}Rvs2if!WDWax3q?!S7$~JvdcpOiN-WcpC-ESEqc16cdQ` zAFI}+oHWujPx*hB>yK63q2J1CqL?hSss&m0y;*%z*2>%V?7j=~%&>N;ZSX6g&b}^h zS=>s#AY;mnlbk3XWuV7&Mb5j&IdvC%*v<|3f1fc%lTU&7p}o`XC*kh^#L}s>*ikCc zq~eAVVs&%ck?xcUN=c}fM%R9q+caNfq`gI%ko)|=ZmTfI9qH1r^;tH&79j5(y2Yf? zG>$I+8;%D`+pt#J0v6?(`+S^*y{Y3S{WJUVF$>9MO2C$|vMK!_XW{8XbK^J@M)k5!s<$ ziGMx!sE&RJ9N^2N$h77KUNN>u8Wjx2h=C1SsFmto1sMfxvZTx!R>o-QyNklgfMr!$V-=VG=3-fbe8Ejal3&>>#8z7Z|JEcOgxHpw)>d|Ln#fp zYxYBBgC9e;Xq7|x6W!=tpkg^LlRPvl7Wir07*xz8`sHqzU~;Iq+I0kMDO zz&;bp2*r8+8@QUa5*n%oUld;ZYRi;*b^My&L+H9DE1_gOn^%842bh)`{K`wjP$VDz zML3g){kfH}6Y%Tn>+kySX=!?Z2h@*x+cK!EuS#g8rMMWoJIGTF6$`-*_~NL8<>BKu zZD#G4=a9i2xLk_m95;D$Q?!6oKEFXxN3^Sp?X(R3o}P^03QLVkX_5UpCy6B+;oZ%5 zO+sr;@9K7V3N%M%IZLkc3%u<`;v47JyJIk;@s`^J;K#We->`OOSO9wjjoMJW=Go+*dX7b+l>E9D9|} zcmLdZHYqs!euD^^(vS=?joyr&atZuAmN-9SNArRtx!M2ACz{CqbOBErv@S@a0gUu# z|20v^D+3827 Rect { + let w = texture.width(); + let h = texture.height(); + let ratio = h / w; + let current_size = rect.size(); + let mut new_size = Vec2::default(); + if current_size.x < current_size.y / ratio { + new_size.x = current_size.x; + new_size.y = current_size.x * ratio; + } else { + new_size.x = current_size.y / ratio; + new_size.y = current_size.y; + } + let center = rect.center(); + Rect::new(center.x - new_size.x / 2., center.y - new_size.y / 2., new_size.x, new_size.y) +} + fn create_music(clip: AudioClip) -> Result { let mut music = UI_AUDIO.with(|it| { it.borrow_mut().create_music( @@ -2219,8 +2236,28 @@ impl Scene for SongScene { fn render(&mut self, tm: &mut TimeManager, ui: &mut Ui) -> Result<()> { set_camera(&ui.camera()); let t = tm.now() as f32; + ui.fill_rect(ui.screen_rect(), (*self.illu.texture.1, ui.screen_rect())); ui.fill_rect(ui.screen_rect(), semi_black(0.55)); + if self.hide_gui { + let in_rect = fit_in_rect(ui.screen_rect(), &self.illu.texture.1); + ui.fill_rect(in_rect, (*self.illu.texture.1, in_rect, ScaleType::Inside)); + } + if let Some(dl) = &mut self.downloading { + dl.render(ui, t); + } + if self.save_task.is_some() { + ui.full_loading(tl!("edit-saving"), t); + } + if self.upload_task.is_some() { + ui.full_loading(tl!("uploading"), t); + } + if self.review_task.is_some() { + ui.full_loading(tl!("review-doing"), t); + } + if self.edit_tags_task.is_some() || self.rate_task.is_some() || self.overwrite_task.is_some() || self.update_cksum_task.is_some() { + ui.full_loading("", t); + } if self.hide_gui { return Ok(()); } @@ -2321,9 +2358,6 @@ impl Scene for SongScene { let r = Rect::new(-s, 0., s, s); let cc = semi_white(0.4); ui.fill_rect(r, (*self.icons.menu, r, ScaleType::Fit, if self.menu_options.is_empty() { cc } else { WHITE })); - self.hide_gui_btn.set(ui, r); - ui.dx(-r.w - 0.03); - ui.fill_rect(r, (*self.icons.menu, r, ScaleType::Fit, if self.menu_options.is_empty() { cc } else { WHITE })); self.menu_btn.set(ui, r); if self.need_show_menu { self.need_show_menu = false; @@ -2343,12 +2377,11 @@ impl Scene for SongScene { } ui.fill_rect(r, (*self.icons.r#mod, r, ScaleType::Fit, if self.local_path.is_some() { WHITE } else { cc })); self.mod_btn.set(ui, r); + ui.dx(-r.w - 0.03); + ui.fill_rect(r, (*self.icons.invisible, r, ScaleType::Fit, if self.menu_options.is_empty() { cc } else { WHITE })); + self.hide_gui_btn.set(ui, r); }); - if let Some(dl) = &mut self.downloading { - dl.render(ui, t); - } - let rt = tm.real_time() as f32; if self.side_enter_time.is_finite() { let p = ((rt - self.side_enter_time.abs()) / EDIT_TRANSIT).min(1.); @@ -2386,18 +2419,6 @@ impl Scene for SongScene { self.menu.render(ui, t, 1.); - if self.save_task.is_some() { - ui.full_loading(tl!("edit-saving"), t); - } - if self.upload_task.is_some() { - ui.full_loading(tl!("uploading"), t); - } - if self.review_task.is_some() { - ui.full_loading(tl!("review-doing"), t); - } - if self.edit_tags_task.is_some() || self.rate_task.is_some() || self.overwrite_task.is_some() || self.update_cksum_task.is_some() { - ui.full_loading("", t); - } let rt = tm.real_time() as f32; self.tags.render(ui, rt); self.rate_dialog.render(ui, rt); From c62270bbdd39c2c905da231b2e22dc2f8ea139f6 Mon Sep 17 00:00:00 2001 From: liquidhelium Date: Wed, 5 Feb 2025 22:40:15 +0800 Subject: [PATCH 3/5] feat: action panel simple layout --- phira/src/scene/song.rs | 39 +++++++++++++++++++--- phira/src/scene/song/action_panel.rs | 50 ++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 phira/src/scene/song/action_panel.rs diff --git a/phira/src/scene/song.rs b/phira/src/scene/song.rs index 523e4c39..4381d3fa 100644 --- a/phira/src/scene/song.rs +++ b/phira/src/scene/song.rs @@ -66,6 +66,9 @@ use uuid::Uuid; use walkdir::WalkDir; use zip::{write::FileOptions, CompressionMethod, ZipWriter}; +mod action_panel; +use action_panel::ActionPanel; + // Things that need to be reloaded for chart info updates type LocalTuple = (String, ChartInfo, AudioClip, Illustration); @@ -225,6 +228,11 @@ impl SideContent { } } +enum SongSceneMode { + Player, + Staff, +} + #[derive(Deserialize)] struct StableR { status: i8, @@ -280,6 +288,10 @@ pub struct SongScene { edit_btn: RectButton, edit_scroll: Scroll, + action_scroll: Scroll, + action_panel: Option, + scene_mode: SongSceneMode, + mods: Mods, mod_btn: RectButton, mod_scroll: Scroll, @@ -444,6 +456,10 @@ impl SongScene { edit_btn: RectButton::new(), edit_scroll: Scroll::new(), + scene_mode: SongSceneMode::Player, + action_panel: None, + action_scroll: Scroll::new(), + mods, mod_btn: RectButton::new(), mod_scroll: Scroll::new(), @@ -1427,6 +1443,9 @@ impl Scene for SongScene { self.menu.touch(touch, t); return Ok(true); } + if self.action_scroll.touch(touch, t) { + return Ok(true) + } if !self.side_enter_time.is_infinite() { if self.side_enter_time > 0. && tm.real_time() as f32 > self.side_enter_time + EDIT_TRANSIT { if touch.position.x < 1. - self.side_content.width() && touch.phase == TouchPhase::Started && self.save_task.is_none() { @@ -2261,16 +2280,16 @@ impl Scene for SongScene { if self.hide_gui { return Ok(()); } - let r = ui.back_rect(); - self.back_btn.set(ui, r); - ui.fill_rect(r, (*self.icons.back, r, ScaleType::Fit)); + let back_r = ui.back_rect(); + self.back_btn.set(ui, back_r); + ui.fill_rect(back_r, (*self.icons.back, back_r, ScaleType::Fit)); ui.alpha::>(((t - self.fade_start) / FADE_IN_TIME).clamp(-1., 0.) + 1., |ui| { let r = ui .text(&self.info.name) - .max_width(0.57 - r.right()) + .max_width(0.57 - back_r.right()) .size(1.2) - .pos(r.right() + 0.02, r.y) + .pos(back_r.right() + 0.02, back_r.y) .draw(); ui.text(&self.info.composer) .size(0.5) @@ -2329,6 +2348,15 @@ impl Scene for SongScene { r.w += 0.13; self.ldb_btn.set(ui, r); } + ui.scope(|ui| { + ui.dy(back_r.bottom() + 0.05); + ui.dx(back_r.right() + 0.02); + let size = (0.3,r.top()-back_r.bottom()-0.02); + self.action_scroll.size(size); + self.action_scroll.render(ui, |ui| { + action_panel::render_action_panel(ui, 0.3) + }); + }); // play button let w = 0.26; @@ -2382,6 +2410,7 @@ impl Scene for SongScene { self.hide_gui_btn.set(ui, r); }); + // side content let rt = tm.real_time() as f32; if self.side_enter_time.is_finite() { let p = ((rt - self.side_enter_time.abs()) / EDIT_TRANSIT).min(1.); diff --git a/phira/src/scene/song/action_panel.rs b/phira/src/scene/song/action_panel.rs new file mode 100644 index 00000000..2d497be5 --- /dev/null +++ b/phira/src/scene/song/action_panel.rs @@ -0,0 +1,50 @@ +use prpr::ui::Ui; + +pub struct ActionPanel { + +} + + +pub fn render_action_panel(ui: &mut Ui, width: f32) -> (f32, f32) { + let mut sy = 0.02; + ui.scope(|ui| { + let s = 0.01; + ui.dx(0.01); + ui.dy(sy); + macro_rules! dy { + ($dy:expr) => {{ + let dy = $dy; + sy += dy; + ui.dy(dy); + }}; + } + dy!(0.01); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let r = ui.text("1111").size(0.9).draw(); + dy!(r.h + 0.04); + let rt = 0.22; + ui.dx(rt); + }); + (width, dbg!(sy)) +} \ No newline at end of file From 34c73fae98929630b2920a4777e8f4a93548d3ee Mon Sep 17 00:00:00 2001 From: liquidhelium Date: Fri, 7 Feb 2025 13:26:42 +0800 Subject: [PATCH 4/5] feat: panel layout --- phira/locales/en-US/song.ftl | 2 + phira/locales/zh-CN/song.ftl | 2 + phira/src/scene/song.rs | 19 +++-- phira/src/scene/song/action_panel.rs | 106 ++++++++++++++++----------- 4 files changed, 79 insertions(+), 50 deletions(-) diff --git a/phira/locales/en-US/song.ftl b/phira/locales/en-US/song.ftl index 6a146f53..bb939b34 100644 --- a/phira/locales/en-US/song.ftl +++ b/phira/locales/en-US/song.ftl @@ -128,3 +128,5 @@ stabilize-approved = Approved stabilize-approved-passed = The chart has been stabilized. stabilize-denied = Denied stabilize-denied-passed = Denied, the beatmap is rejected + +report = Report \ No newline at end of file diff --git a/phira/locales/zh-CN/song.ftl b/phira/locales/zh-CN/song.ftl index 15e50670..9f16ac27 100644 --- a/phira/locales/zh-CN/song.ftl +++ b/phira/locales/zh-CN/song.ftl @@ -126,3 +126,5 @@ stabilize-approved = 已通过 stabilize-approved-passed = 已通过,谱面已 stable stabilize-denied = 已拒绝 stabilize-denied-passed = 已拒绝,谱面已打回 + +report = 举报 \ No newline at end of file diff --git a/phira/src/scene/song.rs b/phira/src/scene/song.rs index 4381d3fa..6a68fb87 100644 --- a/phira/src/scene/song.rs +++ b/phira/src/scene/song.rs @@ -289,7 +289,7 @@ pub struct SongScene { edit_scroll: Scroll, action_scroll: Scroll, - action_panel: Option, + action_panel: ActionPanel, scene_mode: SongSceneMode, mods: Mods, @@ -457,7 +457,7 @@ impl SongScene { edit_scroll: Scroll::new(), scene_mode: SongSceneMode::Player, - action_panel: None, + action_panel: ActionPanel::new(), action_scroll: Scroll::new(), mods, @@ -1135,7 +1135,7 @@ impl SongScene { let r = Rect::new(0.03, 0., mw, 0.12).nonuniform_feather(-0.03, -0.01); self.open_web_btn.render_text(ui, r, rt, ttl!("open-in-web"), 0.6, true); dy!(r.h + 0.04); - self.report_btn.render_text(ui, r, rt, ttl!("open-in-web"), 0.6, true); + self.report_btn.render_text(ui, r, rt, tl!("report"), 0.6, true); dy!(r.h + 0.04); } if let Some(uploader) = &self.info.uploader { @@ -1443,6 +1443,7 @@ impl Scene for SongScene { self.menu.touch(touch, t); return Ok(true); } + self.action_panel.touch(touch, t); if self.action_scroll.touch(touch, t) { return Ok(true) } @@ -1586,6 +1587,8 @@ impl Scene for SongScene { let rt = tm.real_time() as f32; self.tags.update(rt); self.rate_dialog.update(rt); + self.action_scroll.update(t); + self.action_panel.update(tm); if self.tags.confirmed.take() == Some(true) { let mut tags = self.tags.tags.tags().to_vec(); tags.push(self.tags.division.to_owned()); @@ -2349,12 +2352,14 @@ impl Scene for SongScene { self.ldb_btn.set(ui, r); } ui.scope(|ui| { - ui.dy(back_r.bottom() + 0.05); - ui.dx(back_r.right() + 0.02); - let size = (0.3,r.top()-back_r.bottom()-0.02); + let pad = 0.05; + ui.dy(back_r.bottom() + 0.07); + ui.dx(back_r.right() + 0.02 -pad); + let size = (0.8,r.top()-back_r.bottom()-0.1); self.action_scroll.size(size); self.action_scroll.render(ui, |ui| { - action_panel::render_action_panel(ui, 0.3) + ui.dx(pad); + self.action_panel.render(ui, 0.8, t) }); }); diff --git a/phira/src/scene/song/action_panel.rs b/phira/src/scene/song/action_panel.rs index 2d497be5..f8916405 100644 --- a/phira/src/scene/song/action_panel.rs +++ b/phira/src/scene/song/action_panel.rs @@ -1,50 +1,70 @@ -use prpr::ui::Ui; +use macroquad::{input::Touch, math::Rect}; +use prpr::{ext::semi_black, time::TimeManager, ui::{DRectButton, Ui}}; +use tracing::debug; pub struct ActionPanel { - + buttonl: DRectButton, + buttonr: DRectButton, + last_height: f32, + last_width: f32, } -pub fn render_action_panel(ui: &mut Ui, width: f32) -> (f32, f32) { - let mut sy = 0.02; - ui.scope(|ui| { - let s = 0.01; - ui.dx(0.01); - ui.dy(sy); - macro_rules! dy { - ($dy:expr) => {{ - let dy = $dy; - sy += dy; - ui.dy(dy); - }}; +impl ActionPanel { + pub fn new() -> Self { + Self { + buttonl: DRectButton::new(), + buttonr: DRectButton::new(), + last_height:0.2, + last_width:0. } - dy!(0.01); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let r = ui.text("1111").size(0.9).draw(); - dy!(r.h + 0.04); - let rt = 0.22; - ui.dx(rt); - }); - (width, dbg!(sy)) + } + pub fn render(&mut self,ui: &mut Ui,width: f32, t:f32,) -> (f32, f32) { + let mut sy = 0.02; + let h_pad = 0.01; + let w_pad = 0.01; + ui.scope(|ui| { + ui.dy(sy); + let y_top = sy-h_pad; + ui.fill_rect(Rect::new(-2.0*w_pad, 0., self.last_width + 5.0*w_pad, self.last_height), semi_black(0.5)); + macro_rules! dy { + ($dy:expr) => {{ + let dy = $dy; + sy += dy; + ui.dy(dy); + }}; + } + macro_rules! gain_w { + ($w:expr) => { + let w = $w; + self.last_width = f32::max(self.last_width, w); + }; + } + dy!(h_pad); + let r = ui.text("Stable stat:").size(0.7).draw(); + ui.dx(r.w + w_pad); + let w2 = ui.text("test text").size(0.7).draw().w; + ui.dx(-r.w-w_pad); + gain_w!(r.w + w_pad + w2); + dy!(r.h + h_pad); + self.buttonl.render_text(ui, Rect::new(0., 0., 0.25, 0.075), t, "Test1", 0.6, true); + ui.dx(0.25 + w_pad); + self.buttonr.render_text(ui, Rect::new(0., 0., 0.25, 0.075), t, "Test", 0.6, true); + dy!(0.075); + gain_w!(0.5); + }); + self.last_height = sy + h_pad; + (self.last_width, sy) + } + pub fn touch(&mut self,touch: &Touch, t:f32) { + if self.buttonl.touch(touch, t) { + debug!("touched test button") + } + if self.buttonr.touch(touch, t) { + debug!("touched test button") + } + } + pub fn update(&mut self, tm: &mut TimeManager) { + + } } \ No newline at end of file From 0792e8465aef379cb0dc255b99d2d05806fffcc1 Mon Sep 17 00:00:00 2001 From: liquidhelium Date: Sat, 8 Feb 2025 13:51:15 +0800 Subject: [PATCH 5/5] feat: checkbox & fix: vi-VN ident --- phira/locales/vi-VN/settings.ftl | 2 +- phira/src/scene/song/action_panel.rs | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/phira/locales/vi-VN/settings.ftl b/phira/locales/vi-VN/settings.ftl index 860962f3..80b009fa 100644 --- a/phira/locales/vi-VN/settings.ftl +++ b/phira/locales/vi-VN/settings.ftl @@ -62,4 +62,4 @@ about-content = Cảm ơn tất cả các nhà tài trợ của chúng tôi! (Sắp xếp theo từ điển) -哎喂哟-, 114514opkl, 123165, 341819481, 43167364miku, AEsir, Afterglow, akuanoneko, amstlkqp, ApecY176, Arashi, Ark小周, Aromq, Atariter, Aurora., Avencess, Bigironpig, Bradish, brightquasar, buguwu, ccw., CH06E01, CQBZ, Dagehoo, DongZheng, dslzhz, Dumbledore防重复, Ehdiwhxishs, Enigma, evmb, Fall_Li_distance, flamo, Fly段某, Gentle Emperor, GR-17, GYuuLT, Hen77777Tai, hibikip3p, huahbas, huanle, humosu, icyfish, Jerry24, Jiangling, jike, Kaji Emperor, KevinJame1, KKZN, KQ_KongQi, KRYSGCJ, Kynovter, LemonKnife, Lh_39_master, Lighear, liminghao, Lin124, Lio_the_Fox, LJMSTKZF, lorac, luftsch1oss, Maedey, mancy, MaxJack, MGRB, Miku.official, Miska1123, MSSkn, NaiTaGQ, NananEbina, nanxiangx, NEROILY, NingNing0721, NoChoco, Nothu, NsdrfChkew, O-DouSan, obsession, pgwcm, Phira-一个随意废物, PopCatNya, QAQwhatever, QingF_青枫, qwer0160, QWQYuRin, rainbowbex, Ransen, Reeslith, Requiem, RinceTacroix, Rinorsi, Rpec, RUNFORFUNQAQ, sbcujbj, Sensant, Shaaadowsong, Sixi, sksks, Sky_Frozen, soppi, Tearout, Tesla T-T, Thunderlis, Tigerzzz, Tixbicg, Tony0703, Ulyssses, Wind_And_Sky, wjxwp, wszyj, WuJi, wylwktd, xiaoqian, xiaozhemu, XOO_cookie, Xr888, yang125, YMiiiiiii, YN呓凝, YT_XT, yulilizi, yyyyyylll, ZERO707, Zips, ほしの アイ, 一片普通的茶叶, 三月鸠, 不会玩音游的屑, 久往大魔王, 乙酸乙烯酯, 二货甜鱼, 傲丙初A1bcu, 冷光_Lumine, 华树邶, 四十四次日落, 城边的一朵云, 天启之云, 如月清风, 小懒max, 小鲁班, 幻枫落晨, 御坂13900号, 心兮可念, 悲伤很菜, 我永远喜欢爱莉希雅, 日暖随安, 早安起不早, 明晓破风, 易阳Easy_sun, 晨曜, 曲奇cookies, 望悅不是月, 林江恒, 柒柒柒柒, 梓川川川川川川, 欧皇本蝗, 残风, 洛尘sama, 灵晨没有准度, 炫金创创鹅, 甘城猫猫猫猫, 男德村村西张寡妇, 白衣炫五月, 老王, 芝士土拨鼠, 若笛, 荷叶鸭腿, 落弦winglow, 落痕luor, 逐潘, 邮疣铀, 银酱, 露西亚是我的, 飞驰的压路机, 骁龙750G -Dịch bởi @Natelyt \ No newline at end of file + Dịch bởi @Natelyt \ No newline at end of file diff --git a/phira/src/scene/song/action_panel.rs b/phira/src/scene/song/action_panel.rs index f8916405..17d375fd 100644 --- a/phira/src/scene/song/action_panel.rs +++ b/phira/src/scene/song/action_panel.rs @@ -40,6 +40,18 @@ impl ActionPanel { self.last_width = f32::max(self.last_width, w); }; } + macro_rules! item { + ($item:expr) => { + let r = $item; + dy!(r.h + h_pad); + gain_w!(r.w); + }; + ($item:expr, $pad:expr) => { + let r = $item; + dy!(r.h + $pad); + gain_w!(r.w); + } + } dy!(h_pad); let r = ui.text("Stable stat:").size(0.7).draw(); ui.dx(r.w + w_pad); @@ -50,8 +62,15 @@ impl ActionPanel { self.buttonl.render_text(ui, Rect::new(0., 0., 0.25, 0.075), t, "Test1", 0.6, true); ui.dx(0.25 + w_pad); self.buttonr.render_text(ui, Rect::new(0., 0., 0.25, 0.075), t, "Test", 0.6, true); - dy!(0.075); + ui.dx(-(0.25 + w_pad)); + dy!(0.075 + h_pad); gain_w!(0.5); + item!(ui.text("Title").size(0.74).draw()); + item!(ui.text("This is an update").size(0.7).draw(), 2.*h_pad); + item!(ui.checkbox("测试", &mut true)); + item!(ui.checkbox("测试", &mut true)); + item!(ui.checkbox("测试", &mut true)); + item!(ui.checkbox("测试", &mut true)); }); self.last_height = sy + h_pad; (self.last_width, sy)