1+ import json
12import logging
23import os
4+ import urllib .request
35
46import wx
57
8+ from _version import __version__
69from common import load_json , local_path , reverse_dict_lookup
710from 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