From c3a00f469cd5820213f7dc7d0f9df6f71cca1f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80?= <6terio9@vk.com> Date: Thu, 19 Mar 2026 13:19:53 +1000 Subject: [PATCH] v0.3.1: open tables folder, shortened menu, full language localization, screenshot height fix --- data/io.github.vual.metainfo.xml | 6 ++++++ po/en.po | 11 +++++++---- po/ru.po | 11 +++++++---- pyproject.toml | 2 +- src/vual/__init__.py | 2 +- src/vual/locale/en/LC_MESSAGES/vual.mo | Bin 12532 -> 12550 bytes src/vual/locale/ru/LC_MESSAGES/vual.mo | Bin 16268 -> 16281 bytes src/vual/ui/game_tile.py | 13 +++++++++++-- src/vual/ui/main_page.py | 1 + 9 files changed, 34 insertions(+), 12 deletions(-) diff --git a/data/io.github.vual.metainfo.xml b/data/io.github.vual.metainfo.xml index d3f5e4e..1f74bbb 100644 --- a/data/io.github.vual.metainfo.xml +++ b/data/io.github.vual.metainfo.xml @@ -97,6 +97,12 @@ + + +

Open tables folder from tile menu, shortened menu labels, language selector fully localized, screenshot height fix.

+

Открытие папки таблиц из меню, сокращённые пункты меню, полная локализация выбора языка, исправление высоты скриншотов.

+
+

Code split into modules, new icon, screenshots, version check before download, full localization sync.

diff --git a/po/en.po b/po/en.po index 47d6ed7..4750107 100644 --- a/po/en.po +++ b/po/en.po @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: vual 0.3.0\n" +"Project-Id-Version: vual 0.3.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-03-19 00:00+0000\n" "PO-Revision-Date: 2026-03-19 00:00+0000\n" @@ -248,15 +248,18 @@ msgstr "Refresh cover" msgid "Launch game" msgstr "Launch game" -msgid "Launch Cheat Engine" -msgstr "Launch Cheat Engine" +msgid "Launch CE" +msgstr "Launch CE" msgid "Assign table…" -msgstr "Assign table…" +msgstr "Assign…" msgid "Remove table" msgstr "Remove table" +msgid "Tables folder" +msgstr "Tables folder" + msgid "Select Cheat Engine table" msgstr "Select Cheat Engine table" diff --git a/po/ru.po b/po/ru.po index 4a88b4d..1efc03f 100644 --- a/po/ru.po +++ b/po/ru.po @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: vual 0.3.0\n" +"Project-Id-Version: vual 0.3.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-03-19 00:00+0000\n" "PO-Revision-Date: 2026-03-19 00:00+0000\n" @@ -254,15 +254,18 @@ msgstr "Обновить обложку" msgid "Launch game" msgstr "Запустить игру" -msgid "Launch Cheat Engine" -msgstr "Запустить Cheat Engine" +msgid "Launch CE" +msgstr "Запуск CE" msgid "Assign table…" -msgstr "Назначить таблицу…" +msgstr "Назначить…" msgid "Remove table" msgstr "Убрать таблицу" +msgid "Tables folder" +msgstr "Папка таблиц" + msgid "Select Cheat Engine table" msgstr "Выберите таблицу Cheat Engine" diff --git a/pyproject.toml b/pyproject.toml index 19480ef..da6e9de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "vual" -version = "0.3.0" +version = "0.3.1" description = "Launch Cheat Engine for Steam games via Proton" readme = "README.md" license = "GPL-3.0-or-later" diff --git a/src/vual/__init__.py b/src/vual/__init__.py index 5332192..1e7adab 100644 --- a/src/vual/__init__.py +++ b/src/vual/__init__.py @@ -2,7 +2,7 @@ from pathlib import Path -__version__ = "0.3.0" +__version__ = "0.3.1" APP_ID = "io.github.vual" APP_NAME = "Vual" diff --git a/src/vual/locale/en/LC_MESSAGES/vual.mo b/src/vual/locale/en/LC_MESSAGES/vual.mo index 1b0f8d79416a626d774eb5dbd2ba09132c1ff4ae..a03ee1c70b91f13f0cb8f03e26cafb52c148ee44 100644 GIT binary patch delta 3491 zcmZ|QdrZ}39LMp8%MpchxQd8q9H2xI1+9UX=B;9CUUP(wHU&b(nYf&nWq7ojSy+}o z(PnCeH@t&b-cXik>eSTCR*AGGnN3C99Idj|`@?zqv$ON?dYL{n1$WYg_AH8^Dqnxt#h#x zFcI&f)^T&Q=94j&{mmdcx?ln-vr<$g79jVSHJFWCQJFScZ=;9tLpu(PVJ*htsEkLU zuAhktXg>DGWvD<7U@-fevvjoaMPw~=6;+8_s0CV35&wzpN7328KsQt=Gcg>8+wla< zU_1>U$JMCH97G-2F;oCwp-&q%($R&@*aJK9sWM1Kon;Q{#);N^?8)k>fsf%oep|=b5XUSLDl?P#~*O3vR>qlA&%mhQ0AL>PYURuKNpl zn^4M;jLE0~ojSYxmoKaqMkpKN=FMl?Vm6?NRTEUmH7hXZC3F| zC9Xo9-FehP-(oLpL8;iTJRKV z!*5WPx{f39SIopT($m8E$doBSCA1V(k(H>DSD@CdLNYh|aj?Gsr|1mDe^6&SlqaVg z$DsoI0SDo4sIOs4qA^L>4|V1fQ2`X9DmM$2`5UMTt-~PPj9R}E^-EfVK4o~4j=YRo zun84mE5`G`z~%K$78r#*H|7P@*Yg$B^>3m|y4H?&SP!F0d=6Fm%cy7Q29k?;h+3yJzgn74 zOY!+9MlhiZ@=%#ALY-w9sv;XO8~30xZML?eD)-2aL-~^HsJfsso`|}>6cx}C?2ju^ zfgJVG38r%ywedAnX4g@bXhAK|hKe}w3I9>VqZUX;JtG5AXFJM{^Du+)OypLx9#xq- z)R8ry?)QC7M;kSxF1(98hbF40KZ6X^QH)33IK^6o`eB)iByZkERbn@)Vni!Z`LJP5@zW>YUDDrnufviU@xEDKM9qNV#?2Q*uNAf%Bx*#U?KOh=;zDyb_ zfN`k6XQL|h4ywYHcK!@Tu)n!QN13#t&iD~3(wH>=0$$YoFbu>OQ4iTvQ~(Ytfl5@S z)u{VV+WAYU0B#`FH*KgR>CuPt*T$K2lu?#-B&x*YQ43E-mA1f+OORh%vj{t(gR0af z)W%y;8`YqGh`vWXQ+H972~GE}mzqxf^+S`vgcf=hH6D-pB`ZQ@UWVFmEvm%T*b%Ry z0&7H0!!)A;_Vo29kbnxniwf{5RKi2-{D{8PU!}-pLJ!|89E*!lH=ITfUO;X5BZlEk z9EtZ){{sf}^DkV4%CH2L&3q zge3+XcH-R$BX%(^qp8#%)0WcK(pJ(wr|qNZrL)%SAZ-RMUjtr+&I0$MfCA^9JJGd; z@m?p&6XW`V-Vvv_Cn0L9F5(sG$Lw)(J*fdloib0htBScg=ZGgIYQOz-qxDngo+mM2 zyWamTv3A7zFJvjBWXJ{YNK6Bm+k4vhd_up$BofCGTQ#wxD?VJwJjz2{208J&V zpdF)?(2NrsF~n6#XQz`JF*CNB-Wb|s+7Q}IT5au>h?^nKuDAiUt#Oxv-35hnisyT0 ml+Jm%_|@9u-6sVF^skNZo(QNt7kQ_{|6X<_(D^9yrGEhqKXxSm delta 3475 zcmZ|Qdr*}{7{~EFauM(xZe9q*08s?R#LGxv32J7bMQCKHX=o_eq*ipXi>I7{$+WO} z(aA9hQPTuT!n;DLW0q;uphz={W=%siIitx`GnjpUobAufuzYrx_uYM-XW#Quw%}%g zw>{E-z2VbDi=nv#jd8h*>FT9fKHuK9WWHvcE~DqYE-onaxL4q7b>(tim*`KxKNy+J+v+KiTmOOlSNLD&xC*`>vmb z3TPpY!sVzys?neQ%|SZaxDmP6oIq8g6}4eIDwAKa`zZSO76?I=G7dvA)s8c9B;#Bh zj9ye_wxN!!1{J`5^lGCsbadf49Eg9TGKk_To#i;xjak-dcn9N0F#(sMD&e3iwgnYf z19m5bTCWv#q@9?F;r*yTee*Es>4rtt7cq`;8S2Izs1kmG{@8-5SQ{$yc2pw2qmHf< zQ!p~h7f>eZ{ybDd^H7y6ilY9C{8=Uxh!?fsdh9M4CNr)3+z36DA7@(&VEuUxxgcGJdJV)u^*O ziCX9zOu|-Fz_(Eec-Tz=M4|#rL}fg}&X2)JegCJ@(OJyK>9_=S!vWMrO{fZ;!b#YI zso0OSwBS@^$~=flWC^MgC8$!riCV7$$=Gbd4BUeg^!@*hj?QuzPs|!jM+I~e)A2m& z>lYSlOg#2So%KDa03JeB>=9JPOHq|sg?{)pYW;UnZ_v%CO4XrPouhQL;AvEZ7crXu z0oPF#=*6z%un%g(X{dnmP?ec$EkaeG#QuFH61!P#-HA%<6e^Gl@zg(?P6rc;cr*vB z1u~H5#N3DaTFyt^@B*r&Wp=#Lx(ij}BdF3JM?E{uNDk&_)H;E@tu!Bl8jnfv`Yy<3 zLYWn#&T<*5B5N@XD^Z!YTCbuicg>EwP)8NSms}Z7LS0{g3g{Ueg|DDCu0?-5?xmxR zPoXk9i>kyG)B+u-h;L%|Q4H}d&<9n@VW_jsu;XkT$@p>P7PA^vnL5;w?L!6dIcgto zD;-_fjy#9PFVUAlJnAU2P&ejS^HDF9Cy}Jh3RERFqbgQ|3ak;k6GBzw3hGF2V z3Rl|s6R3o*VgUP_8+3HWf1x4`8|GUe1~oq(d*BSzLza&Upd3~DN>rw`sQa7j{MV=e zzDKHVZlI1NdbqEGDd<&3qv^;As1oO(7S2VL_6a*KMBc9Ec?`yKRHZheHm*W#v>R2i zbEs#k167&86yJIYsQ1k96zZ>qvg||->PQC;U(0&KkhEyf_bRS zW}y-(K{u{MZLkKlUL`8y?WlMEVVr=SUOJ(4#*Xy8`zNCUYDS&)WemY+cI72$2BXgU zepE(}p(-{HmGR4{%B)2{tgz$vF`RJ~da&La@fjU0cor4mWhdAj>pI{hy9Z4CnDOg0 zm3R|vC9Q(?7HuzW0ZkvBu|5s7MYK5@@F{Rg-7mR5ac;R|1F9LN@1S<4FtH!Q2t&D^Eg1o&DeQQ9u&d}vzqetPvZm2f@nFs+!j+ZhrzK41&I zolarcV!b9z4s9lFJZ&-U(}o|ye(dSACMCHi7Znzi#7$YcxOiz{!?maj{tYcLxqhzH XhJ?5#S3^tq^}zqVthtA?D|PO_gnV)n diff --git a/src/vual/locale/ru/LC_MESSAGES/vual.mo b/src/vual/locale/ru/LC_MESSAGES/vual.mo index a1e9b47d77e946455c7bd4023047de46613b1543..b1c81275d06a630978d846c5123639a874c478b7 100644 GIT binary patch delta 3523 zcmXxlc~F&A7{~F0!UgqSaAOe#F0Lt>Knh++aUXM;#4)pSSH!I>af8I`GHyef<2z_> zsexgZisBY%lH*irj@KNe(o9EjG_$5j{i9s^{(RpU4xe+*eb0HH=Q;0t`M|%?@4wbK zxY+PhO>3d%GA1Yp-3<8gHZ&#-6EO`tUoH!3x^4@`W0~VO z7-5Xx)Y9SCJmk+S=xStdG!(VLNQ}h^7>R|b>n&`IrOx<><9A37<|kAR*D(t3V*&=V zNc*(LDDH1EoQZ7I1-YmUSD-4g8d+<0V>%u~W&FU=G%?1**o~TxMIW|BWjxNA_oD(T z!W8@nBe}mhLnj!oqi$S_>}~F$O8OMFv8$<_Nn_NJv`1xj}z;GPtjB~Lw<9XN` z%TSg19(5!a(XS1z(b0__pe}rjahS-5${-7M6k|{er#R+e4C95^3OArCQH845X;ffW z@OeV0{hp$ZG*0!;qSK87V$RG*Em-6DF?t#AMJ+s!D&Zffiv5eKn2EMCccBuAL>*lm zcEk)+K)I;(`KW}JM^k^5axD{zd?PB5GE^y#{_1BU3JJHdNd!jPx?>G!q;xVX=C!$LGo-@wJ=8RXMDpP{0 z)E?B0529}LHS+wLJE&*sF{(1LEM`ByNvFf}X0lKl4R^+4kYG(7a?EBm@@q=@qY_u6 zj_xKZu;1|oe1Hl#j=Ly zRHgpL-uMiYu{Y^y<2+=_=yr~nF3m0N_$d=sidd$BGaM(tmTetngmrlSmhcD#ey@Db{0 z!n~Y6{}bX+87=0nbFm2Zw$$M~bb}bw_kb6*Z(n2!^BQWuIjHMbU@C5H$@%x76L3C= zV6`G|gUUP$wcso&lN-pT<{^49hIdKxKIGWV5Y$sX)o}@`^qU=bAu*dn*a2%=`|X8w z+SspIJSyVun2w`SXI6|a<1TE6wKyF;JmLxA*zmBCfib)oI;4Wp39$fTkI8;YvPBpil? zs6+y&Bl3ILMG?g#dzm!UnUBSOI2-kFR-!U^h+3GQWM4M`Rk6{?o~96WT^VZMyQqDG zI@;d{9ni-(8?*HO7tvAXXHgH;Gfc+0q^;Me43+UIOu=i|1slF-&-cUnjK^XaPD8EB zLnX2nmB3ES#_Px}OloIUl=C0^yhEu`8!SV8;jBSU#q307cn)<0_b~z$1 z48{#uh+9zC#ZpcMl!AH|h9EDDnT`tZL+pY{8x_b>)U&h=wZ0YyV|W_%*Te7@X=*_+>a{6F51v6{ zGe4rv%$-ij(1*$>2dS!Ag$lG1mB2adgO^c95!=mv7P_LoKL(;3-|j~JL+BJRp-dJz zZbvPw#yNNeb%Si8jmAl+4Hh`#Ran4y2adoN8FnCfNO8;pY=-+W2G637;+CI|O6kh9 zU!Q0!V%!T?;yF~NBY0__Vgc%*%;x}C;SN-#lK2{>NXCac^LNpOYfv{T#&|q}s`O=y z!jxKP;;}Q)Aj^)hB}Q^VCThcM)cZZts^?A!`I6pORws9Kug~c%r0KIQG(WAFrr-|K z_R;hcZ(|N&E^U-Eo@gy|&kLGhJz>{U=Jr~No+cqj=v7)iPxD4Qo$DGo?y+(_?SiVT z)t>Z_&zL)Io%Xb9RPKDb)p3XQ#FG$IX2pe1jQfzJ1<8-XqP7Lf11AENfpYJKC3N=(sscwZEU$RS7w`HHI;D=I delta 3507 zcmY+_eQZxx9LMp~YK!{)TBTK`^yi^#*C}m>K6t3djA%B5wKI!{jxt)?R0--*L50Y& zTN*NA^|-31b&M93$b?v?l^J5pjBZP(DiO&r+56Lb_s68CuX9fCIrsbho_nwD)@IAP z+bLkH;a?psnid{pjGvz|9*<^?>DbYjb{K|(u^R^BBn-xE?0~beEf%=rB5cpN1a;kJ z?1|;BCo$9*%Uq|!k9o+i@%Rk2(TFf-gK^l6@nnp^eAM-8u@jcL;{&dzkQ~fqR1Wpn z1@B-CK1J;l&f+fI-z3n{#7NWy*{BScqAF61tT8(<6{}DgKX7e9FXNZ)IJmPh>5RLe zGMw(<*3S>K^@5jw6wtwbabN!s0;tX9vH?SmB9eiS-y>0nB$s@T^Sc(AKZYd z#35A0PNM?5f~^Um_G?BRsaN&Sq!UkC%$a$p1*=@QppWq`)WSMc3GbpR)`Y593o7$x zs6+xIoul(&KgJ2DfU;5R=c5uTilqK}x>qxy$Ty+_DMxL17+Xt*uQR@YoPv3TIubw9 z*L7ZG%0y#t9Ef^$vQdE-B0t9FmnvN4&Novx95>}Q!|Iy`SC9a|qVcbtO+Yx0p}H5-s0 zvx{FUaSiI|?w|r|#CU8*1sus;lt3&hfCN;4!%+#3ZJp=*C(uzTW}uGZQ_R8=)Pk$1 z8~uc;&@VU&n=lFcla@A|flQe>s6-ZwDpbPNn4$Oo5}o1LhJ)5wj>1hi z2^G*COvgv4*Do%{m|mEII_oK@0Oq19wh)!^dQ@e0U>mGJ?Y|%O1wDb5N_CNr{1LU` zeN==`F_-@f+WVZ0^0{jf^Gi{0Ni*sO0i1{4e-CQoBxI=>iP~=#>iWf)f*Wx-p6Si` z>ved+gd+E`i!#qZEx3rv83Ty(Z zA~SF@E<+`91$9L2*hB$YQFPeLB%{uJ8ji(9n1Lry8ML4lro7=?HyU-uImn)78S1(U z)W#1``@TeqU}F0@4{;V|GG31)Zkda8^iVy=B>aT5^%_;6GOoj9yoCd?Lw{#}1O_vn zhV5_;YFz;;kxi%scH<GY-NCvLFUC0V#@Ej`7^z?5Cp}T*VN)kAv|EDxmlj zC-Y3y#)TMw6p#uF5mB39LjlZIfA~wx=7Dk}HA5+nT%P%^a1H84rPvcIQ5C+7 zUGSzme(a8Wy`rNCBQl*&ZhzEH?|;ee!-mTpsqIps+*$UY2%kvJ;c}OAL?r;sXtbK jyuP;nRKxm)wbi}){OPf~B~AVRviFmM+gBH-M+f~2+*XOJ diff --git a/src/vual/ui/game_tile.py b/src/vual/ui/game_tile.py index 6162864..6e405fa 100644 --- a/src/vual/ui/game_tile.py +++ b/src/vual/ui/game_tile.py @@ -90,7 +90,8 @@ class GameTile(Gtk.Overlay): self._update_ce_tooltip() ce_menu = Gio.Menu() - ce_menu.append(_("Launch Cheat Engine"), "tile.launch-ce") + ce_menu.append(_("Launch CE"), "tile.launch-ce") + ce_menu.append(_("Tables folder"), "tile.open-tables-folder") ce_menu.append(_("Assign table\u2026"), "tile.assign-table") ce_menu.append(_("Remove table"), "tile.remove-table") @@ -113,6 +114,10 @@ class GameTile(Gtk.Overlay): self._act_remove.set_enabled(tables.get_table(self._app_id) is not None) group.add_action(self._act_remove) + act_open_folder = Gio.SimpleAction.new("open-tables-folder", None) + act_open_folder.connect("activate", lambda *_: self._on_open_tables_folder()) + group.add_action(act_open_folder) + self.insert_action_group("tile", group) row.append(self._btn_ce) @@ -223,12 +228,16 @@ class GameTile(Gtk.Overlay): self._act_remove.set_enabled(False) self._update_ce_tooltip() + def _on_open_tables_folder(self) -> None: + tables.TABLES_DIR.mkdir(parents=True, exist_ok=True) + Gtk.FileLauncher.new(Gio.File.new_for_path(str(tables.TABLES_DIR))).launch(None, None, None) + def _update_ce_tooltip(self) -> None: name = tables.get_table_name(self._app_id) if name: self._btn_ce.set_tooltip_text(f"CE: {name}") else: - self._btn_ce.set_tooltip_text(_("Launch Cheat Engine")) + self._btn_ce.set_tooltip_text(_("Launch CE")) def mark_table_bound(self) -> None: """Refresh table indicator after binding.""" diff --git a/src/vual/ui/main_page.py b/src/vual/ui/main_page.py index 7ba9c29..6e3e93e 100644 --- a/src/vual/ui/main_page.py +++ b/src/vual/ui/main_page.py @@ -358,6 +358,7 @@ class MainPage(Adw.Bin): """Open file chooser to select a .CT table for *app_id*.""" dialog = Gtk.FileDialog() dialog.set_title(_("Select Cheat Engine table")) + dialog.set_initial_folder(Gio.File.new_for_path(str(tables.TABLES_DIR))) f = Gtk.FileFilter() f.set_name(_("CE tables (*.CT)"))