From d28858e36de73d96848a6711e5b3d43ca341d238 Mon Sep 17 00:00:00 2001 From: Hamed <36635653+Hamedrz004@users.noreply.github.com> Date: Thu, 4 Dec 2025 16:24:22 +0330 Subject: [PATCH] feat: Implement core application logic for text conversion via shortcut with system tray management and update default startup configuration. --- config.json | 2 +- requirements.txt | 2 +- run.bat | 2 +- src/__pycache__/config.cpython-314.pyc | Bin 0 -> 4362 bytes src/__pycache__/main.cpython-314.pyc | Bin 0 -> 7930 bytes src/__pycache__/startup.cpython-314.pyc | Bin 0 -> 2846 bytes src/main.pyw | 10 +++++++--- 7 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 src/__pycache__/config.cpython-314.pyc create mode 100644 src/__pycache__/main.cpython-314.pyc create mode 100644 src/__pycache__/startup.cpython-314.pyc diff --git a/config.json b/config.json index 6b90feb..f005e16 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,5 @@ { - "run_on_startup": true, + "run_on_startup": false, "shortcut": "ctrl+shift+B", "lang_change": true } \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 5d88c10..a3f5d18 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ keyboard==0.13.5 pyperclip==1.9.0 pystray==0.19.5 -Pillow==11.3.0 \ No newline at end of file +Pillow \ No newline at end of file diff --git a/run.bat b/run.bat index 2f820d2..149adb0 100644 --- a/run.bat +++ b/run.bat @@ -1,4 +1,4 @@ -@echo off + cd /d "%~dp0" call venv\Scripts\activate.bat diff --git a/src/__pycache__/config.cpython-314.pyc b/src/__pycache__/config.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec0b4afd6cb1202d7b99970dfd07c703fdea9dce GIT binary patch literal 4362 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 literal 0 HcmV?d00001 diff --git a/src/__pycache__/main.cpython-314.pyc b/src/__pycache__/main.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6202d0d42790f809b56b8aed5e3bae842c8e231b GIT binary patch literal 7930 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 literal 0 HcmV?d00001 diff --git a/src/__pycache__/startup.cpython-314.pyc b/src/__pycache__/startup.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ee39001772e315a891a620553fac682f58ee294 GIT binary patch literal 2846 zcmd^=Pi)&{6u>{*apEL)vi{j7wx)5}*jlExT3QDCi;^s(Xj>PYwqwK8q>bBJOJnP^ zLurIq*=cYYH;Tl8145ltiCvM9Sj%Mx4qb`Jcv!))e%r;&@hsyH<49tDT|V5i+&d+!E5uC z^llzONMd@a@~Fj1uHDFTODsr_~H-0Xi8!vcpKG!vp zwnpoN`k@2sbFF>}QD@LzB-frM>6%(o3|PBC$!v8%qUGAUc@&|mYYW%M;i}dfZ5z5s z4cFT^r?>H(XuYm-|2U;kc{ZiD}!}S8yceJKy~1$d3IDsH(H6Q--E4XGn~)rcqiYT8F#vvM-v+n4&eIifO~hYNKgO({rMwix;(AMxQc8 z(@JA2Z*=+AI#c?XHI>Gyd|n&Hx(PkGVkO7(7^^vJNW~`j%Thj92*P(Ej%is{G}6|@ zG0~=8>@U2Kz*xs(I+M|I<7Apj_+w&+&vs8~IjoM`4Si=5mz4ORBqjO>l)+R&vRMOb zIm_my!G0wc9Z-_dfj--F!BBH&)oEKG_Nl~xG88>Gn6P~*)f!4?^J?M)n~NrsN`Lfx z!gfoEH7Rhf1B%yPeUJ5Gx9? z+u0SqvBZa#`Os{3zVBB0`&~bTz6;%H`{~@BQ%jdFFZI1s@N=$LDpYg!6)mbk8Eu50}v0}s~BBe1q>(Z<+8w9x!YtchLpa-c6Z`D6RN zi>)rA?`McS=#TrE#YiCTW`1k`+>`ebR0ryp|_6to|k8 z&&(e{cr9o2Rx%avNt3&dS9)7s!J@`%EtdeVkONwPXkZd7HnK?_$qm(=NX#=xrX7;O zS8}vEl3j&vpQKLe@2gv39>eiq-Zys0nqz(>x`byWt@AKCitw>(BPEBwy!D`gCN91J?=(sQY$z~K@XS>_@R z20d%5F<8U3D2kpy3v^4gon2_XM{svmqIf?)P literal 0 HcmV?d00001 diff --git a/src/main.pyw b/src/main.pyw index 33c97cb..c78c872 100644 --- a/src/main.pyw +++ b/src/main.pyw @@ -106,8 +106,8 @@ def _multiple_replace(mapping, text): return re.sub(pattern, lambda m: mapping[m.group()], str(text)) # Function to handle the keyboard shortcut -def on_shortcut(): - """This function is called when the shortcut is pressed.""" +def process_shortcut(): + """This function contains the logic to handle the shortcut.""" orginal_text = pyperclip.paste() # Get the current clipboard content time.sleep(0.1) keyboard.press_and_release('ctrl+c') # Simulate pressing Ctrl+C to copy selected text @@ -125,6 +125,10 @@ def on_shortcut(): if load_config().get("lang_change", True): # Change the keyboard layout to Persian keyboard.press_and_release('windows+space') + +def on_shortcut(): + """This function is called when the shortcut is pressed.""" + threading.Thread(target=process_shortcut).start() def quit_app(icon, item): icon.stop() import os @@ -173,7 +177,7 @@ def main(): # Register the keyboard shortcut shortcut = get_shortcut() - keyboard.add_hotkey(shortcut, on_shortcut) + keyboard.add_hotkey(shortcut, on_shortcut, suppress=True) print(f"Press {shortcut} to convert text to Persian.") # Keep the script running