From c25a07c95b7036e164569c54546fb3e3b00716d7 Mon Sep 17 00:00:00 2001 From: blitzman Date: Tue, 7 Feb 2017 00:32:45 -0500 Subject: [PATCH] Stuff --- gui/builtinGraphs/fitDps.py | 190 +++++------ gui/builtinViewColumns/ammo.py | 116 +++---- gui/builtinViewColumns/ammoIcon.py | 112 +++---- gui/cachingImageList.py | 74 ++--- gui/graph.py | 76 ++--- gui/preferenceDialog.py | 160 ++++----- gui/preferenceView.py | 80 ++--- scripts/dist.py | 514 ++++++++++++++--------------- 8 files changed, 661 insertions(+), 661 deletions(-) diff --git a/gui/builtinGraphs/fitDps.py b/gui/builtinGraphs/fitDps.py index fcbfa68fa..ae03c180b 100644 --- a/gui/builtinGraphs/fitDps.py +++ b/gui/builtinGraphs/fitDps.py @@ -1,95 +1,95 @@ -# ============================================================================= -# 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 . -# ============================================================================= - -from gui.graph import Graph -from gui.bitmapLoader import BitmapLoader -from eos.graph.fitDps import FitDpsGraph as FitDps -from eos.graph import Data -import gui.mainFrame -from service.attribute import Attribute - - -class FitDpsGraph(Graph): - propertyAttributeMap = {"angle": "maxVelocity", - "distance": "maxRange", - "signatureRadius": "signatureRadius", - "velocity": "maxVelocity"} - - propertyLabelMap = {"angle": "Target Angle (degrees)", - "distance": "Distance to Target (km)", - "signatureRadius": "Target Signature Radius (m)", - "velocity": "Target Velocity (m/s)"} - - defaults = FitDps.defaults.copy() - - def __init__(self): - Graph.__init__(self) - self.defaults["distance"] = "0-20" - self.name = "DPS" - self.fitDps = None - self.mainFrame = gui.mainFrame.MainFrame.getInstance() - - def getFields(self): - return self.defaults - - def getLabels(self): - return self.propertyLabelMap - - def getIcons(self): - icons = {} - sAttr = Attribute.getInstance() - for key, attrName in self.propertyAttributeMap.iteritems(): - iconFile = sAttr.getAttributeInfo(attrName).icon.iconFile - bitmap = BitmapLoader.getBitmap(iconFile, "icons") - if bitmap: - icons[key] = bitmap - - return icons - - def getPoints(self, fit, fields): - fitDps = getattr(self, "fitDps", None) - if fitDps is None or fitDps.fit != fit: - fitDps = self.fitDps = FitDps(fit) - - fitDps.clearData() - variable = None - for fieldName, value in fields.iteritems(): - d = Data(fieldName, value) - if not d.isConstant(): - if variable is None: - variable = fieldName - else: - # We can't handle more then one variable atm, OOPS FUCK OUT - return False, "Can only handle 1 variable" - - fitDps.setData(d) - - if variable is None: - return False, "No variable" - - x = [] - y = [] - for point, val in fitDps.getIterator(): - x.append(point[variable]) - y.append(val) - - return x, y - - -FitDpsGraph.register() +# ============================================================================= +# 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 . +# ============================================================================= + +from gui.graph import Graph +from gui.bitmapLoader import BitmapLoader +from eos.graph.fitDps import FitDpsGraph as FitDps +from eos.graph import Data +import gui.mainFrame +from service.attribute import Attribute + + +class FitDpsGraph(Graph): + propertyAttributeMap = {"angle": "maxVelocity", + "distance": "maxRange", + "signatureRadius": "signatureRadius", + "velocity": "maxVelocity"} + + propertyLabelMap = {"angle": "Target Angle (degrees)", + "distance": "Distance to Target (km)", + "signatureRadius": "Target Signature Radius (m)", + "velocity": "Target Velocity (m/s)"} + + defaults = FitDps.defaults.copy() + + def __init__(self): + Graph.__init__(self) + self.defaults["distance"] = "0-20" + self.name = "DPS" + self.fitDps = None + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + + def getFields(self): + return self.defaults + + def getLabels(self): + return self.propertyLabelMap + + def getIcons(self): + icons = {} + sAttr = Attribute.getInstance() + for key, attrName in self.propertyAttributeMap.iteritems(): + iconFile = sAttr.getAttributeInfo(attrName).icon.iconFile + bitmap = BitmapLoader.getBitmap(iconFile, "icons") + if bitmap: + icons[key] = bitmap + + return icons + + def getPoints(self, fit, fields): + fitDps = getattr(self, "fitDps", None) + if fitDps is None or fitDps.fit != fit: + fitDps = self.fitDps = FitDps(fit) + + fitDps.clearData() + variable = None + for fieldName, value in fields.iteritems(): + d = Data(fieldName, value) + if not d.isConstant(): + if variable is None: + variable = fieldName + else: + # We can't handle more then one variable atm, OOPS FUCK OUT + return False, "Can only handle 1 variable" + + fitDps.setData(d) + + if variable is None: + return False, "No variable" + + x = [] + y = [] + for point, val in fitDps.getIterator(): + x.append(point[variable]) + y.append(val) + + return x, y + + +FitDpsGraph.register() diff --git a/gui/builtinViewColumns/ammo.py b/gui/builtinViewColumns/ammo.py index 27a742bce..4cd6a0ba7 100644 --- a/gui/builtinViewColumns/ammo.py +++ b/gui/builtinViewColumns/ammo.py @@ -1,58 +1,58 @@ -# ============================================================================= -# 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 -from eos.types import Fighter -from gui.viewColumn import ViewColumn -from gui.bitmapLoader import BitmapLoader - - -class Ammo(ViewColumn): - name = "Ammo" - - def __init__(self, fittingView, params): - ViewColumn.__init__(self, fittingView) - self.mask = wx.LIST_MASK_IMAGE - self.imageId = fittingView.imageList.GetImageIndex("damagePattern_small", "gui") - self.bitmap = BitmapLoader.getBitmap("damagePattern_small", "gui") - - def getText(self, stuff): - if isinstance(stuff, Fighter): - # this is an experiment, not sure I like it. But it saves us from duplicating code. - col = self.columns['Fighter Abilities'](self.fittingView, {}) - text = col.getText(stuff) - del col - return text - if getattr(stuff, "charge", None) is not None: - charges = stuff.numCharges - if charges > 0: - cycles = stuff.numShots - if cycles != 0 and charges != cycles: - return "%s (%d, %d cycles)" % (stuff.charge.name, charges, cycles) - else: - return "%s (%d)" % (stuff.charge.name, charges) - else: - return stuff.charge.name - return "" - - def getImageId(self, mod): - return -1 - - -Ammo.register() +# ============================================================================= +# 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 +from eos.types import Fighter +from gui.viewColumn import ViewColumn +from gui.bitmapLoader import BitmapLoader + + +class Ammo(ViewColumn): + name = "Ammo" + + def __init__(self, fittingView, params): + ViewColumn.__init__(self, fittingView) + self.mask = wx.LIST_MASK_IMAGE + self.imageId = fittingView.imageList.GetImageIndex("damagePattern_small", "gui") + self.bitmap = BitmapLoader.getBitmap("damagePattern_small", "gui") + + def getText(self, stuff): + if isinstance(stuff, Fighter): + # this is an experiment, not sure I like it. But it saves us from duplicating code. + col = self.columns['Fighter Abilities'](self.fittingView, {}) + text = col.getText(stuff) + del col + return text + if getattr(stuff, "charge", None) is not None: + charges = stuff.numCharges + if charges > 0: + cycles = stuff.numShots + if cycles != 0 and charges != cycles: + return "%s (%d, %d cycles)" % (stuff.charge.name, charges, cycles) + else: + return "%s (%d)" % (stuff.charge.name, charges) + else: + return stuff.charge.name + return "" + + def getImageId(self, mod): + return -1 + + +Ammo.register() diff --git a/gui/builtinViewColumns/ammoIcon.py b/gui/builtinViewColumns/ammoIcon.py index 1dc6906e3..f4f6f7af1 100644 --- a/gui/builtinViewColumns/ammoIcon.py +++ b/gui/builtinViewColumns/ammoIcon.py @@ -1,56 +1,56 @@ -# ============================================================================= -# 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 . -# ============================================================================= - -from gui.viewColumn import ViewColumn -import wx -from eos.types import Module - - -class AmmoIcon(ViewColumn): - name = "Ammo Icon" - - def __init__(self, fittingView, params): - ViewColumn.__init__(self, fittingView) - self.size = 24 - self.maxsize = self.size - self.mask = wx.LIST_MASK_IMAGE - self.columnText = "" - - def getText(self, mod): - return "" - - def getImageId(self, stuff): - if not isinstance(stuff, Module): - return -1 - - if stuff.charge is None: - return -1 - else: - iconFile = stuff.charge.icon.iconFile if stuff.charge.icon else "" - if iconFile: - return self.fittingView.imageList.GetImageIndex(iconFile, "icons") - else: - return -1 - - def getToolTip(self, mod): - if isinstance(mod, Module) and mod.charge is not None: - return mod.charge.name - - -AmmoIcon.register() +# ============================================================================= +# 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 . +# ============================================================================= + +from gui.viewColumn import ViewColumn +import wx +from eos.types import Module + + +class AmmoIcon(ViewColumn): + name = "Ammo Icon" + + def __init__(self, fittingView, params): + ViewColumn.__init__(self, fittingView) + self.size = 24 + self.maxsize = self.size + self.mask = wx.LIST_MASK_IMAGE + self.columnText = "" + + def getText(self, mod): + return "" + + def getImageId(self, stuff): + if not isinstance(stuff, Module): + return -1 + + if stuff.charge is None: + return -1 + else: + iconFile = stuff.charge.icon.iconFile if stuff.charge.icon else "" + if iconFile: + return self.fittingView.imageList.GetImageIndex(iconFile, "icons") + else: + return -1 + + def getToolTip(self, mod): + if isinstance(mod, Module) and mod.charge is not None: + return mod.charge.name + + +AmmoIcon.register() diff --git a/gui/cachingImageList.py b/gui/cachingImageList.py index aceff6775..0762d1687 100644 --- a/gui/cachingImageList.py +++ b/gui/cachingImageList.py @@ -1,37 +1,37 @@ -# ============================================================================= -# 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 -from gui.bitmapLoader import BitmapLoader - - -class CachingImageList(wx.ImageList): - def __init__(self, width, height): - wx.ImageList.__init__(self, width, height) - self.map = {} - - def GetImageIndex(self, *loaderArgs): - id_ = self.map.get(loaderArgs) - if id_ is None: - bitmap = BitmapLoader.getBitmap(*loaderArgs) - if bitmap is None: - return -1 - id_ = self.map[loaderArgs] = wx.ImageList.Add(self, bitmap) - return id_ +# ============================================================================= +# 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 +from gui.bitmapLoader import BitmapLoader + + +class CachingImageList(wx.ImageList): + def __init__(self, width, height): + wx.ImageList.__init__(self, width, height) + self.map = {} + + def GetImageIndex(self, *loaderArgs): + id_ = self.map.get(loaderArgs) + if id_ is None: + bitmap = BitmapLoader.getBitmap(*loaderArgs) + if bitmap is None: + return -1 + id_ = self.map[loaderArgs] = wx.ImageList.Add(self, bitmap) + return id_ diff --git a/gui/graph.py b/gui/graph.py index 0b40902c2..720e10cb8 100644 --- a/gui/graph.py +++ b/gui/graph.py @@ -1,38 +1,38 @@ -# ============================================================================= -# 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 . -# ============================================================================= - - -class Graph(object): - views = [] - - @classmethod - def register(cls): - Graph.views.append(cls) - - def __init__(self): - self.name = "" - - def getFields(self, fit, fields): - raise NotImplementedError() - - def getIcons(self): - return None - - -from gui.builtinGraphs import * # noqa +# ============================================================================= +# 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 . +# ============================================================================= + + +class Graph(object): + views = [] + + @classmethod + def register(cls): + Graph.views.append(cls) + + def __init__(self): + self.name = "" + + def getFields(self, fit, fields): + raise NotImplementedError() + + def getIcons(self): + return None + + +from gui.builtinGraphs import * # noqa diff --git a/gui/preferenceDialog.py b/gui/preferenceDialog.py index 1d1146c85..1d36d0d03 100644 --- a/gui/preferenceDialog.py +++ b/gui/preferenceDialog.py @@ -1,80 +1,80 @@ -# ============================================================================= -# 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 -from gui.preferenceView import PreferenceView -from gui.bitmapLoader import BitmapLoader - - -class PreferenceDialog(wx.Dialog): - def __init__(self, parent): - wx.Dialog.__init__(self, parent, id=wx.ID_ANY, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE) - self.SetTitle("pyfa - Preferences") - i = wx.IconFromBitmap(BitmapLoader.getBitmap("preferences_small", "gui")) - self.SetIcon(i) - mainSizer = wx.BoxSizer(wx.VERTICAL) - - self.listbook = wx.Listbook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LB_DEFAULT) - - self.listview = self.listbook.GetListView() - # self.listview.SetMinSize((500, -1)) - # self.listview.SetSize((500, -1)) - - self.imageList = wx.ImageList(32, 32) - self.listbook.SetImageList(self.imageList) - - mainSizer.Add(self.listbook, 1, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.LEFT, 5) - - self.m_staticline2 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) - mainSizer.Add(self.m_staticline2, 0, wx.EXPAND, 5) - - btnSizer = wx.BoxSizer(wx.HORIZONTAL) - btnSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5) - self.btnOK = wx.Button(self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0) - btnSizer.Add(self.btnOK, 0, wx.ALL, 5) - mainSizer.Add(btnSizer, 0, wx.EXPAND, 5) - self.SetSizer(mainSizer) - - self.Centre(wx.BOTH) - - for prefView in PreferenceView.views: - page = wx.Panel(self.listbook) - bmp = prefView.getImage() - if bmp: - imgID = self.imageList.Add(bmp) - else: - imgID = -1 - prefView.populatePanel(page) - self.listbook.AddPage(page, prefView.title, imageId=imgID) - - # Set the height based on a condition. Can all the panels fit in the current height? - # If not, use the .GetBestVirtualSize() to ensure that all content is available. - minHeight = 360 - bestFit = self.GetBestVirtualSize() - if minHeight > bestFit[1]: - self.SetSizeWH(450, minHeight) - else: - self.SetSizeWH(450, bestFit[1]) - - self.Layout() - - self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK) - - def OnBtnOK(self, event): - self.Close() +# ============================================================================= +# 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 +from gui.preferenceView import PreferenceView +from gui.bitmapLoader import BitmapLoader + + +class PreferenceDialog(wx.Dialog): + def __init__(self, parent): + wx.Dialog.__init__(self, parent, id=wx.ID_ANY, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE) + self.SetTitle("pyfa - Preferences") + i = wx.IconFromBitmap(BitmapLoader.getBitmap("preferences_small", "gui")) + self.SetIcon(i) + mainSizer = wx.BoxSizer(wx.VERTICAL) + + self.listbook = wx.Listbook(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LB_DEFAULT) + + self.listview = self.listbook.GetListView() + # self.listview.SetMinSize((500, -1)) + # self.listview.SetSize((500, -1)) + + self.imageList = wx.ImageList(32, 32) + self.listbook.SetImageList(self.imageList) + + mainSizer.Add(self.listbook, 1, wx.EXPAND | wx.TOP | wx.BOTTOM | wx.LEFT, 5) + + self.m_staticline2 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) + mainSizer.Add(self.m_staticline2, 0, wx.EXPAND, 5) + + btnSizer = wx.BoxSizer(wx.HORIZONTAL) + btnSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5) + self.btnOK = wx.Button(self, wx.ID_ANY, u"OK", wx.DefaultPosition, wx.DefaultSize, 0) + btnSizer.Add(self.btnOK, 0, wx.ALL, 5) + mainSizer.Add(btnSizer, 0, wx.EXPAND, 5) + self.SetSizer(mainSizer) + + self.Centre(wx.BOTH) + + for prefView in PreferenceView.views: + page = wx.Panel(self.listbook) + bmp = prefView.getImage() + if bmp: + imgID = self.imageList.Add(bmp) + else: + imgID = -1 + prefView.populatePanel(page) + self.listbook.AddPage(page, prefView.title, imageId=imgID) + + # Set the height based on a condition. Can all the panels fit in the current height? + # If not, use the .GetBestVirtualSize() to ensure that all content is available. + minHeight = 360 + bestFit = self.GetBestVirtualSize() + if minHeight > bestFit[1]: + self.SetSizeWH(450, minHeight) + else: + self.SetSizeWH(450, bestFit[1]) + + self.Layout() + + self.btnOK.Bind(wx.EVT_BUTTON, self.OnBtnOK) + + def OnBtnOK(self, event): + self.Close() diff --git a/gui/preferenceView.py b/gui/preferenceView.py index 9dd58c9e9..06e7d10e2 100644 --- a/gui/preferenceView.py +++ b/gui/preferenceView.py @@ -1,40 +1,40 @@ -# ============================================================================= -# 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 - - -class PreferenceView(object): - views = [] - - @classmethod - def register(cls): - PreferenceView.views.append(cls()) - - def populatePanel(self, panel): - raise NotImplementedError() - - def refreshPanel(self, fit): - raise NotImplementedError() - - def getImage(self): - return wx.NullBitmap - - -from gui.builtinPreferenceViews import * # noqa +# ============================================================================= +# 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 + + +class PreferenceView(object): + views = [] + + @classmethod + def register(cls): + PreferenceView.views.append(cls()) + + def populatePanel(self, panel): + raise NotImplementedError() + + def refreshPanel(self, fit): + raise NotImplementedError() + + def getImage(self): + return wx.NullBitmap + + +from gui.builtinPreferenceViews import * # noqa diff --git a/scripts/dist.py b/scripts/dist.py index 3d6f7c3af..588418a39 100755 --- a/scripts/dist.py +++ b/scripts/dist.py @@ -1,257 +1,257 @@ -#!/usr/bin/env python -""" -Script for generating distributables based on platform skeletons. - -User supplies path for pyfa code base, root skeleton directory, and where the -builds go. The builds are automatically named depending on the pyfa config -values of `version` and `tag`. If it's a Stable release, the naming -convention is: - - pyfa-pyfaversion-expansion-expversion-platform - -If it is not Stable (tag=git), we determine if the pyfa code base includes -the git repo to use as an ID. If not, uses randomly generated 6-character ID. -The unstable naming convention: - - pyfa-YYYMMDD-id-platform - -dist.py can also build the Windows installer provided that it has a path to -Inno Setup (and, for generating on non-Windows platforms, that WINE is -installed). To build the EXE file, `win` must be included in the platforms to -be built. -""" - -#@todo: ensure build directory can be written to -# todo: default build and dist directories - -from optparse import OptionParser -import os.path -import shutil -import sys -import tarfile -import datetime -import random -import string -import zipfile -import errno -from subprocess import call - -class FileStub(): - def write(self, *args): - pass - - def flush(self, *args): - pass - -i = 0 -def loginfo(path, names): - # Print out a "progress" and return directories / files to ignore - global i - i += 1 - if i % 10 == 0: - sys.stdout.write(".") - sys.stdout.flush() - return () - -def copyanything(src, dst): - try: - shutil.copytree(src, dst, ignore=loginfo) - except: # python >2.5 - try: - shutil.copy(src, dst) - except: - raise - -def id_generator(size=6, chars=string.ascii_uppercase + string.digits): - return ''.join(random.choice(chars) for x in range(size)) - -def zipdir(path, zip): - for root, dirs, files in os.walk(path): - for file in files: - zip.write(os.path.join(root, file)) - -skels = ['win', 'src', 'mac', 'mac-deprecated'] -iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine - -if __name__ == "__main__": - oldstd = sys.stdout - parser = OptionParser() - parser.add_option("-s", "--skeleton", dest="skeleton", help="Location of Pyfa-skel directory") - parser.add_option("-b", "--base", dest="base", help="Location of cleaned read-only base directory") - parser.add_option("-d", "--destination", dest="destination", help="Where to copy our distributable") - parser.add_option("-p", "--platforms", dest="platforms", help="Comma-separated list of platforms to build", default=','.join(skels)) - parser.add_option("-q", "--quiet", dest="silent", action="store_true") - parser.add_option("-w", "--winexe", dest="winexe", action="store_true", help="Build the Windows installer file (needs Inno Setup). Must include 'win' in platform options") - parser.add_option("-z", "--zip", dest="zip", action="store_true", help="zip archive instead of tar") - - options, args = parser.parse_args() - - if options.skeleton is None or options.base is None or options.destination is None: - print "Need --skeleton argument as well as --base and --destination argument" - parser.print_help() - sys.exit() - - if options.silent: - sys.stdout = FileStub() - - options.platforms = options.platforms.split(",") - - for skel in skels: - if skel not in options.platforms: - continue - - print "\n======== %s ========"%skel - - info = {} - config = {} - setup = {} - skeleton = os.path.expanduser(os.path.join(options.skeleton, skel)) - - execfile(os.path.join(options.base, "config.py"), config) - execfile(os.path.join(skeleton, "info.py"), info) - execfile(os.path.join(options.base, "setup.py"), setup) - - destination = os.path.expanduser(options.destination) - if not os.path.isdir(destination) or not os.access(destination, os.W_OK | os.X_OK): - print "Destination directory does not exist or is not writable: {}".format(destination) - sys.exit() - - dirName = info["arcname"] - - nowdt = datetime.datetime.now() - now = "%04d%02d%02d" % (nowdt.year, nowdt.month, nowdt.day) - - git = False - if config['tag'].lower() == "git": - try: # if there is a git repo associated with base, use master commit - with open(os.path.join(options.base, ".git", "refs", "heads", "master"), 'r') as f: - id = f.readline()[0:6] - git = True - except: # else, use custom ID - id = id_generator() - fileName = "pyfa-{}-{}-{}".format(now, id, info["os"]) - else: - fileName = "pyfa-{}-{}-{}-{}".format( - config['version'], - config['expansionName'].lower(), - config['expansionVersion'], - info["os"] - ) - - archiveName = "{}.{}".format(fileName, "zip" if options.zip else "tar.bz2") - tmpDir = os.path.join(os.getcwd(), dirName) # tmp directory where files are copied - tmpFile = os.path.join(os.getcwd(), archiveName) - - try: - print "Copying skeleton to ", tmpDir - shutil.copytree(skeleton, tmpDir, ignore=loginfo) - print - source = os.path.expanduser(options.base) - root = os.path.join(tmpDir, info["base"]) - - # it is easier to work from the source directory - oldcwd = os.getcwd() - os.chdir(source) - - if info["library"]: - print "Injecting files into", info["library"] - libraryFile = os.path.join(root, info["library"]) - - with zipfile.ZipFile(libraryFile, 'a') as library: - for dir in setup['packages']: - zipdir(dir, library) - library.write('pyfa.py', 'pyfa__main__.py') - library.write('config.py') - else: # platforms where we don't have a packaged library - print "Copying modules into", root - for dir in setup['packages']: - copyanything(dir, os.path.join(root, dir)) - - # add some additional files to root dir for these platforms - # (hopefully can figure out a way later for OS X to use the one in - # it's library) - if skel == 'mac': - setup['include_files'] += ['pyfa.py'] - if skel in ('src', 'mac-deprecated'): - setup['include_files'] += ['pyfa.py', 'config.py'] - - print - print "Copying included files:", - - for file in setup['include_files']: - if isinstance(file, basestring): - print file, - copyanything(file, os.path.join(root, file)) - - print - print "Creating images zipfile:", - os.chdir('imgs') - imagesFile = os.path.join(root, "imgs.zip") - - with zipfile.ZipFile(imagesFile, 'w') as images: - for dir in setup['icon_dirs']: - print dir, - zipdir(dir, images) - os.chdir(oldcwd) - - print - print "Creating archive" - if options.zip: - archive = zipfile.ZipFile(tmpFile, 'w', compression=zipfile.ZIP_DEFLATED) - zipdir(dirName, archive) - archive.close() - else: - archive = tarfile.open(tmpFile, "w:bz2") - archive.add(tmpDir, arcname=info["arcname"]) - archive.close() - - print "Moving archive to ", destination - shutil.move(tmpFile, destination) - - if "win" in skel and options.winexe: - print "Compiling EXE" - - if config['tag'].lower() == "git": - if git: # if git repo info available, use git commit - expansion = "git-%s"%(id) - else: # if there is no git repo, use timestamp - expansion = now - else: # if code is Stable, use expansion name - expansion = "%s %s"%(config['expansionName'], config['expansionVersion']), - - calllist = ["wine"] if 'win' not in sys.platform else [] - - call(calllist + [ - iscc, - "pyfa-setup.iss", - "/dMyAppVersion=%s"%(config['version']), - "/dMyAppExpansion=%s"%(expansion), - "/dMyAppDir=pyfa", - "/dMyOutputDir=%s"%destination, - "/dMyOutputFile=%s"%fileName]) #stdout=devnull, stderr=devnull - - print "EXE completed" - - except Exception as e: - print "Encountered an error: \n\t", e - raise - finally: - print "Deleting tmp files\n" - try: - shutil.rmtree("dist") # Inno dir - except: - pass - try: - shutil.rmtree(tmpDir) - except: - pass - try: - os.unlink(tmpFile) - except: - pass - - sys.stdout = oldstd - if os.path.isdir(destination): - print os.path.join(destination, os.path.split(tmpFile)[1]) - else: - print destination +#!/usr/bin/env python +""" +Script for generating distributables based on platform skeletons. + +User supplies path for pyfa code base, root skeleton directory, and where the +builds go. The builds are automatically named depending on the pyfa config +values of `version` and `tag`. If it's a Stable release, the naming +convention is: + + pyfa-pyfaversion-expansion-expversion-platform + +If it is not Stable (tag=git), we determine if the pyfa code base includes +the git repo to use as an ID. If not, uses randomly generated 6-character ID. +The unstable naming convention: + + pyfa-YYYMMDD-id-platform + +dist.py can also build the Windows installer provided that it has a path to +Inno Setup (and, for generating on non-Windows platforms, that WINE is +installed). To build the EXE file, `win` must be included in the platforms to +be built. +""" + +#@todo: ensure build directory can be written to +# todo: default build and dist directories + +from optparse import OptionParser +import os.path +import shutil +import sys +import tarfile +import datetime +import random +import string +import zipfile +import errno +from subprocess import call + +class FileStub(): + def write(self, *args): + pass + + def flush(self, *args): + pass + +i = 0 +def loginfo(path, names): + # Print out a "progress" and return directories / files to ignore + global i + i += 1 + if i % 10 == 0: + sys.stdout.write(".") + sys.stdout.flush() + return () + +def copyanything(src, dst): + try: + shutil.copytree(src, dst, ignore=loginfo) + except: # python >2.5 + try: + shutil.copy(src, dst) + except: + raise + +def id_generator(size=6, chars=string.ascii_uppercase + string.digits): + return ''.join(random.choice(chars) for x in range(size)) + +def zipdir(path, zip): + for root, dirs, files in os.walk(path): + for file in files: + zip.write(os.path.join(root, file)) + +skels = ['win', 'src', 'mac', 'mac-deprecated'] +iscc = "C:\Program Files (x86)\Inno Setup 5\ISCC.exe" # inno script location via wine + +if __name__ == "__main__": + oldstd = sys.stdout + parser = OptionParser() + parser.add_option("-s", "--skeleton", dest="skeleton", help="Location of Pyfa-skel directory") + parser.add_option("-b", "--base", dest="base", help="Location of cleaned read-only base directory") + parser.add_option("-d", "--destination", dest="destination", help="Where to copy our distributable") + parser.add_option("-p", "--platforms", dest="platforms", help="Comma-separated list of platforms to build", default=','.join(skels)) + parser.add_option("-q", "--quiet", dest="silent", action="store_true") + parser.add_option("-w", "--winexe", dest="winexe", action="store_true", help="Build the Windows installer file (needs Inno Setup). Must include 'win' in platform options") + parser.add_option("-z", "--zip", dest="zip", action="store_true", help="zip archive instead of tar") + + options, args = parser.parse_args() + + if options.skeleton is None or options.base is None or options.destination is None: + print "Need --skeleton argument as well as --base and --destination argument" + parser.print_help() + sys.exit() + + if options.silent: + sys.stdout = FileStub() + + options.platforms = options.platforms.split(",") + + for skel in skels: + if skel not in options.platforms: + continue + + print "\n======== %s ========"%skel + + info = {} + config = {} + setup = {} + skeleton = os.path.expanduser(os.path.join(options.skeleton, skel)) + + execfile(os.path.join(options.base, "config.py"), config) + execfile(os.path.join(skeleton, "info.py"), info) + execfile(os.path.join(options.base, "setup.py"), setup) + + destination = os.path.expanduser(options.destination) + if not os.path.isdir(destination) or not os.access(destination, os.W_OK | os.X_OK): + print "Destination directory does not exist or is not writable: {}".format(destination) + sys.exit() + + dirName = info["arcname"] + + nowdt = datetime.datetime.now() + now = "%04d%02d%02d" % (nowdt.year, nowdt.month, nowdt.day) + + git = False + if config['tag'].lower() == "git": + try: # if there is a git repo associated with base, use master commit + with open(os.path.join(options.base, ".git", "refs", "heads", "master"), 'r') as f: + id = f.readline()[0:6] + git = True + except: # else, use custom ID + id = id_generator() + fileName = "pyfa-{}-{}-{}".format(now, id, info["os"]) + else: + fileName = "pyfa-{}-{}-{}-{}".format( + config['version'], + config['expansionName'].lower(), + config['expansionVersion'], + info["os"] + ) + + archiveName = "{}.{}".format(fileName, "zip" if options.zip else "tar.bz2") + tmpDir = os.path.join(os.getcwd(), dirName) # tmp directory where files are copied + tmpFile = os.path.join(os.getcwd(), archiveName) + + try: + print "Copying skeleton to ", tmpDir + shutil.copytree(skeleton, tmpDir, ignore=loginfo) + print + source = os.path.expanduser(options.base) + root = os.path.join(tmpDir, info["base"]) + + # it is easier to work from the source directory + oldcwd = os.getcwd() + os.chdir(source) + + if info["library"]: + print "Injecting files into", info["library"] + libraryFile = os.path.join(root, info["library"]) + + with zipfile.ZipFile(libraryFile, 'a') as library: + for dir in setup['packages']: + zipdir(dir, library) + library.write('pyfa.py', 'pyfa__main__.py') + library.write('config.py') + else: # platforms where we don't have a packaged library + print "Copying modules into", root + for dir in setup['packages']: + copyanything(dir, os.path.join(root, dir)) + + # add some additional files to root dir for these platforms + # (hopefully can figure out a way later for OS X to use the one in + # it's library) + if skel == 'mac': + setup['include_files'] += ['pyfa.py'] + if skel in ('src', 'mac-deprecated'): + setup['include_files'] += ['pyfa.py', 'config.py'] + + print + print "Copying included files:", + + for file in setup['include_files']: + if isinstance(file, basestring): + print file, + copyanything(file, os.path.join(root, file)) + + print + print "Creating images zipfile:", + os.chdir('imgs') + imagesFile = os.path.join(root, "imgs.zip") + + with zipfile.ZipFile(imagesFile, 'w') as images: + for dir in setup['icon_dirs']: + print dir, + zipdir(dir, images) + os.chdir(oldcwd) + + print + print "Creating archive" + if options.zip: + archive = zipfile.ZipFile(tmpFile, 'w', compression=zipfile.ZIP_DEFLATED) + zipdir(dirName, archive) + archive.close() + else: + archive = tarfile.open(tmpFile, "w:bz2") + archive.add(tmpDir, arcname=info["arcname"]) + archive.close() + + print "Moving archive to ", destination + shutil.move(tmpFile, destination) + + if "win" in skel and options.winexe: + print "Compiling EXE" + + if config['tag'].lower() == "git": + if git: # if git repo info available, use git commit + expansion = "git-%s"%(id) + else: # if there is no git repo, use timestamp + expansion = now + else: # if code is Stable, use expansion name + expansion = "%s %s"%(config['expansionName'], config['expansionVersion']), + + calllist = ["wine"] if 'win' not in sys.platform else [] + + call(calllist + [ + iscc, + "pyfa-setup.iss", + "/dMyAppVersion=%s"%(config['version']), + "/dMyAppExpansion=%s"%(expansion), + "/dMyAppDir=pyfa", + "/dMyOutputDir=%s"%destination, + "/dMyOutputFile=%s"%fileName]) #stdout=devnull, stderr=devnull + + print "EXE completed" + + except Exception as e: + print "Encountered an error: \n\t", e + raise + finally: + print "Deleting tmp files\n" + try: + shutil.rmtree("dist") # Inno dir + except: + pass + try: + shutil.rmtree(tmpDir) + except: + pass + try: + os.unlink(tmpFile) + except: + pass + + sys.stdout = oldstd + if os.path.isdir(destination): + print os.path.join(destination, os.path.split(tmpFile)[1]) + else: + print destination