Skip to content

Commit c3ab69e

Browse files
Smart Password Manager (Desktop) v2.3.1
1 parent 3b74811 commit c3ab69e

4 files changed

Lines changed: 99 additions & 48 deletions

File tree

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
BSD 3-Clause License
22

3-
Copyright (c) 2026, Alexander Suvorov
3+
Copyright (©) 2026, Alexander Suvorov
44

55
Redistribution and use in source and binary forms, with or without
66
modification, are permitted provided that the following conditions are met:

README.md

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Smart Password Manager Desktop <sup>v2.3.0</sup>
1+
# Smart Password Manager Desktop <sup>v2.3.1</sup>
22

33
---
44

@@ -97,11 +97,11 @@ Powered by **[smartpasslib v2.2.0+](https://github.com/smartlegionlab/smartpassl
9797

9898
Starting from smartpasslib v2.2.0, configuration files are stored in:
9999

100-
| Platform | Configuration Path |
101-
|----------|-------------------|
102-
| Linux | `~/.config/smart_password_manager/passwords.json` |
103-
| macOS | `~/.config/smart_password_manager/passwords.json` |
104-
| Windows | `C:\Users\Username\.config\smart_password_manager\passwords.json` |
100+
| Platform | Configuration Path |
101+
|----------|:------------------------------------------------------------------|
102+
| Linux | `~/.config/smart_password_manager/passwords.json` |
103+
| macOS | `~/.config/smart_password_manager/passwords.json` |
104+
| Windows | `C:\Users\Username\.config\smart_password_manager\passwords.json` |
105105

106106
**Automatic Migration**:
107107
- Old `~/.cases.json` files are automatically migrated on first run
@@ -111,19 +111,6 @@ Starting from smartpasslib v2.2.0, configuration files are stored in:
111111

112112
---
113113

114-
## 🆕 What's New in v2.3.0
115-
116-
### Context Menu for Password Table
117-
118-
- **Right-click anywhere** on a password row to open context menu
119-
- **Quick access** to Get, Edit, and Delete actions
120-
- **Visual icons** for better recognition (🔑, ✏️, 🗑️)
121-
- **Seamless integration** - buttons remain for one-click access
122-
123-
This enhancement provides an alternative interaction method while maintaining the familiar button interface.
124-
125-
---
126-
127114
## 📦 Installation & Quick Start
128115

129116
### Prerequisites
@@ -219,28 +206,31 @@ python app.py
219206

220207
### ⌨️ Keyboard Shortcuts
221208

222-
| Shortcut | Action | Description |
223-
|----------|--------|-------------|
224-
| `F1` | Help | Show help |
225-
| `Ctrl+Q` | Exit | Close the application |
226-
| `Ctrl+P` | Create new password | Open "Create password" dialog |
227-
| `Ctrl+Shift+S` | Toggle sounds | Enable/Disable app's sounds |
228-
| `Ctrl+/` | Keyboard shortcuts | Keyboard shortcuts |
229-
| `Ctrl+Shift+A` | About dialog | About dialog |
230-
| `Ctrl+E` | Export passwords | Export metadata to JSON file |
231-
| `Ctrl+I` | Import passwords | Import metadata from JSON file |
209+
| Shortcut | Action | Description |
210+
|----------------|---------------------|--------------------------------|
211+
| `F1` | Help | Show help |
212+
| `Ctrl+Q` | Exit | Close the application |
213+
| `Ctrl+P` | Create new password | Open "Create password" dialog |
214+
| `Ctrl+Shift+S` | Toggle sounds | Enable/Disable app's sounds |
215+
| `Ctrl+/` | Keyboard shortcuts | Keyboard shortcuts |
216+
| `Ctrl+Shift+A` | About dialog | About dialog |
217+
| `Ctrl+E` | Export passwords | Export metadata to JSON file |
218+
| `Ctrl+I` | Import passwords | Import metadata from JSON file |
219+
| `Ctrl+G` | Get password | Get selected password |
220+
| `Ctrl+Shift+E` | Edit password | Edit selected password |
221+
| `Del` | Delete password | Delete selected password |
232222

233223
---
234224

235225
### 🖱️ Context Menu
236226

237227
Right-click on any password row to access a context menu with all actions:
238228

239-
| Menu Item | Action | Description |
240-
|-----------|--------|-------------|
241-
| 🔑 Get Password | One-click access | Generate and display password |
242-
| ✏️ Edit Metadata | Quick edit | Modify description or length |
243-
| 🗑️ Delete Entry | Direct deletion | Remove password metadata |
229+
| Menu Item | Action | Description | Shortcuts |
230+
|---------------|------------------|-------------------------------|----------------|
231+
| Get Password | One-click access | Generate and display password | `Ctrl+G` |
232+
| Edit Metadata | Quick edit | Modify description or length | `Ctrl+Shift+E` |
233+
| Delete Entry | Direct deletion | Remove password metadata | `Del` |
244234

245235
This provides an alternative to the table buttons for users who prefer context menus, while keeping the buttons for quick one-click access.
246236

@@ -378,7 +368,7 @@ Length Strategy:
378368
**Best Practices:**
379369
1. **Unique per service** - Different secret for each account type
380370
2. **Memorable but complex** - Phrases you can remember
381-
3. **Case-sensitive** - v2.3.0 enforces exact case matching
371+
3. **Case-sensitive** - v2.3.1 enforces exact case matching
382372
4. **No digital storage** - Keep only in memory
383373
5. **Backup plan** - Physical written backup in secure location
384374
6. **Export regularly** - Backup metadata after adding new passwords
@@ -440,7 +430,7 @@ Length Strategy:
440430

441431
**[BSD 3-Clause License](LICENSE)**
442432

443-
Copyright (c) 2026, Alexander Suvorov
433+
Copyright (©) 2026, Alexander Suvorov
444434

445435
```
446436
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Copyright (©) 2026, Alexander Suvorov. All rights reserved.
22
"""Cross-platform desktop manager for deterministic smart passwords. Generate, manage, and
33
retrieve passwords without storing them. Your secret phrase is the only key you need."""
4-
__version__ = '2.3.0'
4+
__version__ = '2.3.1'
55
__author__ = 'Alexander Suvorov'

core/main_window.py

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def __init__(self, parent=None):
7979
self.table_widget.setColumnCount(5)
8080
self.table_widget.setHorizontalHeaderLabels(['Description', 'Length', 'Get', 'Edit', 'Delete'])
8181
self.table_widget.setEditTriggers(QTableWidget.NoEditTriggers)
82+
self.table_widget.setSelectionMode(QTableWidget.SingleSelection)
8283
self.table_widget.setAlternatingRowColors(True)
8384
self.table_widget.setStyleSheet("""
8485
QTableWidget {
@@ -252,6 +253,55 @@ def setup_table_context_menu(self):
252253
self.table_widget.setContextMenuPolicy(Qt.CustomContextMenu)
253254
self.table_widget.customContextMenuRequested.connect(self.show_table_context_menu)
254255

256+
shortcuts = [
257+
('Ctrl+G', 'Get Password', self.get_password_for_selected_row),
258+
('Ctrl+Shift+E', 'Edit Password', self.edit_password_for_selected_row),
259+
('Del', 'Delete Password', self.delete_selected_row)
260+
]
261+
262+
for shortcut, name, callback in shortcuts:
263+
action = QAction(name, self)
264+
action.setShortcut(shortcut)
265+
action.triggered.connect(callback)
266+
self.addAction(action)
267+
268+
def _get_public_key_for_row(self, row):
269+
if row < 0:
270+
return None
271+
272+
for col in [2, 3, 4]:
273+
widget = self.table_widget.cellWidget(row, col)
274+
if widget and hasattr(widget, 'public_key'):
275+
return widget.public_key
276+
return None
277+
278+
def _execute_action_for_selected_row(self, action_name):
279+
current_row = self.table_widget.currentRow()
280+
public_key = self._get_public_key_for_row(current_row)
281+
282+
if not public_key:
283+
self.show_status_message('No row selected', 2000)
284+
return
285+
286+
method_map = {
287+
'get': 'get_password',
288+
'edit': 'edit_password',
289+
'delete': 'remove_password'
290+
}
291+
292+
method_name = method_map.get(action_name)
293+
if method_name:
294+
getattr(self, method_name)(public_key)
295+
296+
def get_password_for_selected_row(self):
297+
self._execute_action_for_selected_row('get')
298+
299+
def edit_password_for_selected_row(self):
300+
self._execute_action_for_selected_row('edit')
301+
302+
def delete_selected_row(self):
303+
self._execute_action_for_selected_row('delete')
304+
255305
def show_table_context_menu(self, position):
256306
item = self.table_widget.itemAt(position)
257307
if not item:
@@ -272,14 +322,17 @@ def show_table_context_menu(self, position):
272322
context_menu = QMenu(self)
273323

274324
get_action = context_menu.addAction("🔑 Get Password")
325+
get_action.setShortcut("Ctrl+G")
275326
get_action.triggered.connect(lambda checked, pk=public_key: self.get_password(pk))
276327

277328
edit_action = context_menu.addAction("✏️ Edit Metadata")
329+
edit_action.setShortcut("Ctrl+Shift+E")
278330
edit_action.triggered.connect(lambda checked, pk=public_key: self.edit_password(pk))
279331

280332
context_menu.addSeparator()
281333

282334
delete_action = context_menu.addAction("🗑️ Delete Entry")
335+
delete_action.setShortcut("Del")
283336
delete_action.triggered.connect(lambda checked, pk=public_key: self.remove_password(pk))
284337

285338
context_menu.exec_(self.table_widget.viewport().mapToGlobal(position))
@@ -321,16 +374,24 @@ def _show_keyboard_shortcuts(self):
321374
QMessageBox.about(
322375
self,
323376
"Keyboard Shortcuts",
324-
f"""<h2>Keyboard Shortcuts</h2>
325-
326-
<p><b>F1</b> - Show Help</p>
327-
<p><b>Ctrl + Q</b> - Exit Application</p>
328-
<p><b>Ctrl + P</b> - Create New Password</p>
329-
<p><b>Ctrl + Shift + S</b> - Toggle Sounds</p>
330-
<p><b>Ctrl + /</b> - Keyboard shortcuts</p>
331-
<p><b>Ctrl + Shift + A</b> - About</p>
332-
<p><b>Ctrl + I</b> - Import Passwords</p>
333-
<p><b>Ctrl + E</b> - Export Passwords</p>
377+
f"""<h2 style="color: #2a82da">Global Keyboard Shortcuts</h2>
378+
379+
<p><b style="color: #2a82da">F1</b> - Show Help</p>
380+
<p><b style="color: #2a82da">Ctrl + Q</b> - Exit Application</p>
381+
<p><b style="color: #2a82da">Ctrl + P</b> - Create New Password</p>
382+
<p><b style="color: #2a82da">Ctrl + Shift + S</b> - Toggle Sounds</p>
383+
<p><b style="color: #2a82da">Ctrl + /</b> - Keyboard shortcuts</p>
384+
<p><b style="color: #2a82da">Ctrl + Shift + A</b> - About</p>
385+
<p><b style="color: #2a82da">Ctrl + I</b> - Import Passwords</p>
386+
<p><b style="color: #2a82da">Ctrl + E</b> - Export Passwords</p>
387+
388+
<hr>
389+
390+
<h2 style="color: #2a82da">Password's Keyboard Shortcuts</h2>
391+
392+
<p><b style="color: #2a82da">Ctrl + G</b> - Get Password</p>
393+
<p><b style="color: #2a82da">Ctrl + Shift + E</b> - Edit Password</p>
394+
<p><b style="color: #2a82da">Del</b> - Delete Password</p>
334395
"""
335396
)
336397

0 commit comments

Comments
 (0)