From 49e448ed2ddb12c2a5da889f17b290e9fb4f0984 Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Wed, 17 Sep 2025 13:25:21 -0600 Subject: [PATCH] editor styling --- plugins/dfpworm/src/dfpwm.rs | 4 +- plugins/dfpworm/src/editor.rs | 67 ++++++++++++++----- plugins/dfpworm/src/lib.rs | 19 +++++- plugins/dfpworm/src/resources/aggression.png | Bin 0 -> 925 bytes plugins/dfpworm/src/resources/background.png | Bin 0 -> 7981 bytes plugins/dfpworm/src/resources/logo.png | Bin 1848 -> 2116 bytes plugins/dfpworm/src/resources/relaxation.png | Bin 0 -> 1073 bytes plugins/dfpworm/src/resources/style.css | 31 +++++++++ 8 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 plugins/dfpworm/src/resources/aggression.png create mode 100644 plugins/dfpworm/src/resources/background.png create mode 100644 plugins/dfpworm/src/resources/relaxation.png create mode 100644 plugins/dfpworm/src/resources/style.css diff --git a/plugins/dfpworm/src/dfpwm.rs b/plugins/dfpworm/src/dfpwm.rs index 9965b9c..65232af 100644 --- a/plugins/dfpworm/src/dfpwm.rs +++ b/plugins/dfpworm/src/dfpwm.rs @@ -1,7 +1,7 @@ -pub const DEFAULT_RESPONSE_INCREASE: f32 = 7.0 / 127.0; +pub const DEFAULT_RESPONSE_INCREASE: f32 = 7.0 / 128.0; pub const DEFAULT_RESPONSE_DECREASE: f32 = 20.0 / 128.0; -const NUDGE: f32 = 1.0 / 128.0; +pub const NUDGE: f32 = 1.0 / 128.0; pub struct Context { pub response_increase: f32, diff --git a/plugins/dfpworm/src/editor.rs b/plugins/dfpworm/src/editor.rs index 10235f7..66f8ba7 100644 --- a/plugins/dfpworm/src/editor.rs +++ b/plugins/dfpworm/src/editor.rs @@ -1,4 +1,6 @@ use nih_plug::editor::Editor; +use nih_plug_vizia::vizia::image::DynamicImage; +use nih_plug_vizia::vizia::image::codecs::png::PngDecoder; use nih_plug_vizia::vizia::prelude::*; use nih_plug_vizia::{ViziaState, assets, create_vizia_editor, widgets::*}; use std::sync::Arc; @@ -13,7 +15,7 @@ struct Data { impl Model for Data {} pub(crate) fn default_state() -> Arc { - ViziaState::new(|| (200, 150)) + ViziaState::new(|| (216, 240)) } pub(crate) fn create( @@ -24,35 +26,64 @@ pub(crate) fn create( editor_state, nih_plug_vizia::ViziaTheming::Custom, move |cx, _| { - assets::register_noto_sans_light(cx); - assets::register_noto_sans_thin(cx); + assets::register_noto_sans_bold(cx); Data { params: params.clone(), } .build(cx); + // load images + // TODO: find out if this should be moved out of this function for perf reasons? + load_image(cx, "logo", &include_bytes!("resources/logo.png")[..]); + load_image( + cx, + "background", + &include_bytes!("resources/background.png")[..], + ); + load_image( + cx, + "aggression", + &include_bytes!("resources/aggression.png")[..], + ); + load_image( + cx, + "relaxation", + &include_bytes!("resources/relaxation.png")[..], + ); + + // apply stylesheet + cx.add_stylesheet(include_str!("resources/style.css")) + .expect("Failed to load stylesheet."); + + // build the ui VStack::new(cx, |cx| { - Label::new(cx, "Dirty Frying Pan Worm") - .font_family(vec![FamilyOwned::Name(String::from(assets::NOTO_SANS))]) - .font_weight(FontWeightKeyword::Thin) - .font_size(30.0) - .height(Pixels(60.0)) - .text_align(TextAlign::Center) - .child_top(Stretch(1.0)) - .child_bottom(Pixels(0.0)); + Element::new(cx).class("logo"); // response increase - Label::new(cx, "Aggression"); - ParamSlider::new(cx, Data::params, |params| ¶ms.response_increase); + Element::new(cx) + .class("param-header") + .background_image(vec![BackgroundImage::from("url('aggression')")]); + ParamSlider::new(cx, Data::params, |params| ¶ms.response_increase) + .class("param-slider"); // response decrease - Label::new(cx, "Regression").top(Pixels(10.0)); - ParamSlider::new(cx, Data::params, |params| ¶ms.response_decrease); + Element::new(cx) + .class("param-header") + .background_image(vec![BackgroundImage::from("url('relaxation')")]); + ParamSlider::new(cx, Data::params, |params| ¶ms.response_decrease) + .class("param-slider"); }) - .row_between(Pixels(0.0)) - .child_left(Stretch(1.0)) - .child_right(Stretch(1.0)); + .class("root"); }, ) } + +fn load_image(cx: &mut Context, name: &str, data: &[u8]) { + cx.load_image( + name, + DynamicImage::from_decoder(PngDecoder::new(data).expect("Failed to load image.")) + .expect("Failed to load image."), + ImageRetentionPolicy::Forever, + ); +} diff --git a/plugins/dfpworm/src/lib.rs b/plugins/dfpworm/src/lib.rs index 21be160..c4b766a 100644 --- a/plugins/dfpworm/src/lib.rs +++ b/plugins/dfpworm/src/lib.rs @@ -44,17 +44,32 @@ impl Default for WormParams { "Response Increase", dfpwm::DEFAULT_RESPONSE_INCREASE, FloatRange::Linear { min: 0.0, max: 1.0 }, - ), + ) + .with_step_size(dfpwm::NUDGE) + .with_value_to_string(v2s_f32_scaled_int(dfpwm::NUDGE)) + .with_string_to_value(s2v_f32_scaled_int(dfpwm::NUDGE)), response_decrease: FloatParam::new( "Response Decrease", dfpwm::DEFAULT_RESPONSE_DECREASE, FloatRange::Linear { min: 0.0, max: 1.0 }, - ), + ) + .with_step_size(dfpwm::NUDGE) + .with_value_to_string(v2s_f32_scaled_int(dfpwm::NUDGE)) + .with_string_to_value(s2v_f32_scaled_int(dfpwm::NUDGE)), } } } +fn v2s_f32_scaled_int(step: f32) -> Arc String + Send + Sync> { + let scale = step.recip(); + Arc::new(move |value| format!("{}", (value * scale).floor())) +} + +pub fn s2v_f32_scaled_int(step: f32) -> Arc Option + Send + Sync> { + Arc::new(move |string| string.parse().ok().map(|x: f32| x * step)) +} + impl Plugin for Worm { const NAME: &'static str = "Dirty Frying Pan Worm"; diff --git a/plugins/dfpworm/src/resources/aggression.png b/plugins/dfpworm/src/resources/aggression.png new file mode 100644 index 0000000000000000000000000000000000000000..c25d58f9ceb370d503b0a7444c16a79e798510cd GIT binary patch literal 925 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 literal 0 HcmV?d00001 diff --git a/plugins/dfpworm/src/resources/logo.png b/plugins/dfpworm/src/resources/logo.png index 9f0f1bd552082276521505d1d0a30c5ed35c3902..2ac5db9990ec7ddf4bebc300844d6e3a879f34ae 100644 GIT binary patch delta 2029 zcmVv6fw}axlORMp_jd;DBBqd)jmfk;bb7gua@_&jk>5bP*GRqqxVa2LH zTp2;+Y2KQ@PEMO$<+nt7>vaQ>DmST*c_Hmz*9fN7QfigosVgiS_FwRsV^|(~kY2wk zC8SbdleEb%y+*daVpu3gl?cz>OCt{v8rqFZf3OSX;7Wxjxb_~Tx(ihN8evYtjoI<+5K%Lz}k5w1OT zS_!|}PLF72p`ca^m|C0KvDca@V9lj)F_*6AFehl7r&0_@R&}?$fO&j_#iI(dNlICW$^_TUbr_Qz$6kgiXDV zYh94j^t_tqtm;}yBr-1ghbf3omPRU|@-4CxGX!0uFo^jM`C@nrY8QUoK1m|Cl{T?_uV1S&n3HnqaS|<4r15GgkWIP48_Q~3 z8)ywuauui~fvlNbj0nDviFHM*LlWlcphT9ENA|^)O=P`qstoLZk1~m@8>hgF#8lRb zNq++MQ^U->!zAF=Jpfvo!udF@pL{P$ax~f`d-{g|1O}bxBX1KqCk@ku!9BJfGKog| zgNPd^RdT*U3)0nr?>@bul&~5hCm}^i(-;PAW+zeZx52dxp~91y7AL~5X1N%ft&Q2d z$*?;vCRsk5*b4?OFJ&5Q# zE-oq*6_Va;o)3ij*dYS*-P*uj|!ez`B#TFmOL$ew10%G zA#-B<+AfG|bMmS^MQZ)J5&YVFT3x>$PcO%l_6Tyy4~Q^Vy=kbJwU+v7Jh9r}9_9WW z5o<#(C#K7BM8+bwQI)=Q53bv3zC}G>~tOtJSO$#rs5*j&F&8%2&@rXVFnv&if@1vLD!wgn#k_NglQ0 zvr!1>jwTact0RP2%h}p%v&ayouFX#-mUGk>-ucAJZVw@fK5+fe)tatlpFP(u+NH#s zHZACI0RM@`6km}LF;0+=cP^@F8I2@lQh8_vwvWDsAO%gD8-}euFE-G`S1q6XY>GDD z6d)3zB#cvb!s<_XDSkAdJ%1*!B3w+-Dw26+ut5?$^r`|iyZ37%L<1-Kz9xDA5(pL9 z#mguj?C(JepB%*?;yP2SvL5vhC@vexZr4#1PGGFH--(t)8{)(!m|f#29vPqjZKZYm z8U@Hu5ulmYSQ*|Mt&{qGO@uLeWKFEv+KUG4?0*sRp|e5Oo}3sHGJg?W@(G}~xpyk$ zybNhx_soXGBngU3=822SV1J73br21_5c5E+PVYqb3jlP#B+?ku8W}K)64B$8&<4z6 z&kU?C`erRQ$e+X$5(p2~u($P65-K_C30vCj?CD!wRT8rPfFeYG5AP)KMO%O6 z!>b+3SW(+*9B3+x<9{v04KyB(Mo>lzIc^PxaKoWQJlL)}5698!HmN#xq9h~3^E5?I z9f&%T@(&*v7&cgJsU-JnA_EOW+bYCBfJ0r0eYytWltj-j9A)ZhlX}dxB%=@!?lRfx zi9;Ni(pygkeOGSP>DY}#KL`+$VNw$Kqb9R zmg)y81l9vIUS<$kSd-)I3UMzi(ip(k?FqaGJAhyfUzi|#9m^#GpOeRo*KO4kkb8i< zXXIu`)j=hGWk+w(24k2@;ziw`C+B0zm#M);jjuX|zxwZlzrX$g6m{z2%Q0Sv00000 LNkvXXu0mjfM3%oO delta 1759 zcmV<51|a#w5V#JIZGR6?OjJbx0000007C`@WEByGEh)^Gi+2D300DGTPE!Ct=GbNc z00xdpL_t(o!`)bGma8ZbHoyYF%mM`O0ussvbPM}m)6@$zx7AM1ocm+OlPEr*>Z^A# z4FAsq^1qmzri+)QeBhr(_FEza=s0|3QaqpMaMmxGX<_%BJAYuz&T^!m5-Cvfj6?`T z-hF2uNAiT6Q_6>cuZWl#vLDA8kaOdA#E(|8DTNU3vp;wj{Dqw7@}%=``f#Nj$lm6N zOBtAcY87sYB8j0cc&!T_kAW2IyVPu3HU;L(lO|!NA-_n8ezex$hT&tkcx{4t2$9Ls z2z7+V!xoexn}5@TXuwmx6|F(E8CZ`c=ZOI3DJ7arQ(b**G^$crCS}%;jag!G$>=kI zrAVe^p&3+S!P|g#1_>YHpL98=Xy_Aw1){64qftc$WfCQzjBsd6iTAn=cBS=Ct&ip^kQ#>ufpzi}^$?K( z!F+B((|iZC2?^sGXelI;mo6>0Lqa-H2<6$B_rj$5i61)>)sm=$ zyayNHrzH}RH4q{B%qkKhKuF5^N(7l(VPA^D2I_%Vw3SAuA z(PYzxM1`~=G07W_16D0e=dw0BkwK6UYhqow2Y*P8DUe}{&V6Khjv`ZNNUS1RX?;Ga z^SfC>1u`OfN!_X>df_6WN8yc#-x2Xj)=DU2Bny!8l@-Z{oUmwUySOF^i)c}~acw%1 z?b${oB9bQ?DlSpjfLCP&D3t(*Dhg4c-p$cTkj#6oeRCM!F(vhSoGh^z`E)?h9Kx1< z0e^$-lVfh48{Y&V3z8K5wqDd2)^%d^8Gf#l3rBPe=iMriC*&De>@d$`XSSDRh*>)d;vAnbHqj^_c{48jR>rp&H*rNxTsg@cx)g|W zOG0wof+Xl$82#6zy@`Lg;U`}!h}0$rU4JKFghuNO;r;xalfSO&;=y|hYd9TBAJ_JIsous&w zH;IIA-XHP+k|W(ab)dNfBA(@sOYGQcpzn|I+SqU7NeK)Bp)NnJXn)dA0b!`6{C`Oz zSQRcyg)MyjkzS3dt&XPzzK(Hl_)QQ^k1pH(HG%59vOMkBNg&nLd=??3XjF!ZJK>p_ei(`KU>}_oV} zzh^ZuJEt%b6l$;jTJkTXIL=hS%@P={+Jv*#Ty`II^$Wwt#EI4^d-6dDh(ScYe&R+7xb`c(H zq&7=S`!((>dBz~WXW#9i0-gd?R(xFjy7eMDqv?o~Izb{Kv=y`zuz-p*h1!hb;`YD{8tjAT70(z;>x2lfO% z?3#GIC%zr16ZQ5`QvmNavBjJtY5KE0*ea4?jJki_2!Bu{YYTwKI#JnM zX)%(eW^4DHn=fk6LEJ#LDiEfXF4O4)-u9YKGoLU{lH$s6%DmZFwk=2C#q+S~j}|UAZ-lCqzsbTN_9n6aI}PX}tKC=DoG><2Z7F(0QB_ z0)K2y>t{dQeCzIBue%OUI>&YwUaFCwbZ`IB<8QVkIs^`)1A+hm002ovPDHLkV1i*T BL`MJs diff --git a/plugins/dfpworm/src/resources/relaxation.png b/plugins/dfpworm/src/resources/relaxation.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0a16272f71ecb2ead6fc1939cbb95e5a5f7693 GIT binary patch literal 1073 zcmV-11kU@3P)001Ba0{{R3XHjm(00001b5ch_0olnc ze*gdg1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy8&FJCMKJ&X5*8Z{GEXR8jY?vAW}m!Yrs{y%{{R2~LAK-K00001 zbW%=J06^y0W&i*Kdr3q=R7l6IR!wu_I1rV|{s4=QWsWgULXN@Sv2zRq#2f?IR<2-B z=NhopzGiDF`Dbs7klD?_vt$dEOLDi`Pp?}ow;21>IOjGyTWdC(S3%;O53oIsN6C72 zKETdR5~P0&&j)xd5!GUKKEVEC?%nv_`2cSgTkbBh%U>EbdJm@q`YY!8{xNT^eg7Zm zi=Vs&&Kc{S2I!Age&%~em{7?h3JpPad~YCbndjY|$j}eyc?Wd+0lb4;;N?a5LAPNT zy3#)hFvz6JYQd!aH4t>o^j#dpc7(<<@3&PcIz2RYCAf5&$_BK77{gLnP}8np$8gY zsy%9n>dJi*q^z{|JYVc<)1sfIG8KzUHZ9{GiWCGAU`$*w-8Jv&y-ZNiq7Jw3U&^w? zvJlkO14>EeIJZRU^f1ZDtG&S4HKLSD9w7=$=v5X@ZxB^_U(rfRAwJZ{&^Qgs3Be8F zyWI7`>EMiqQU(s|1MfhJDo}n4R<|YRU63FHfI%H#O7x6Jg&AQZbFmqYJJJvWUV58mJ{I zDCz)(gqfk3D=6Y|BJ&6nt=8->;sLqFy~dnSViu`Fz!ME*`vYV>!&D5r6zH*l@dOF* z8wnV*E&vE+1oEyc;`WpnzKq)uZbaM&A+M_%k;11o5pgK}bU9Mnh)xT>HYD{0r6CP} zvWe14Y%nr>N%Lk2Eb8*+9?A#nwtQ_GV%U*eL$}&S=OMtfT=<+*K-jnPM;*gZ>mjqaZH*oJxTSE(sZy`#eA}Gz z+XzeYV8+c>8553r%i6=*Qhw!{j~HQ^df!r#AB5jwYg_JdhP4WAQGN}KsWD`~xEg%E zHZ;`Ie%Hz+_3tw_YbN#Iw r_7l*li_Ia%Uk9`}J8!f8-@Wc{mkmMV;RQP#00000NkvXXu0mjf;UeV4 literal 0 HcmV?d00001 diff --git a/plugins/dfpworm/src/resources/style.css b/plugins/dfpworm/src/resources/style.css new file mode 100644 index 0000000..bb486b7 --- /dev/null +++ b/plugins/dfpworm/src/resources/style.css @@ -0,0 +1,31 @@ +.root { + background-image: url("background"); +} + +.logo { + background-image: url("logo"); + width: 200px; + height: 64px; + top: 8px; + left: 1s; + right: 1s; +} + +.param-header { + width: 160px; + height: 32px; + top: 12px; + left: 1s; + right: 1s; +} + +.param-slider { + width: 180px; + left: 1s; + right: 1s; +} + +.param-slider .value { + color: #22dd5f; + font-weight: bold; +} \ No newline at end of file