From 1017850a6cc91328abc1127bdb117495f5e909d8 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Thu, 28 Apr 2022 21:25:27 +0000 Subject: [PATCH 01/20] feat: refactored centered box to diplay in any of 9 areas --- README.md | 13 +++-- src/app_error.rs | 25 +++------ src/input_handler/mod.rs | 35 ++++++++++++- src/main.rs | 2 + src/ui/draw_blocks.rs | 68 ++++++++++++++++++------- src/ui/gui_state.rs | 106 +++++++++++++++++++++++++++++++++------ src/ui/mod.rs | 10 +++- 7 files changed, 202 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index ae524e6..4610130 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,21 @@
-## Download +## Download & install See releases +install +```bash +INSTALL_DIR="${HOME}/.local/bin" +tar xzvf oxker_linux_x86_64.tar.gz oxker +install -Dm 755 oxker -t "$INSTALL_DIR" +rm oxker_linux_x86_64.tar.gz oxker +``` ## Run -```./oxker``` +```oxker``` available command line arguments | argument|result| @@ -56,7 +63,7 @@ requires docker & error!("Unable to access docker daemon"), - Self::DockerInterval => error!("Docker update interval needs to be greater than 0"), - Self::InputPoll => error!("Unable to poll user input"), - Self::Terminal => error!("Unable to draw to terminal"), - Self::DockerCommand(s) => { - let error = format!("Unable to {} container", s); - error!(%error); - } - } - } -} - /// Convert errors into strings to display impl fmt::Display for AppError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { @@ -39,6 +22,10 @@ impl fmt::Display for AppError { Self::InputPoll => "Unable to poll user input".to_owned(), Self::Terminal => "Unable to draw to terminal".to_owned(), Self::DockerCommand(s) => format!("Unable to {} container", s), + Self::MouseCapture(x) => { + let reason = if *x { "en" } else { "dis" }; + format!("Unable to {}able mouse capture", reason) + } }; write!(f, "{}", disp) } diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index 3e14fb5..610c0f5 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -4,7 +4,12 @@ use std::sync::{ }; use bollard::{container::StartContainerOptions, Docker}; -use crossterm::event::{KeyCode, MouseButton, MouseEvent, MouseEventKind}; +use crossterm::{ + event::{ + DisableMouseCapture, EnableMouseCapture, KeyCode, MouseButton, MouseEvent, MouseEventKind, + }, + execute, +}; use parking_lot::Mutex; use tokio::sync::broadcast::Receiver; use tui::layout::Rect; @@ -25,6 +30,7 @@ pub struct InputHandler { gui_state: ArcJhpTIdteIy?eUYMErqS;nwKH!x z(~$s-n`K*A5T3V?z9~&_r!)7|Lk}&UG=)78RBx1U;2riO5%yF4A|RF^EP=nW^IwSS zSdDx=?GWMss%&ORqNvZ{oqt+b{-4RDDyUVaR-3tq_4%WSk8~uDW{d6F%4_Y#ii=}b z25iPg9G!7?N$1U!?u-(BTGr}%;wu^{tm`u1c*L^*h6(t4Uv;wsGH$KFT4xC46E75o{Zm+xDF^Dwh~L-e9*LQ_;+R zv4AB4s9&75m-rCB*HkJ$hT^CnDXRzP%hZyLW!hFdl(C!>albLuLHO^xMyCcZ_jYUt zz*BLTelj^DqQJbx{t~#bG22$pjHCp6(pz?viC^S++jb079w$~Y3sMwC^?)uZN0d-J z)aN#Kj#Rsvk~!RcG?BNnhb1 )HJv8ZYyh7fW#E8ZP5ZcTZqO!E4YHQM>QmHo3bS*&@FqzT^K z<0_f%s-k_i27?+}#t=`i(>HGyRpM(B2dP}3Q0~?HuyY*@XVvPg^5RexxCX-1S*~mO zzFZRvu%cx!jOgbN@#Hnig05m%0JS__-8o)VICt S{BZE#wIOW9J~EU3t3i0JZ 1o82!oXY*G@xF8l=Z(8YjLq2D_R!3Kq?aHm8g@(7Sa8qO%%Wd*v=Va$hzZ8{|ip zq#Kt7?mhGurk &7(#L{F a}?50s!1A&es_1GGKijF#gzH?RLnA61gk%v z;Eb#p$$tkq=Q;2`pHuKG?|$!>s)qOR5C;}&fqOR^W6HzaU+1`Szt5BAH*$Mk`mRZi zYev@$o*CJYmQa4{Q%<}&_YO}4SC8`m@L4}cfu=-EK~v 9FS4?WP_x9{ F_@-+O7KjpNmmzpCmwaFZ*4Wr)1^g04TWCK+uq zeD|?2r=HV%=z`b1g^h?;M|GUj(eZh4)r&M04&n)Os{e^NT7A=f0S}udyX!UV7j>T% zrFE^LB*h43AXZ_#zX8~?;HqW|le!>I_E@xd&?Bw_NgO{5gVt IEz)`)d*A~uawjR$OJp36 zhn_^Hv|Q(MLu7a)H2{roK5gJ*I2Cy3P7Q=gq6Cp)t6c*WyDaI3@9#O0T&+(T+>j0N z?mY@$=2_Z0q#R}L4QaTbsF^!|)(J&p-wIghs|YtoAj&{UMRJeT#3)yANDRiRm-S4w zj0*~+vZ9O*h@__0p;Yxc2_Ik3Evq_EZk9$|Cw7^13s-+xeT8z^s$ToND0`f_xjy=o zot}5$afQa6iej %7_Xg`FXZ`i7xrc%#Zo0<;Oe^rne%E{o>~ zUK|~n=BfNws=fIFt6^kmZ|PplA8Q=GxnSCt3le*MHvT<8l+9%If=5hcmf1uhNmIlH zE*Iy=1~dJuMBk=yPSf{Ga@t=h=k+!qeA+MV{J8#lkkf)3FQsR^I06)I(yy}k#{9}` zv*7t^g+7BrQt5$5h}wFbEnM`f#?{l)87Q$x+{bGAj?A>n8l~r7IQJ~-Y8%XGe)5YV z*I|31A@S1rO1_K_Bij(;p&3)PemL~K9T}aXW{l%kS?SEA#bisr(O!FGu$V&_<5oAv zPV F2F9s^s|ABIKv!ujGB5${t;e0v&?+^DY*6 z8!KLH)^_=b8`2GyxhiV1GqJ88f@?1T-6+oR=IzPY`X)Vf+iqu=ywq5Qin7p)Z)a`* znITpl;={lD>d@>Aq(}GWN=NGM+km$5rLsf2+RE5b2+BH?WowqRtNsD3n$@Ckpt)#t z^g-FD!DI4of-lWDrTb-16H6*&NUt~Sj7Nn6{y+BKJ1&YX-5Lf#lH{DBi7inOBnxzt zGf2)+Ns=T8C?GaD=ZrK-QcKRX2uKzrgGi7lNf5Nj;9Gd+-f!ld`~B|BIcMh1`+fJH zg08OGd)MAotJkxhwRe4aPPQ4^`F`nMKQ~kHdWAIMqq)tVq@KHJ?piN44-%)CR9e&r zH+z{mNdh-FOLZ@zr3qWxM8;#WrEj!H4Q*R%ZYnCW1tg2%8~Zp-ner_peO+mZgG@}C zZ00i@Phsit=+sm>mEW)vxtn55z! -t;46^neRVn|sD9sd#=&>K9vj`^4l8coJ)(&ig6Agc zF-cpv cJN+I;IkD5AnpsCE4;@Jcx2C{lXm|!cE}%65YX-6 zcUs-Iy?^ujXheQ;V-LIc>rzRxxJe08?yPCi*F~ba=Y|WnQ6%r0D`#RVd`uq-pd<+J zUuZK@64xbjKS15aq@gz-+InAtVZq-W^Va{g@Idks;ap`_w{3S^nxP=AFCoTw>CJ3D zp}Q705e>mSMT}t>)G&lUY#{kya^^+hEf0}DP3_cXj~*bqP_l_{*K6gK3g~jw|1i)f zO{QX>zq&ogG?`tUHaR|9mSk-!tz9MJg}Rs6b)j^h>czzUl!S=Y3l8*Qz-}Q@>yLB7Ks6X0z3KS^Vw3Oz8iV?iK66ZxTdXPtvuS?&RQ< zabvFBltZ7JJ({nYlX<#_VwQ1^hcp#i85S3#WB{**NZ{Qy9&@+ou<&h?d-y-4d$G6$ zR~Jvr5peVoPi)2~=3|KdG2P3nDl|Nsxx%rxRn{PTX?pxDeztTbGDf DeMg6 z+vT@<%d81T3}~LIRK*+FsnOwt6vTs)uJc;SGs2^@c{J|mX0}3V)VGyt8glgS*8#d0 zVVU7Vj;abipy0ExXv?}iOmxhNSt?gU0~gNo8=CES){MI&Kn$dk;op*y{^Fnc{d{gU z_dwsfHKVomN$jxYGsK;a2M<}If49~?Usu#DwOaWng_pMTw?bwIOc)|;B(4&Cb(wjS zqXjvIbw-0a2|RW}1)he& %CtM**f0( zqg>Lu >9wl*6CjuSR6#TxqCQ0DSAam8}+)U zp+AS7?Bng{Zpo9uv#B${z9JEnqfW>}*;G0#79J&2oz&SmhT2;*Rg(QJsfLF;+kpE? zd}HXI1;6=;zEbek548JcclfL|lh~0OE!VNK?Zf*PmRqhrWA<^R!Exfrz%S!sZLUf8 z63UouF %pWC-;*_$*TTR1(A(-Ds%Ou*D76%-Gw^WZ(Z_31 zR3tXk)9I`Mo27)#9d@GAda}FR#cH?4A`e&S34 xJ6LU>6>AL7U z6i;hqj6>9xCGH7)rb9gbun(PRr2gbt2-2?*Ht2JQu;H-BX)3%zP-|G?-X;KQ`eJ!_ zm&@LLL`~vxDEr@l)qm)Szu%&CPfg2Mm^H%__BcGRr&68C5(m%!4`l4NtqAaHI3l>Q zNL31dp#5o1g7NCFZlvw9fQIE*{TlQ)xH2grG4a<<0%q||mrmpT)Y6&MFjE~TFK0*j zO0cXsdYu)E50>10FkyD0rQ=CuStxsSsj!=aS`heqL-q~cMxcs;yEUj!bPCtq({V}C z^Ada15miQ1x~r(vml<>@8_+I1j grx%LK9#5 z_@ii_|2bPh$ijDOb8?-K4p9EAdI$E>qsTGKPy~Cv#$1vp-5ds8eiw^XH9;damb0p( z<4%=LJzwJ&xy}e!(zUvDP`R>wQX|{U;-&J@{V9ruzS&*BrI_X=L6g)+_T%>B^$B72 zN0!SCZ}sfwJMkOVXZsqLUwFRn+v!u^oznS0w`OwiCzuQx2aLbeH%U IQg? zc|J;*Jydljh>;)5I<3D6X~-KScuqpe#&=Wop$p-MbZ0|G+j&(Ue{V0qB$eZNzqB%~ z@<} Q5CaD5(Lo zd$@KW4%i$Tm?14CZW%~<5FN!Eaz_?1p$bY{VwUq2YN@Y*J&k|isJ~x?2T-e&OVUs$ zQ4KapVkUY|CS)rF1N!?Df&eiJF=dVNtPTk(A9mZ`yy$zVyCbjgV$LWt(2REUO*BD( zUBA9n1mLdjtPF*a@=TYk-Y)lh2)HG%)yWvD{NClJg(&E;)Tq3eQ=xc}eVX)S_cav8 zHOsh@_tesHb-+xOF1&Ods%kFC?u$XDr{;oE?{mOV7n{sVB>$Z20*@n}3j9pA^GbB; z_O?r1CfE138B+Jjhy3*ut<&Sh%9k;fjrbpw*l-##7u+M=BQl?R&)} T@z7=FE2m#??3d3?Tc2{@ zeJQlU`<+=o|Ayqoj~Ze(9Aqx%RuKOh(?LsbVg=#O3eQ6J)MPn&Mn&99fC;@C@JoAa zZni+F ~CXL6qe+XqFb6HJe z;?j{%ME*5~ZKnC$)SR@)Ou9KXV@W5IG?P)>qR^LRHK}L}Pi|Q$GR+i=53z2cf#Q3M zVz8u0`#<1#q2lSQ r+fSUdZjhz?^N1Qrx~r66_BGvxZH=)~+6 N1*f&IGopRl>V>+P~$k+b0K^4WIx&nWQEY1YqD?yq}m0IhQDpZ|Q- z%m={c4_&eCXBO3+{Dpo|r`w^mzk4H)&P%V4zRgy~GAIKRD7D3?sIw(2Ltsr*k#(VV z2wrke1& ^@!*0_0Pxt&l({-O-_AIwtHnTpfY(z|2X%~;DASTu2 zwzxzd=0Bw?c^ed3cENf^g3cj^7SB`|XwA&l%S?*#J#I%1Gkx`%OhCd#cu*33kP^|D zbTu)lO*}68sp28aH8l@(W@)9%w=&Anvyx$(Of%uQ0)3c4f2^oj88+ KJF7$U%?!SaTdl!KRxc}ALar}fv5Ab>Id2(jMqCz)u$HAM=%T5M45mV z)j+H;f~uaLeCR}Q&ct($;@vh$J$hwyvSl*W$h&7+`)#5T;bOAT{NQt`tMObT(&PPm zorU^lSHHCvxkX4Pj|J4Aw3Mpf)EaU-HNY 9h1ixQ@{BH5KVH>5GDIS;x|c#lOtKT!mjg zx=^!g+8gwn-irHyW`DkZNpw;A%Y4ieaA5WiG@Ylha*Vz3%MzfY;)Y#60p$Y)028pU z>g~gN6xt;kHz6V %TC^7aQEyxbPL-N0^;p24A*T6Hy&%m_OFY4z^ zv#sZv{m}DuV3dF{VQXt^MEJV;t)``=qAG!rO*}YQs0T(Z(cIi*stp)e)j^ sBqSU~mj^Yd<-14GZgw)T$|QL5^(@ZVIm^Iwh5o4@UMR}|AK`g-*bw2wU!Y=sjT zDD>|7p_2yRKBh0mz}z{L!{`RF|6FY0uhw1oxBFLRx5vF>ZU*z|zg^4zi|&K54M_q^ z*C>#np 69|Zqg&IVZaMjG8n@;!e_Xf|=bXTYP{$7W2~I}22bpCv>> zMo)%^mi~Xg)4VIq+o?D65PxkpW{JK_4E^0d&@-^x_^Xoy|LjhzdcZp0#uqp2?Rul& zTTWKz#`)*_Ut6TbKK#ed+N+&AS34zswe$ZuGWO@`zdG{QJAan>tDUh{*?3F;QPWlR zhxniT8~=g3XNRV%p6)k|zL~Lhpfw};0Ln6NmkvHh^7hZ%aaD>-_|Yb97ff>NuO zi{kNK+M#9lcINOJMn__S_|Zxtd3b*}U75Dd!_P@P&mzL34pr+?SeVI#!*pwc=^S~7 z4FYc*)vdLEJAnpA4EohTm&sa9z_D7QIf(8-X&YvisGGzd*dL(D(Vf-}uRgj4yvc{j z%9b(8+p&bpGf<7b4zzW6mi%h!GnwgtSUT&AubA4}jVhZLsWL)ji;HJsiYW|^qBTKi zOxXPahuMvnfnYa%nI6w-w@XUhc&mp2*YD~od~3X_9cH8;sZe*Kaw}Z(sjG8aTe}lG zz2Z%>=v(_n)_w>ClOby;l{;r|;P#m>Pe!O{1m`fc`>e?>OxJ}AoR4}|) k(Y_^Fne%Sk}fShvRl+TX;;+_1i!|Lv) zR7wvd46cvS3{Q6aY_J(9`^)d!iT?vl6m~1}Uwjq6zYp`@*M>i*eueYk 9dK?^)a!j`3}!muSPesKX2!s(AWL}9#Y$Xb<^+^`=$+aK}3trFvaV~>!)=y z)uP9Tjv19(>a=3%t4JWGEM`LCQ*nj`=LQ;=&*%l@tgvhjx4t($&^#k7*F0kpwdNqc zPj(6{{TQ_LaYTutObbc%;)_m5&V)7&^lf063Z;*>9EgbIvMX?B?{Zs`=E*B_`sb3@ zUuAq|&lc_LR%ob(QhFuzuO3v(llXP%@tW!iJa`KwDFR*3TCd?0N5!QG2o%}fOH#I7 z9=7ST%_D#2ap0g{p>0?DV*Yd^oZ!Y3?IUl>!$7J_MNUcsp#fPmkAeX^&>($Y5x&4% zo^1F;?d=q?Hf;XFab0Gb9vy*1A^S9P VMDR%a79}$p43nbk2doiBdiRG0rfTPUn4thCLqh&j6 zaWh$r1$5t$6Cr-IYm^}N3VM?!sGb``N)KxNK96MW;69G{n<#1F7{_ RzzQho6S zK5OA&sW}L&UToNYd$ui)&5<;iB=34Xox0XER)-ZGw1bb*!y87H(Qo0u(!eIA-!{q{ zuJN6Ka%1LuTud9buL+7d*BMFca4^VbuEE2-ZiH6Ns5kg|yl%34YpGHxj5F9xHk`yr zQ6}~%p+HgYNUz&Y%3CW^=BypK6TA+p6@?jPYwt~FWL?K~yNurG!4zU_C4az+r9%zv zZ`Gr(ERRGZKpxnU44jr^Y$qpMp2-OeMUp&_k(|GukY3tc^6|`QG#bZV${Rdvj9+*w zEXlh}%))>ijn02{fHeiBeS7*QxZ^O~CX1Y9ILNmpSTvgCUEkqMZMX$5ZYWJtZSQ!Z zqnMJq+~X5)0V~^`=wrjXTX&*v5-J(7Cvi@`#mr4Us!P@d3}w1msju$9K{OJt9xb40 zDcs1}U$8s;zPgqe>9@ABT9ZJQ7}Vr;+Dd7PUu>+P%1%tvDmlyFNY!k&0$WXIFq`Iq zX?5UhUN(w-#aUy%)h+e ^ZUH9 z$}=O=aaM9`(Iw2m!#BGDdqP$q$W2NaQFe5ts_tB_IFEdz(Z29y@(_h{a*#)dP!76M zgK&vev9EciMhTU(GLAA2aY% GFX |;3mCE*=m`1Y_Tb(WW^J! zi>6fVcSbwaJUWaqP-_0m=SzDkqBG1YPr;G+CHYjw-R `{CIrHx(<;avKy+_u^N9z#NG##8)bhMe(@=h;`)qq$p-9U|9So5mdC1KO*H(tv zaXg_g{6`SaM&UKT*LBdCh4`BU8!|X#6(wC1gc|VyqD=?dP&tg~+h7mRw M1J2#>`GP$%b}Y`^_O;M|#K`4$w 1CHx|oUQmo$jfKn_#cE!jR-O^DZ6ulA9})1rjDYwKJmFfw9P*yFjSkJ7 z*i11lnQM*^99bBK&U1DJ+ij$55 TMuf1ceTO)QV@KWk^dOaQ=c(T0-nKt0IhyW{CVdCpcY7gWX?^PbN+<|pY z7NkakF|X6N$#ohRVVSOOF>HZ1At1+O_tVbRKq7&GRS#=^3*Ev&KC3uU_SHjhk4pNa zByPrvaX#(<+Q*k|k2ynmve72Er}AmIbROgu?@gd~jXJQwCO$qpcvHGvl&0zL^}U}D zc4%X+p* l4AxXEwmjraTCBjK?d~WxO7*$wPQ)hYY zPP!6lXd`Xelga!7ZAWF%^0^Vj=G5ha)$&-`GOR?q`2;?}WZ&)b9Yw3}>T8<5-lA1t z#nmM4hhThS-lvw~D8d~eBilPOtYJ%#RxnKWa3{{?-MOgueK{b>->ku8IC+tjDae7` zIPIVg3l8d53(gnNqR3P2AUAGH)c{8{ET9O$Fcz HqAoy B^bb$A|p2UrnK9C?j@7>g`%?S^%`Ceu;{8n1vRFCJgHB