Skip to content

Commit 05f4864

Browse files
committed
Add Help Menu
1 parent fb35cdf commit 05f4864

File tree

3 files changed

+122
-3
lines changed

3 files changed

+122
-3
lines changed

UI/app.py

+18
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,8 @@ def setupUi(self, MainWindow):
237237
self.menubar.setObjectName("menubar")
238238
self.menuSave = QtWidgets.QMenu(self.menubar)
239239
self.menuSave.setObjectName("menuSave")
240+
self.menuHelp = QtWidgets.QMenu(self.menubar)
241+
self.menuHelp.setObjectName("menuHelp")
240242
MainWindow.setMenuBar(self.menubar)
241243
self.statusbar = QtWidgets.QStatusBar(MainWindow)
242244
self.statusbar.setObjectName("statusbar")
@@ -251,14 +253,26 @@ def setupUi(self, MainWindow):
251253
self.actionExport.setObjectName("actionExport")
252254
self.actionExit = QtWidgets.QAction(MainWindow)
253255
self.actionExit.setObjectName("actionExit")
256+
self.actionCheck_For_Updates = QtWidgets.QAction(MainWindow)
257+
self.actionCheck_For_Updates.setEnabled(True)
258+
self.actionCheck_For_Updates.setObjectName("actionCheck_For_Updates")
259+
self.actionAbout = QtWidgets.QAction(MainWindow)
260+
self.actionAbout.setObjectName("actionAbout")
261+
self.actionSource_Code = QtWidgets.QAction(MainWindow)
262+
self.actionSource_Code.setObjectName("actionSource_Code")
254263
self.menuSave.addAction(self.actionSave)
255264
self.menuSave.addSeparator()
256265
self.menuSave.addAction(self.actionImport)
257266
self.menuSave.addAction(self.actionExport)
258267
self.menuSave.addSeparator()
259268
self.menuSave.addAction(self.actionExit)
269+
self.menuHelp.addAction(self.actionCheck_For_Updates)
270+
self.menuHelp.addSeparator()
271+
self.menuHelp.addAction(self.actionAbout)
272+
self.menuHelp.addAction(self.actionSource_Code)
260273
self.menubar.addSeparator()
261274
self.menubar.addAction(self.menuSave.menuAction())
275+
self.menubar.addAction(self.menuHelp.menuAction())
262276

263277
self.retranslateUi(MainWindow)
264278
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@@ -286,9 +300,13 @@ def retranslateUi(self, MainWindow):
286300
self.label_6.setText(_translate("MainWindow", "Icon"))
287301
self.pushButton_5.setText(_translate("MainWindow", "Clear"))
288302
self.menuSave.setTitle(_translate("MainWindow", "File"))
303+
self.menuHelp.setTitle(_translate("MainWindow", "Help"))
289304
self.actionSave.setText(_translate("MainWindow", "Save"))
290305
self.actionImport.setText(_translate("MainWindow", "Import"))
291306
self.actionExport.setText(_translate("MainWindow", "Export"))
292307
self.actionExit.setText(_translate("MainWindow", "Exit"))
308+
self.actionCheck_For_Updates.setText(_translate("MainWindow", "Check For Updates"))
309+
self.actionAbout.setText(_translate("MainWindow", "About pyWinContext"))
310+
self.actionSource_Code.setText(_translate("MainWindow", "Source Code"))
293311

294312
import res_rc

UI/app.ui

+29-1
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,18 @@ QTreeView::branch:open:has-children:has-siblings {
433433
<addaction name="separator"/>
434434
<addaction name="actionExit"/>
435435
</widget>
436+
<widget class="QMenu" name="menuHelp">
437+
<property name="title">
438+
<string>Help</string>
439+
</property>
440+
<addaction name="actionCheck_For_Updates"/>
441+
<addaction name="separator"/>
442+
<addaction name="actionAbout"/>
443+
<addaction name="actionSource_Code"/>
444+
</widget>
436445
<addaction name="separator"/>
437446
<addaction name="menuSave"/>
447+
<addaction name="menuHelp"/>
438448
</widget>
439449
<widget class="QStatusBar" name="statusbar"/>
440450
<action name="actionSave">
@@ -463,9 +473,27 @@ QTreeView::branch:open:has-children:has-siblings {
463473
<string>Exit</string>
464474
</property>
465475
</action>
476+
<action name="actionCheck_For_Updates">
477+
<property name="enabled">
478+
<bool>true</bool>
479+
</property>
480+
<property name="text">
481+
<string>Check For Updates</string>
482+
</property>
483+
</action>
484+
<action name="actionAbout">
485+
<property name="text">
486+
<string>About pyWinContext</string>
487+
</property>
488+
</action>
489+
<action name="actionSource_Code">
490+
<property name="text">
491+
<string>Source Code</string>
492+
</property>
493+
</action>
466494
</widget>
467495
<resources>
468-
<include location="res.qrc"/>
496+
<include location="../res.qrc"/>
469497
</resources>
470498
<connections/>
471499
</ui>

wincontext.py

+75-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import os
1212
import argparse
1313

14+
import urllib.request
15+
import webbrowser
16+
1417
import regutils as reg
1518

1619
# import time
@@ -24,9 +27,12 @@
2427

2528
import output
2629

27-
2830
import ctypes
29-
myappid = 'VodBox.pyWinContext.1.0' # arbitrary string
31+
32+
versionNums = [0, 1, 0] # major, minor, patch
33+
versionNumber = ".".join(str(x) for x in versionNums)
34+
35+
myappid = 'VodBox.pyWinContext.' + versionNumber # arbitrary string
3036
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
3137

3238
parser = argparse.ArgumentParser(
@@ -100,6 +106,21 @@ def initUI(self):
100106
self.actionSave.setShortcut(QtGui.QKeySequence("Ctrl+S"))
101107
self.actionImport.triggered.connect(self.action_import)
102108
self.actionExport.triggered.connect(self.action_export)
109+
self.actionSource_Code.triggered.connect(
110+
lambda self: webbrowser.open(
111+
"https://github.com/VodBox/pyWinContext")
112+
)
113+
self.actionAbout.triggered.connect(
114+
lambda: QMessageBox.about(
115+
self, "About pyWinContext",
116+
"pyWinContext v" + versionNumber + "\n"
117+
+ "Written and Maintained by VodBox (Dillon Pentz)\n\n"
118+
+ "Homepage: https://github.com/VodBox/pyWinContext\n"
119+
+ "Source: https://github.com/VodBox/pyWinContext\n"
120+
+ "Downloads: https://github.com/VodBox/pyWinContext/releases"
121+
)
122+
)
123+
self.actionCheck_For_Updates.triggered.connect(self.check_updates)
103124
self.setWindowTitle('pyWinContext')
104125
fts = reg.get_file_types()
105126
types = {}
@@ -262,6 +283,58 @@ def action_import(self):
262283
def action_export(self):
263284
pass
264285

286+
def check_updates(self):
287+
release = self.find_later_release()
288+
if release is False:
289+
QMessageBox.information(
290+
self, "Check for Updates",
291+
"There are no new updates at this time."
292+
)
293+
else:
294+
box = QMessageBox(self)
295+
box.setText(
296+
"An update is available! It is available at\n"
297+
+ "https://github.com/VodBox/pyWinContext/releases/tag/"
298+
+ release)
299+
box.setWindowTitle("Check for Updates")
300+
box.setIcon(QMessageBox.Information)
301+
download = box.addButton("Download", QMessageBox.AcceptRole)
302+
box.addButton("Okay", QMessageBox.AcceptRole)
303+
box.exec_()
304+
clicked = box.clickedButton()
305+
if clicked is download:
306+
webbrowser.open(
307+
"https://github.com/VodBox/pyWinContext/releases/tag/"
308+
+ release)
309+
310+
def find_later_release(self):
311+
resp = urllib.request.urlopen(
312+
"https://api.github.com/repos/VodBox/pyWinContext/releases/latest")
313+
verInfo = {}
314+
try:
315+
verInfo = json.loads(resp.read())
316+
except json.JSONDecodeError:
317+
return False
318+
majorNum = int(
319+
re.search(r"v(\d+)\.(\d+)\.(\d+)", verInfo["tag_name"]).group(1)
320+
)
321+
minorNum = int(
322+
re.search(r"v(\d+)\.(\d+)\.(\d+)", verInfo["tag_name"]).group(2)
323+
)
324+
patchNum = int(
325+
re.search(r"v(\d+)\.(\d+)\.(\d+)", verInfo["tag_name"]).group(3)
326+
)
327+
if (
328+
majorNum < versionNums[0]
329+
or (majorNum == versionNums[0] and minorNum < versionNums[1])
330+
or (
331+
majorNum == versionNums[0] and minorNum == versionNums[1]
332+
and patchNum <= versionNums[2]
333+
)
334+
):
335+
return False
336+
return verInfo["tag_name"]
337+
265338
def search_change(self, text):
266339
for i in range(0, self.treeWidget_2.topLevelItemCount()):
267340
for x in range(0, self.treeWidget_2.topLevelItem(i).childCount()):

0 commit comments

Comments
 (0)