Skip to content

Commit f6d422b

Browse files
committed
Add update checker in settings page
1 parent ca10efb commit f6d422b

File tree

1 file changed

+34
-3
lines changed

1 file changed

+34
-3
lines changed

src/gui/settings.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import json
12
import logging
23
import os
4+
import urllib.request
35

46
import wx
57

8+
from _version import __version__
69
from common import load_json, local_path, reverse_dict_lookup
710
from gui.widgets import EVT_TIME_SPAN_SELECT, TimeSpanSelector, simple_box_sizer
811

@@ -57,6 +60,7 @@ def header(text: str):
5760

5861
open_install_btn = wx.Button(panel, label='Open install directory')
5962
open_github_btn = wx.Button(panel, label='Open GitHub page')
63+
check_updates_btn = wx.Button(panel, label='Check for updates')
6064
# place
6165
simple_box_sizer(
6266
panel,
@@ -72,6 +76,7 @@ def header(text: str):
7276
(log_level_txt, log_level_opt),
7377
open_install_btn,
7478
open_github_btn,
79+
check_updates_btn,
7580
),
7681
)
7782

@@ -98,10 +103,13 @@ def header(text: str):
98103
open_install_btn.Bind(wx.EVT_BUTTON, lambda *_: os.startfile(local_path('.')))
99104
open_github_btn.Bind(wx.EVT_BUTTON, lambda *_: os.startfile('https://github.com/Crozzers/RestoreWindowPos'))
100105

106+
self._latest_version = None
107+
check_updates_btn.Bind(wx.EVT_BUTTON, self.check_update)
108+
101109
# place
102-
sizer = wx.BoxSizer(wx.VERTICAL)
103-
sizer.Add(panel, 0, wx.ALL | wx.EXPAND, 5)
104-
self.SetSizerAndFit(sizer)
110+
self.sizer = wx.BoxSizer(wx.VERTICAL)
111+
self.sizer.Add(panel, 0, wx.ALL | wx.EXPAND, 5)
112+
self.SetSizerAndFit(self.sizer)
105113

106114
def on_setting(self, event: wx.Event):
107115
widget = event.GetEventObject()
@@ -125,3 +133,26 @@ def on_setting(self, event: wx.Event):
125133
elif isinstance(widget, TimeSpanSelector):
126134
if event.Id == 5:
127135
self.settings.set('window_history_ttl', widget.GetTime())
136+
137+
def check_update(self, event: wx.Event):
138+
widget: wx.Button = event.GetEventObject()
139+
if 'check for' in widget.GetLabelText().lower():
140+
data = json.loads(
141+
urllib.request.urlopen('https://api.github.com/repos/Crozzers/RestoreWindowPos/tags').read().decode()
142+
)
143+
self._latest_version = data[0]['name']
144+
145+
# convert both to an int tuple for simple comparison without requiring the `packaging` package
146+
latest_version_num = tuple(int(i) for i in self._latest_version.split('.'))
147+
current_version_num = tuple(int(i) for i in __version__.split('.'))
148+
149+
if latest_version_num > current_version_num:
150+
widget.SetLabel(f'Update Available ({__version__} -> {self._latest_version}). Click to download')
151+
else:
152+
widget.SetLabel('Check for updates (none available)')
153+
widget.Layout()
154+
self.sizer.Layout()
155+
else:
156+
os.startfile(
157+
f'https://github.com/Crozzers/RestoreWindowPos/releases/download/{self._latest_version}/RestoreWindowPos_install.exe'
158+
)

0 commit comments

Comments
 (0)