From 16745002e8ef1a0fec24a47d91913090d79ea2ab Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Sun, 6 Feb 2022 13:34:48 -0600 Subject: [PATCH] initial push --- README.md | 18 ++- images/pic1.png | Bin 0 -> 13208 bytes images/pic2.png | Bin 0 -> 33301 bytes src/Window.py | 29 +++++ src/__builtins__.py | 94 ++++++++++++++ src/__init__.py | 21 ++++ src/__main__.py | 34 +++++ src/controller/ChangeView.py | 57 +++++++++ src/controller/Controller.py | 167 +++++++++++++++++++++++++ src/controller/__init__.py | 2 + src/controller/widgets/Case.py | 47 +++++++ src/controller/widgets/Insert.py | 63 ++++++++++ src/controller/widgets/Remove.py | 55 ++++++++ src/controller/widgets/RemoveFromTo.py | 45 +++++++ src/controller/widgets/Replace.py | 41 ++++++ src/controller/widgets/__init__.py | 5 + src/mixins/CommonActionsMixin.py | 124 ++++++++++++++++++ src/mixins/__init__.py | 1 + user_config/usr/share/bulkr/bulkr.png | Bin 0 -> 18961 bytes 19 files changed, 802 insertions(+), 1 deletion(-) create mode 100644 images/pic1.png create mode 100644 images/pic2.png create mode 100644 src/Window.py create mode 100644 src/__builtins__.py create mode 100644 src/__init__.py create mode 100644 src/__main__.py create mode 100644 src/controller/ChangeView.py create mode 100644 src/controller/Controller.py create mode 100644 src/controller/__init__.py create mode 100644 src/controller/widgets/Case.py create mode 100644 src/controller/widgets/Insert.py create mode 100644 src/controller/widgets/Remove.py create mode 100644 src/controller/widgets/RemoveFromTo.py create mode 100644 src/controller/widgets/Replace.py create mode 100644 src/controller/widgets/__init__.py create mode 100644 src/mixins/CommonActionsMixin.py create mode 100644 src/mixins/__init__.py create mode 100644 user_config/usr/share/bulkr/bulkr.png diff --git a/README.md b/README.md index 368ad9f..f26a6bd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ # BulkR +Bulk renaming utility written with python and Gtk. -Bulk renaming utility written with python and Gtk. \ No newline at end of file +# Notes + + +
Install Setup
+``` +sudo apt-get install python3.8 python3-setproctitle python3-gi +``` + +# TODO + + +# Images +![1 BulkR clean slate. ](images/pic1.png) +![2 BulkR loaded dir and some actions. ](images/pic2.png) diff --git a/images/pic1.png b/images/pic1.png new file mode 100644 index 0000000000000000000000000000000000000000..5de477d59452327b4fe15c119efb01bd8b2004b0 GIT binary patch literal 13208 zcmeHucU)6xw{9F9MUgV2h=Ram01H*64SfvbARr)JI*5Qs2|Yjvu}~Zt1cUSvktQ|t z2!TXFx)7v=9y$aFp(Z3D$<56DzH`p^o$uU#?m735`isw;MtSYvPLlT@MGq$ci+8z`{Ua?-`zeZbo)E~Q@P!OJa=9r zjP6J!)*Dxm$uk3#B>o$qtsq0iQ|YUFbRT6cE#@?NdQ)AwuCDZDRjcyE5CHJ=LnDxE z;ZSCx&KUqet$x2#g6oY~ywGvL3#*<#2ja4ZMn*;!rO8G`AlcM&r%mW9R7?^K%Wdd46-Z5m&i#oI0=#mt@GB2{Kim^LoS_Ui zH}PX7AA_AZ*swOYIS=Yidl)w1-v>gpY)^g`Y8!JnLmDf3yju?u86Bw#IwibZH07@$ zpKEHCqgn20HzT{6sljZ`nqVd57BiDhS@+fnRdp zg=b^fJL&70pMj|u1*f~+cZuVzDOYnt3?NL`g2LD}lNTY5J>>~rIZ z7ud8UCd>7w`RW$B)GSOzSLO3C6)P)IU|;)TNlC!CRT1b;$uLmb#Dsne)=U^vPkVTi zo;FQDYAzLZb~V#Zk-po*!2JBbKV3d9^C_oekl- zI~59yQM49zDwmV%>k|#?le`(h*lcEW?$-L!szy_Vm-!P-P-ZzccMu_(4cukk^{f9_ zLvzsb>vO9_Kjv#v2!rfRQFN^JE%9r-D%WrG#zU^RZ!)^-nzE;ozX$vZK&aA6*19fa z!kCk%;@ztiyo#TKb@|QXUHb{_?%0%MPC>urYHy!WunAp;LgD+8_ORK?`W)EHhEbN9VShgP)C z3@N_%NU`5jpVz5OR+n9)VEe_!+`0M30a4K)U`!e}4scf=$?9?4Cst(GhJ^*fZpTqB zsSu03VTedeOG6;;I_WFM3{DSOoUbK?L^j~9>ngC~I9b3CKXy1hFgfUpv@Owte9VJG z*S;bU2%$EhLyiiyr^|~PwewM;M8TJIzO4)tFoUN~xq6+yY{=cf7eL&JDYh(q04=g8 zwUU)KysFgSxHJB3f=?uEt#New)7g>%`Ev-``Oy~i`<3>({ycPmw^MtggFt0f#f51c zL91>>b$JgMGs%d{tRu<|q!^VX7$l}At+Q%`ITIK!G`6*wpsHe;r;CwJnGLGDB^my5 zd9R4QVSc+Dt|;k#0>E~txweAO)&UPpcOk=nJd3cBO_lCBifDkQB6lZ;@(if#&fH8U z=t^tUU2~4E4)kDcveMX^Hy?Y$_6{Ohx~VwI&O7XL^{vd1=8Ary98GtBZ?&n)=AZ;1 z&t)^@OlOWE;!74LU}WVvbAMgeXRGbDY6Ev+uJ^ul)@eSEtTI5a+sp(dQ6ZSu(&FNHIP~?SQ=7`O;hgd2uYbE=2aM z&BbRM(T&77jk;>?>4ZSR#(fJ}lcc&;kt?RTH@x=pd77dfTL`rl{ynCT7~kyJu*!Ij*zp)&Y#aq*-m28@olw$Ak{VzRk8E30Ux*~+hGB01e9 znjTXih*wpGZM*|}nb~9OqGx0C5>ZM2M_31^$Hk#0PgT4{KtV&vNHj)+6Z$z{ldtsYaC}QTYvW z>!Aza^TzhV4fJBiT1Lb% z!1$pBDa7!ygSmCCQ3I7fn9TR7Gj1|D=97NBM_rM)x;6kXmhM;;$Zly$-eBr61XTldJ@ zyR;n4Yv|xbZJ@RPsGy)AenXm@_LE1qI`&H4{^2e{19Bjo>;P zz4htFyAyA-{SUo4LxSu_l_nMaGvfb$^!YT4xXGCY84-H^L~UIMAJpPYg{T)v%fK2`_|A$f?`a)Hqp zQh@hUFkXZC@wtHZPNC&X;SX&u6bwA-CK?6#;R{gP+-dYpLxkhZf_j$@HTxvnE}T;q zpUMN#VD3Q^FATQ2efr&ieK_THd9?lpyz%j&p^Jupd_Qv~eL#}7G%nl+_KP&^m~%JN zja)U?H%gh_-{CaVs&M@S4KYHd&FfigL3XP@zSV%AG+H0Bl>%=ezg9nwVxoAtPu#bL zzHMIcYt?R*VM@u}JZ%s1c}x}Xe#J+nyxpSP3AW$eO^>E%QCiV+tLoF^lkG^{t`B|!LfJd?DlaHMp~7?|EufY)3+x+vnpHmxdZpeNzx_T4Dj zk@OCCu|9_QL87v)Jg$M%8==Ke_7_%#t{~4sFw13T^N4 zZJdy)_D)PN-VY!Dg3oxhm9?seA76N@U~@N%^_k+FS@WStM%`_5W^ujm)pWj>&z@H~ zg#8O@$YqwbiReu0%$k5V9b_)ttu!Ngqp-qgBK>n4W2JbKCegfTX8oKx)f^OY){L_U zTU;GEcba|;Pek@mFFMb@MwT1{+~)(E!B+F*B{HuE4)y-&A!FWv5D9U;Pt$oO)p$wO zd%?jEKiJu-57ApX#79NlLv9txkc2>s3naNMd$rQA4)Q5}y4!QPHoo#aT%m8kP)m4p zH2ua}6l>STU}HF5I+o$xltwEt;{~3P>-!xA762}tUwS#50#b}gHfdNT007m|!VcGC z?oBIw*b=^=N!`5xjJcL_C1$jPcsg^pU+E`rj^6Bk3cOVrT~k^_Q1pT`yE&Wro3+-V z85Wi;I<-GK=#}R;(6fWb0 z#DX%?Q@GM&KXw#Zj^jA8pLmwKZj*LxLv!v0Y6~+-!Yh4&Ex%z!+PryK&bSn`UK1Le z7g3IlXlE?}06xp)Qp)eqhhGIsKMu}Aj}z`-+5HZZ5z8OIj^Re$;gp#kcaAQ!?l~uz z^1EKr6q9c?N39y#-j+!tM$L?LrU}_+>ow7ur%ZLp<9#TNcit06B6*j@<1XQ{NP6t$ zz>-U_9_y1{-0gHq$%T`0Qhi@g5KwKSDSa%#Vg^c8kV8F!7H4(vm6c%{!@xTM0X~xv z85aOg1Z-_F^$tn1l`~VvpvQ|O06%-x-@t!&9N;ST{WAdI^*@=%F1*DShKP#Q*8sra zYlO66(IlgBIxN=J+uPgHU7s5b-EV_!%&NeEMlf_gVfMn%* zv$M0s#KibwK__1&^8b+1^Cm6Lvu=V5&l{Xy2*2H{{pOb{9l0ku&nldCk(6N!1tFu_ z_)V_qW{tsv0^HK7KW*seveVt^$yY6#gN|4+Q`vhjAa- z#JIkzLM8MQ^gs&}>Ufg-bMD`M76SZW0s1#1nJT2cFeEo{X`(fp`MD2u#Hen-jeIMV z{qIT1f6zW#;Aiu~sjgJaS=Yo%q06JIzB4fQq-O_h3C6x-eWAx`%}ce5k+v~Hh{D19 znDC=Mcg{8%zCs{>bG}?s?rT_dKZT{3X9%r&n_ORC|Tb7svf`r zN3XufM@>g{_<5wVu=}Q;Fg;!o%m&ZD*7fVnXnr3I?=S-=O+4j}k=A zhinHI4jI5aKL!ilouy}(#c`nTpNn8M4fE&W*iiEwDpkZOa(_Y3F|6+mzxIh2AX(Vv zQyz98=d;tRDY+KpC#W;uw9#(Cs{vjq{R(F&7BvyXwf$&LCTl0k;IvT)g^ln?-l2058PKl0_*|)^>Zi}6F}G5#8-AR z{?DDY@*;Q4`8iA$^d;wujX$eE&WzpxQOunlk6Ku^rNYDSF6JSp-@(ywv2~qC^s1Va z^f;j*nHfRtmG?TjYAp`l8OnY~Jn+N4&oU;!7&bE}^wZM=kto`$hNBL!^cAO26V6GF zGkSHlAa4J$y(X>n@>mpZ25RZoF zi+PtY57=YH=-?WXFJAwZmS++fy_V&jbF@BAoZVZh=BqliLf59+wiQ&hL~ct~Vcm`p zLZJT&QH^oVuLZokxkI0$t?&6`1-x}+%F##rNx|zwQeoqJ)w9AhN67LxM^~k#wgAtZ9NX)3hSC-KZq5j5E^n;n3i}9oRj&FSBLd5i+%+5;Q=K5K;q^D4i6g2 z9$VGtJ&9!Y>pVu{NGEaGw#dnO<&r2?o2BC60J#GR>o(V#jbthLM?(zVET;u=ifY8D z!}qTpV6F>GJ(idK-U(j-jgw-Ma1k^!1Za!q?g=}1(eK>iV-d*M5y{cr%r#KLh5NeO z;R>*UD=+B|*|P&35>!3nv=j%G4L^#XXdo#-CRew0g>kqQD83&1y#(Y_=F}G$Ba6a% zVAtFQbkW^t0XI5^AMDcN1UU+KVh%P~sIT@BJV9&ds>AIt&-rqiuqk#a#fid!8)t)f zd8kas_9KJKYASHoi1O)QNBhN7%32=&a@*5Lzi$9@5b5Q-$d+n;#i6}(#%wz3fqzdw zERagQHuWIA-N>>ZkFQiRwOi)Pa!!G~SD%~~4YAnRX#Wug(OP669fMhBRoJ6vmJXM7 zLODy;=kAO3LK8KaQ(iIYlqR-WdDX|e6UpsNg(j~DCcJK2b#Qs&{90LvY)o?H3MUWcnDM^(I#w!PjoSNz?4Yco(o&hJ?e@ZMlm%8o{ z$jmj9uK@d(!6^A!Y%A4AxJtQn@Ku`~^vB5L0h_ImZCfKm=Z(EIxa8JL{yRQXnV{%T zk|l~WoM8O~zMmcwv1hlSJ3I+~i#6^(SppYkWt@g!#PuV}R<`!`$9Z53nYyk_`^{tz zUp-91Fg4U?wui;wVFwXc$c*iNLW^U%pkE8Ag03}k*%OA8$|zeKqrFu^M(=nVE8+Yc znUcD5%JB~ory$zOr41Ju2s1!(1VxPkdmWh0$AbNHL+?Hl)Nf^e}R#* z0k3_~``c6q?jW&4#^ZU)O2^(_AEz!E<-!(w77({Qict(E+;i3Xzu+WZ}h1mNw$GqLO_Eum@$S8J=2gD_X z1RG3~=~K)*`XsLHr%mlh7lE;!xTUH}?eR%ET=#pt{6s1B;pI!?bw`3=KTYUwnhgsY z&x)*DsXFt&^SqkmeBGg`U8%&rrOWsn2{im>N95?6h(2D?VQp{1%=A=Z0)a76-}esn zsmEs`oGW!UbD91*wX}34Hqsr%q$6zuPq@j#_Dh(=2oi*Iz>at-3=^QU3A8idME?O3 z<09Hc^E~>`e3yZRHVwl5{*mg1R0;dE%-24rfDh%+r-5G_OL0VAg{)VyX& zH=T17I&6eY-MaZsvjy%OS^g5ifQV%UDK7?k#+OQz?pX^Ga7sLK z9<6vZ`)xWw)zl2JVvGy@`WQ}?wma|Cxk< zUKH`!Lx*60o3bTKSRLuXo`)Rz>cHUSK2@=CC)X+xryzGz^3kU;o3@qdisVVieLGLa zE`RrXp|&$f+wprZDKx(?gVT(#V*i0PQfzCIxD9Izh*5}S%{I54OwwuC8K=7wE1D0V z97A5qrHu?LG|`n-o5erSz3NPqUqbT^Upy*vI6Tb7jW4bnn@%nN=HP5U*vZ%YE9GAH ztiuok`^vSf#Rmx!kQlexi`*fi6n!rpOgNR*k!lrTR8HHcN?pYsy+8t9B5RZbS2}Ea zQY)wyKKfBVKK`Pd?Dd$z58FLa=+-bYqMy)8Kdfk0$_?wD%S+81T7Qj^hyvkyh1yyi zjnRIL621L}WgizY^mW?uSsKaC98tLr8x%>ZKx%~@#Sfgbli~);6;C9yjosQS5#>wm z9X`1UX`?>JlqeTDz!oxQWcLKIH9xt~81BlVcx}?~^GK`W;Ud-vaNtPks!gHg{|0?z zPHwYe`{COAHP}+RAZO{VuG4U72(O{6rFoVBy_q19I~%Z-E^uL_KsHx#L;d0B8!kGy zg?7}vorWp@k7ZlG5vDAO7g^f{+2P;D-P2jy?r;A+oxP#Nswu8Qa>-)?j6j~Q!nHEzG+%bT!^4NNcGAcw`@U1rn9 z_Cv_q#ztksK4e}tuKhP=PPH|mgv}Tb)oBd;dNxsp2m8Stwd(BhJ?H|n6TxFTQ542l z6x;VI5I;@7jn>n4pIS7#YFuIuy+zm;e>@B|ws(OZXKsac9$;dn4YPtn>xy6D4%7wD zmEgiRTBoAP@8zNoCpu++A1rL|&g`?{tZY3F@)3MWRW?8(TTpp~lcIcSu=g z6dsPx7Slnq-{Se9JA#(K5(6yf$E8g5IEdbR94d}ObW&1}5pr&2_L$`awS^+fz7T%@ zqa={i+s7hj!uEfQcL|?3R%GbU_)PF`S)30&nn*WcZD8hiXDK@D6*x}v%h5&xG@32u zB05;=N@0az4n}3W*jM+8s5Hd=xoa)Tpm?muvalHRLiQW0<|Blpqvm2`Ib3~N zPx7_K&aNDW%`m`aVSS|pd@D!go$p!CgmUZfhQCogKCJDPs4KeOsqYZJBzwKF)77V{ zxg12I@DD?%3fxqwNvgEr;~B*mN(W_gY)82Mn~<r&?zpTzhqzY{@51ez;aTQn?>Nu8vU%+0gB{U6`|2~3UIvE1M@V@2=R4to?s)BKJo3J^X_7nTP#rEg%**hq>nYSs3H=o%Eg#|sb4sKt% zVP@uJ_Wb01EkEC7U(A!Fw+GNyt^{*fF;;Est3g-GhpQqMnYq+S_s?^>2b2~~&o5_D zxNM4E$Y*Y8@45V3&Z%*YF_yrgENAjBkLone!0`UY#0Umybsc1gdg`z_j)`g&5O#HH zaF;u|{d(vI^mt!0C29@W2PO<$plxOwzeJ~-=2U;sb!o}1lo-Xmla`LPEmnAJh={Q4 zjPIv)hh5Zu_h4ZuZe@ATEXy7V_RgFUinEDLZcz&kH2!`?wIQVR>NSeF=&a8fpnSxh zq+sg=u;9en9Y65D-w?JjqJ!*f?ZFGYrm~VE9g|!yuV6~C$r9l2TlMyTbP6clZx}eR zP&2oDgcLn|iYQ+moC0XP+4_l49x&!XReV3n@dhx`$ zl4Bwg`+=#mfpvK#t775{KM*f{(#}#e%a%Ew8cGa9=?iMCeT1pI=(QieZ~Sjg9hA;n z-?4YTsO8^Ri59J9w?f2dIY$&83P>Uuiq2A>>^m|z^sE>q>bC2|j-sg#~{ z?8l|u8vsB>*1tIFpHA}E@ITG#UsLkel>D`ExSBW7FIfss++=y!U3+{rtjQ(5D)p?Wr&*770r1$3vq(( zO&JqHpKxQKq))BE^;F$;Wu82!>u$HZZqsZh58&eoiy^jM`H4$6H_R@k?omg z+7(>J2kDr57B|-3pG_K%D8Dr!t?s^1PMgt*G_8_}3HXC57h?s?T%lgl_}~>yYAM;` zkTcXp;)NQgI2lsZqx-1!kt4g|yvR9h;P7L8UKUMb;~CF}(&3i4I9u!(;KgUrn7Mz& zzrI=6|F8MiF+qMw*eszjPn|m12ewNiMGszc(Ob<)Gp-VMYVp}#ZEPiTc~o7TTY_0m zK&J?fG18$YV67E>Fh`~wPT*%VoTi|ID@-zu{6VX;l9|L0_!%n5@6{W3X%^h0bJhpM z8;oSR(*+D{i@0^3?`YV`GnH&IS+L*Hijd==HXm!Sm1#@t45}T~+MFm^P{+X|-SmSk z$igAQC2weG>jlVD`Bh#l`$_uAPC7=@dOZVse z1T{I_R?|d>-h1zB^*-YOKz)@{d|den2~F)U_syRIV>)BaRxsoSpLAdBR)3e*D2!CE ze}cv>R&A1|59ZD?tmA}MmhGGUhV@wa=f4oJYW{9peOI=I>)uH_j56OUN!aN@HV@-g z#`2oq5mvE>6FMiTTU_O%z6BT97;`)7gK%VB6$@ucI9mM{;Mx>M{%(3_JooWsV%_eW z!sP$XI#MmKIdCU~upy{H_hAaIS=a2hLL}*|M9MN*;5c9n;1hPso2#<9i1oSf58cdv z?`!_geUc$(mi_^;x{d)pGVUQ1{K$&X+MZ?`-v;qny-gBBhC1E{v%2&b3%%qSZkp+?U&(c zrDuTB3iPblVCTs7r??~c^-hU%9}S)f9an?>P2pgfS*s96-;B6|Y@H*DBsr}=-~|Zq z^L)KyA7tr#Xl(g?BgN7@Cy1Q{j|!peE|BlixBpN;qI@-D0*0&!Ik>J_;!hj|lC{|^ z>9oV;j|lDs{GzU~@1OlFZ;@I19Y)+K>v43nKkKoVM9}9j{Ly?d7`Cx6CE*ah=I!+m z_UUrvKWCb?O>GO$EsN*@J3{i%_bYDAl5!2L6tr(}E+(!J`d&*o7mdVi< zyCA=-zHumJ0$tJaj+~jbr}*Jpz~HsihsF+=zJEnL{mDKx$Q@4^b$TYrRgJ!Fl&j(j zTun>9zrhO_ER{Ay4Acul$&9M`zq4zXxVcrHyNWIk+iY?V)aT7a_!di@I1cz|5F?lX j_>T+XPXNEp;c3jBuzu1NFvWex1z>pF^p`4->$Cp_+wZ_I literal 0 HcmV?d00001 diff --git a/images/pic2.png b/images/pic2.png new file mode 100644 index 0000000000000000000000000000000000000000..19c5f843ae6fb458b62876bd71b097bf29099147 GIT binary patch literal 33301 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 literal 0 HcmV?d00001 diff --git a/src/Window.py b/src/Window.py new file mode 100644 index 0000000..c06b4f9 --- /dev/null +++ b/src/Window.py @@ -0,0 +1,29 @@ +#!/usr/bin/python3 + + +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from __builtins__ import Builtins +from controller import Controller + + +class Window(Gtk.Window, Builtins): + """docstring for Main.""" + + def __init__(self, args): + super(Window, self).__init__() + + self.add(Controller(args)) + self.connect("delete-event", Gtk.main_quit) + self.set_default_size(800, 600) + self.set_title(f"{app_name}") + self.set_icon_from_file("/usr/share/bulkr/bulkr.png") + self.set_gravity(5) # 5 = CENTER + self.set_position(3) # 4 = CENTER_ALWAYS + self.show_all() diff --git a/src/__builtins__.py b/src/__builtins__.py new file mode 100644 index 0000000..3ad41bc --- /dev/null +++ b/src/__builtins__.py @@ -0,0 +1,94 @@ +# Python imports +import builtins, os +from os import path + +# Lib imports + +# Application imports + + +class Builtins: + """ Create an pub/sub systems. """ + + def __init__(self): + self.USER_HOME = path.expanduser('~') + self.block_from_update = False + self.block_to_update = False + self.active_path = None + self.from_changes = [] + self.to_changes = [] + + # NOTE: The format used is list of [type, target, (data,)] Where: + # type is useful context for control flow, + # target is the method to call, + # data is the method parameters to give + # Where data may be any kind of data + self._gui_events = [] + self._module_events = [] + + + # Makeshift fake "events" type system FIFO + def _pop_gui_event(self): + if len(self._gui_events) > 0: + return self._gui_events.pop(0) + return None + + def _pop_module_event(self): + if len(self._module_events) > 0: + return self._module_events.pop(0) + return None + + + def set_active_path(self, _file): + if os.path.isdir(_file) : + self.from_changes.clear() + self.active_path = _file + for f in os.listdir(_file): + self.from_changes.append(f) + + self.to_changes = self.from_changes + event_system.push_gui_event(["update-from", None, ()]) + event_system.push_gui_event(["update-to", None, ()]) + + def reset_to_view(self): + self.to_changes = self.from_changes + event_system.push_gui_event(["update-to", None, ()]) + + def reset_from_view(self): + self.set_active_path(self.active_path) + + def push_gui_event(self, event): + if len(event) == 3: + self._gui_events.append(event) + return None + + raise Exception("Invald event format! Please do: [type, target, (data,)]") + + def push_module_event(self, event): + if len(event) == 3: + self._module_events.append(event) + return None + + raise Exception("Invald event format! Please do: [type, target, (data,)]") + + def read_gui_event(self): + return self._gui_events[0] + + def read_module_event(self): + return self._module_events[0] + + def consume_gui_event(self): + return self._pop_gui_event() + + def consume_module_event(self): + return self._pop_module_event() + + + +# NOTE: Just reminding myself we can add to builtins two different ways... +# __builtins__.update({"event_system": Builtins()}) +builtins.app_name = "Bulk-Renamer" +builtins.event_system = Builtins() +builtins.event_sleep_time = 0.1 +builtins.debug = False +builtins.trace_debug = False diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..db3945b --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,21 @@ +#!/usr/bin/python3 + + +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from __builtins__ import Builtins +from Window import Window +from controller import Controller + + +class Main(Window): + """docstring for Main.""" + + def __init__(self, args): + super(Main, self).__init__(args) diff --git a/src/__main__.py b/src/__main__.py new file mode 100644 index 0000000..055337d --- /dev/null +++ b/src/__main__.py @@ -0,0 +1,34 @@ +#!/usr/bin/python3 + + +# Python imports +import sys, argparse +from setproctitle import setproctitle + +# Gtk imports +import gi, faulthandler, signal +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from gi.repository import GLib + +# Application imports +from __init__ import Main + + + + +if __name__ == "__main__": + try: + setproctitle('Bulk-Renamer') + GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, Gtk.main_quit) + faulthandler.enable() # For better debug info + parser = argparse.ArgumentParser() + # Add long and short arguments + parser.add_argument("--file", "-f", default="default", help="JUST SOME FILE ARG.") + + # Read arguments (If any...) + args = parser.parse_args() + main = Main(args) + Gtk.main() + except Exception as e: + print( repr(e) ) diff --git a/src/controller/ChangeView.py b/src/controller/ChangeView.py new file mode 100644 index 0000000..bce4e68 --- /dev/null +++ b/src/controller/ChangeView.py @@ -0,0 +1,57 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class ChangeView(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(ChangeView, self).__init__() + + from_container = Gtk.Box() + to_container = Gtk.Box() + from_scroll_vw, \ + self.from_store = self._create_treeview_widget(title="From:") + to_scroll_vw, \ + self.to_store = self._create_treeview_widget(title="To:") + + from_container.add(from_scroll_vw) + to_container.add(to_scroll_vw) + + from_container.set_orientation(1) + to_container.set_orientation(1) + + self.set_spacing(20) + self.set_border_width(2) + self.set_homogeneous(True) + self.add(from_container) + self.add(to_container) + self.show_all() + + + def update_from_list(self): + if event_system.block_from_update: + return + + print("Updating From List...") + if self.from_store: + self.from_store.clear() + + for i, change in enumerate(event_system.from_changes): + self.from_store.insert(i, [change]) + + def update_to_list(self): + if event_system.block_to_update: + return + + print("Updating To List...") + if self.to_store: + self.to_store.clear() + + for i, change in enumerate(event_system.to_changes): + self.to_store.insert(i, [change]) diff --git a/src/controller/Controller.py b/src/controller/Controller.py new file mode 100644 index 0000000..00ac263 --- /dev/null +++ b/src/controller/Controller.py @@ -0,0 +1,167 @@ +# Python imports +import os, sys, threading, time + +# lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk +from gi.repository import GLib + +# Application imports +from mixins import CommonActionsMixin +from . import ChangeView +from .widgets import * + + +def threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() + return wrapper + + +class Controller(Gtk.Box, CommonActionsMixin): + def __init__(self, args): + super(Controller, self).__init__() + + # Add header + self.change_view = ChangeView() + action_bar = Gtk.Box() + file_choser = Gtk.FileChooserButton(title="Directory Chooser", action=2) # 2 = SELECT_FOLDER + file_filter = Gtk.FileFilter() + file_choser.show() + file_choser.set_filename(event_system.USER_HOME) + file_filter.add_mime_type("inode/directory") + file_choser.add_filter(file_filter) + + label = Gtk.Label(label="Bulk Action Type: ") + data = ["Insert", "Replace", "Remove", "Remove From / To", "Case"] + self.store, self.combo_box = self._create_combobox_widget(data) + + add_button = Gtk.Button(label="Add Action") + test_all_button = Gtk.Button(label="Preview") + reset_button = Gtk.Button(label="Reset") + run_button = Gtk.Button(label="Run") + + action_bar.add(label) + action_bar.add(self.combo_box) + action_bar.add(add_button) + action_bar.add(test_all_button) + action_bar.add(reset_button) + action_bar.set_homogeneous(True) + action_bar.set_spacing(20) + action_bar.show_all() + + run_button.connect("clicked", self._run_all) + add_button.connect("clicked", self._add_action) + test_all_button.connect("clicked", self._test_all) + reset_button.connect("clicked", self._reset_to_view) + file_choser.connect("file-set", self.update_dir_path) + + actions_scroll_label = Gtk.Label(label="Actions:") + actions_scroll_label.set_xalign(-20) + actions_scroll_view, self.actions_list_view = self._create_listBox_widget() + + self.set_spacing(20) + self.set_margin_top(5) + self.set_margin_bottom(10) + self.set_margin_left(15) + self.set_margin_right(15) + self.set_orientation(1) + + self.add(file_choser) + self.add(action_bar) + self.add(self.change_view) + self.add(actions_scroll_label) + self.add(actions_scroll_view) + self.add(run_button) + self.show_all() + + self.gui_event_observer() + self.action_collection = [] + + + @threaded + def gui_event_observer(self): + while True: + time.sleep(event_sleep_time) + event = event_system.consume_gui_event() + if event: + try: + type, target, data = event + if type: + method = getattr(self.__class__, "_handle_gui_event") + GLib.idle_add(method, *(self, type, target, data)) + else: + method = getattr(self.__class__, target) + GLib.idle_add(method, *(self, *data,)) + except Exception as e: + print(repr(e)) + + + def update_dir_path(self, widget): + path = widget.get_filename() + event_system.set_active_path(path) + + def _handle_gui_event(self, type, target, parameters): + if type == "update-from": + self.change_view.update_from_list() + return + + if type == "update-to": + self.change_view.update_to_list() + return + + for action in self.action_collection: + if action == target: + if type == "delete": + self.action_collection.remove(target) + target.delete() + if type == "run": + target.run() + + + def _add_action(self, widget): + itr = self.combo_box.get_active_iter() + text = self.store.get(itr, 0)[0] + widget = self._str_to_class( self._clean_text(text) ) + + print(f"Adding: {self._clean_text(text)}") + self.actions_list_view.add(widget) + self.action_collection.append(widget) + + def _test_all(self, widget=None): + event_system.block_to_update = True + event_system.reset_to_view() + for action in self.action_collection: + action.run() + + event_system.block_to_update = False + event_system.push_gui_event(["update-to", self, ()]) + + def _reset_to_view(self, widget): + event_system.reset_to_view() + + def _run_all(self, widget): + if not event_system.active_path: + print("No active path set. Returning...") + return + + self._test_all() + dir = event_system.active_path + for i, file in enumerate(event_system.from_changes): + fPath = f"{dir}/{file}" + tPath = f"{dir}/{event_system.to_changes[i]}" + if fPath != tPath: + try: + os.rename(fPath, tPath) + except Exception as e: + print(f"Cant Move: {fPath}\nTo File: {tPath}") + + event_system.reset_from_view() + + def _clean_text(self, text): + return text.replace(" ", "") \ + .replace("/", "") + + def _str_to_class(self, class_name): + return getattr(sys.modules[__name__], class_name)() diff --git a/src/controller/__init__.py b/src/controller/__init__.py new file mode 100644 index 0000000..b290d33 --- /dev/null +++ b/src/controller/__init__.py @@ -0,0 +1,2 @@ +from .ChangeView import ChangeView +from .Controller import Controller diff --git a/src/controller/widgets/Case.py b/src/controller/widgets/Case.py new file mode 100644 index 0000000..ddfe5f7 --- /dev/null +++ b/src/controller/widgets/Case.py @@ -0,0 +1,47 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class Case(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(Case, self).__init__() + + label = Gtk.Label(label="Case") + data = ["Title Case", "UPPER", "lower", "InVert CaSe --> iNvERT cAsE"] + self.store, self.combo_box = self._create_combobox_widget(data) + + label.set_hexpand(True) + + self.add_widgets([label, self.combo_box]) + self.set_spacing(20) + self.show_all() + + + def run(self): + new_collection = [] + itr = self.combo_box.get_active_iter() + type = self.store.get(itr, 0)[0] + + print(f"Changing Case...") + if type == "Title Case": + for name in event_system.to_changes: + new_collection.append(name.title()) + if type == "UPPER": + for name in event_system.to_changes: + new_collection.append(name.upper()) + if type == "lower": + for name in event_system.to_changes: + new_collection.append(name.lower()) + if type == "InVert CaSe --> iNvERT cAsE": + for name in event_system.to_changes: + new_collection.append(name.swapcase()) + + event_system.to_changes = new_collection + event_system.push_gui_event(["update-to", self, ()]) diff --git a/src/controller/widgets/Insert.py b/src/controller/widgets/Insert.py new file mode 100644 index 0000000..97afb68 --- /dev/null +++ b/src/controller/widgets/Insert.py @@ -0,0 +1,63 @@ +# Python imports +import pathlib + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class Insert(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(Insert, self).__init__() + + label = Gtk.Label(label="Insert: ") + self.insert_entry = Gtk.Entry() + self.insert_entry.set_hexpand(True) + self.insert_entry.set_placeholder_text("Insert...") + + data = ["Start", "End", "Position"] + self.store, self.combo_box = self._create_combobox_widget(data) + + self.spin_button = self._create_spinbutton_widget() + + self.add_widgets([label, self.insert_entry, self.combo_box, self.spin_button]) + self.set_spacing(20) + self.show_all() + + + def run(self): + new_collection = [] + insert_str = self.insert_entry.get_text() + itr = self.combo_box.get_active_iter() + type = self.store.get(itr, 0)[0] + + print(f"Inserting...") + if type == "Start": + for name in event_system.to_changes: + new_collection.append(f"{insert_str}{name}") + if type == "End": + for name in event_system.to_changes: + base, file_extension = self.get_file_parts() + new_collection.append(f"{base}{insert_str}{file_extension}") + if type == "Position": + position = self.spin_button.get_value_as_int() + for name in event_system.to_changes: + name = f"{name[:position]}{insert_str}{name[position:]}" + new_collection.append(f"{name}") + + event_system.to_changes = new_collection + event_system.push_gui_event(["update-to", self, ()]) + + + def _combo_box_changed(self, widget, eve=None): + itr = widget.get_active_iter() + type = self.store.get(itr, 0)[0] + + if type == "Position": + self.spin_button.set_sensitive(True) + else: + self.spin_button.set_sensitive(False) diff --git a/src/controller/widgets/Remove.py b/src/controller/widgets/Remove.py new file mode 100644 index 0000000..fe7b38b --- /dev/null +++ b/src/controller/widgets/Remove.py @@ -0,0 +1,55 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class Remove(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(Remove, self).__init__() + + label = Gtk.Label(label="Remove: ") + self.entry_from = Gtk.Entry() + + data = ["All", "Word Start", "Word End", "First Instance", "Last Instance", "RegEx"] + self.store, self.combo_box = self._create_combobox_widget(data) + + self.entry_from.set_hexpand(True) + self.entry_from.set_placeholder_text("Remove...") + + self.add_widgets([label, self.entry_from, self.combo_box]) + self.set_spacing(20) + self.show_all() + + + def run(self): + from_str = self.entry_from.get_text() + if from_str: + new_collection = [] + itr = self.combo_box.get_active_iter() + type = self.store.get(itr, 0)[0] + print(f"To Remove: {from_str}") + + if type == "All": + for name in event_system.to_changes: + new_collection.append(name.replace(from_str, '')) + if type == "Word Start": + print("Stub...") + if type == "Word End": + print("Stub...") + if type == "First Instance": + for name in event_system.to_changes: + new_collection.append( name.replace(from_str, "", 1) ) + if type == "Last Instance": + for name in event_system.to_changes: + new_collection.append( self._replace_last(name, from_str, "") ) + if type == "RegEx": + print("Stub...") + + event_system.to_changes = new_collection + event_system.push_gui_event(["update-to", self, ()]) diff --git a/src/controller/widgets/RemoveFromTo.py b/src/controller/widgets/RemoveFromTo.py new file mode 100644 index 0000000..ebd1fbb --- /dev/null +++ b/src/controller/widgets/RemoveFromTo.py @@ -0,0 +1,45 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class RemoveFromTo(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(RemoveFromTo, self).__init__() + + label = Gtk.Label(label="Remove From / To: ") + self.entry_from = Gtk.Entry() + self.entry_to = Gtk.Entry() + + self.entry_from.set_hexpand(True) + self.entry_to.set_hexpand(True) + self.entry_from.set_placeholder_text("From...") + self.entry_to.set_placeholder_text("To...") + + self.add_widgets([label, self.entry_from, self.entry_to]) + + self.set_spacing(20) + self.show_all() + + + def run(self): + fsub = self.entry_from.get_text() + tsub = self.entry_to.get_text() + + if fsub and tsub: + new_collection = [] + print(f"From: {fsub}\nTo: {tsub}") + for name in event_system.to_changes: + startIndex = name.index(fsub) + 1 + endIndex = name.index(tsub) + toRemove = name[startIndex:endIndex] + new_collection.append(name.replace(toRemove, '')) + + event_system.to_changes = new_collection + event_system.push_gui_event(["update-to", self, ()]) diff --git a/src/controller/widgets/Replace.py b/src/controller/widgets/Replace.py new file mode 100644 index 0000000..821d131 --- /dev/null +++ b/src/controller/widgets/Replace.py @@ -0,0 +1,41 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports +from mixins import CommonActionsMixin + + +class Replace(Gtk.Box, CommonActionsMixin): + def __init__(self): + super(Replace, self).__init__() + + label = Gtk.Label(label="Replace With: ") + self.entry_from = Gtk.Entry() + self.entry_to = Gtk.Entry() + + self.entry_from.set_hexpand(True) + self.entry_to.set_hexpand(True) + self.entry_from.set_placeholder_text("From...") + self.entry_to.set_placeholder_text("To...") + + self.add_widgets([label, self.entry_from, self.entry_to]) + + self.set_spacing(20) + self.show_all() + + + def run(self): + fsub = self.entry_from.get_text() + tsub = self.entry_to.get_text() + if fsub and tsub: + new_collection = [] + print(f"From: {fsub}\nTo: {tsub}") + for name in event_system.to_changes: + new_collection.append(name.replace(fsub, tsub)) + + event_system.to_changes = new_collection + event_system.push_gui_event(["update-to", self, ()]) diff --git a/src/controller/widgets/__init__.py b/src/controller/widgets/__init__.py new file mode 100644 index 0000000..4688b2e --- /dev/null +++ b/src/controller/widgets/__init__.py @@ -0,0 +1,5 @@ +from .Insert import Insert +from .Replace import Replace +from .Remove import Remove +from .RemoveFromTo import RemoveFromTo +from .Case import Case diff --git a/src/mixins/CommonActionsMixin.py b/src/mixins/CommonActionsMixin.py new file mode 100644 index 0000000..f8afbee --- /dev/null +++ b/src/mixins/CommonActionsMixin.py @@ -0,0 +1,124 @@ +# Python imports +import pathlib + +# lib imports +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk + +# Application imports + + +class CommonActionsMixin: + def add_widgets(self, widgets): + for widget in widgets: + self.add(widget) + + remove_button = Gtk.Button(label="X") + test_button = Gtk.Button(label="Test") + + remove_button.connect("clicked", self._remove_self) + test_button.connect("clicked", self._do_run) + + remove_button.set_size_request(120, 32) + test_button.set_size_request(120, 32) + + self.add(test_button) + self.add(remove_button) + + def delete(self): + self.get_parent().destroy() + + + + + def get_file_parts(self, name): + file_extension = pathlib.Path(name).suffix + base = name.split(file_extension)[0] + return base, file_extension + + def _has_method(self, obj, name): + ''' Checks if a given method exists. ''' + return callable(getattr(obj, name, None)) + + def _replace_last(self, string, find, replace): + reversed = string[::-1] + replaced = reversed.replace(find[::-1], replace[::-1], 1) + return replaced[::-1] + + + + + def _remove_self(self, widget): + event_system.push_gui_event(["delete", self, ()]) + + def _do_run(self, widget): + event_system.push_gui_event(["run", self, ()]) + + + def _create_spinbutton_widget(self): + spin_button = Gtk.SpinButton() + spin_button.set_numeric(True) + spin_button.set_wrap(True) + spin_button.set_digits(0) + spin_button.set_increments(1.0, 1.0) + spin_button.set_range(1, 1000000) + spin_button.set_sensitive(False) + + return spin_button + + def _create_combobox_widget(self, data): + cell = Gtk.CellRendererText() + store = Gtk.ListStore(str) + + for row in data: + store.append([row]) + + combo_box = Gtk.ComboBox() + combo_box.set_model(store) + combo_box.pack_start(cell, True) + combo_box.add_attribute(cell, 'text', 0) + combo_box.set_active(0) + + if self._has_method(self, "_combo_box_changed"): + combo_box.connect("changed", self._combo_box_changed) + + return store, combo_box + + def _create_treeview_widget(self, title = "Not Set"): + scroll = Gtk.ScrolledWindow() + grid = Gtk.TreeView() + store = Gtk.ListStore(str) + column = Gtk.TreeViewColumn(title) + name = Gtk.CellRendererText() + selec = grid.get_selection() + + grid.set_model(store) + selec.set_mode(2) + + column.pack_start(name, True) + column.add_attribute(name, "text", 0) + column.set_expand(False) + + grid.append_column(column) + grid.set_search_column(0) + grid.set_headers_visible(True) + grid.set_enable_tree_lines(False) + + grid.show_all() + scroll.add(grid) + grid.columns_autosize() + scroll.set_size_request(360, 240) + return scroll, store + + def _create_listBox_widget(self,): + scroll = Gtk.ScrolledWindow() + grid = Gtk.ListBox() + viewport = Gtk.Viewport() + + grid.show_all() + viewport.add(grid) + scroll.add(viewport) + + scroll.set_size_request(360, 200) + return scroll, grid diff --git a/src/mixins/__init__.py b/src/mixins/__init__.py new file mode 100644 index 0000000..55cf9b4 --- /dev/null +++ b/src/mixins/__init__.py @@ -0,0 +1 @@ +from .CommonActionsMixin import CommonActionsMixin diff --git a/user_config/usr/share/bulkr/bulkr.png b/user_config/usr/share/bulkr/bulkr.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f652f0578bd308de3c206f34ea72ffe37f40ce GIT binary patch literal 18961 zcmeIYRd5|mvM##B%obX(1Qs(hGh2)nGcz+<%#0Q@GqY?lGcz;O(f`lvy=UT{mmP7> z+jOk%)m@eOW#(5|)zuaCQ(jgK0Tu@q001CJhzl!x{`3EJLPLIDOU>-o0RR$ecO^AP z1w9v_t-X!0nWYiX(aqKfXyj^U3;?(;7i3r@?Y35Cd{}(J_kSb}=}Vr!hUfP50ii4_ zEqht!?OZc)F*2h376t%C0XSB^b-f=rydk~UA0DGCmbC17-jFpedLD>$Ok`Vsv~n$X z-IH|^T)hxn=;#o*uEV~)CvTf$i-lYN z9mwR#pT`5!*V>PCc47KHUwx>4@Yn@8O?X_owC;27yK6a)I6X95@fD?0Gdz1e^}=1K z=X9tGU5!luUqs%VqUmyj&?y@;Q+O^bKQzMYMjAbSI5+%BOx}^dU{8(Lc`fp(`nZLg z$dk7{uhj7vXl-9Gu7g*X{jkTvu$yQr`OW%x^YB2h#G>1iudNcw%<7z>7_r+K3rxuc zgCh0L!g4g~Akz(RcGPE})deXR#MWEJQu!|Xf%YZC0pjst$ zlem2UmC^9xlej8(r>P+cf5ut5P{$On@3!fUXuU%T>{vOL6 zE?v81UyFqivGR1=9DPRXLrppI)^zHe_!zSG`cbtKfL-d*lnFwfT8 zZO(X|Ru=UaH)q>3#zAb2DeF~aWSW{jqLgKrFXR0{)vwf*G{ENT)v2ICKQmWu0#aLcrbZKv(x?Jo>#G%iAYp1* zVnwNQ8vhP-mEIP3btpjX#`5aPG;%+ea0cdiRd`3WTOL`;L|tsh!&&XKN}ZUoPk-;z zhBBTJoggg3AS=t_A?7h3$m~deEFM+efo^Tm&TO;(aib`i+Pb=Fk$%_buql>ec)6Q$75i#p+-@ zO#%j$&wa0}HbKF?Rw9<$@XLPEa`fDoBLjfSim#@=-^GLI<|cBq(W33)(xoJF(R75` z-7S;+?#EX(mZibw#W#8t<0iaNKfj6GY~ldtpFS?>6K)%_{bG0ch)`74XQHNyb6MG{ z9ฐ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 bfAK*V+pxrFaRz=aX9FZeWQ8jQb^ZSjzX*C2 literal 0 HcmV?d00001