From 6ee474a8ffedbee0594212e3f92844f8dd4583ae Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 13 Feb 2014 22:28:56 -0500 Subject: [PATCH 01/15] Started work on update notification. Successfully prints out alert to stdout if version from GitHub is not the same as internal version. --- gui/mainFrame.py | 4 ++++ service/__init__.py | 1 + service/update.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 service/update.py diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 234537c91..607bc8c58 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -161,6 +161,10 @@ class MainFrame(wx.Frame): #Show ourselves self.Show() + #Check for updates + self.sUpdate = service.Update.getInstance() + self.sUpdate.CheckUpdate() + def LoadMainFrameAttribs(self): mainFrameDefaultAttribs = {"wnd_width":1000, "wnd_height": 700, "wnd_maximized": False} diff --git a/service/__init__.py b/service/__init__.py index 7ade0eb7e..e7581c675 100644 --- a/service/__init__.py +++ b/service/__init__.py @@ -5,3 +5,4 @@ from service.character import Character from service.damagePattern import DamagePattern from service.settings import SettingsProvider from service.fleet import Fleet +from service.update import Update diff --git a/service/update.py b/service/update.py new file mode 100644 index 000000000..bfb691b63 --- /dev/null +++ b/service/update.py @@ -0,0 +1,55 @@ +#=============================================================================== +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +#=============================================================================== + +import threading +import wx +import urllib2 +import json +import config + +from service.settings import SettingsProvider + +class Update(): + instance = None + def __init__(self): + pass + + def CheckUpdate(self): + print "Checking for Updates" + t=threading.Thread(target=self.__CheckUpdate) + t.start() + + def __CheckUpdate(self): + print "In the thread" + try: + response = urllib2.urlopen('https://api.github.com/repos/DarkFenX/Pyfa/releases') + jsonResponse = json.loads(response.read()); + responseVersion = jsonResponse[0]['tag_name'].replace('v', '', 1) + if responseVersion != config.version: + print "New version!" + except: + pass + + @classmethod + def getInstance(cls): + if cls.instance == None: + cls.instance = Update() + return cls.instance + + From d7dda833145cf24bcc32a50a01a6310d9edb6e1f Mon Sep 17 00:00:00 2001 From: blitzmann Date: Thu, 13 Feb 2014 22:52:36 -0500 Subject: [PATCH 02/15] More work on update notification. Displays debug popup now. --- gui/mainFrame.py | 5 ++++- service/update.py | 28 +++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gui/mainFrame.py b/gui/mainFrame.py index 607bc8c58..f92560e0c 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -163,8 +163,11 @@ class MainFrame(wx.Frame): #Check for updates self.sUpdate = service.Update.getInstance() - self.sUpdate.CheckUpdate() + self.sUpdate.CheckUpdate(self.ShowUpdateBox) + def ShowUpdateBox(self): + wx.MessageBox('ZOMG UPDATE', 'Info', wx.OK | wx.ICON_INFORMATION) + def LoadMainFrameAttribs(self): mainFrameDefaultAttribs = {"wnd_width":1000, "wnd_height": 700, "wnd_maximized": False} diff --git a/service/update.py b/service/update.py index bfb691b63..09af1f20f 100644 --- a/service/update.py +++ b/service/update.py @@ -25,17 +25,12 @@ import config from service.settings import SettingsProvider -class Update(): - instance = None - def __init__(self): - pass - - def CheckUpdate(self): - print "Checking for Updates" - t=threading.Thread(target=self.__CheckUpdate) - t.start() - - def __CheckUpdate(self): +class CheckUpdateThread(threading.Thread): + def __init__(self, callback): + threading.Thread.__init__(self) + self.callback = callback + + def run(self): print "In the thread" try: response = urllib2.urlopen('https://api.github.com/repos/DarkFenX/Pyfa/releases') @@ -43,9 +38,20 @@ class Update(): responseVersion = jsonResponse[0]['tag_name'].replace('v', '', 1) if responseVersion != config.version: print "New version!" + wx.CallAfter(self.callback) except: pass +class Update(): + instance = None + def __init__(self): + pass + + def CheckUpdate(self, callback): + print "Checking for Updates" + thread = CheckUpdateThread(callback) + thread.start() + @classmethod def getInstance(cls): if cls.instance == None: From 7ced595cca7702bca691789da2fa06d4eb5fb815 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 15 Feb 2014 00:55:04 -0500 Subject: [PATCH 03/15] Custom dialog implemented. --- gui/mainFrame.py | 7 +++- gui/updateDialog.py | 98 +++++++++++++++++++++++++++++++++++++++++++++ service/update.py | 2 +- 3 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 gui/updateDialog.py diff --git a/gui/mainFrame.py b/gui/mainFrame.py index f92560e0c..1d1d8d4e0 100644 --- a/gui/mainFrame.py +++ b/gui/mainFrame.py @@ -49,6 +49,7 @@ from gui.graphFrame import GraphFrame from gui.copySelectDialog import CopySelectDialog from gui.utils.clipboard import toClipboard, fromClipboard from gui.fleetBrowser import FleetBrowser +from gui.updateDialog import UpdateDialog from gui.builtinViews import * #dummy panel(no paint no erasebk) @@ -165,8 +166,10 @@ class MainFrame(wx.Frame): self.sUpdate = service.Update.getInstance() self.sUpdate.CheckUpdate(self.ShowUpdateBox) - def ShowUpdateBox(self): - wx.MessageBox('ZOMG UPDATE', 'Info', wx.OK | wx.ICON_INFORMATION) + def ShowUpdateBox(self, release): + dlg = UpdateDialog(self, release) + dlg.ShowModal() + dlg.Destroy() def LoadMainFrameAttribs(self): diff --git a/gui/updateDialog.py b/gui/updateDialog.py new file mode 100644 index 000000000..563eec1e4 --- /dev/null +++ b/gui/updateDialog.py @@ -0,0 +1,98 @@ +#=============================================================================== +# Copyright (C) 2010 Diego Duclos +# +# This file is part of pyfa. +# +# pyfa is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# pyfa is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with pyfa. If not, see . +#=============================================================================== + +import wx +import bitmapLoader +import config + +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.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize ) + + mainSizer = wx.BoxSizer( wx.VERTICAL ) + + headSizer = wx.BoxSizer( wx.HORIZONTAL ) + + self.headingText = wx.StaticText( self, wx.ID_ANY, "Pyfa Update Available!", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE ) + self.headingText.Wrap( -1 ) + self.headingText.SetFont( wx.Font( 14, 74, 90, 92, False) ) + + headSizer.Add( self.headingText, 1, wx.ALL, 5 ) + mainSizer.Add( headSizer, 0, wx.EXPAND, 5 ) + 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 ) + + self.versionText = wx.StaticText( self, wx.ID_ANY, release['tag_name'], wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT ) + 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 ) + 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 ) + + 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 ) + + goSizer = wx.BoxSizer( wx.VERTICAL ) + 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 ) + actionSizer.Add( self.closeButton, 0, wx.ALL, 5 ) + mainSizer.Add( actionSizer, 0, wx.EXPAND, 5 ) + + self.SetSizer( mainSizer ) + self.Layout() + + self.Centre( wx.BOTH ) + + def OnClose(self, e): + + self.Destroy() \ No newline at end of file diff --git a/service/update.py b/service/update.py index 09af1f20f..ba13f03af 100644 --- a/service/update.py +++ b/service/update.py @@ -38,7 +38,7 @@ class CheckUpdateThread(threading.Thread): responseVersion = jsonResponse[0]['tag_name'].replace('v', '', 1) if responseVersion != config.version: print "New version!" - wx.CallAfter(self.callback) + wx.CallAfter(self.callback, jsonResponse[0]) except: pass From 024637432c57162c93a3d7341c62fefd067d80a3 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sat, 15 Feb 2014 21:58:48 -0500 Subject: [PATCH 04/15] Added settings for update notification suppression. --- gui/builtinPreferenceViews/__init__.py | 2 +- .../pyfaUpdatePreferences.py | 61 +++++++++++++++++++ gui/updateDialog.py | 59 +++++++++++------- service/settings.py | 33 +++++++++- service/update.py | 6 +- 5 files changed, 136 insertions(+), 25 deletions(-) create mode 100644 gui/builtinPreferenceViews/pyfaUpdatePreferences.py 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()); From c0b4e736293579f7481a2bdbf0ebe48c78b168bf Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 16 Feb 2014 01:26:13 -0500 Subject: [PATCH 05/15] Added logic for notification suppression, along with other tweaks. Did not worry too much on how to handle pre-releases. --- .../pyfaUpdatePreferences.py | 60 ++++++++++++++++++- gui/updateDialog.py | 24 +++++--- service/settings.py | 9 +-- service/update.py | 39 ++++++++---- 4 files changed, 106 insertions(+), 26 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index 247856b88..dd304a208 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -33,12 +33,53 @@ to receive notifications for 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.suppressPrerelease.Bind(wx.EVT_CHECKBOX, self.OnPrereleaseStateChange) + self.suppressAll.SetValue(self.UpdateSettings.get('all')) + self.suppressPrerelease.SetValue(self.UpdateSettings.get('prerelease')) + + if (self.UpdateSettings.get('version')): + self.versionSizer = wx.BoxSizer( wx.VERTICAL ) + + + self.versionTitle = wx.StaticText( panel, wx.ID_ANY, "Suppressing "+self.UpdateSettings.get('version')+" Notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.versionTitle.Wrap( -1 ) + self.versionTitle.SetFont( wx.Font( 12, 70, 90, 90, False, wx.EmptyString ) ) + + self.versionInfo = ''' +There is a release available which you have chosen to suppress. +You can choose to reset notification suppression for this release, +or download the new release from GitHub. +''' + + self.versionSizer.AddSpacer( ( 5, 5), 0, wx.EXPAND, 5 ) + + self.versionSizer.Add( wx.StaticLine( panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND, 5 ) + self.versionSizer.AddSpacer( ( 5, 5), 0, wx.EXPAND, 5 ) + + self.versionSizer.Add( self.versionTitle, 0, wx.EXPAND, 5 ) + self.versionDesc = wx.StaticText( panel, wx.ID_ANY, self.versionInfo, wx.DefaultPosition, wx.DefaultSize, 0 ) + self.versionSizer.Add( self.versionDesc, 0, wx.ALL, 5 ) + + actionSizer = wx.BoxSizer( wx.HORIZONTAL ) + resetSizer = wx.BoxSizer( wx.VERTICAL ) + + self.downloadButton = wx.Button( panel, wx.ID_ANY, "Download", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.downloadButton.Bind(wx.EVT_BUTTON, self.OnDownload) + resetSizer.Add( self.downloadButton, 0, wx.ALL, 5 ) + actionSizer.Add( resetSizer, 1, wx.EXPAND, 5 ) + + self.resetButton = wx.Button( panel, wx.ID_ANY, "Reset Suppression", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.resetButton.Bind(wx.EVT_BUTTON, self.ResetSuppression) + actionSizer.Add( self.resetButton, 0, wx.ALL, 5 ) + self.versionSizer.Add( actionSizer, 0, wx.EXPAND, 5 ) + mainSizer.Add( self.versionSizer, 0, wx.EXPAND, 5 ) + self.ToggleSuppressAll(self.suppressAll.IsChecked()) panel.SetSizer( mainSizer ) @@ -55,6 +96,23 @@ to receive notifications for self.UpdateSettings.set('all', self.suppressAll.IsChecked()) self.ToggleSuppressAll(self.suppressAll.IsChecked()) + def OnPrereleaseStateChange(self, event): + self.UpdateSettings.set('prerelease', self.suppressPrerelease.IsChecked()) + + def ResetSuppression(self, event): + self.UpdateSettings.set('version', None) + + # Todo: Find a way to hide the entire panel in one go + self.versionSizer.Hide(True) + self.versionTitle.Hide() + self.versionDesc.Hide() + self.downloadButton.Hide() + self.resetButton.Hide() + self.resetButton.Hide() + + def OnDownload(self, event): + wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.UpdateSettings.get('version')) + def getImage(self): return bitmapLoader.getBitmap("pyfa64", "icons") diff --git a/gui/updateDialog.py b/gui/updateDialog.py index 25ec1f693..795bec739 100644 --- a/gui/updateDialog.py +++ b/gui/updateDialog.py @@ -41,6 +41,7 @@ class UpdateDialog(wx.Dialog): headSizer.Add( self.headingText, 1, wx.ALL, 5 ) mainSizer.Add( headSizer, 0, wx.EXPAND, 5 ) + 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 ) @@ -69,7 +70,8 @@ class UpdateDialog(wx.Dialog): notesSizer = wx.BoxSizer( wx.HORIZONTAL ) - 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 ) + self.notesTextCtrl = wx.TextCtrl( self, wx.ID_ANY, self.releaseInfo['body'], wx.DefaultPosition, wx.DefaultSize, wx.TE_AUTO_URL|wx.TE_MULTILINE|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 ) @@ -82,8 +84,9 @@ class UpdateDialog(wx.Dialog): actionSizer = wx.BoxSizer( wx.HORIZONTAL ) goSizer = wx.BoxSizer( wx.VERTICAL ) - self.goButton = wx.Button( self, wx.ID_ANY, "Download", wx.DefaultPosition, wx.DefaultSize, 0 ) - goSizer.Add( self.goButton, 0, wx.ALL, 5 ) + self.downloadButton = wx.Button( self, wx.ID_ANY, "Download", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.downloadButton.Bind(wx.EVT_BUTTON, self.OnDownload) + goSizer.Add( self.downloadButton, 0, wx.ALL, 5 ) actionSizer.Add( goSizer, 1, wx.EXPAND, 5 ) self.closeButton = wx.Button(self, wx.ID_CLOSE) @@ -94,13 +97,12 @@ class UpdateDialog(wx.Dialog): self.SetSizer( mainSizer ) self.Layout() + # Handle use-case of suppressing a release, then a new version becoming available. + # If that new version is not suppressed, the old version will remain in the preferences and + # may cause confusion. If this dialog box is popping up for any reason, that mean we can + # safely reset this setting + self.UpdateSettings.set('version', None) - ''' - 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): @@ -111,3 +113,7 @@ class UpdateDialog(wx.Dialog): self.UpdateSettings.set('version', self.releaseInfo['tag_name']) else: self.UpdateSettings.set('version', None) + + def OnDownload(self, e): + wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.releaseInfo['tag_name']) + self.OnClose(e) \ No newline at end of file diff --git a/service/settings.py b/service/settings.py index c23ed9eb6..adcb2cb35 100644 --- a/service/settings.py +++ b/service/settings.py @@ -38,6 +38,7 @@ class SettingsProvider(): os.mkdir(self.BASE_PATH); def getSettings(self, area, defaults=None): + s = self.settings.get(area) if s is None: p = os.path.join(self.BASE_PATH, area) @@ -239,11 +240,7 @@ class UpdateSettings(): self.serviceUpdateSettings = SettingsProvider.getInstance().getSettings("pyfaServiceUpdateSettings", serviceUpdateDefaultSettings) def get(self, type): - print "Getting "+type+ ": " - print self.serviceUpdateSettings["suppress" + type] - return self.serviceUpdateSettings["suppress" + type] + return self.serviceUpdateSettings[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 + self.serviceUpdateSettings[type] = value \ No newline at end of file diff --git a/service/update.py b/service/update.py index a3f39e586..7279d4a77 100644 --- a/service/update.py +++ b/service/update.py @@ -22,29 +22,49 @@ import wx import urllib2 import json import config - -from service.settings import SettingsProvider, UpdateSettings +import service class CheckUpdateThread(threading.Thread): def __init__(self, callback): threading.Thread.__init__(self) self.callback = callback - self.settings = UpdateSettings.getInstance() + self.settings = service.settings.UpdateSettings.getInstance() def run(self): - print "In the thread" + # Suppress all if (self.settings.get('all')): return try: response = urllib2.urlopen('https://api.github.com/repos/DarkFenX/Pyfa/releases') jsonResponse = json.loads(response.read()); - responseVersion = jsonResponse[0]['tag_name'].replace('v', '', 1) - if responseVersion != config.version: - print "New version!" - wx.CallAfter(self.callback, jsonResponse[0]) - except: + i = 0 + while (True): + release = jsonResponse[i] + + # Suppress pre releases + if (release['prerelease'] and self.settings.get('prerelease')): + i += 1 + continue + + # Handle use-case of updating to suppressed version + if self.settings.get('version') == 'v'+config.version: + self.settings.set('version', None) + + # Suppress version + if (release['tag_name'] == self.settings.get('version')): + return + + version = release['tag_name'].replace('v', '', 1) + if version != config.version: + wx.CallAfter(self.callback, jsonResponse[i]) + break; + + except: # for when there is no internet connection pass + + def versiontuple(v): + return tuple(map(int, (v.split(".")))) class Update(): instance = None @@ -52,7 +72,6 @@ class Update(): pass def CheckUpdate(self, callback): - print "Checking for Updates" thread = CheckUpdateThread(callback) thread.start() From 9c792fc9a72d03d06841979174d09aee73d5ed09 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 16 Feb 2014 18:09:49 -0500 Subject: [PATCH 06/15] Pre-release notifications suppressed by default --- gui/builtinPreferenceViews/pyfaUpdatePreferences.py | 2 +- service/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index dd304a208..2fe33728e 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -32,7 +32,7 @@ to receive notifications for 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 ) + self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Suppress 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 ) diff --git a/service/settings.py b/service/settings.py index adcb2cb35..f77a946b0 100644 --- a/service/settings.py +++ b/service/settings.py @@ -236,7 +236,7 @@ class UpdateSettings(): # 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 } + serviceUpdateDefaultSettings = { "all": False, "prerelease": True, 'version': None } self.serviceUpdateSettings = SettingsProvider.getInstance().getSettings("pyfaServiceUpdateSettings", serviceUpdateDefaultSettings) def get(self, type): From 26b078b69f1168aaf784da66e9d854573a4e098d Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 17 Feb 2014 11:30:04 -0500 Subject: [PATCH 07/15] Tweaking label of update preferences --- gui/builtinPreferenceViews/pyfaUpdatePreferences.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index 2fe33728e..d8c599008 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -14,7 +14,7 @@ class PFUpdatePref (PreferenceView): 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 +to receive notifications for. """ def populatePanel( self, panel ): @@ -31,7 +31,7 @@ to receive notifications for 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.suppressAll = wx.CheckBox( panel, wx.ID_ANY, u"Don't check for updates", wx.DefaultPosition, wx.DefaultSize, 0 ) self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Suppress pre-release notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) mainSizer.Add( self.suppressAll, 0, wx.ALL|wx.EXPAND, 5 ) From 40953655185d8f0931dedbd6e13091d41ccf1b9a Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 17 Feb 2014 22:44:40 -0500 Subject: [PATCH 08/15] Hotfix for issue #48 --- eos/db/gamedata/queries.py | 7 +++++-- service/market.py | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index 93c43fc38..a91409626 100755 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -181,7 +181,8 @@ def getItemsByCategory(filter, where=None, eager=None): return gamedata_session.query(Item).options(*processEager(eager)).join(Item.group, Group.category).filter(filter).all() @cachedQuery(3, "where", "nameLike", "join") -def searchItems(nameLike, where=None, join=None, eager=None): +def searchItems(nameLike, shipSearch=False, where=None, join=None, eager=None): + if not isinstance(nameLike, basestring): raise TypeError("Need string as argument") @@ -195,7 +196,9 @@ def searchItems(nameLike, where=None, join=None, eager=None): for token in nameLike.split(' '): token_safe = u"%{0}%".format(sqlizeString(token)) items = items.filter(processWhere(Item.name.like(token_safe, escape="\\"), where)) - items = items.limit(100).all() + if not shipSearch: + items = items.limit(100) + items = items.all() return items @cachedQuery(2, "where", "itemids") diff --git a/service/market.py b/service/market.py index 96e6b6097..bb51c2195 100644 --- a/service/market.py +++ b/service/market.py @@ -630,7 +630,7 @@ class Market(): def searchShips(self, name): """Find ships according to given text pattern""" - results = eos.db.searchItems(name) + results = eos.db.searchItems(name, True) ships = set() for item in results: if self.getCategoryByItem(item).name == "Ship" and self.getPublicityByItem(item): From 48963167fe667df0f17ea9f44156fecca3c891d5 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 17 Feb 2014 23:29:02 -0500 Subject: [PATCH 09/15] Reverts previous commit and introduces better way to filter ships --- eos/db/gamedata/queries.py | 7 ++----- service/market.py | 7 +++++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/eos/db/gamedata/queries.py b/eos/db/gamedata/queries.py index a91409626..93c43fc38 100755 --- a/eos/db/gamedata/queries.py +++ b/eos/db/gamedata/queries.py @@ -181,8 +181,7 @@ def getItemsByCategory(filter, where=None, eager=None): return gamedata_session.query(Item).options(*processEager(eager)).join(Item.group, Group.category).filter(filter).all() @cachedQuery(3, "where", "nameLike", "join") -def searchItems(nameLike, shipSearch=False, where=None, join=None, eager=None): - +def searchItems(nameLike, where=None, join=None, eager=None): if not isinstance(nameLike, basestring): raise TypeError("Need string as argument") @@ -196,9 +195,7 @@ def searchItems(nameLike, shipSearch=False, where=None, join=None, eager=None): for token in nameLike.split(' '): token_safe = u"%{0}%".format(sqlizeString(token)) items = items.filter(processWhere(Item.name.like(token_safe, escape="\\"), where)) - if not shipSearch: - items = items.limit(100) - items = items.all() + items = items.limit(100).all() return items @cachedQuery(2, "where", "itemids") diff --git a/service/market.py b/service/market.py index bb51c2195..6a8313051 100644 --- a/service/market.py +++ b/service/market.py @@ -630,10 +630,13 @@ class Market(): def searchShips(self, name): """Find ships according to given text pattern""" - results = eos.db.searchItems(name, True) + filter = eos.types.Category.name.in_(["Ship"]) + results = eos.db.searchItems(name, where=filter, + join=(eos.types.Item.group, eos.types.Group.category), + eager=("icon", "group.category", "metaGroup", "metaGroup.parent")) ships = set() for item in results: - if self.getCategoryByItem(item).name == "Ship" and self.getPublicityByItem(item): + if self.getPublicityByItem(item): ships.add(item) return ships From 29fc82b771a93567c5cc2ffde330c74921e77b79 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Tue, 18 Feb 2014 02:04:07 -0500 Subject: [PATCH 10/15] Semantics. Tweaking working not better represents that pre-release notification is opt-in. Thanks Andro! --- gui/builtinPreferenceViews/pyfaUpdatePreferences.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index d8c599008..48b2c27a1 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -32,16 +32,16 @@ to receive notifications for. mainSizer.Add( self.stDesc, 0, wx.ALL, 5 ) self.suppressAll = wx.CheckBox( panel, wx.ID_ANY, u"Don't check for updates", wx.DefaultPosition, wx.DefaultSize, 0 ) - self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Suppress pre-release notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) + self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Allow 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.suppressPrerelease.Bind(wx.EVT_CHECKBOX, self.OnPrereleaseStateChange) - + self.suppressAll.SetValue(self.UpdateSettings.get('all')) - self.suppressPrerelease.SetValue(self.UpdateSettings.get('prerelease')) + self.suppressPrerelease.SetValue(not self.UpdateSettings.get('prerelease')) if (self.UpdateSettings.get('version')): self.versionSizer = wx.BoxSizer( wx.VERTICAL ) From 0826aa4bfe8628265dadde5cf27d1f7e668b1ae2 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Mon, 24 Feb 2014 21:58:42 -0500 Subject: [PATCH 11/15] Fix for issue 52 --- gui/builtinViews/fittingView.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gui/builtinViews/fittingView.py b/gui/builtinViews/fittingView.py index f079adbfa..21bd543a6 100644 --- a/gui/builtinViews/fittingView.py +++ b/gui/builtinViews/fittingView.py @@ -230,7 +230,7 @@ class FittingView(d.Display): self.removeModule(self.mods[row]) self.Select(row,0) row = self.GetNextSelected(row) - + event.Skip() def fitRemoved(self, event): @@ -288,9 +288,8 @@ class FittingView(d.Display): wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) else: populate = cFit.appendModule(fitID, itemID) - if populate: - self.slotsChanged() if populate is not None: + self.slotsChanged() wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID)) event.Skip() @@ -304,14 +303,14 @@ class FittingView(d.Display): else: if "wxMSW" in wx.PlatformInfo: self.click(event) - + def removeModule(self, module): cFit = service.Fit.getInstance() fit = cFit.getFit(self.activeFitID) populate = cFit.removeModule(self.activeFitID, fit.modules.index(module)) - + if populate is not None: - if populate: self.slotsChanged() + self.slotsChanged() wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID)) def swapItems(self, x, y, itemID): @@ -373,16 +372,16 @@ class FittingView(d.Display): if self.activeFitID is not None and self.activeFitID == event.fitID: self.generateMods() self.refresh(self.mods) - + exportHtml.getInstance().refreshFittingHTMl() - + self.Show(self.activeFitID is not None and self.activeFitID == event.fitID) except wx._core.PyDeadObjectError: pass finally: event.Skip() - + def scheduleMenu(self, event): event.Skip() @@ -451,7 +450,7 @@ class FittingView(d.Display): 5: ''} def slotColour(self, slot): return self.slotColourMap[slot] or self.GetBackgroundColour() - + def refresh(self, stuff): d.Display.refresh(self, stuff) sFit = service.Fit.getInstance() @@ -460,7 +459,7 @@ class FittingView(d.Display): for slotType in Slot.getTypes(): slot = Slot.getValue(slotType) slotMap[slot] = fit.getSlotsFree(slot) < 0 - + for i, mod in enumerate(self.mods): if slotMap[mod.slot]: self.SetItemBackgroundColour(i, wx.Colour(204, 51, 51)) From 34f27f79959d131feb7a3ec2ce96a0cdc826dcef Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 2 Mar 2014 17:51:48 -0500 Subject: [PATCH 12/15] Do not commit saved data --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 677cb209f..db7e1e15c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ #Patch files *.patch #Personal +/saveddata From 25c9bfe4d495f615cef296d726ddf3136797c9b2 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 2 Mar 2014 22:45:18 -0500 Subject: [PATCH 13/15] Check to see if release version is actually higher than current version (shouldn't really happen, but who knows) --- service/update.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/service/update.py b/service/update.py index 7279d4a77..5957ec765 100644 --- a/service/update.py +++ b/service/update.py @@ -28,7 +28,7 @@ class CheckUpdateThread(threading.Thread): def __init__(self, callback): threading.Thread.__init__(self) self.callback = callback - self.settings = service.settings.UpdateSettings.getInstance() + self.settings = service.settings.UpdateSettings.getInstance() def run(self): # Suppress all @@ -36,6 +36,7 @@ class CheckUpdateThread(threading.Thread): return try: + # @todo: use proxy settings? response = urllib2.urlopen('https://api.github.com/repos/DarkFenX/Pyfa/releases') jsonResponse = json.loads(response.read()); i = 0 @@ -46,31 +47,32 @@ class CheckUpdateThread(threading.Thread): if (release['prerelease'] and self.settings.get('prerelease')): i += 1 continue - + # Handle use-case of updating to suppressed version if self.settings.get('version') == 'v'+config.version: self.settings.set('version', None) - + # Suppress version if (release['tag_name'] == self.settings.get('version')): - return - + return + version = release['tag_name'].replace('v', '', 1) - if version != config.version: + + if self.versiontuple(version) > self.versiontuple(config.version): wx.CallAfter(self.callback, jsonResponse[i]) break; - + except: # for when there is no internet connection pass - - def versiontuple(v): + + def versiontuple(self, v): return tuple(map(int, (v.split(".")))) class Update(): instance = None def __init__(self): pass - + def CheckUpdate(self, callback): thread = CheckUpdateThread(callback) thread.start() @@ -81,4 +83,4 @@ class Update(): cls.instance = Update() return cls.instance - + From 2ff6ecdbec308b03706fad9cdad6c5b9fea8a660 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 2 Mar 2014 22:55:11 -0500 Subject: [PATCH 14/15] Fixed settings for prerelease suppression --- .../pyfaUpdatePreferences.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py index 48b2c27a1..0655564fd 100644 --- a/gui/builtinPreferenceViews/pyfaUpdatePreferences.py +++ b/gui/builtinPreferenceViews/pyfaUpdatePreferences.py @@ -12,8 +12,8 @@ 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 +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. """ @@ -27,33 +27,33 @@ to receive notifications for. 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"Don't check for updates", wx.DefaultPosition, wx.DefaultSize, 0 ) self.suppressPrerelease = wx.CheckBox( panel, wx.ID_ANY, u"Allow 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.suppressPrerelease.Bind(wx.EVT_CHECKBOX, self.OnPrereleaseStateChange) self.suppressAll.SetValue(self.UpdateSettings.get('all')) self.suppressPrerelease.SetValue(not self.UpdateSettings.get('prerelease')) - + if (self.UpdateSettings.get('version')): self.versionSizer = wx.BoxSizer( wx.VERTICAL ) - + self.versionTitle = wx.StaticText( panel, wx.ID_ANY, "Suppressing "+self.UpdateSettings.get('version')+" Notifications", wx.DefaultPosition, wx.DefaultSize, 0 ) self.versionTitle.Wrap( -1 ) self.versionTitle.SetFont( wx.Font( 12, 70, 90, 90, False, wx.EmptyString ) ) - + self.versionInfo = ''' -There is a release available which you have chosen to suppress. -You can choose to reset notification suppression for this release, +There is a release available which you have chosen to suppress. +You can choose to reset notification suppression for this release, or download the new release from GitHub. ''' @@ -68,7 +68,7 @@ or download the new release from GitHub. actionSizer = wx.BoxSizer( wx.HORIZONTAL ) resetSizer = wx.BoxSizer( wx.VERTICAL ) - + self.downloadButton = wx.Button( panel, wx.ID_ANY, "Download", wx.DefaultPosition, wx.DefaultSize, 0 ) self.downloadButton.Bind(wx.EVT_BUTTON, self.OnDownload) resetSizer.Add( self.downloadButton, 0, wx.ALL, 5 ) @@ -79,9 +79,9 @@ or download the new release from GitHub. actionSizer.Add( self.resetButton, 0, wx.ALL, 5 ) self.versionSizer.Add( actionSizer, 0, wx.EXPAND, 5 ) mainSizer.Add( self.versionSizer, 0, wx.EXPAND, 5 ) - + self.ToggleSuppressAll(self.suppressAll.IsChecked()) - + panel.SetSizer( mainSizer ) panel.Layout() @@ -97,7 +97,7 @@ or download the new release from GitHub. self.ToggleSuppressAll(self.suppressAll.IsChecked()) def OnPrereleaseStateChange(self, event): - self.UpdateSettings.set('prerelease', self.suppressPrerelease.IsChecked()) + self.UpdateSettings.set('prerelease', not self.suppressPrerelease.IsChecked()) def ResetSuppression(self, event): self.UpdateSettings.set('version', None) @@ -109,10 +109,10 @@ or download the new release from GitHub. self.downloadButton.Hide() self.resetButton.Hide() self.resetButton.Hide() - + def OnDownload(self, event): wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.UpdateSettings.get('version')) - + def getImage(self): return bitmapLoader.getBitmap("pyfa64", "icons") From 2d69705469b02c020022c26a07e72ffeb7f5a890 Mon Sep 17 00:00:00 2001 From: blitzmann Date: Sun, 2 Mar 2014 23:42:16 -0500 Subject: [PATCH 15/15] Added date in update message --- gui/updateDialog.py | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/gui/updateDialog.py b/gui/updateDialog.py index 795bec739..ec389186b 100644 --- a/gui/updateDialog.py +++ b/gui/updateDialog.py @@ -21,60 +21,61 @@ import wx import bitmapLoader import config import service +import dateutil.parser 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 ) - + headSizer = wx.BoxSizer( wx.HORIZONTAL ) - + self.headingText = wx.StaticText( self, wx.ID_ANY, "Pyfa Update Available!", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE ) self.headingText.Wrap( -1 ) self.headingText.SetFont( wx.Font( 14, 74, 90, 92, False) ) - + headSizer.Add( self.headingText, 1, wx.ALL, 5 ) mainSizer.Add( headSizer, 0, wx.EXPAND, 5 ) - + 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: + 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, 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 ) - + mainSizer.Add( versionSizer, 0, wx.EXPAND, 5 ) mainSizer.AddSpacer( ( 0, 5), 0, wx.EXPAND, 5 ) + releaseDate = dateutil.parser.parse(self.releaseInfo['created_at']) notesSizer = wx.BoxSizer( wx.HORIZONTAL ) - - self.notesTextCtrl = wx.TextCtrl( self, wx.ID_ANY, self.releaseInfo['body'], wx.DefaultPosition, wx.DefaultSize, wx.TE_AUTO_URL|wx.TE_MULTILINE|wx.TE_READONLY|wx.DOUBLE_BORDER|wx.TRANSPARENT_WINDOW ) + self.notesTextCtrl = wx.TextCtrl( self, wx.ID_ANY, str(releaseDate.date())+":\n\n"+self.releaseInfo['body'], wx.DefaultPosition, wx.DefaultSize, wx.TE_AUTO_URL|wx.TE_MULTILINE|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 remind me again for this release", wx.DefaultPosition, wx.DefaultSize, 0 ) self.supressCheckbox.Bind(wx.EVT_CHECKBOX, self.SuppressChange) @@ -97,23 +98,23 @@ class UpdateDialog(wx.Dialog): self.SetSizer( mainSizer ) self.Layout() - # Handle use-case of suppressing a release, then a new version becoming available. - # If that new version is not suppressed, the old version will remain in the preferences and - # may cause confusion. If this dialog box is popping up for any reason, that mean we can + # Handle use-case of suppressing a release, then a new version becoming available. + # If that new version is not suppressed, the old version will remain in the preferences and + # may cause confusion. If this dialog box is popping up for any reason, that mean we can # safely reset this setting self.UpdateSettings.set('version', None) - + self.Centre( wx.BOTH ) def OnClose(self, e): self.Destroy() - + def SuppressChange(self, e): if (self.supressCheckbox.IsChecked()): self.UpdateSettings.set('version', self.releaseInfo['tag_name']) else: self.UpdateSettings.set('version', None) - + def OnDownload(self, e): wx.LaunchDefaultBrowser('https://github.com/DarkFenX/Pyfa/releases/tag/'+self.releaseInfo['tag_name']) self.OnClose(e) \ No newline at end of file