From ae39a318d991a46f51dc2efc64199a38485800ba Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Sat, 21 Mar 2026 00:00:35 +0000 Subject: [PATCH] add --no-rich_log flag use it to disable the RichLog and load the tui_no_log tcss. update README and add no log screenshot --- README.md | 5 +++ img/tui-no_log.png | Bin 0 -> 8439 bytes src/vban_tui/settings.py | 1 + src/vban_tui/tui.py | 13 +++++- src/vban_tui/tui_no_log.tcss | 85 +++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 2 deletions(-) create mode 100755 img/tui-no_log.png create mode 100644 src/vban_tui/tui_no_log.tcss diff --git a/README.md b/README.md index 916cdde..5a0eef0 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,11 @@ The TUI should now be discoverable as `vban-tui` vban-tui --host=localhost --port=6980 --streamname=Command1 ``` +Additional Flags: + +- --rich_log/--no-rich_log: Use this to [disable the RichLog window](./img/tui-no_log.png). + - This is useful if you're sending commands to Voicemeeter because you won't receive any responses anyway. + ### Environment Variables example .envrc: diff --git a/img/tui-no_log.png b/img/tui-no_log.png new file mode 100755 index 0000000000000000000000000000000000000000..d2ce1ed5600006239b09df86e4dff7f944389b09 GIT binary patch literal 8439 zcmdUUcT|(vw{{dqtRRYX0mTueNS97f1ROyS5fCXs5CYN!q=#e}2kD^Fi$OtpiHLxd zBqCL+fb7;5NHqNzEX4@Yv&b%kT=QqE}=AF!n(&-?$6{RVE(Z zzV{PgAAESt+7ATcYG(iKY4F(Y8FAXL5(pWe%9L5jymgf%Bp5no*9|3-o9_w-ekAvO8ogu+dr+}a7 z*5z8Bof^QeFMs;{|9d0+WW<$kmoYxH@f$omJ}(h32Zl!mUsyXahs%P`;r89E^};cA zaPM46;%~Bx9_!}Wc$_LrDO{PX&$Mp-5vJ3B7p5Npd^#K20on1i(i);XvH+Db+2pg^NmHVKE=|98+^VuZ1ep$1z>UCr|J3F7pM6pd!US{72;Q=l@4 zk$V)Xw4_%=P%d*m)iE=9EpFPz+CnSzQdw*?S;C_9oX*MEW%HL=mMU_?^g^AMRW3H*0X&OCI3+!JpD zI?c`LSm4(UBP5r|p6tvt1TdQ0Mr z$@a}WwWF}f9e}K>(wJ!(_E+#B#MTWpg^u87Zplg~1gW$>@x{e`x$NpeyUi)5-&;uMj{0n!$AwJj4f2}m5vcg`9>17JVIrAd?>Hl*a#~AhDcB8bxBBgt6uB6N zI<$Ht?DPa#U6rcCTTDL$;^CONzV3q~yL z4?9CWRx?0}gj$)b%iihYfSM(d7DB_x-8A%^HT>&CI<(b!UlnvCLp6X8JG}lR5mXp#BdjEw$c?aqWx# z#~hkSWn7lo!f~uX0=%U}ve0-3nKSv)G!XI*t1eKOr)1Jtsc=T=C+3WF5_gr&yGe|k zSLomphjI-;tV4P*8Gb^JSRiRJA+jTvye#>^EvA6IP9B#x2dmSA@Wqqv7xnuhu&qy0 zA+zJeg%)lf?O|upII|Erl|rtmD9w!$8v{fI?fYj%?hhc*S`D=njRW0f_GAYiUL82I z__!9d0;-ZN9NiyE&UJbsq{=j>BR4BHr)&+%h-K@TzR*y=QO@dY1De1-3Pm|Tr9U|f z$!lRQ8O!~Al-`s-Ze?O*Wm%}UrWXe`%L@|?aXcT8W`LotICq|qEZvGRL9C|Xn-e?9 z=WpwpphueU=V;X8_Uo8=`bd>gKh*z?%C*9X!$aLdiJx{0l#J@1DtH$~l)@5eIK~QN5n)Q7KQQkRN;V6J z`6)eqsVJjZG_;7%|5#8ud$=JRb}gFHV;6IO2kXSAtSQ`%9p*#uf$bvNS- zkJLZ4PsmPtxan^2R;AEsNTp*$t7GM?k)GZs1Rq~)zCxNoDoaL&&&cUw*U(!o09=9I z*dAm*p8om+Cmi@+Fm#*uQ|uzaiBw`Ae_GQtY~y(rJhTD7N+izkG_qkE=^D@@iD4h@ zIZ@O4>{$c7A`)-rEq5k2a1{oF2U%eR#q(76ckv(YgUWGP)>@4`Ct;{WPA5vHcg7zfKveSMj~9xA8(oMI_GDaM^%NMe|fD z9O?;l+8&=JjkFmlAp%Y%l$QrO%??t;WH1%FHEmwfQ{$AfuUP)W6u*P*&G*4wbEAp)Lw6PNDHck{1ihXYryi_xK ziBKl&YKvZjk*5S8S?CYx>h~HoMKiijNqWZ{@(#CEs0rW_R17Dk2kINR3^fw-6D^iH)yxjVCG{Y}lX=M^$=D zm@LOyJ!#9WE7#;&ks5C59j+9RdXcwh_TX%=xxo{YHca@l_Y+&N%7@;b@eL9jW(&P) zbtvgUxFTkA*-M#!E7{n=dB=MCEjMdINOWRktYlV? z=h}n(_utzbpzefx&ITX_UPbj%i8I^NkhVZW-@L_qo?N`g<|~2ND`hVxs(<;_5c-5# z_BN9UwWxZM>lv%KQ1OcptM7-hL z*>~@NsrRB35QCUB{I$)`cih)r2X*SDfn1dM^fJzdtqub7v5lHm6R^{B>L0hRfcCZ5 z>N)Yu)Z*_4ZxM#q)ZTj9cnAw6)}S-C1}FJKH~8>fl(HA>Da|O@jqSVk0Prj$dmG>I zY0vX%VxIqES4mT55@WyP>(6{Z(wci8-rI4k!~K&fYVuB$<2wu=!RF^eQhXEIlPBW> z-iUIQ=7uxsZ>pd?qT%(@e)n}SF`158%P^?m4zQTw^7HgOy_^8aYBYs8K(b{}s>*yl zo+txb;lu_XRfB~429GcC|Po@x>iVgM@|u!I$vvM@SV;_O6(li(1rgpKemaWz>0Z z&tf)x%hbo$;XplCDL>D9h?^2$I^q=*6~(c`ky3*}E_Vx2Yh8MjQgU#>E>+w57HY9W zUCVLe$75GmA_&$7B4=f<&}Y_mAFBmiW_yzLW$OyYy_e#@u)efXx|Q~u#sMuElEWdi zLJ-_NPV54B^XRo=(LbuvQOzqrJvlt0IjT;$=LMqv4A7?!A~Y@+uaUI_{tnOB^d&v7 zQ*|;qr+m+w1AnSr|FcGy##3<6>IcWlJCyuauV%rAV_OH(jU>AMy=oC2=)by|PFc1> zP4V*ZaBgu*c>)wSLuJmpCle|K{)3zmXTa?jTM#&wI_`+_8^oPDDP}P(0!GaykO!6~ za8@+ApZ;7?ciE#;Mk1Rye(mic`^de*={#~{BTiGD!K5iGa#OGQf*R|R3;wI;RpBMi_V(kFrOVCqqTXcZ=)vF@&Vny$0 zv`5h4bgYUy@{=mChPu0u4K~>LrE?GvT6)Uv{mzzRp8t?y{&rH=DB80qW{ouRL2!ME z81UjP`q~!v+CmPeG!`7Qa@zEG#~)i3`1jN6I)yqhx?a1w%ipUxf3>;#smyS-o!&W^ z5-=`zzarOcRvycBNqh`wkD8A=!NG~Q4G6|og|x0$sA)eG?>)5?^MYQpSl_U58>N&q z6{~(-Yv8iI08izd%$RA)-DwK;%Hvoh9;9RrlHvbk+Q@p%=xR&Pd)OKLcT+@`;sE>ykMG|QT!d@f&E4E67#GiKAPzWKdjTYu?NXU!Hr; z9>FsZd~eS6u#I7hi}K$aSs@;Dde#7W%W>0X;b*`}EyXU)r=}S-$iq`S{co$aj&HLm zdA?!@ni^4o>`0_ciMa9j3PQ+)ZSs%e>}JQ)Nm2CaMCLSYSbx-bu=%Wnk7Tf`S2(&78UEj4poS z7zhx?zV~dB5nI{K5$rV{;#R+9mGU$b9l4z(;2DfoKH8vWx3lG{{*bGckToQ+#KW`0 zg3BHfPIVn$M@I|v)XG}Y_dLocaQ9Voqu3km#ohIAElp3fmK{2%FJL-HW6 zca4)*CMw?ZYV$Msgzv(ixud>KI>7vua-H3mzqzdho-Ax>pVgjB+3+RAc4i({`GcT# z^zHD@WE|$y#4XTns$Qq1drtjcT9!Zpff7~4ae^|VJEyV40Sj-7<%jOA{ zarb$a6XXcamj6_W+blMEbE9cMdkojIS%oqUmODIz)8Wmrs{_{|yp>z$vkf{T9XHZc zrBRIL60DFlARS)&s{^cfdwb4irLCVES4v{bjJGN3wB3SFEVV>p{KyYn;@j`<9%re- ze-fCTgSqMXM5f9z)5#qp2)wy}XdB{GNvB{5Swxu}^B?pwvDjJr3bU^{lw!x;$?2?l zwHlx>9yu3q7jygEMbX%V zgoOE^r6o0Uw<(@T6X%athOAkJYYd=uUX71mQn81-znN~!$Cv9uc{ok%ejtWTzsC~6 zE@)+Ms8?mSd$+$*Q}LV+*am^_h=jvFrI-v9{{A*%3;{FssPn54;MM4Di>FP9eLNU^ zg^}34y6UIEEIQs(mb$(^MHv-oU%5ZQg(Lw~A76^Qqne3phu8oTEXmY)X`S$JGC`KpOtqXZUVvxX7LJ1i&tMag+U0Y93dqlb|GXCrZ z{_f;-T!2VS+OTO$YoCsk3Jl1r?5KjHalk#d;}yXBoqR zA{r-~+c)~Q>Wt}HL}f%ELImNamEgavgXs5|s{d;;|)$|~b1fb#>y}HLiPtdc=ct!*QxETiH<$+GaWi>Q3@Qd-?yu(0PH^bC< z`AwrXcrife6Vw8H&J1I3XOpbqOO=^zdZR3K>8at>mM!9({B_IbmR2=O4IUjT&DFSDK^&*1 z3Bd1uf-q0%NVn(f2ACLmJ*w&ybjF}8LB%iRoASAf2Em`h@OY?#pg-ROgjOxnAiMnc z0;RR}5!GC`W}{ZK_nk%eU94jm7HM5;HV+aY&u3~`o9lOS=!^V|KD(KC7tl78ys?%d zKTE%O*{hSO?B@8L{K+g|$-CV>zaJf(W%Sf_{CMa(FP=;}k55pk)L3p=3K1F}uRLej zJ_}XX(h_N&7~yY_;>L8!#)@RvTx$1Lf4J>ZJ@dJE6azS9Hwy>z9^74%yn7tMS6d9R zayc)N@tQX4-O{`=(a~$bsq7q|&<-4{txg#qDqkJDQH8!3E$mY>_Y138_*E%mrnXEC zJ~-wxe|vH4_z;VW+?xkx?;?9WPRcKN3dn|~M~`67xJ|SAnQEA@FxoYUEEJQ_A6+my zV4)K{%@b*#*-Y;2G@l{{Q_%HVVi;Ioh(S*up?gF@Lt#q0F46J#3X?>fqdJ^AzEYRP zSj##xlM&g_W6>-E27&lWE^`Dk5B9ZkoPB zOXl{q@X+AU2`5^slf^{ol5ykCcx5+Z^n|bhky0O_{%*#&Q9DQ>cbk`();8m@yvMp4 zoHoF)wHqf6C^Dj;%S!H2J5$yi-M;GZ!&BG@pY7DG&80+$x0{sqv5QnV6lg0hoCz$; zlfWth(5mUL@pMn^bbOu|#%c&GmWE`Eyk{hqS1x>ar&nlHOK`myKLI4|8S0yPDMli9 zyU~o_!GqP^%nj?fF)*YZh3sL{HQ+-}A|t6cPM-Rx0lFDkv8;8nho!=oCC9R1bGZL< zq(3=zntj;6+egtDxQ#5)AYP~>a9&!9o-8jo`*l;+o1FlOnHR{Q+X?_azvE?W&H1%b zo>07)@e}CRe2IT{GxoRljDJF=(uX2GK8DSZsFDjok6TY*hFGA{rG>qM*Umt{tqGk|2N(4n4RYpofZC9 z+<0rEBB+G0Py*~{&^1Ck8QfBc5G~t=GuAf%HNisK6j$f3Qe}|4tN+p#&Gz}44+AUo z=ey~D9n^5cAEfT{`3D5IA572xACk2HTiyOMmg-<TWbhOZ5Brw=fht=E0Ui7S zHa^7d2H@BHd;jp3yog>61z!Kq?7R!Q{(=~9vZlpkz6L0g>wx~CU-V6`R$OuT?cV@o C-pYjl literal 0 HcmV?d00001 diff --git a/src/vban_tui/settings.py b/src/vban_tui/settings.py index f8281e8..eb3d14f 100644 --- a/src/vban_tui/settings.py +++ b/src/vban_tui/settings.py @@ -27,6 +27,7 @@ class Settings(BaseSettings): host: Annotated[str, AfterValidator(is_valid_host)] = 'localhost' port: Annotated[int, AfterValidator(is_valid_port)] = 6980 streamname: Annotated[str, AfterValidator(is_valid_streamname)] = 'Command1' + rich_log: bool = True model_config = SettingsConfigDict( env_file=( diff --git a/src/vban_tui/tui.py b/src/vban_tui/tui.py index 38a3407..2f6341f 100644 --- a/src/vban_tui/tui.py +++ b/src/vban_tui/tui.py @@ -11,11 +11,15 @@ from .settings import Settings class VbanTui(App): """A Textual App to display VBAN data.""" - CSS_PATH = 'tui.tcss' + def _select_css(self): + if hasattr(self, '_settings') and not self._settings.rich_log: + return 'tui_no_log.tcss' + return 'tui.tcss' def __init__(self): - super().__init__() self._settings = Settings() + self.CSS_PATH = self._select_css() + super().__init__() self._command_history = CommandHistory() self._history_index = None @@ -62,6 +66,11 @@ class VbanTui(App): self.query_one('#request-input').focus() + if not self._settings.rich_log: + self.query_one('#response-log').remove() + self.query_one('#main-grid').styles.height = '20' + self.query_one('#main-grid').refresh(layout=True) + def on_key(self, event): """Handle key events.""" request_input = self.query_one('#request-input') diff --git a/src/vban_tui/tui_no_log.tcss b/src/vban_tui/tui_no_log.tcss new file mode 100644 index 0000000..3ab2ab5 --- /dev/null +++ b/src/vban_tui/tui_no_log.tcss @@ -0,0 +1,85 @@ +#main-grid { + height: 20; + margin: 1 2; + background: #232a38; + color: #f5e0dc; + border: heavy #a5b6d7; + border-title-color: #b7bdfc; + border-title-style: bold; + padding: 1 1; + grid-size: 3 2; + grid-gutter: 1 1; + grid-rows: 1fr 1fr; + grid-columns: 1fr 1fr 1fr; +} + +#host-labelinput { + height: auto; + width: 100%; + content-align: left middle; + text-align: left; + background: #3a415a; + border: solid #a5b6d7; + border-title-color: #b7bdfc; + padding: 0 1 0 1; + margin: 0 1 0 1; +} + +#host-label { + padding: 0 1; +} + +#port-labelinput { + height: auto; + width: 100%; + content-align: left middle; + text-align: left; + background: #3a415a; + border: solid #a5b6d7; + border-title-color: #b7bdfc; + padding: 0 1 0 1; + margin: 0 1 0 1; +} + +#port-label { + padding: 0 1; +} + +#streamname-labelinput { + height: auto; + width: 100%; + content-align: left middle; + text-align: left; + background: #3a415a; + border: solid #a5b6d7; + border-title-color: #c6a0f6; + padding: 0 1 0 1; + margin: 0 1 0 1; +} + +#streamname-label { + padding: 0 1; +} + +#request-labelinput { + height: auto; + width: 100%; + content-align: left middle; + text-align: left; + background: #3a415a; + border: solid #a5b6d7; + border-title-color: #b7bdfc; + padding: 0 1 0 1; + margin: 0 1 0 1; + column-span: 3; +} + +#request-label { + padding: 0 1; +} + +#request-input { + width: 100%; + display: block; +} +