Skip to content

Commit b9500f9

Browse files
committed
feat(ui): add version display and improve settings layout
Introduced a versioning system that computes release tags during build and displays the current version or build SHA in the settings dialog. The settings UI was also reorganized for better space efficiency. - Added src/version.py to handle version string formatting from build info. - Implemented _compute_release_tag in build.py to generate patch versions based on git tags. - Updated release.yml to fetch all tags and history for accurate version calculation. - Refactored settings dialog layout into separate toggle and action rows. - Renamed several buttons in _desktop_backup_buttons.py and dialog.py for conciseness. - Added a version label to the bottom right of the settings dialog.
1 parent 52e94b3 commit b9500f9

5 files changed

Lines changed: 80 additions & 26 deletions

File tree

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ jobs:
2323
runs-on: ${{ matrix.os }}
2424
steps:
2525
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
26+
with:
27+
fetch-depth: 0
28+
fetch-tags: true
2629

2730
- name: Install Linux Qt deps
2831
if: matrix.os == 'ubuntu-latest'

build.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"""
1313

1414
import os
15+
import re
1516
import shutil
1617
import struct
1718
import subprocess
@@ -118,6 +119,26 @@ def _generate_icon() -> Path | None:
118119
return _generate_ico(renderer)
119120

120121

122+
def _compute_release_tag() -> str:
123+
if not os.environ.get("GITHUB_SHA"):
124+
return ""
125+
try:
126+
py = Path("pyproject.toml").read_text(encoding="utf-8")
127+
m = re.search(r'^version\s*=\s*"([^"]+)"', py, re.M)
128+
if not m:
129+
return ""
130+
major_minor = ".".join(m.group(1).split(".")[:2])
131+
out = subprocess.check_output(
132+
["git", "tag", "-l", f"v{major_minor}.*"], text=True
133+
).strip().splitlines()
134+
out = sorted(out, key=lambda t: [int(x) for x in t.lstrip("v").split(".")])
135+
patch = int(out[-1].split(".")[-1]) + 1 if out else 0
136+
return f"v{major_minor}.{patch}"
137+
except Exception as exc:
138+
print(f"tag compute failed: {exc}", file=sys.stderr)
139+
return ""
140+
141+
121142
def _write_build_info() -> None:
122143
sha = os.environ.get("GITHUB_SHA")
123144
if not sha:
@@ -127,8 +148,11 @@ def _write_build_info() -> None:
127148
).strip()
128149
except Exception:
129150
sha = "unknown"
130-
Path("src/_build_info.py").write_text(f'BUILD_SHA = "{sha}"\n', encoding="utf-8")
131-
print(f"BUILD_SHA={sha}")
151+
tag = _compute_release_tag()
152+
Path("src/_build_info.py").write_text(
153+
f'BUILD_SHA = "{sha}"\nBUILD_TAG = "{tag}"\n', encoding="utf-8"
154+
)
155+
print(f"BUILD_SHA={sha} BUILD_TAG={tag}")
132156

133157

134158
def build() -> Path:

src/settings/_desktop_backup_buttons.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ def __init__(
2222
self._parent = parent
2323
self._on_restored = on_restored
2424

25-
self.backup_btn = QPushButton("Backup to Desktop")
25+
self.backup_btn = QPushButton("Backup Desktop")
2626
self.backup_btn.clicked.connect(self._do_backup)
2727

28-
self.restore_btn = QPushButton("Restore Desktop Backup")
28+
self.restore_btn = QPushButton("Restore from Desktop")
2929
self.restore_btn.setVisible(False)
3030
self.restore_btn.clicked.connect(self._do_restore)
3131

32-
self.delete_btn = QPushButton("Delete Desktop Backup")
32+
self.delete_btn = QPushButton("Delete Desktop Copy")
3333
self.delete_btn.setVisible(False)
3434
self.delete_btn.clicked.connect(self._do_delete)
3535

src/settings/dialog.py

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
from src.settings.initial_upload import InitialUploadDialog
3737
from src.shortcuts_editor import ShortcutsEditorDialog
3838
from src.sync.sync_dir import SYNC_DIR_NAME
39+
from src.version import version_display
3940
from src.winget import WingetManager
4041

4142
_LOG = logging.getLogger(__name__)
@@ -173,57 +174,69 @@ def _build_ui(self) -> None:
173174
right.addWidget(self._profiles_group)
174175

175176
selects_row = QWidget()
176-
selects_layout = QHBoxLayout(selects_row)
177-
selects_layout.setContentsMargins(0, 0, 0, 0)
178-
selects_layout.setSpacing(6)
177+
selects_outer = QVBoxLayout(selects_row)
178+
selects_outer.setContentsMargins(0, 0, 0, 0)
179+
selects_outer.setSpacing(4)
179180

180-
self._activity_log_check = QCheckBox("Show activity log")
181+
toggles_row = QHBoxLayout()
182+
toggles_row.setContentsMargins(0, 0, 0, 0)
183+
toggles_row.setSpacing(8)
184+
185+
self._activity_log_check = QCheckBox("Activity log")
181186
self._activity_log_check.setChecked(True)
182187
self._activity_log_check.toggled.connect(self._on_activity_log_changed)
183-
selects_layout.addWidget(self._activity_log_check)
184-
185-
selects_layout.addSpacing(8)
188+
toggles_row.addWidget(self._activity_log_check)
186189

187190
self._autostart_check = QCheckBox("Launch on login")
188191
self._autostart_check.setChecked(True)
189192
self._autostart_check.toggled.connect(self._on_autostart_changed)
190-
selects_layout.addWidget(self._autostart_check)
193+
toggles_row.addWidget(self._autostart_check)
191194

192-
selects_layout.addSpacing(8)
193-
194-
self._helium_update_check = QCheckBox("Auto-update Helium (winget)")
195+
self._helium_update_check = QCheckBox("Auto-update Helium")
195196
self._helium_update_check.setVisible(False)
196197
self._helium_update_check.toggled.connect(self._on_helium_auto_update_changed)
197-
selects_layout.addWidget(self._helium_update_check)
198+
toggles_row.addWidget(self._helium_update_check)
198199

199200
self._helium_version_label = QLabel()
200201
self._helium_version_label.setStyleSheet(SMALL_MUTED)
201202
self._helium_version_label.setVisible(False)
202-
selects_layout.addWidget(self._helium_version_label)
203+
toggles_row.addWidget(self._helium_version_label)
204+
205+
toggles_row.addStretch()
203206

204-
selects_layout.addSpacing(8)
207+
version_label = QLabel(version_display())
208+
version_label.setStyleSheet(SMALL_MUTED)
209+
toggles_row.addWidget(version_label)
205210

206-
edit_shortcuts_btn = QPushButton("Edit Search Shortcuts")
211+
selects_outer.addLayout(toggles_row)
212+
213+
actions_row = QHBoxLayout()
214+
actions_row.setContentsMargins(0, 0, 0, 0)
215+
actions_row.setSpacing(6)
216+
217+
edit_shortcuts_btn = QPushButton("Shortcuts")
207218
edit_shortcuts_btn.clicked.connect(self._open_shortcuts_editor)
208-
selects_layout.addWidget(edit_shortcuts_btn)
219+
actions_row.addWidget(edit_shortcuts_btn)
209220

210221
view_ext_btn = QPushButton("Extensions")
211222
view_ext_btn.clicked.connect(self._open_extension_links)
212-
selects_layout.addWidget(view_ext_btn)
223+
actions_row.addWidget(view_ext_btn)
213224

214225
flags_btn = QPushButton("Flags")
215226
flags_btn.clicked.connect(self._open_flags_manager)
216-
selects_layout.addWidget(flags_btn)
227+
actions_row.addWidget(flags_btn)
217228

218-
selects_layout.addSpacing(8)
229+
actions_row.addSpacing(8)
219230

220231
self._desktop_buttons = DesktopBackupButtons(
221232
parent=self, on_restored=self._refresh_for_folder,
222233
)
223234
for btn in self._desktop_buttons.widgets():
224-
selects_layout.addWidget(btn)
235+
actions_row.addWidget(btn)
236+
237+
actions_row.addStretch()
238+
selects_outer.addLayout(actions_row)
225239

226-
selects_layout.addStretch()
227240
selects_row.setVisible(False)
228241
right.addWidget(selects_row)
229242
self._selects_row = selects_row

src/version.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from __future__ import annotations
2+
3+
4+
def version_display() -> str:
5+
try:
6+
from src import _build_info
7+
except ImportError:
8+
return "from source"
9+
tag = getattr(_build_info, "BUILD_TAG", "")
10+
if tag:
11+
return tag
12+
sha = getattr(_build_info, "BUILD_SHA", "")
13+
short = sha[:7] if sha and sha != "unknown" else ""
14+
return f"from source ({short})" if short else "from source"

0 commit comments

Comments
 (0)