diff --git a/gui/builtinPreferenceViews/__init__.py b/gui/builtinPreferenceViews/__init__.py index 186166994..ef3d543ed 100644 --- a/gui/builtinPreferenceViews/__init__.py +++ b/gui/builtinPreferenceViews/__init__.py @@ -1 +1 @@ -__all__ = ["pyfaGlobalPreferences","pyfaHTMLExportPreferences"] +__all__ = ["pyfaGlobalPreferences","pyfaHTMLExportPreferences","pyfaUpdatePreferences"] diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py new file mode 100644 index 000000000..247856b88 --- /dev/null +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -0,0 +1,61 @@ +import wx +import service +import os + +from gui.preferenceView import PreferenceView +from gui import bitmapLoader + +import service +import gui.globalEvents as GE + + +class PFUpdatePref (PreferenceView): + title = "Pyfa Update Options" + desc = """ +Pyfa can automatically check and notify you of new releases. +These options will allow you to choose what kind of updates, if any, you wish +to receive notifications for +""" + + def populatePanel( self, panel ): + self.UpdateSettings = service.settings.UpdateSettings.getInstance() + self.dirtySettings = False + + mainSizer = wx.BoxSizer( wx.VERTICAL ) + + self.stTitle = wx.StaticText( panel, wx.ID_ANY, self.title, wx.DefaultPosition, wx.DefaultSize, 0 ) + self.stTitle.Wrap( -1 ) + self.stTitle.SetFont( wx.Font( 12, 70, 90, 90, False, wx.EmptyString ) ) + mainSizer.Add( self.stTitle, 0, wx.ALL, 5 ) + + self.stDesc = wx.StaticText( panel, wx.ID_ANY, self.desc, wx.DefaultPosition, wx.DefaultSize, 0 ) + mainSizer.Add( self.stDesc, 0, wx.ALL, 5 ) + + self.suppressAll = wx.CheckBox( panel, wx.ID_ANY, u"Suppress all update notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Suppress only pre-release notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) + + mainSizer.Add( self.suppressAll, 0, wx.ALL|wx.EXPAND, 5 ) + mainSizer.Add( self.suppressPrerelease, 0, wx.ALL|wx.EXPAND, 5 ) + + self.suppressAll.Bind(wx.EVT_CHECKBOX, self.OnSuppressAllStateChange) + + self.ToggleSuppressAll(self.suppressAll.IsChecked()) + + panel.SetSizer( mainSizer ) + panel.Layout() + + def ToggleSuppressAll(self, bool): + ''' Toggles other inputs on/off depending on value of SuppressAll ''' + if bool: + self.suppressPrerelease.Disable() + else: + self.suppressPrerelease.Enable() + + def OnSuppressAllStateChange(self, event): + self.UpdateSettings.set('all', self.suppressAll.IsChecked()) + self.ToggleSuppressAll(self.suppressAll.IsChecked()) + + def getImage(self): + return bitmapLoader.getBitmap("pyfa64", "icons") + +PFUpdatePref.register() \ No newline at end of file diff --git a/gui/updateDialog.py b/gui/updateDialog.py index 563eec1e4..25ec1f693 100644 --- a/gui/updateDialog.py +++ b/gui/updateDialog.py @@ -20,12 +20,15 @@ import wx import bitmapLoader import config +import service class UpdateDialog(wx.Dialog): def __init__(self, parent, release): wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = "Pyfa Update", pos = wx.DefaultPosition, size = wx.Size( 400,300 ), style = wx.DEFAULT_DIALOG_STYLE ) + self.UpdateSettings = service.settings.UpdateSettings.getInstance() + self.releaseInfo = release self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) mainSizer = wx.BoxSizer( wx.VERTICAL ) @@ -41,40 +44,39 @@ class UpdateDialog(wx.Dialog): mainSizer.Add( wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND |wx.ALL, 5 ) versionSizer = wx.BoxSizer( wx.HORIZONTAL ) + + if(self.releaseInfo['prerelease']): + self.releaseText = wx.StaticText( self, wx.ID_ANY, "Pre-release", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) + self.releaseText.SetFont( wx.Font( 12, 74, 90, 92, False) ) + self.releaseText.SetForegroundColour( wx.Colour( 230, 0, 0 ) ) + else: + self.releaseText = wx.StaticText( self, wx.ID_ANY, "Stable", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) + self.releaseText.SetFont( wx.Font( 12, 74, 90, 90, False) ) + + self.releaseText.Wrap( -1 ) + + versionSizer.Add( self.releaseText, 1, wx.ALL, 5 ) - self.versionText = wx.StaticText( self, wx.ID_ANY, release['tag_name'], wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) + self.versionText = wx.StaticText( self, wx.ID_ANY, self.releaseInfo['tag_name'], wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_LEFT ) self.versionText.Wrap( -1 ) self.versionText.SetFont( wx.Font( 12, 74, 90, 90, False) ) versionSizer.Add( self.versionText, 1, wx.ALL, 5 ) versionSizer.AddSpacer( ( 15, 5), 0, wx.EXPAND, 5 ) - if(release['prerelease']): - pass - self.releaseText = wx.StaticText( self, wx.ID_ANY, "Pre-release", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.releaseText.SetFont( wx.Font( 12, 74, 90, 92, False, "Tahoma" ) ) - self.releaseText.SetForegroundColour( wx.Colour( 230, 0, 0 ) ) - else: - self.releaseText = wx.StaticText( self, wx.ID_ANY, "Stable", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.releaseText.SetFont( wx.Font( 12, 74, 90, 90, False) ) - - self.releaseText.Wrap( -1 ) - - versionSizer.Add( self.releaseText, 1, wx.ALL, 5 ) mainSizer.Add( versionSizer, 0, wx.EXPAND, 5 ) mainSizer.AddSpacer( ( 0, 5), 0, wx.EXPAND, 5 ) notesSizer = wx.BoxSizer( wx.HORIZONTAL ) - self.notesTextCtrl = wx.TextCtrl( self, wx.ID_ANY, release['body'], wx.DefaultPosition, wx.DefaultSize, wx.TE_AUTO_URL|wx.TE_MULTILINE|wx.TE_NO_VSCROLL|wx.TE_READONLY|wx.DOUBLE_BORDER|wx.TRANSPARENT_WINDOW ) + self.notesTextCtrl = wx.TextCtrl( self, wx.ID_ANY, self.releaseInfo['body'], wx.DefaultPosition, wx.DefaultSize, wx.TE_AUTO_URL|wx.TE_MULTILINE|wx.TE_NO_VSCROLL|wx.TE_READONLY|wx.DOUBLE_BORDER|wx.TRANSPARENT_WINDOW ) notesSizer.Add( self.notesTextCtrl, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 5 ) mainSizer.Add( notesSizer, 1, wx.EXPAND, 5 ) - self.supressCheckbox = wx.CheckBox( self, wx.ID_ANY, "Don't show me again", wx.DefaultPosition, wx.DefaultSize, 0 ) - mainSizer.Add( self.supressCheckbox, 0, wx.ALL, 5 ) - self.supressPreCheckbox = wx.CheckBox( self, wx.ID_ANY, "Don't show me (pre-releases) again", wx.DefaultPosition, wx.DefaultSize, 0 ) - mainSizer.Add( self.supressPreCheckbox, 0, wx.ALL, 5 ) + self.supressCheckbox = wx.CheckBox( self, wx.ID_ANY, "Don't remind me again for this release", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.supressCheckbox.Bind(wx.EVT_CHECKBOX, self.SuppressChange) + mainSizer.Add( self.supressCheckbox, 0, wx.ALL, 5 ) mainSizer.Add( wx.StaticLine( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND |wx.ALL, 5 ) actionSizer = wx.BoxSizer( wx.HORIZONTAL ) @@ -83,16 +85,29 @@ class UpdateDialog(wx.Dialog): self.goButton = wx.Button( self, wx.ID_ANY, "Download", wx.DefaultPosition, wx.DefaultSize, 0 ) goSizer.Add( self.goButton, 0, wx.ALL, 5 ) actionSizer.Add( goSizer, 1, wx.EXPAND, 5 ) - - self.closeButton = wx.Button( self, wx.ID_ANY, "Close", wx.DefaultPosition, wx.DefaultSize, 0 ) + + self.closeButton = wx.Button(self, wx.ID_CLOSE) + self.closeButton.Bind(wx.EVT_BUTTON, self.OnClose) actionSizer.Add( self.closeButton, 0, wx.ALL, 5 ) mainSizer.Add( actionSizer, 0, wx.EXPAND, 5 ) self.SetSizer( mainSizer ) self.Layout() + + ''' + TODO: If release suppression is not ticked, make sure it's set correctly in settings. + Otherwise, a release will be suppressed, and a new release will come around. However, + if user does not suppress that one, the old release will continue to see the suppressed + release in prefs + ''' self.Centre( wx.BOTH ) def OnClose(self, e): - - self.Destroy() \ No newline at end of file + self.Destroy() + + def SuppressChange(self, e): + if (self.supressCheckbox.IsChecked()): + self.UpdateSettings.set('version', self.releaseInfo['tag_name']) + else: + self.UpdateSettings.set('version', None) diff --git a/service/settings.py b/service/settings.py index eb5e66a77..c23ed9eb6 100644 --- a/service/settings.py +++ b/service/settings.py @@ -215,4 +215,35 @@ class HTMLExportSettings(): return self.serviceHTMLExportSettings["path"] def setPath(self, path): - self.serviceHTMLExportSettings["path"] = path \ No newline at end of file + self.serviceHTMLExportSettings["path"] = path + +""" +Settings used by update notification +""" +class UpdateSettings(): + _instance = None + + @classmethod + def getInstance(cls): + if cls._instance == None: + cls._instance = UpdateSettings() + + return cls._instance + + def __init__(self): + # Settings + # all - If True, suppress all update notifications + # prerelease - If True, suppress only prerelease notifications + # version - Set to release tag that user does not want notifications for + serviceUpdateDefaultSettings = { "all": False, "prerelease": False, 'version': None } + self.serviceUpdateSettings = SettingsProvider.getInstance().getSettings("pyfaServiceUpdateSettings", serviceUpdateDefaultSettings) + + def get(self, type): + print "Getting "+type+ ": " + print self.serviceUpdateSettings["suppress" + type] + return self.serviceUpdateSettings["suppress" + type] + + def set(self, type, value): + self.serviceUpdateSettings["suppress" + type] = value + print "Setting "+type+ " = " + print self.serviceUpdateSettings["suppress" + type] \ No newline at end of file diff --git a/service/update.py b/service/update.py index ba13f03af..a3f39e586 100644 --- a/service/update.py +++ b/service/update.py @@ -23,15 +23,19 @@ import urllib2 import json import config -from service.settings import SettingsProvider +from service.settings import SettingsProvider, UpdateSettings class CheckUpdateThread(threading.Thread): def __init__(self, callback): threading.Thread.__init__(self) self.callback = callback + self.settings = UpdateSettings.getInstance() def run(self): print "In the thread" + if (self.settings.get('all')): + return + try: response = urllib2.urlopen('https://api.github.com/repos/DarkFenX/Pyfa/releases') jsonResponse = json.loads(response.read());