From 46f7139be81b9141a0d0712d8311342aaca3f477 Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Fri, 14 Nov 2025 14:29:36 -0500 Subject: [PATCH] Keyboard shortcuts for speech settings added. Control+s for save. Cleanup of some .pyc files. --- .gitignore | 159 ++++++++++ README.md | 282 +++++++++++++++--- requirements.txt | 14 +- src/__pycache__/__init__.cpython-313.pyc | Bin 181 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 188 -> 0 bytes .../__pycache__/settings.cpython-313.pyc | Bin 18001 -> 0 bytes src/irc/__pycache__/__init__.cpython-313.pyc | Bin 182 -> 0 bytes src/irc/__pycache__/client.cpython-313.pyc | Bin 28178 -> 0 bytes src/ui/__pycache__/__init__.cpython-313.pyc | Bin 175 -> 0 bytes .../accessible_tree.cpython-313.pyc | Bin 3299 -> 0 bytes .../autocomplete_textedit.cpython-313.pyc | Bin 14389 -> 0 bytes src/ui/__pycache__/logger.cpython-313.pyc | Bin 6779 -> 0 bytes .../__pycache__/main_window.cpython-313.pyc | Bin 81435 -> 0 bytes src/ui/__pycache__/pm_window.cpython-313.pyc | Bin 10330 -> 0 bytes .../settings_dialog.cpython-313.pyc | Bin 81641 -> 0 bytes src/ui/__pycache__/sound.cpython-313.pyc | Bin 6397 -> 0 bytes src/ui/__pycache__/speech.cpython-313.pyc | Bin 17272 -> 0 bytes src/ui/__pycache__/ui_utils.cpython-313.pyc | Bin 2976 -> 0 bytes src/ui/main_window.py | 145 ++++++++- src/ui/ui_utils.py | 15 +- 20 files changed, 568 insertions(+), 47 deletions(-) create mode 100644 .gitignore delete mode 100644 src/__pycache__/__init__.cpython-313.pyc delete mode 100644 src/config/__pycache__/__init__.cpython-313.pyc delete mode 100644 src/config/__pycache__/settings.cpython-313.pyc delete mode 100644 src/irc/__pycache__/__init__.cpython-313.pyc delete mode 100644 src/irc/__pycache__/client.cpython-313.pyc delete mode 100644 src/ui/__pycache__/__init__.cpython-313.pyc delete mode 100644 src/ui/__pycache__/accessible_tree.cpython-313.pyc delete mode 100644 src/ui/__pycache__/autocomplete_textedit.cpython-313.pyc delete mode 100644 src/ui/__pycache__/logger.cpython-313.pyc delete mode 100644 src/ui/__pycache__/main_window.cpython-313.pyc delete mode 100644 src/ui/__pycache__/pm_window.cpython-313.pyc delete mode 100644 src/ui/__pycache__/settings_dialog.cpython-313.pyc delete mode 100644 src/ui/__pycache__/sound.cpython-313.pyc delete mode 100644 src/ui/__pycache__/speech.cpython-313.pyc delete mode 100644 src/ui/__pycache__/ui_utils.cpython-313.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..10de9ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,159 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# PyCharm +.idea/ + +# VSCode +.vscode/ + +# Qt Creator +*.pro.user +*.pro.user.* + +# Qt +*.qm +*.qrc.cpp +moc_*.cpp +ui_*.py +qrc_*.py + +# StormIRC specific +# User configuration and data (don't commit personal settings) +config.json +logs/ +*.log + +# Backup files +*~ +*.bak +*.swp +*.swo +.DS_Store diff --git a/README.md b/README.md index 55b3d40..caf425c 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,274 @@ # StormIRC -A completely accessible GUI IRC client designed for users who value both accessibility and good design. +A completely accessible GUI IRC client built specifically for blind users and anyone who values keyboard-first design. Built with Python and Qt6 (PySide6). ## Features -- **Full Accessibility**: Built with GTK4 for excellent screen reader support -- **Keyboard Navigation**: Complete keyboard control with logical tab order -- **Smart Notifications**: System notifications with customizable highlight patterns -- **IRC Protocol Support**: Full IRC client with join/part, messaging, nick changes -- **Configurable**: Comprehensive settings for servers, accessibility, and UI preferences -- **Chat History Navigation**: Enhanced navigation for screen reader users +### 🎯 Accessibility First +- **Screen Reader Support**: Fully compatible with Orca, NVDA, and other screen readers +- **Keyboard Navigation**: Complete keyboard control - mouse optional +- **Text-to-Speech**: Optional Speech Dispatcher integration for self-voicing +- **Cursor Navigation**: Arrow keys work in chat history for easy navigation -## Keyboard Shortcuts +### 💬 Full IRC Protocol Support +- Multi-server support with SSL/TLS +- SASL PLAIN authentication +- Channel management (join, part, topic) +- Private messages in tabs +- User lists per channel +- Nick changes, WHOIS, CTCP ACTION (/me) +- Automatic reconnection with exponential backoff +- CAP negotiation (IRCv3) -- `F6`: Cycle through main areas (channel list, chat, input) -- `Ctrl+1`: Focus channel list -- `Ctrl+2`: Focus chat area -- `Ctrl+3`: Focus message input -- `Ctrl+J`: Quick join channel -- `Ctrl+W`: Leave current channel -- `Ctrl+N`: Next channel -- `Ctrl+P`: Previous channel -- `Ctrl+Home`: Jump to chat beginning -- `Ctrl+End`: Jump to chat end -- `Alt+Up/Down`: Scroll chat -- `Ctrl+R`: Read last messages +### 🗂️ Tabbed Interface +- **Server Console** tab for server messages +- **One tab per channel** with independent chat, topic, user list, and input +- **One tab per PM** conversation (no separate windows!) +- Easy tab navigation with keyboard shortcuts + +### ⚙️ Highly Configurable +- Multi-server configuration with auto-connect +- Per-channel autojoin settings +- Customizable highlight patterns (regex) +- Speech settings (rate, pitch, volume, voice selection) +- Window dimensions and UI preferences +- Export/import configuration for backup + +### 🔔 Smart Notifications +- System notifications for highlights and PMs +- Customizable regex highlight patterns +- Unread message counters +- Sound notifications + +### 🎹 Programmable Function Keys +- F1-F12 keys can execute: + - Plain text messages + - IRC commands (e.g., `/away I'm away`) + - Shell commands (e.g., `/usr/bin/date`) + - Shell with output to channel (e.g., `/usr/bin/fortune|`) ## Installation -1. Install dependencies: +### Prerequisites + +**Required:** +- Python 3.8 or later +- Qt6 (via PySide6) + +**Optional (for text-to-speech):** +- Speech Dispatcher + +### Install Steps + +1. **Clone the repository:** + ```bash + git clone https://git.stormux.org/storm/stormirc.git + cd stormirc + ``` + +2. **Install Python dependencies:** ```bash pip install -r requirements.txt ``` -2. Run the application: +3. **Optional - Install Speech Dispatcher:** ```bash - python run_stormirc.py + # Arch/Manjaro: + sudo pacman -S speech-dispatcher python-speechd + + # Debian/Ubuntu: + sudo apt install python3-speechd + + # Fedora: + sudo dnf install python3-speechd ``` +4. **Run StormIRC:** + ```bash + ./stormirc + ``` + + Or with debug logging: + ```bash + ./stormirc -d + ``` + +## Keyboard Shortcuts + +### Tab Navigation +- **Ctrl+Tab**: Next tab +- **Ctrl+Shift+Tab**: Previous tab +- **Ctrl+W**: Close current tab (sends PART for channels) +- **Alt+7**, **Alt+8**, **Alt+9**: Jump to tab 7, 8, or 9 + +### Configuration +- **Ctrl+S**: Save settings to disk + +### Within a Tab +- **F6**: Cycle focus (chat → input → user list → chat) +- **Ctrl+L**: Focus input field from anywhere +- **Enter** on user in user list: Open PM tab +- **Shift+Enter** in input: Insert newline (for multi-line messages) +- **Enter** in input: Send message + +### Speech Control +- **Ctrl**: Stop speech immediately +- **Alt+1**: Decrease volume (-10) +- **Alt+2**: Increase volume (+10) +- **Alt+3**: Decrease pitch (-10) +- **Alt+4**: Increase pitch (+10) +- **Alt+5**: Decrease rate (-10) +- **Alt+6**: Increase rate (+10) + +**Note:** Speech adjustments apply immediately, save to config, and announce the new value. + +### Function Keys +- **F1-F12**: Execute programmable commands (configure in Settings) + ## IRC Commands +StormIRC supports all standard IRC commands. Just prefix with `/`: + +### Channel Management - `/join #channel` - Join a channel -- `/part` - Leave current channel -- `/nick newnick` - Change nickname -- `/quit` - Disconnect and quit +- `/part [#channel]` - Leave current or specified channel +- `/list` - Browse available channels (opens dialog) +- `/topic [new topic]` - View or set channel topic + +### User Communication +- `/msg [message]` - Open PM tab and optionally send message +- `/query ` - Open PM tab (alias for /msg) +- `/me ` - Send CTCP ACTION +- `/whois ` - Get user information + +### Configuration +- `/autojoin` - Show autojoin channels for current server +- `/autojoin add #channel1,#channel2` - Add channels to autojoin +- `/autojoin remove #channel` - Remove channel from autojoin +- `/autojoin clear` - Clear all autojoin channels +- `/autojoin list` - List autojoin channels + +### Connection +- `/nick ` - Change nickname +- `/quit [message]` - Disconnect and quit application + +### Any Other IRC Command +Send raw IRC commands by prefixing with `/`: +- `/mode #channel +o nick` - Give ops +- `/kick #channel nick [reason]` - Kick user +- `/away [message]` - Set away status +- etc. ## Configuration -StormIRC stores its configuration in `~/.config/stormirc/config.json`. You can: +StormIRC stores configuration in `~/.config/stormirc/config.json`. -- Add multiple IRC servers -- Configure accessibility preferences -- Set custom highlight patterns -- Adjust UI settings +### Settings Dialog -Access settings through the gear icon in the header bar. +Access via menu or keyboard shortcut. Five tabs: + +1. **General**: Window dimensions, timestamps, theme +2. **Accessibility**: Screen reader, notifications, display options +3. **Speech**: TTS enable/disable, rate, pitch, volume, voice selection +4. **Servers**: Add, edit, remove IRC servers +5. **Highlights**: Manage regex highlight patterns +6. **Function Keys**: Configure F1-F12 programmable keys + +### Server Configuration + +Each server can have: +- Host, port, SSL/TLS +- Nickname, username, real name +- Optional server password +- SASL authentication (username/password) +- Auto-connect on startup +- Auto-join channels (per-channel checkbox) + +### Message Logging + +All messages are automatically logged to `~/.config/stormirc/logs/`: +- Per-server, per-channel log files +- Daily rotation (YYYY-MM-DD format) +- Recent history loaded when opening channels ## Accessibility Features -- Screen reader announcements for important events -- Logical keyboard navigation -- Proper widget labeling and descriptions -- High contrast support ready -- Customizable notification preferences +### Screen Reader Compatibility +- Proper ARIA roles and labels for all UI elements +- Live message announcements (when window is active) +- Logical tab order +- Context announcements when switching tabs + +### Keyboard-First Design +- All functionality accessible via keyboard +- No mouse-only interactions +- Intuitive keyboard shortcuts +- F6 cycling for common navigation patterns + +### Text-to-Speech (Optional) +- Speech Dispatcher integration +- Configurable voice, rate, pitch, volume +- On-the-fly adjustments with Alt+1 through Alt+6 +- Per-message speech control +- Interrupt speech with Ctrl key +- Optional reading of your own messages + +### Visual Accessibility +- High DPI support +- Customizable font sizes +- Clear focus indicators - Unread message indicators -## Building for those panzies who need GUI +## Architecture -This IRC client proves that accessibility and good UX aren't mutually exclusive. While terminal purists have irssi, this gives everyone else a proper IRC experience that works beautifully with assistive technologies. +``` +stormirc/ +├── stormirc # Main executable +├── requirements.txt # Python dependencies +└── src/ + ├── irc/ + │ └── client.py # IRC protocol implementation + ├── config/ + │ └── settings.py # Configuration management + └── ui/ + ├── main_window.py # Main tabbed window + ├── channel_tab.py # Reusable tab widget + ├── accessible_tree.py # Accessible tree widget + ├── settings_dialog.py # Settings dialog + ├── autocomplete_textedit.py # Text input with autocomplete + ├── speech.py # Speech Dispatcher TTS + ├── sound.py # Sound notifications + └── logger.py # Message logging +``` -Built with Python, GTK4, and lots of care for the user experience. \ No newline at end of file +### Threading Model +- IRC client runs in background daemon thread +- UI updates via Qt signals/slots (thread-safe) +- Speech runs in separate thread to avoid blocking + +## Known Limitations + +- No DCC file transfers yet +- No channel modes UI (use `/mode` command) +- URLs not clickable yet (can be copied) +- No message formatting (bold/italic/colors) yet +- No custom keyboard shortcut configuration yet + +## Contributing + +This project prioritizes accessibility. When contributing: + +1. **Never break screen reader functionality** - This is the highest priority +2. **Test with a screen reader** (Orca on Linux, NVDA on Windows) +3. **Maintain keyboard navigation** - All features must be keyboard accessible +4. **Follow code quality standards** - See `.claude/CLAUDE.md` for details + +## License + +[Add your license here] + +## Credits + +Built with Python, Qt6 (PySide6), and lots of care for the user experience. + +StormIRC proves that accessibility and good UX aren't mutually exclusive. diff --git a/requirements.txt b/requirements.txt index b5ebd71..49f0ccc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,11 @@ -PyGObject>=3.44.0 -pycairo>=1.20.0 -python-speechd>=0.11.0 \ No newline at end of file +# StormIRC Dependencies +# Python 3.8+ required + +# Qt6 framework for GUI +PySide6>=6.5.0 + +# Note: Speech Dispatcher support (python3-speechd) is optional +# Install via system package manager: +# Arch/Manjaro: sudo pacman -S speech-dispatcher python-speechd +# Debian/Ubuntu: sudo apt install python3-speechd +# Fedora: sudo dnf install python3-speechd diff --git a/src/__pycache__/__init__.cpython-313.pyc b/src/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index a6f79bca100c84abd6383548744eaa3349ad4081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmey&%ge>Uz`)>LDVV9jz`*br#DQT(DC08+0|UcUhG2#whIB?vrYgnYlKi4v&md<7 zT?NPF}zQ`1q9!pF!r_Qqj-I&rQ`Y2I+;6 znMKL^#YM^b@$s2?nI-Y@dIgoYIBatBQ%ZAE?TXkK7#KhUz`*cg!SW1s1_p-5APx*OLK&Yq7#J9)G6XXeF{CqUGF2%$=jWwmrk55a zmSpDVDdZ;RC8nq5rskC>&Z{fzwFRQ=+T z{Gwb4nOT&qUtE-|pA0rmKR!M)FS8^*Uaz3?7KaVQD7zvy1_lO@LyAF;_`uA_$asrE Ky@-W@fdK#ysWW&0 diff --git a/src/config/__pycache__/settings.cpython-313.pyc b/src/config/__pycache__/settings.cpython-313.pyc deleted file mode 100644 index ff3317f0c98a2133c14796b61251f299678df610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18001 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 CI8u@T diff --git a/src/irc/__pycache__/__init__.cpython-313.pyc b/src/irc/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 11d4bf00b87744a406b644a7e27ae668183573b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmey&%ge>Uz`$^S!SW0h1_p-5APx*OLK&Yq7#J9)G6XXeF{CqUGF8cW201Gf6y=xX zC+FuVWF+RL-lLi-eQlBPsvY?k6+2~8Dz*U4gHM#+*JMIlKi4v z2$@-wtY2J|tPi5&<1_OzOXB183My}L*g(v&D`I0{U;sIx7-aniW=2NFTMQ~iEDQ_` E09t!6YXATM diff --git a/src/irc/__pycache__/client.cpython-313.pyc b/src/irc/__pycache__/client.cpython-313.pyc deleted file mode 100644 index 715055f8b55272a3d11c761637352ea842986711..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28178 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

w77wCzk(yG) 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 diff --git a/src/ui/__pycache__/logger.cpython-313.pyc b/src/ui/__pycache__/logger.cpython-313.pyc deleted file mode 100644 index e00f3111ced10698e34b581621e77c83e3ac7b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6779 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 R?K_({6QklM1`r806aePE&prSE diff --git a/src/ui/__pycache__/main_window.cpython-313.pyc b/src/ui/__pycache__/main_window.cpython-313.pyc deleted file mode 100644 index ff5c05477a9b4bb28e81e4c6bd4305ec2cd0aae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81435 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�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 OqgqGxR|XIbwi5t%S~SD} diff --git a/src/ui/__pycache__/settings_dialog.cpython-313.pyc b/src/ui/__pycache__/settings_dialog.cpython-313.pyc deleted file mode 100644 index ade1a3e28c02e878a2180baa081877e41b3e0cde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81641 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�k$UT-JN9^uDg+ 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 PVicPY{*?hlgVO;3S*KIm diff --git a/src/ui/__pycache__/sound.cpython-313.pyc b/src/ui/__pycache__/sound.cpython-313.pyc deleted file mode 100644 index 967a601964a2274924377a0d26e43f05fe8d5665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6397 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 diff --git a/src/ui/__pycache__/speech.cpython-313.pyc b/src/ui/__pycache__/speech.cpython-313.pyc deleted file mode 100644 index 412b95b1ae87def7ecadc8242f3ebe64be3a77df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17272 zcmey&%ge>Uz`&q)P$+Y&5d*_x5C?`?pp4I53=9lY8G;##7=jstnYGO5H6%x2065m8`}XYf-`W3XkGXGmkzC%u82DE6qy=$t31vmQ?C-1r+6% zWu~MSE0m;Gl<1b^>lQ^EgTr!hOLfoo?FkO|GU!ss$mYA87n3R*Mr{I}aT#}fRqfk&;l98Wh z47E1}Y$J+;i%Sa%@{3CJl0mk?FejApc>^OTLSh(-7=sx=kx;}O%v8h@tP#u{!)n45 z%p%2*#gfHX#1_mN!*0S9%m(5YaRjr2c^qIKCsd9T%;O5?ieUxIvjlU4MYzEtApI=C zJYW$XBoSV)2yd`vFn>8V98MHmiTWMBwo2vUY}ktmp76d2MO(-}2cs?xbU^D;{^6LT`FQWZ)vQWc;@ zK`tbc^tiYji_(j&xD*r=6kvgFrQldlkdv7VDQrN|0M5V|@uZNPpO=>kE_k^7+=@T} zt|?Rm3YlAM$vK&+c_p{lQ}aM2L&`1Al8mC%#FWgu^jj=G`N`S0xF8Mzv-wIhA%=&5 z72Ogm&&*57FOP>Pi7!qqDap)BFTN!T6$cf2sR&`1^4$EC(i|jl5vcN_#1bS?-jvj| z#L}FSc(5tA_+VU!?pr)CK1kOsxZ;A$lH?48;5SQs- z>EXE}r95A6mfmG4tqztR{u^>i9V}Nkq(87RsB3~)$~R2SLA25hGYb%{e8a>HL@Rz^ zV}PiYg6X*-BMXv|ydf(GqNQ%g$%AO==iD-vxMgne2=x1Q`u6&NU}oTv{R~Qpx7dnO zOG=CKlHu8rfq?;(vA|jP6}YaIV~7SR1>+!4(12M8LJ5?-Vf8aYm;qK}hBD-UOaseA zgAyE=6$HDu&A$l1mgy^05?kTwFom(1K>ckfPF5h0HXh zoTX4)nw*?kT%1;#qod%Km{XjpkYAFKT2!7{oXS-t2Q@r31*`EPRT^%InK=+yXu8Cz z&`QD2O_SpmJ0uCF+~Nuj_6%?a=V5UAEdmAYE%u!J^mK3*&df{8zs2cVk(>%{B-~<6 zEh@?{TFF!-&A`BLi!l|N-iu@y7#NDAKw{_#8R{AnP(lVJ22es~=ajr7rFdOR=aQ7p zijeiOD`PK9S$DYfc;Dd>?)T~PxgcqIg~#fKu=tNV{1TrTm^mdu624u&7i3%x1Rij{ zAmwp|$Mc4i99WOA#P1L6%$$|AI z1(Jk(56>MA{(jyr-Whz`+!t0Jkh-Aeb3x4aDu-W@JOcv*O5p$sS8$leF@V~Ap$tKY zV1=`65n(G0YFZ;=14)JtBooSjEq;O-eHc|3G?_pdG9xuP8#)MP$gJ^ z3W)UAbk0_OuYu9#4gIkP`wFbf}pF$5iDTIR?1qzudsd*)tX_=`-3L2?;>3TW} zP<;yEmI}CQR8*E)qzP`*K%)sq-T}93N-{Ewp-#Y-mxLiP1Xc=hje>d=lR6|*73nZA zFn}Um02JS#{8XgNz`&r%436|7Q0WHAQlKbMP=F=?K~Tnlm<4U)+>(db0;}gS6oiA4 zgApV-2rw8~UguE0$f3Nz^CE{HG^1UR&|cxW!g@o}vGkpi7lLCiSj1fri@(Z|08Sp* z3pp!rn!ujnf+6Cu(?%|5%*+H0b8v`Z#4^#bOLPtdB_^aeRM3F7 z;EF*t9k|HMOj7`LREtwfG`T`FnTkM>b&EMYwFFvWf#V6K)RV|8jz@_gc!pI&jVN5| zl0fk#3yCig1_6=l{8|_JwXXB)UF6qWQMp6qGQa%=4tqRN69J1FP{9EWei#)BZ_?y3 zg~BtVHbWkBC*lYwKU99C(iXmV*X6h!TO9?fuu&K!d#gjfPo`l7(3+Z1J(%-;&S;(q`{f3166z>ks8yq~> zIpi*K$jzv{!eMfQU*ZCX1UTmWZn1zySZ;9?6lLZYWtLRl;sg!T6cv>glq7?iys!uZ zu|e7CGXoO?LmWdKV;oZ)a~#W5h7g7zEb$BL#lec%6h;PybjA>POoIlOLa@ek2)vPs zrWa9rsxdHxFb08K1alpfMz-x;hCOawCpGg~q$Fod#%GKVsRGKMmlu!2X6IPzGd;Z6G>Q1%C_ zM-WO3p{&8ImW&|`IiQ3EmI!7G!RoUdPOvlsPM3k2n=mC%8s;wrhIB?v_C$R~1_sa= zUt%_Rhz_+a0?j508t_I5XnYQoK|%d@NU5ZWQjCHUp_M{NYDEdC$SW>LP0R*Yeh{_b z$`dx22d(IkYtfQ?g=BCc4p9yow1ZU3uzok#ELak^f^}kG0t&hcN}0K!(Y(aG5+xl4 zCFroCk`AbSs|0eJ64(TI*056WOar%NbrgzA@(UE8xf|3T01bMkWfm2ez)NvR&8^Ah zmp*GI2<)`iWW2>*l9`*DUs{4Pd8Muu3dhE`%MFV-YPZ zf3px)Z2euhn^eIjVe=JsJ3(z#gd@N#gl$;-3hzaOm4XQZeuWQcffa*^5Y`|p=3wr4P(KDf zV2afaSh7LV7|f{0oCg|n(nb=5GDBEMcLA)qmB)x9HbI>PsQEAo(Wq0vRUU!bDKOaA(?LhlS9x-48g3SOsE4O@(jTYc}$K>eufYlF;=F?pu+%* z8c>5LjR`a_roaHQ8#*(_=BLSgixXbi++v4THAPOKsRl@enwghwrSKBu?JR$Q4^ zl95`RSqvFKE&@$+6oKlUTO1&1(6Dh4C|lm*1aZOR#zmmv+FM*8K4jpyNCMQ(1!aI+ z90BmQqo;3xe^7{{U&t+XU)SJZM|am-EFrEDAw`xT%XvWBVU_MJRnr&&png-x`f6>35_cfTHm-BBor4!Zcw>yqLI&KRUf!Y^NSMZ zJ6Nt;1YNWUx)2<5(IWP$L>$;a?dy`-7|OgZT6kTN@J2Gw`=XKeWmRvuN}Y=mIx9l1 z>$+XkbvsabQ8)0aM9>462Vs(S7j^BfNZ5a1V-S^`?mf}_x`^gQ5zQ4U*R^aeYS~;7 zu|<;6x+tQx!sNQP-9>G?DYJXAH{*JQNb!Fp=%Es4~tuHED z-%(J%u3&Ic!Qi@r=|u(8kL)ZeViSBma51PDK$LCp*pq(U&hMg~-*vmNi*{j`mBT0a zJP?t9xI^cnh|Y?bDc}2wFj)?Sh-$}j;yjGNKaNZEKqH;y{ z4&e(*wpT>#z6Uch2q{jG|M4Y+kwHT7GXtZb10z)Z1r@6uhC7rmDA`>XvA-x{|N8?o zNcPwFP>`Of^1q5f1zI1Yw&o^QmF=%9J6=?Fyul-Iok#v6kNkBWm5V$oD}pb8Xv6O;I-CxS9~nU8ml#F{ zd5!CGdY9z%HsoBCa|X}c+)&l*V7bmAeUU@@3WpN7a|>c$=TN-Jp?H-;8Qir+8K4C< zJ;B}AeGH&6MC{{58qk72QHFs*4pf&y`N$Nu!3m_U5fgZR2HpXK)-sHQCUAop(dTF6 z8G@O>GcrsN8d1w=GFQnuC*~!m=Ad^wAcekOl_a9VNQNkc4EkCr_-V32(w8@=&;*yY zp!N#5z%2rKA7u!M4Wj#&2x@5w5j_q{CqCd|hX>sJ{nq`~ADEbV?QaN(Oy{1+eO*A| zqJY9x0i_SD3_RjLzOXTf$bM#EUU67K~C%N>e4gfGb1UKg;tC}0Q5SiJVX zia}M;WGQ`y^<0iJ%sV9=#hDL^vpUK!qeLdCO8|~cklUw%A_~t41h~J-RHYt_rJtse zn3I`U3?Ai!cuG^xPm{4I6%;t2RteIOcM&MWZV91=1gO$I4+;m+I6wo#0}h^k?oRGr zUU2%m#R95GQAV;s{X2-m!PEcIaAyZIMuWt`2`!i@6h1-;YrW(#A_mD4`571@1h9>7 zhcbaG&UBUt0mR&5DAoZ0P*j5~OO%DCbWnu}5 zieTnYv?(R<>?5-yb2>{fOCGZ$Gg4Y-tvbsUoLU0wSc5_oG1HM>1dclVgMJ__@E$*i zqmWjVpR1s2XkehAQJj-so?2X@2^w?&3#26$mw*Ix6bwLE;U<3TMlP@r4}rQ#ZJZvG;` zARs)!WRCER-~}qPZIhS2m!?Mnozt$ zgz!89szQDBuW6sk}~%zdnPyL+hm-c^D4za5-8s9~6^xG+{ny!s=+re2WdzLmEw~ z!Qd2&l2VJ1Qz|5!uqRcB96YT;xX6jMurxCjTvWr$?wtJ66#U6m7He{an2nxZL1hsn zy#|01CHC}M0+PZ^uOJ<_(B{QKB`w6J@1O(=%0A!(DU6N( zkW;zBA&rz`oe?Qk?V^C%g0iaupt2RYUFD2Ov9>!BcLZOMbG$C#bWy+woMN3Be-#yj z8vI<~6=RTfiJ%+?D|Fz^V@N@Y(b#~gL!zOL4WlQE?8}Q~a!nhz%QI6n( zSttc5q+tzjra%i)=4g1)iftGcJmHVo*kA%RGSWc}Yt+UDbJbyR@&rv%fCEY&Hd0cR zS_DdFrNyc6)C!s!0L^INZ+(D`0f)Dhf?r~8szQDmcnu?19NBp4H8HA0QByhCDp2ZX z2M+;3MteZPR^$sxy=Vy=+K?y*N#STnK!%0D#$qd!!4m9@3=GBT;P%8f0R|q?8zy$w zdDJfQs4b|x#AEnCQTqyy98&AS9^QB`z9?e6!RxAsJzC?z9^NB|bR3jyuZ!4S6ajY} z1nr^8n;SCT1rBeNhWBXt1})2Hu6hMe-;lnd0wll`G$0*B1*G(@Nn%Qem;?@b)TEAP z6J)`QdMbF3O*b!HT}MGZEw#8Lvn(-39kSwuDlP3Qw89?68IbG%8ZL#5je@fSs56VB zU0sbQI~0NRVO#wIu@O23D+$UFpao0~43G?A>TsP${UVS03eHPBMh}#9ukgqtWe9gf zbK3Bth~Wn9t0H!2Il>*$oOV2*ctH4qlIwL5w~Hcfpdw$;9a`k0be!SY;03t7Okfm5 zAKEtr7sjXrzEO}oMx;fA+zbrSAX~xO5e2#mgFXWUDQB?>v2#U-Hf7rxd_0bEoSqpy_nfvN+`DwLEKYx=_uqR=B1Y=rl;yClqD8rCgzoB>L{e<7L-(iCcr@}bl`?_Rf!|YVX)O;^NK-9 zj}6?gxFre_j)&zr=xBWLEf$b4dP0OO#{#u2Gm}$`A>BJr4GwD~-{J=8f(+;vqpxyA zlF|mH!whi2{DF^wM*uQ#!@_HOLsE9W^i1jNl2#Wbtu9O2OklgGt~;e@CQ8~lPDoWDP?GVxfG!5Dpg>uA4K^Y_4OOoKDB%{v78>FxcR^)vPG(7}x+YhZJX*3vbqP}P6$U3O zh%~g6D=umPm6T|03TWD8hg1<*5^qr(sBx-@+QGwOx)mt#Lb`e=iPx3!hLqfV?U~xw zr7SN>Szea1p1^)jLw`!i4EM>k7X-{V1YHm?$4I@dh&D51JVMU-x`4|C0T)E_b!Gfj z)B;-U3mS3+mthPH450K0!k1EJbsDNe+Bs$gemp20nE>kWCKm#`27y9rm_275Xo@Pc7dR|w=X*Vv@1e~t(8wEpzk_CF!IP($@y?IrHIPBKWN}72NIDSB-x?SBHLmmP zT;$hT5qX*4`~rtLroTZQHE^u2!P8#Ap3)JkY!yHQ^dOUvatDY>ls;@@ZXg$d3_!xj zt9qdW{szuDsfk4ji8-KYlH!v5Tu?xRH(}w(Wqz70;B0n_xgfs)Je3X^c*V$YqRAkW zVOb8g#O#(bYVc!K6bgz2(4-uAvfw(0(nSuX>l|tqIn)+ZZcw?xVGf?l0#20)H0eO#-0C;|ZK>N;;y!M>}Lo_@# zv8@*awa<`NVSqLX!ec6(Ih|RN0kK;N+Kp#KG7;1ihpUG$K&w2k%#SgH=EwXDgTXYS zy{8D;?Zf~YUxDa`?_^@BQghD9FHS|?nuK*nQ@{2(mm@yO}S%Xw*vVzp7LKZxz!s|-VybZ?uThVk-t%x>93)T)A=q?70sx~md zhl$vDmEq%>iWdbGuLvlET4y|ycrM5~T@i5pz`-D|Jb`5@_XmFPj2s8F4Htx{1$|Bg zo^ZY(7jRu5@S;E#Q6II8&u=3V$ev}WCQe3PkmNL8wSYO=Rr$m5Zi{+i50b7 z2dY0o`4(D#fVN9PVh79C7m!+rB%FkAebGQ$tgoAbw7W}9+bTVSoHd#KiabH< zb2S*RHSlt;{1cSug z8Fxe+NZuI>l5l7Ipu)>4G$RD$P@xZUysSbCU~DE<%N5EW7?@ZsH)!lI-l+Qp#Qea) z#A*c!2_{yn4Hi3`H`;=Ptw6#SD}+I+EjCE(P~IpD61Moj!NO|3qWB8~3#<7j9!^%} z4`NKLwlh+`Gcd8*LgES(O`6qm7 zk>xWN10(-!27&twiXT{58M7E~vk2Xgkh#Dj`kg0)mC^PS1Bm?bft!It_%j0&V;18L v3E2xQqBmH$+x?sTFNkDZW6Au$3X=F$49byH*i;#oN;xtyA7o^7WMT#Y+n|4P diff --git a/src/ui/__pycache__/ui_utils.cpython-313.pyc b/src/ui/__pycache__/ui_utils.cpython-313.pyc deleted file mode 100644 index 3b19071eabdc593c2062c1d5bfe6abcb3ec6d8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2976 zcmey&%ge>Uz`)RQRwz@ClY!wehy%kMP{!v|3=9lY8G;##7=jstnYQ3%w8--ED8)UEE-TviF^zo8CGvrFSa5!FZLpKuu3*>4lm9kP6dV-#vl=> zQY1==A%@$O5h75;6U<)38_ZF}7tB$_AIw=K5X@C17|c~96wF;D9L!lH63kO18q6Cb z7R(pSA1n|fX2KRMD8-P)QY0QM6f7Jp5-b`l79$oc5X@x45iAatkw|CKl&G2>oRL_R znxYWusZd&ynUh(PnOdxnmS3b0T#{du>lx&%$Hf(rky)&eo1apeld6!MpI4HYnOCfk zoS&PUp9j@csgPEhmt2yWpI59Wag%7GT!11 zi41U!clK~~_V)C1*JQfI5$frjpO==IeoNFjBQY;8H7B?rH8nXSIJKlCGcUauqz5A6 zo0ylFo?4Wtz|6pq8NtNBkU4>of#IbM0|Ud$6b1%{OdUoBhFk2psl~;K>8ZCkOEcq> z!6p~6GB7aQVk=55DJ{xNW&$}2ikTT07(n>*Byge#WekE!AXD%}V9LM{4c8sSf~*F@ zR$?%PFc^Z^p$sG{lradF2$4i#2_%mxl!1>Sm@$-zkHMH(g&~wdg+Y_4>YiJEQEp<1 zLZSlHUkc@!B^e5dc?$UjpvX$hQ2>Q(aYXi^U@KPC=?W>rll68<|U^Vb8!WM z!xU;I#Hl5zDRBFWONv06!A^!dQz0`=AvG^CDJM0B>lUMeChIN!;*9+Ac({V%B2b*% zV$RDizr|5pQj`Xgxg`K1!TyX-1BZzwa}g-J7jc7PmlG~q4AQKipm0m5xF}h_G*iDc zGai&LiuDRAZ^=Tm#zO-$9^^8F#YLhF3=DD%3=GBg3=9kn3?D=oI0Ub=D_mz+xFaGn z-Di@|WWVbo+80H%S9o66al5GFc3H%|gY$-vgIlP^9>=^`RYBUc_X%Ih*g`k6(K^Z5Q1-ozg7=l@`yP1z6m<_wVd<@1Mu*|8z zkj}2jkyy*fz~ER=kW;CU3@NJg1AG-A5v%}L*pG*1SjX`73b$lxqr7i*yn8a6#>X6lt&=s!^7onVhPlP?T7bs-uu! zT2fG20xjn?K`u!w%g;M*;cVb!pXLZQwJJGwtku%w^+f_w>XPaOX49+7Eo}4b7?%7#S018_*`%WdP@+b z5><#TCqF$swdfXWN@`MRx+ZgxILMh2AOhrISeaBL0?O~A;3$rVhCVEqij)}`81z7e z&nigaBgMcW&|cSGcY{OhI)}nV4uu60%jFiz?XbK6;64y2DFKXJKu)M&bagihR2@6-d zPovKTVe=iF8>&ArFgi0z-jGzBFE>-}f`rBj_6;1{c{lQ|sQ(o8)_$Uw?U&h*q0A4uSG#K(hDM0|XaA}AO|TwL88Lw!Qx z!#(|6{KMnJJzYXPZi%9adboPJdxYE)hY1JxqNBIR?eUWPDwN zgB{&n<6Zqif+FL69V1{e(gD8lI3)#qJ^fHE7eo?)n$28XQUtDt!0BNn12}jg>4w7w zk^t?B%orFLKn=^{B@7GB6J0|$eI^aTcy8z55jhLr3D2Jsuxau*mRZb-`_NIAs|4AM7*#V#-i z+z=7Jz##a6jh9h)h4BXlUPj>^R$%Ic@)r>AgMt{N$qM}s3}TEXH&m=YFpDvoJW$p6 OzzU*u4ZnhDurC103JQ_{ diff --git a/src/ui/main_window.py b/src/ui/main_window.py index 7f3fbdc..f9ae506 100644 --- a/src/ui/main_window.py +++ b/src/ui/main_window.py @@ -89,6 +89,7 @@ class MainWindow(QMainWindow): self.setup_irc_handlers() self.setup_signal_connections() self.populate_initial_servers() + self.install_global_event_filter() def setup_signal_connections(self): """Connect Qt signals to slots.""" @@ -99,6 +100,48 @@ class MainWindow(QMainWindow): self.channel_list_ready.connect(self.on_channel_list_ready_ui) self.private_message_received.connect(self.handle_private_message) + def install_global_event_filter(self): + """Install event filter to catch keyboard shortcuts globally.""" + # Install event filter on the application to catch all events + from PySide6.QtWidgets import QApplication + QApplication.instance().installEventFilter(self) + + def eventFilter(self, obj, event): + """Filter events to capture keyboard shortcuts before widgets process them.""" + from PySide6.QtCore import QEvent + from PySide6.QtGui import QKeyEvent + + # Only process KeyPress events + if event.type() == QEvent.KeyPress: + key_event = event + # Check for our global shortcuts (Alt+1-6, Ctrl+S) + if key_event.modifiers() == Qt.AltModifier: + if key_event.key() == Qt.Key_1: + self.adjust_speech_volume(-10) + return True # Event handled + elif key_event.key() == Qt.Key_2: + self.adjust_speech_volume(10) + return True + elif key_event.key() == Qt.Key_3: + self.adjust_speech_pitch(-10) + return True + elif key_event.key() == Qt.Key_4: + self.adjust_speech_pitch(10) + return True + elif key_event.key() == Qt.Key_5: + self.adjust_speech_rate(-10) + return True + elif key_event.key() == Qt.Key_6: + self.adjust_speech_rate(10) + return True + elif key_event.modifiers() == Qt.ControlModifier: + if key_event.key() == Qt.Key_S: + self.save_settings() + return True + + # Let the event propagate normally + return super().eventFilter(obj, event) + def keyPressEvent(self, event): """Handle key press events - Ctrl stops all speech, tab shortcuts.""" @@ -125,9 +168,9 @@ class MainWindow(QMainWindow): self.close_tab(current_idx) event.accept() return - # Alt+1-9: Jump to tab + # Alt+7-9: Jump to tab elif event.modifiers() == Qt.AltModifier: - if Qt.Key_1 <= event.key() <= Qt.Key_9: + if Qt.Key_7 <= event.key() <= Qt.Key_9: tab_idx = event.key() - Qt.Key_1 if tab_idx < self.tab_widget.count(): self.tab_widget.setCurrentIndex(tab_idx) @@ -208,6 +251,104 @@ class MainWindow(QMainWindow): self.speech_manager.set_pitch(accessibility.speech_pitch) self.speech_manager.set_volume(accessibility.speech_volume) + def save_settings(self): + """Save current configuration to disk and announce confirmation.""" + try: + self.config_manager.save_config() + self.speech_manager.speak("Settings saved", interrupt=True) + logger.info("Settings saved manually via Ctrl+S") + except Exception as e: + logger.error(f"Failed to save settings: {e}", exc_info=True) + self.speech_manager.speak("Error saving settings", interrupt=True) + + def adjust_speech_volume(self, delta: int): + """ + Adjust speech volume by delta and announce the new value. + + IMPORTANT: Clears window-specific volume settings so the global + adjustment applies to all channels/PMs immediately. + + Args: + delta: Amount to adjust (-10 or +10) + """ + accessibility = self.config_manager.get_accessibility_config() + new_volume = max(-100, min(100, accessibility.speech_volume + delta)) + accessibility.speech_volume = new_volume + + # Update speech manager global default + self.speech_manager.set_volume(new_volume) + self.config_manager.config.accessibility.speech_volume = new_volume + + # CRITICAL: Clear window-specific volume settings if they exist + # (Currently volume doesn't have window-specific settings in SpeechManager, + # but we clear any that might be added in the future) + + self.config_manager.save_config() + + # Announce the new value + self.speech_manager.speak(f"Volume {new_volume}", interrupt=True) + logger.info(f"Speech volume adjusted to {new_volume}") + + def adjust_speech_pitch(self, delta: int): + """ + Adjust speech pitch by delta and announce the new value. + + IMPORTANT: Clears window-specific pitch settings so the global + adjustment applies to all channels/PMs immediately. + + Args: + delta: Amount to adjust (-10 or +10) + """ + accessibility = self.config_manager.get_accessibility_config() + new_pitch = max(-100, min(100, accessibility.speech_pitch + delta)) + accessibility.speech_pitch = new_pitch + + # Update speech manager global default + self.speech_manager.set_pitch(new_pitch) + self.config_manager.config.accessibility.speech_pitch = new_pitch + + # CRITICAL: Clear window-specific pitch settings if they exist + # (Currently pitch doesn't have window-specific settings in SpeechManager, + # but we clear any that might be added in the future) + + self.config_manager.save_config() + + # Announce the new value + self.speech_manager.speak(f"Pitch {new_pitch}", interrupt=True) + logger.info(f"Speech pitch adjusted to {new_pitch}") + + def adjust_speech_rate(self, delta: int): + """ + Adjust speech rate by delta and announce the new value. + + Args: + delta: Amount to adjust (-10 or +10) + """ + accessibility = self.config_manager.get_accessibility_config() + new_rate = max(-100, min(100, accessibility.speech_rate + delta)) + accessibility.speech_rate = new_rate + + # Update speech manager global default + self.speech_manager.set_rate(new_rate) + self.config_manager.config.accessibility.speech_rate = new_rate + + # CRITICAL: Clear window-specific rate settings so global default applies + # This ensures Alt+5/6 adjustments work for all channels/PMs immediately + self.speech_manager.window_rate_settings.clear() + + # CRITICAL FIX: Reset default_channel_rate and default_pm_rate to 0 + # This prevents apply_speech_settings() from re-adding window-specific rates + # from config defaults after we've cleared them + self.config_manager.config.accessibility.default_channel_rate = 0 + self.config_manager.config.accessibility.default_pm_rate = 0 + logger.info(f"Cleared window-specific rate settings and reset default channel/PM rates to 0, all windows will use global rate={new_rate}") + + self.config_manager.save_config() + + # Announce the new value + self.speech_manager.speak(f"Rate {new_rate}", interrupt=True) + logger.info(f"Speech rate adjusted to {new_rate}, speech_manager.default_rate={self.speech_manager.default_rate}") + def speak_for_channel(self, target: str, text: str): """Speak text with channel/PM-specific settings.""" accessibility = self.config_manager.get_accessibility_config() diff --git a/src/ui/ui_utils.py b/src/ui/ui_utils.py index 1933a7c..1c9b6be 100644 --- a/src/ui/ui_utils.py +++ b/src/ui/ui_utils.py @@ -51,18 +51,29 @@ def apply_speech_settings(speech_manager: 'SpeechManager', This consolidates the common pattern of applying per-channel/PM speech configuration (voice, rate, output module) to avoid duplication. + IMPORTANT: Only sets window-specific settings if they differ from defaults. + This allows global speech adjustments (Alt+1-6) to apply to channels/PMs + that don't have custom settings. + Args: speech_manager: The SpeechManager instance to configure settings: Channel-specific speech settings window_id: Unique identifier for the window (channel name or PM nick) """ + # Only set window-specific voice if explicitly configured (non-empty) if settings.voice: speech_manager.set_voice(settings.voice, window_id=window_id) + + # Only set window-specific rate if explicitly configured (non-zero) + # NOTE: We don't set rate=0 because that would override the global default + # This allows Alt+5/6 global adjustments to work for channels without custom rates if settings.rate != 0: speech_manager.set_rate(settings.rate, window_id=window_id) + + # Only set window-specific module if explicitly configured (non-empty) if settings.output_module: speech_manager.set_output_module(settings.output_module, window_id=window_id) logger.debug(f"Applied speech settings for window '{window_id}': " - f"voice={settings.voice}, rate={settings.rate}, " - f"module={settings.output_module}") + f"voice={settings.voice or 'default'}, rate={settings.rate or 'default'}, " + f"module={settings.output_module or 'default'}")