Merge tag 'v2.0.1' into singularity (bring sisi code up to date with pyfa 2 / py3 / wx4)
# Conflicts: # eos/effects/techtwocommandburstbonus.py
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.builtinAdditionPanes.boosterView import BoosterView
|
||||
from gui.builtinAdditionPanes.cargoView import CargoView
|
||||
from gui.builtinAdditionPanes.commandView import CommandView
|
||||
@@ -29,22 +29,22 @@ from gui.builtinAdditionPanes.fighterView import FighterView
|
||||
from gui.builtinAdditionPanes.implantView import ImplantView
|
||||
from gui.builtinAdditionPanes.notesView import NotesView
|
||||
from gui.builtinAdditionPanes.projectedView import ProjectedView
|
||||
from gui.chromeTabs import PFNotebook
|
||||
from gui.pyfatogglepanel import TogglePanel
|
||||
from gui.chrome_tabs import ChromeNotebook
|
||||
from gui.toggle_panel import TogglePanel
|
||||
|
||||
|
||||
class AdditionsPane(TogglePanel):
|
||||
def __init__(self, parent):
|
||||
|
||||
TogglePanel.__init__(self, parent, forceLayout=1)
|
||||
TogglePanel.__init__(self, parent, force_layout=1)
|
||||
|
||||
self.SetLabel("Additions")
|
||||
pane = self.GetContentPane()
|
||||
pane = self.GetContentPanel()
|
||||
|
||||
baseSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
pane.SetSizer(baseSizer)
|
||||
|
||||
self.notebook = PFNotebook(pane, False)
|
||||
self.notebook = ChromeNotebook(pane, False)
|
||||
self.notebook.SetMinSize((-1, 1000))
|
||||
|
||||
baseSizer.Add(self.notebook, 1, wx.EXPAND)
|
||||
@@ -59,28 +59,28 @@ class AdditionsPane(TogglePanel):
|
||||
notesImg = BitmapLoader.getImage("skill_small", "gui")
|
||||
|
||||
self.drone = DroneView(self.notebook)
|
||||
self.notebook.AddPage(self.drone, "Drones", tabImage=droneImg, showClose=False)
|
||||
self.notebook.AddPage(self.drone, "Drones", image=droneImg, closeable=False)
|
||||
|
||||
self.fighter = FighterView(self.notebook)
|
||||
self.notebook.AddPage(self.fighter, "Fighters", tabImage=fighterImg, showClose=False)
|
||||
self.notebook.AddPage(self.fighter, "Fighters", image=fighterImg, closeable=False)
|
||||
|
||||
self.cargo = CargoView(self.notebook)
|
||||
self.notebook.AddPage(self.cargo, "Cargo", tabImage=cargoImg, showClose=False)
|
||||
self.notebook.AddPage(self.cargo, "Cargo", image=cargoImg, closeable=False)
|
||||
|
||||
self.implant = ImplantView(self.notebook)
|
||||
self.notebook.AddPage(self.implant, "Implants", tabImage=implantImg, showClose=False)
|
||||
self.notebook.AddPage(self.implant, "Implants", image=implantImg, closeable=False)
|
||||
|
||||
self.booster = BoosterView(self.notebook)
|
||||
self.notebook.AddPage(self.booster, "Boosters", tabImage=boosterImg, showClose=False)
|
||||
self.notebook.AddPage(self.booster, "Boosters", image=boosterImg, closeable=False)
|
||||
|
||||
self.projectedPage = ProjectedView(self.notebook)
|
||||
self.notebook.AddPage(self.projectedPage, "Projected", tabImage=projectedImg, showClose=False)
|
||||
self.notebook.AddPage(self.projectedPage, "Projected", image=projectedImg, closeable=False)
|
||||
|
||||
self.gangPage = CommandView(self.notebook)
|
||||
self.notebook.AddPage(self.gangPage, "Command", tabImage=gangImg, showClose=False)
|
||||
self.notebook.AddPage(self.gangPage, "Command", image=gangImg, closeable=False)
|
||||
|
||||
self.notes = NotesView(self.notebook)
|
||||
self.notebook.AddPage(self.notes, "Notes", tabImage=notesImg, showClose=False)
|
||||
self.notebook.AddPage(self.notes, "Notes", image=notesImg, closeable=False)
|
||||
|
||||
self.notebook.SetSelection(0)
|
||||
|
||||
@@ -92,19 +92,16 @@ class AdditionsPane(TogglePanel):
|
||||
def getName(self, idx):
|
||||
return self.PANES[idx]
|
||||
|
||||
def toggleContent(self, event):
|
||||
TogglePanel.toggleContent(self, event)
|
||||
h = self.headerPanel.GetSize()[1] + 4
|
||||
def ToggleContent(self, event):
|
||||
TogglePanel.ToggleContent(self, event)
|
||||
h = self.header_panel.GetSize()[1] + 4
|
||||
|
||||
if self.IsCollapsed():
|
||||
self.old_pos = self.parent.GetSashPosition()
|
||||
self.parent.SetMinimumPaneSize(h)
|
||||
self.parent.SetSashPosition(h * -1, True)
|
||||
# only available in >= wx2.9
|
||||
if getattr(self.parent, "SetSashInvisible", None):
|
||||
self.parent.SetSashInvisible(True)
|
||||
self.parent.SetSashInvisible(True)
|
||||
else:
|
||||
if getattr(self.parent, "SetSashInvisible", None):
|
||||
self.parent.SetSashInvisible(False)
|
||||
self.parent.SetSashInvisible(False)
|
||||
self.parent.SetMinimumPaneSize(200)
|
||||
self.parent.SetSashPosition(self.old_pos, True)
|
||||
|
||||
@@ -17,9 +17,10 @@
|
||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||
# =============================================================================
|
||||
|
||||
import cStringIO
|
||||
import io
|
||||
import os.path
|
||||
import zipfile
|
||||
from collections import OrderedDict
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
@@ -29,23 +30,18 @@ import config
|
||||
from logbook import Logger
|
||||
logging = Logger(__name__)
|
||||
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from utils.compat import OrderedDict
|
||||
|
||||
|
||||
class BitmapLoader(object):
|
||||
try:
|
||||
archive = zipfile.ZipFile(os.path.join(config.pyfaPath, 'imgs.zip'), 'r')
|
||||
logging.info("Using zipped image files.")
|
||||
except IOError:
|
||||
except (IOError, TypeError):
|
||||
logging.info("Using local image files.")
|
||||
archive = None
|
||||
|
||||
cachedBitmaps = OrderedDict()
|
||||
dontUseCachedBitmaps = False
|
||||
max_bmps = 500
|
||||
cached_bitmaps = OrderedDict()
|
||||
dont_use_cached_bitmaps = False
|
||||
max_cached_bitmaps = 500
|
||||
|
||||
@classmethod
|
||||
def getStaticBitmap(cls, name, parent, location):
|
||||
@@ -55,25 +51,25 @@ class BitmapLoader(object):
|
||||
|
||||
@classmethod
|
||||
def getBitmap(cls, name, location):
|
||||
if cls.dontUseCachedBitmaps:
|
||||
if cls.dont_use_cached_bitmaps:
|
||||
img = cls.getImage(name, location)
|
||||
if img is not None:
|
||||
return img.ConvertToBitmap()
|
||||
|
||||
path = "%s%s" % (name, location)
|
||||
|
||||
if len(cls.cachedBitmaps) == cls.max_bmps:
|
||||
cls.cachedBitmaps.popitem(False)
|
||||
if len(cls.cached_bitmaps) == cls.max_cached_bitmaps:
|
||||
cls.cached_bitmaps.popitem(False)
|
||||
|
||||
if path not in cls.cachedBitmaps:
|
||||
if path not in cls.cached_bitmaps:
|
||||
img = cls.getImage(name, location)
|
||||
if img is not None:
|
||||
bmp = img.ConvertToBitmap()
|
||||
else:
|
||||
bmp = None
|
||||
cls.cachedBitmaps[path] = bmp
|
||||
cls.cached_bitmaps[path] = bmp
|
||||
else:
|
||||
bmp = cls.cachedBitmaps[path]
|
||||
bmp = cls.cached_bitmaps[path]
|
||||
|
||||
return bmp
|
||||
|
||||
@@ -88,14 +84,14 @@ class BitmapLoader(object):
|
||||
|
||||
try:
|
||||
img_data = cls.archive.read(path)
|
||||
sbuf = cStringIO.StringIO(img_data)
|
||||
sbuf = io.StringIO(img_data)
|
||||
return wx.ImageFromStream(sbuf)
|
||||
except KeyError:
|
||||
print("Missing icon file from zip: {0}".format(path))
|
||||
print(("Missing icon file from zip: {0}".format(path)))
|
||||
else:
|
||||
path = os.path.join(config.pyfaPath, 'imgs' + os.sep + location + os.sep + filename)
|
||||
|
||||
if os.path.exists(path):
|
||||
return wx.Image(path)
|
||||
else:
|
||||
print("Missing icon file: {0}".format(path))
|
||||
print(("Missing icon file: {0}".format(path)))
|
||||
@@ -28,12 +28,12 @@ from gui.utils.staticHelpers import DragDropHelper
|
||||
from service.fit import Fit
|
||||
|
||||
|
||||
class BoosterViewDrop(wx.PyDropTarget):
|
||||
class BoosterViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(BoosterViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -131,6 +131,7 @@ class BoosterView(d.Display):
|
||||
fit = sFit.getFit(fitID)
|
||||
|
||||
if not fit or fit.isStructure:
|
||||
event.Skip()
|
||||
return
|
||||
|
||||
trigger = sFit.addBooster(fitID, event.itemID)
|
||||
|
||||
@@ -28,12 +28,12 @@ from service.fit import Fit
|
||||
from service.market import Market
|
||||
|
||||
|
||||
class CargoViewDrop(wx.PyDropTarget):
|
||||
class CargoViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(CargoViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -88,7 +88,7 @@ class CargoView(d.Display):
|
||||
row = event.GetIndex()
|
||||
|
||||
if row != -1:
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "cargo:" + str(row)
|
||||
data.SetText(dataStr)
|
||||
|
||||
@@ -119,14 +119,14 @@ class CargoView(d.Display):
|
||||
module = fit.modules[modIdx]
|
||||
|
||||
if dstRow != -1: # we're swapping with cargo
|
||||
if mstate.CmdDown(): # if copying, append to cargo
|
||||
if mstate.cmdDown: # if copying, append to cargo
|
||||
sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID)
|
||||
else: # else, move / swap
|
||||
sFit.moveCargoToModule(self.mainFrame.getActiveFit(), module.position, dstRow)
|
||||
else: # dragging to blank spot, append
|
||||
sFit.addCargo(self.mainFrame.getActiveFit(), module.item.ID)
|
||||
|
||||
if not mstate.CmdDown(): # if not copying, remove module
|
||||
if not mstate.cmdDown: # if not copying, remove module
|
||||
sFit.removeModule(self.mainFrame.getActiveFit(), module.position)
|
||||
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit(), action="moddel", typeID=module.item.ID))
|
||||
|
||||
@@ -43,12 +43,12 @@ class DummyEntry(object):
|
||||
self.item = DummyItem(txt)
|
||||
|
||||
|
||||
class CommandViewDrop(wx.PyDropTarget):
|
||||
class CommandViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(CommandViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -119,7 +119,7 @@ class CommandView(d.Display):
|
||||
def startDrag(self, event):
|
||||
row = event.GetIndex()
|
||||
if row != -1 and isinstance(self.get(row), es_Drone):
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "command:" + str(self.GetItemData(row))
|
||||
data.SetText(dataStr)
|
||||
|
||||
@@ -136,6 +136,8 @@ class CommandView(d.Display):
|
||||
sFit = Fit.getInstance()
|
||||
fit = sFit.getFit(event.fitID)
|
||||
|
||||
CommandFits.populateFits(event)
|
||||
|
||||
self.Parent.Parent.DisablePage(self, not fit or fit.isStructure)
|
||||
|
||||
# Clear list and get out if current fitId is None
|
||||
@@ -167,6 +169,8 @@ class CommandView(d.Display):
|
||||
|
||||
self.update(stuff)
|
||||
|
||||
event.Skip()
|
||||
|
||||
def get(self, row):
|
||||
if row == -1:
|
||||
return None
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
import wx
|
||||
|
||||
import gui.globalEvents as GE
|
||||
import gui.mainFrame
|
||||
from gui.builtinMarketBrowser.events import ItemSelected, ITEM_SELECTED
|
||||
from gui.display import Display
|
||||
from gui.builtinViewColumns.state import State
|
||||
@@ -30,12 +31,12 @@ from service.fit import Fit
|
||||
from service.market import Market
|
||||
|
||||
|
||||
class DroneViewDrop(wx.PyDropTarget):
|
||||
class DroneViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(DroneViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -66,6 +67,8 @@ class DroneView(Display):
|
||||
self.hoveredRow = None
|
||||
self.hoveredColumn = None
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
|
||||
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
|
||||
self.mainFrame.Bind(ITEM_SELECTED, self.addItem)
|
||||
self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem)
|
||||
@@ -101,7 +104,7 @@ class DroneView(Display):
|
||||
if self.DEFAULT_COLS[col] == "Miscellanea":
|
||||
tooltip = self.activeColumns[col].getToolTip(mod)
|
||||
if tooltip is not None:
|
||||
self.SetToolTipString(tooltip)
|
||||
self.SetToolTip(tooltip)
|
||||
else:
|
||||
self.SetToolTip(None)
|
||||
else:
|
||||
@@ -123,7 +126,7 @@ class DroneView(Display):
|
||||
def startDrag(self, event):
|
||||
row = event.GetIndex()
|
||||
if row != -1:
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "drone:" + str(row)
|
||||
data.SetText(dataStr)
|
||||
|
||||
@@ -207,6 +210,7 @@ class DroneView(Display):
|
||||
fit = sFit.getFit(fitID)
|
||||
|
||||
if not fit or fit.isStructure:
|
||||
event.Skip()
|
||||
return
|
||||
|
||||
trigger = sFit.addDrone(fitID, event.itemID)
|
||||
|
||||
@@ -32,12 +32,12 @@ from service.fit import Fit
|
||||
from service.market import Market
|
||||
|
||||
|
||||
class FighterViewDrop(wx.PyDropTarget):
|
||||
class FighterViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(FighterViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -60,7 +60,7 @@ class FighterView(wx.Panel):
|
||||
mainSizer.Add(self.fighterDisplay, 1, wx.EXPAND, 0)
|
||||
|
||||
textSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
textSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
textSizer.AddStretchSpacer()
|
||||
|
||||
for x in self.labels:
|
||||
lbl = wx.StaticText(self, wx.ID_ANY, x.capitalize())
|
||||
@@ -75,7 +75,7 @@ class FighterView(wx.Panel):
|
||||
lbl = wx.StaticText(self, wx.ID_ANY, "0")
|
||||
setattr(self, "label%sTotal" % (x.capitalize()), lbl)
|
||||
textSizer.Add(lbl, 0, wx.ALIGN_CENTER)
|
||||
textSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
textSizer.AddStretchSpacer()
|
||||
|
||||
mainSizer.Add(textSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
@@ -97,7 +97,7 @@ class FighterView(wx.Panel):
|
||||
slot = getattr(Slot, "F_{}".format(x.upper()))
|
||||
used = fit.getSlotsUsed(slot)
|
||||
total = fit.getNumSlots(slot)
|
||||
color = wx.Colour(204, 51, 51) if used > total else wx.SystemSettings_GetColour(
|
||||
color = wx.Colour(204, 51, 51) if used > total else wx.SystemSettings.GetColour(
|
||||
wx.SYS_COLOUR_WINDOWTEXT)
|
||||
|
||||
lbl = getattr(self, "label%sUsed" % x.capitalize())
|
||||
@@ -110,6 +110,8 @@ class FighterView(wx.Panel):
|
||||
|
||||
self.Refresh()
|
||||
|
||||
event.Skip()
|
||||
|
||||
|
||||
class FighterDisplay(d.Display):
|
||||
DEFAULT_COLS = ["State",
|
||||
@@ -166,7 +168,7 @@ class FighterDisplay(d.Display):
|
||||
if self.DEFAULT_COLS[col] == "Miscellanea":
|
||||
tooltip = self.activeColumns[col].getToolTip(mod)
|
||||
if tooltip is not None:
|
||||
self.SetToolTipString(tooltip)
|
||||
self.SetToolTip(tooltip)
|
||||
else:
|
||||
self.SetToolTip(None)
|
||||
else:
|
||||
@@ -188,7 +190,7 @@ class FighterDisplay(d.Display):
|
||||
def startDrag(self, event):
|
||||
row = event.GetIndex()
|
||||
if row != -1:
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "fighter:" + str(row)
|
||||
data.SetText(dataStr)
|
||||
|
||||
|
||||
@@ -41,12 +41,12 @@ class ImplantView(wx.Panel):
|
||||
mainSizer.Add(self.implantDisplay, 1, wx.EXPAND, 0)
|
||||
|
||||
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
radioSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
radioSizer.AddStretchSpacer()
|
||||
self.rbFit = wx.RadioButton(self, id=wx.ID_ANY, label="Use Fit-specific Implants", style=wx.RB_GROUP)
|
||||
self.rbChar = wx.RadioButton(self, id=wx.ID_ANY, label="Use Character Implants")
|
||||
radioSizer.Add(self.rbFit, 0, wx.ALL, 5)
|
||||
radioSizer.Add(self.rbChar, 0, wx.ALL, 5)
|
||||
radioSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
radioSizer.AddStretchSpacer()
|
||||
|
||||
mainSizer.Add(radioSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
@@ -71,6 +71,8 @@ class ImplantView(wx.Panel):
|
||||
self.rbFit.Enable(fit is not None)
|
||||
self.rbChar.Enable(fit is not None)
|
||||
|
||||
event.Skip()
|
||||
|
||||
def OnRadioSelect(self, event):
|
||||
fitID = self.mainFrame.getActiveFit()
|
||||
sFit = Fit.getInstance()
|
||||
@@ -150,6 +152,7 @@ class ImplantDisplay(d.Display):
|
||||
fit = sFit.getFit(fitID)
|
||||
|
||||
if not fit or fit.isStructure:
|
||||
event.Skip()
|
||||
return
|
||||
|
||||
trigger = sFit.addImplant(fitID, event.itemID)
|
||||
|
||||
@@ -40,6 +40,8 @@ class NotesView(wx.Panel):
|
||||
self.lastFitId = event.fitID
|
||||
self.editNotes.SetValue(fit.notes or "")
|
||||
|
||||
event.Skip()
|
||||
|
||||
def onText(self, event):
|
||||
# delay the save so we're not writing to sqlite on every keystroke
|
||||
self.saveTimer.Stop() # cancel the existing timer
|
||||
|
||||
@@ -47,12 +47,12 @@ class DummyEntry(object):
|
||||
self.item = DummyItem(txt)
|
||||
|
||||
|
||||
class ProjectedViewDrop(wx.PyDropTarget):
|
||||
class ProjectedViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(ProjectedViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -139,7 +139,7 @@ class ProjectedView(d.Display):
|
||||
def startDrag(self, event):
|
||||
row = event.GetIndex()
|
||||
if row != -1 and isinstance(self.get(row), es_Drone):
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "projected:" + str(self.GetItemData(row))
|
||||
data.SetText(dataStr)
|
||||
|
||||
@@ -229,6 +229,8 @@ class ProjectedView(d.Display):
|
||||
|
||||
self.update(stuff)
|
||||
|
||||
event.Skip()
|
||||
|
||||
def get(self, row):
|
||||
if row == -1:
|
||||
return None
|
||||
|
||||
@@ -3,7 +3,7 @@ from gui.contextMenu import ContextMenu
|
||||
import gui.mainFrame
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from eos.saveddata.character import Skill
|
||||
import gui.globalEvents as GE
|
||||
from service.fit import Fit
|
||||
@@ -49,7 +49,7 @@ class ChangeAffectingSkills(ContextMenu):
|
||||
if cont[attrName] == 0:
|
||||
continue
|
||||
|
||||
for fit, afflictors in cont.getAfflictions(attrName).iteritems():
|
||||
for fit, afflictors in cont.getAfflictions(attrName).items():
|
||||
for afflictor, modifier, amount, used in afflictors:
|
||||
# only add Skills
|
||||
if not isinstance(afflictor, Skill):
|
||||
@@ -89,12 +89,12 @@ class ChangeAffectingSkills(ContextMenu):
|
||||
if bitmap is not None:
|
||||
skillItem.SetBitmap(bitmap)
|
||||
|
||||
for i in xrange(-1, 6):
|
||||
for i in range(-1, 6):
|
||||
levelItem = self.addSkill(rootMenu if msw else grandSub, skill, i)
|
||||
grandSub.AppendItem(levelItem)
|
||||
grandSub.Append(levelItem)
|
||||
if (not skill.learned and i == -1) or (skill.learned and skill.level == i):
|
||||
levelItem.Check(True)
|
||||
sub.AppendItem(skillItem)
|
||||
sub.Append(skillItem)
|
||||
|
||||
return sub
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ class CommandFits(ContextMenu):
|
||||
if evt is None or not ids.isdisjoint(cls.commandTypeIDs):
|
||||
# we are adding or removing an item that defines a command fit. Need to refresh fit list
|
||||
cls.populateFits(evt)
|
||||
evt.Skip()
|
||||
|
||||
@classmethod
|
||||
def populateFits(cls, evt):
|
||||
@@ -50,7 +51,7 @@ class CommandFits(ContextMenu):
|
||||
return "Command Fits"
|
||||
|
||||
def addFit(self, menu, fit, includeShip=False):
|
||||
label = fit.name if not includeShip else u"({}) {}".format(fit.ship.item.name, fit.name)
|
||||
label = fit.name if not includeShip else "({}) {}".format(fit.ship.item.name, fit.name)
|
||||
id = ContextMenu.nextID()
|
||||
self.fitMenuItemIds[id] = fit
|
||||
menuItem = wx.MenuItem(menu, id, label)
|
||||
@@ -67,7 +68,7 @@ class CommandFits(ContextMenu):
|
||||
if len(self.__class__.commandFits) < 15:
|
||||
for fit in sorted(self.__class__.commandFits, key=lambda x: x.name):
|
||||
menuItem = self.addFit(rootMenu if msw else sub, fit, True)
|
||||
sub.AppendItem(menuItem)
|
||||
sub.Append(menuItem)
|
||||
else:
|
||||
typeDict = {}
|
||||
|
||||
@@ -84,9 +85,9 @@ class CommandFits(ContextMenu):
|
||||
|
||||
for fit in sorted(typeDict[ship], key=lambda x: x.name):
|
||||
fitItem = self.addFit(rootMenu if msw else grandSub, fit, False)
|
||||
grandSub.AppendItem(fitItem)
|
||||
grandSub.Append(fitItem)
|
||||
|
||||
sub.AppendItem(shipItem)
|
||||
sub.Append(shipItem)
|
||||
|
||||
return sub
|
||||
|
||||
|
||||
@@ -3,15 +3,12 @@ import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.fit import Fit
|
||||
from service.damagePattern import DamagePattern as import_DamagePattern
|
||||
from service.settings import ContextMenuSettings
|
||||
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from utils.compat import OrderedDict
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
class DamagePattern(ContextMenu):
|
||||
@@ -52,7 +49,7 @@ class DamagePattern(ContextMenu):
|
||||
self.singles.append(pattern)
|
||||
|
||||
# return list of names, with singles first followed by submenu names
|
||||
self.m = map(lambda p: p.name, self.singles) + self.subMenus.keys()
|
||||
self.m = [p.name for p in self.singles] + list(self.subMenus.keys())
|
||||
return self.m
|
||||
|
||||
def addPattern(self, rootMenu, pattern):
|
||||
@@ -96,7 +93,7 @@ class DamagePattern(ContextMenu):
|
||||
|
||||
# Items that have a parent
|
||||
for pattern in self.subMenus[self.m[i]]:
|
||||
sub.AppendItem(self.addPattern(rootMenu if msw else sub, pattern))
|
||||
sub.Append(self.addPattern(rootMenu if msw else sub, pattern))
|
||||
|
||||
return sub
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class DroneSpinner(wx.Dialog):
|
||||
|
||||
bSizer1.Add(self.spinner, 1, wx.ALL, 5)
|
||||
|
||||
self.button = wx.Button(self, wx.ID_OK, u"Split")
|
||||
self.button = wx.Button(self, wx.ID_OK, "Split")
|
||||
bSizer1.Add(self.button, 0, wx.ALL, 5)
|
||||
|
||||
self.SetSizer(bSizer1)
|
||||
|
||||
@@ -3,7 +3,7 @@ import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.fit import Fit
|
||||
from service.settings import ContextMenuSettings
|
||||
|
||||
@@ -31,9 +31,7 @@ class FactorReload(ContextMenu):
|
||||
|
||||
def getBitmap(self, context, selection):
|
||||
sFit = Fit.getInstance()
|
||||
fitID = self.mainFrame.getActiveFit()
|
||||
fit = sFit.getFit(fitID)
|
||||
if fit.factorReload:
|
||||
if sFit.serviceFittingOptions["useGlobalForceReload"]:
|
||||
return BitmapLoader.getBitmap("state_active_small", "gui")
|
||||
else:
|
||||
return None
|
||||
|
||||
@@ -44,7 +44,7 @@ class FighterAbility(ContextMenu):
|
||||
if not ability.effect.isImplemented:
|
||||
continue
|
||||
menuItem = self.addAbility(rootMenu if msw else sub, ability)
|
||||
sub.AppendItem(menuItem)
|
||||
sub.Append(menuItem)
|
||||
menuItem.Check(ability.active)
|
||||
|
||||
return sub
|
||||
|
||||
@@ -61,7 +61,7 @@ class ImplantSets(ContextMenu):
|
||||
mitem = wx.MenuItem(rootMenu, id, set.name)
|
||||
bindmenu.Bind(wx.EVT_MENU, self.handleSelection, mitem)
|
||||
self.idmap[id] = set
|
||||
m.AppendItem(mitem)
|
||||
m.Append(mitem)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ class ItemStats(ContextMenu):
|
||||
mstate = wx.GetMouseState()
|
||||
reuse = False
|
||||
|
||||
if mstate.CmdDown():
|
||||
if mstate.cmdDown:
|
||||
reuse = True
|
||||
|
||||
if self.mainFrame.GetActiveStatsWindow() is None and reuse:
|
||||
|
||||
@@ -91,7 +91,7 @@ class MetaSwap(ContextMenu):
|
||||
|
||||
# Sort items by metalevel, and group within that metalevel
|
||||
items = list(self.variations)
|
||||
print context
|
||||
print(context)
|
||||
if "implantItem" in context:
|
||||
# sort implants based on name
|
||||
items.sort(key=lambda x: x.name)
|
||||
@@ -116,14 +116,14 @@ class MetaSwap(ContextMenu):
|
||||
if thisgroup != group and context not in ("implantItem", "boosterItem"):
|
||||
group = thisgroup
|
||||
id = ContextMenu.nextID()
|
||||
m.Append(id, u'─ %s ─' % group)
|
||||
m.Append(id, '─ %s ─' % group)
|
||||
m.Enable(id, False)
|
||||
|
||||
id = ContextMenu.nextID()
|
||||
mitem = wx.MenuItem(rootMenu, id, item.name)
|
||||
bindmenu.Bind(wx.EVT_MENU, self.handleModule, mitem)
|
||||
self.moduleLookup[id] = item
|
||||
m.AppendItem(mitem)
|
||||
m.Append(mitem)
|
||||
return m
|
||||
|
||||
def handleModule(self, event):
|
||||
|
||||
@@ -9,7 +9,7 @@ from eos.saveddata.module import Hardpoint
|
||||
import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
from gui.contextMenu import ContextMenu
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.settings import ContextMenuSettings
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
return False
|
||||
|
||||
self.modules = modules
|
||||
self.charges = list(filter(lambda charge: Market.getInstance().getPublicityByItem(charge), validCharges))
|
||||
self.charges = list([charge for charge in validCharges if Market.getInstance().getPublicityByItem(charge)])
|
||||
return len(self.charges) > 0
|
||||
|
||||
def getText(self, itmContext, selection):
|
||||
@@ -58,9 +58,9 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
|
||||
def turretSorter(self, charge):
|
||||
damage = 0
|
||||
range_ = (self.module.getModifiedItemAttr("maxRange") or 0) * \
|
||||
range_ = (self.module.getModifiedItemAttr("maxRange")) * \
|
||||
(charge.getAttribute("weaponRangeMultiplier") or 1)
|
||||
falloff = (self.module.getModifiedItemAttr("falloff") or 0) * \
|
||||
falloff = (self.module.getModifiedItemAttr("falloff")) * \
|
||||
(charge.getAttribute("fallofMultiplier") or 1)
|
||||
for type_ in self.DAMAGE_TYPES:
|
||||
d = charge.getAttribute("%sDamage" % type_)
|
||||
@@ -108,7 +108,7 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
|
||||
def nameSorter(self, charge):
|
||||
parts = charge.name.split(" ")
|
||||
return map(self.numericConverter, parts)
|
||||
return list(map(self.numericConverter, parts))
|
||||
|
||||
def addCharge(self, menu, charge):
|
||||
id_ = ContextMenu.nextID()
|
||||
@@ -127,7 +127,7 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
@staticmethod
|
||||
def addSeperator(m, text):
|
||||
id_ = ContextMenu.nextID()
|
||||
m.Append(id_, u'─ %s ─' % text)
|
||||
m.Append(id_, '─ %s ─' % text)
|
||||
m.Enable(id_, False)
|
||||
|
||||
def getSubMenu(self, context, selection, rootMenu, i, pitem):
|
||||
@@ -137,7 +137,7 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
hardpoint = self.module.hardpoint
|
||||
moduleName = self.module.item.name
|
||||
# Make sure we do not consider mining turrets as combat turrets
|
||||
if hardpoint == Hardpoint.TURRET and self.module.getModifiedItemAttr("miningAmount") is None:
|
||||
if hardpoint == Hardpoint.TURRET and self.module.getModifiedItemAttr("miningAmount", None) is None:
|
||||
self.addSeperator(m, "Long Range")
|
||||
items = []
|
||||
range_ = None
|
||||
@@ -170,15 +170,15 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch)
|
||||
self.addSeperator(sub, "Less Damage")
|
||||
item.SetSubMenu(sub)
|
||||
sub.AppendItem(self.addCharge(rootMenu if msw else sub, base))
|
||||
sub.Append(self.addCharge(rootMenu if msw else sub, base))
|
||||
|
||||
sub.AppendItem(self.addCharge(rootMenu if msw else sub, charge))
|
||||
sub.Append(self.addCharge(rootMenu if msw else sub, charge))
|
||||
|
||||
if sub is not None:
|
||||
self.addSeperator(sub, "More Damage")
|
||||
|
||||
for item in items:
|
||||
m.AppendItem(item)
|
||||
m.Append(item)
|
||||
|
||||
self.addSeperator(m, "Short Range")
|
||||
elif hardpoint == Hardpoint.MISSILE and moduleName != 'Festival Launcher':
|
||||
@@ -203,23 +203,23 @@ class ModuleAmmoPicker(ContextMenu):
|
||||
sub.Bind(wx.EVT_MENU, self.handleAmmoSwitch)
|
||||
self.addSeperator(sub, "Less Damage")
|
||||
item.SetSubMenu(sub)
|
||||
m.AppendItem(item)
|
||||
m.Append(item)
|
||||
|
||||
if charge.name not in ("Light Defender Missile I", "Heavy Defender Missile I"):
|
||||
sub.AppendItem(self.addCharge(rootMenu if msw else sub, charge))
|
||||
sub.Append(self.addCharge(rootMenu if msw else sub, charge))
|
||||
else:
|
||||
defender = charge
|
||||
|
||||
if defender is not None:
|
||||
m.AppendItem(self.addCharge(rootMenu if msw else m, defender))
|
||||
m.Append(self.addCharge(rootMenu if msw else m, defender))
|
||||
if sub is not None:
|
||||
self.addSeperator(sub, "More Damage")
|
||||
else:
|
||||
self.charges.sort(key=self.nameSorter)
|
||||
for charge in self.charges:
|
||||
m.AppendItem(self.addCharge(rootMenu if msw else m, charge))
|
||||
m.Append(self.addCharge(rootMenu if msw else m, charge))
|
||||
|
||||
m.AppendItem(self.addCharge(rootMenu if msw else m, None))
|
||||
m.Append(self.addCharge(rootMenu if msw else m, None))
|
||||
return m
|
||||
|
||||
def handleAmmoSwitch(self, event):
|
||||
|
||||
@@ -35,7 +35,7 @@ class PriceOptions(ContextMenu):
|
||||
|
||||
for option in self.optionList:
|
||||
menuItem = self.addOption(rootMenu if msw else sub, option)
|
||||
sub.AppendItem(menuItem)
|
||||
sub.Append(menuItem)
|
||||
menuItem.Check(self.settings.get(option.lower()))
|
||||
|
||||
return sub
|
||||
|
||||
@@ -38,15 +38,15 @@ class TabbedFits(ContextMenu):
|
||||
else:
|
||||
bindmenu = m
|
||||
|
||||
for page in self.mainFrame.fitMultiSwitch.pages:
|
||||
for page in self.mainFrame.fitMultiSwitch._pages:
|
||||
if isinstance(page, BlankPage):
|
||||
continue
|
||||
fit = sFit.getFit(page.activeFitID, basic=True)
|
||||
id = ContextMenu.nextID()
|
||||
mitem = wx.MenuItem(rootMenu, id, u"{}: {}".format(fit.ship.item.name, fit.name))
|
||||
mitem = wx.MenuItem(rootMenu, id, "{}: {}".format(fit.ship.item.name, fit.name))
|
||||
bindmenu.Bind(wx.EVT_MENU, self.handleSelection, mitem)
|
||||
self.fitLookup[id] = fit
|
||||
m.AppendItem(mitem)
|
||||
m.Append(mitem)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class TacticalMode(ContextMenu):
|
||||
|
||||
for mode in self.modes:
|
||||
menuItem = self.addMode(rootMenu if msw else sub, mode)
|
||||
sub.AppendItem(menuItem)
|
||||
sub.Append(menuItem)
|
||||
menuItem.Check(self.currMode.item == mode.item)
|
||||
|
||||
return sub
|
||||
|
||||
@@ -3,15 +3,11 @@ import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.targetResists import TargetResists as svc_TargetResists
|
||||
from service.fit import Fit
|
||||
from service.settings import ContextMenuSettings
|
||||
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from utils.compat import OrderedDict
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
class TargetResists(ContextMenu):
|
||||
@@ -87,15 +83,15 @@ class TargetResists(ContextMenu):
|
||||
else:
|
||||
self.singles.append(pattern)
|
||||
|
||||
sub.AppendItem(self.addPattern(rootMenu if msw else sub, None)) # Add reset
|
||||
sub.Append(self.addPattern(rootMenu if msw else sub, None)) # Add reset
|
||||
sub.AppendSeparator()
|
||||
|
||||
# Single items, no parent
|
||||
for pattern in self.singles:
|
||||
sub.AppendItem(self.addPattern(rootMenu if msw else sub, pattern))
|
||||
sub.Append(self.addPattern(rootMenu if msw else sub, pattern))
|
||||
|
||||
# Items that have a parent
|
||||
for menuName, patterns in self.subMenus.items():
|
||||
for menuName, patterns in list(self.subMenus.items()):
|
||||
# Create parent item for root menu that is simply name of parent
|
||||
item = wx.MenuItem(rootMenu, ContextMenu.nextID(), menuName)
|
||||
|
||||
@@ -108,8 +104,8 @@ class TargetResists(ContextMenu):
|
||||
|
||||
# Append child items to child menu
|
||||
for pattern in patterns:
|
||||
grandSub.AppendItem(self.addPattern(rootMenu if msw else grandSub, pattern))
|
||||
sub.AppendItem(item) # finally, append parent item to root menu
|
||||
grandSub.Append(self.addPattern(rootMenu if msw else grandSub, pattern))
|
||||
sub.Append(item) # finally, append parent item to root menu
|
||||
|
||||
return sub
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ class WhProjector(ContextMenu):
|
||||
subItem = wx.MenuItem(sub, wx.ID_ANY, swType)
|
||||
grandSub = wx.Menu()
|
||||
subItem.SetSubMenu(grandSub)
|
||||
sub.AppendItem(subItem)
|
||||
sub.Append(subItem)
|
||||
|
||||
for swData in sorted(effdata[swType], key=lambda tpl: tpl[2]):
|
||||
wxid = ContextMenu.nextID()
|
||||
@@ -45,7 +45,7 @@ class WhProjector(ContextMenu):
|
||||
rootMenu.Bind(wx.EVT_MENU, self.handleSelection, grandSubItem)
|
||||
else:
|
||||
grandSub.Bind(wx.EVT_MENU, self.handleSelection, grandSubItem)
|
||||
grandSub.AppendItem(grandSubItem)
|
||||
grandSub.Append(grandSubItem)
|
||||
return sub
|
||||
|
||||
def handleSelection(self, event):
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
# =============================================================================
|
||||
|
||||
from gui.graph import Graph
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from eos.graph.fitDps import FitDpsGraph as FitDps
|
||||
from eos.graph import Data
|
||||
import gui.mainFrame
|
||||
@@ -54,7 +54,7 @@ class FitDpsGraph(Graph):
|
||||
def getIcons(self):
|
||||
icons = {}
|
||||
sAttr = Attribute.getInstance()
|
||||
for key, attrName in self.propertyAttributeMap.iteritems():
|
||||
for key, attrName in self.propertyAttributeMap.items():
|
||||
iconFile = sAttr.getAttributeInfo(attrName).icon.iconFile
|
||||
bitmap = BitmapLoader.getBitmap(iconFile, "icons")
|
||||
if bitmap:
|
||||
@@ -69,7 +69,7 @@ class FitDpsGraph(Graph):
|
||||
|
||||
fitDps.clearData()
|
||||
variable = None
|
||||
for fieldName, value in fields.iteritems():
|
||||
for fieldName, value in fields.items():
|
||||
d = Data(fieldName, value)
|
||||
if not d.isConstant():
|
||||
if variable is None:
|
||||
|
||||
@@ -14,7 +14,7 @@ from eos.saveddata.fit import Fit
|
||||
|
||||
import gui.mainFrame
|
||||
from gui.contextMenu import ContextMenu
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class ItemAffectedBy(wx.Panel):
|
||||
@@ -43,17 +43,17 @@ class ItemAffectedBy(wx.Panel):
|
||||
mainSizer.Add(self.m_staticline, 0, wx.EXPAND)
|
||||
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.toggleExpandBtn = wx.ToggleButton(self, wx.ID_ANY, u"Expand All", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.toggleExpandBtn = wx.ToggleButton(self, wx.ID_ANY, "Expand All", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.toggleExpandBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
self.toggleNameBtn = wx.ToggleButton(self, wx.ID_ANY, u"Toggle Names", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.toggleNameBtn = wx.ToggleButton(self, wx.ID_ANY, "Toggle Names", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.toggleNameBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, u"Toggle View", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, "Toggle View", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.toggleViewBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
if stuff is not None:
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, u"Refresh", wx.DefaultPosition, wx.DefaultSize, wx.BU_EXACTFIT)
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, "Refresh", wx.DefaultPosition, wx.DefaultSize, wx.BU_EXACTFIT)
|
||||
bSizer.Add(self.refreshBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
self.refreshBtn.Bind(wx.EVT_BUTTON, self.RefreshTree)
|
||||
|
||||
@@ -74,9 +74,9 @@ class ItemAffectedBy(wx.Panel):
|
||||
def spawnMenu(self, item):
|
||||
self.affectedBy.SelectItem(item)
|
||||
|
||||
stuff = self.affectedBy.GetPyData(item)
|
||||
stuff = self.affectedBy.GetItemData(item)
|
||||
# String is set as data when we are dealing with attributes, not stuff containers
|
||||
if stuff is None or isinstance(stuff, basestring):
|
||||
if stuff is None or isinstance(stuff, str):
|
||||
return
|
||||
contexts = []
|
||||
|
||||
@@ -109,10 +109,10 @@ class ItemAffectedBy(wx.Panel):
|
||||
self.Freeze()
|
||||
|
||||
for item in self.treeItems:
|
||||
change = self.affectedBy.GetPyData(item)
|
||||
change = self.affectedBy.GetItemData(item)
|
||||
display = self.affectedBy.GetItemText(item)
|
||||
self.affectedBy.SetItemText(item, change)
|
||||
self.affectedBy.SetPyData(item, display)
|
||||
self.affectedBy.SetItemData(item, display)
|
||||
|
||||
self.Thaw()
|
||||
|
||||
@@ -141,7 +141,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
# sheri was here
|
||||
del self.treeItems[:]
|
||||
root = self.affectedBy.AddRoot("WINPWNZ0R")
|
||||
self.affectedBy.SetPyData(root, None)
|
||||
self.affectedBy.SetItemData(root, None)
|
||||
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
self.affectedBy.SetImageList(self.imageList)
|
||||
@@ -185,7 +185,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName, 0)):
|
||||
continue
|
||||
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).iteritems():
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).items():
|
||||
for afflictor, modifier, amount, used in afflictors:
|
||||
|
||||
if not used or afflictor.item is None:
|
||||
@@ -216,7 +216,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
(type(afflictor), afflictor, item, modifier, amount, getattr(afflictor, "projected", False)))
|
||||
|
||||
# Make sure projected fits are on top
|
||||
rootOrder = container.keys()
|
||||
rootOrder = list(container.keys())
|
||||
rootOrder.sort(key=lambda x: self.ORDER.index(type(x)))
|
||||
|
||||
# Now, we take our created dictionary and start adding stuff to our tree
|
||||
@@ -230,7 +230,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
parent = child
|
||||
|
||||
attributes = container[thing]
|
||||
attrOrder = sorted(attributes.keys(), key=self.sortAttrDisplayName)
|
||||
attrOrder = sorted(list(attributes.keys()), key=self.sortAttrDisplayName)
|
||||
|
||||
for attrName in attrOrder:
|
||||
attrInfo = self.stuff.item.attributes.get(attrName)
|
||||
@@ -257,7 +257,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
|
||||
# this is the attribute node
|
||||
child = self.affectedBy.AppendItem(parent, display, attrIcon)
|
||||
self.affectedBy.SetPyData(child, saved)
|
||||
self.affectedBy.SetItemData(child, saved)
|
||||
self.treeItems.append(child)
|
||||
|
||||
items = attributes[attrName]
|
||||
@@ -284,12 +284,12 @@ class ItemAffectedBy(wx.Panel):
|
||||
penalized += "(penalized)"
|
||||
if 'r' in attrModifier:
|
||||
penalized += "(resisted)"
|
||||
attrModifier = "*"
|
||||
attrModifier = "*"
|
||||
|
||||
# this is the Module node, the attribute will be attached to this
|
||||
display = "%s %s %.2f %s" % (displayStr, attrModifier, attrAmount, penalized)
|
||||
treeItem = self.affectedBy.AppendItem(child, display, itemIcon)
|
||||
self.affectedBy.SetPyData(treeItem, afflictor)
|
||||
self.affectedBy.SetItemData(treeItem, afflictor)
|
||||
|
||||
def buildModuleView(self, root):
|
||||
"""
|
||||
@@ -314,7 +314,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
if attributes[attrName] == (attributes.getOriginal(attrName, 0)):
|
||||
continue
|
||||
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).iteritems():
|
||||
for fit, afflictors in attributes.getAfflictions(attrName).items():
|
||||
for afflictor, modifier, amount, used in afflictors:
|
||||
if not used or getattr(afflictor, 'item', None) is None:
|
||||
continue
|
||||
@@ -350,7 +350,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
info[2].append((attrName, modifier, amount))
|
||||
|
||||
# Make sure projected fits are on top
|
||||
rootOrder = container.keys()
|
||||
rootOrder = list(container.keys())
|
||||
rootOrder.sort(key=lambda x: self.ORDER.index(type(x)))
|
||||
|
||||
# Now, we take our created dictionary and start adding stuff to our tree
|
||||
@@ -364,7 +364,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
parent = child
|
||||
|
||||
items = container[thing]
|
||||
order = items.keys()
|
||||
order = list(items.keys())
|
||||
order.sort(key=lambda x: (self.ORDER.index(items[x][0]), x))
|
||||
|
||||
for itemName in order:
|
||||
@@ -389,7 +389,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
|
||||
# this is the Module node, the attribute will be attached to this
|
||||
child = self.affectedBy.AppendItem(parent, displayStr, itemIcon)
|
||||
self.affectedBy.SetPyData(child, afflictors.pop())
|
||||
self.affectedBy.SetItemData(child, afflictors.pop())
|
||||
|
||||
if counter > 0:
|
||||
attributes = []
|
||||
@@ -416,7 +416,7 @@ class ItemAffectedBy(wx.Panel):
|
||||
penalized += "(penalized)"
|
||||
if 'r' in attrModifier:
|
||||
penalized += "(resisted)"
|
||||
attrModifier = "*"
|
||||
attrModifier = "*"
|
||||
|
||||
attributes.append((attrName, (displayName if displayName != "" else attrName), attrModifier,
|
||||
attrAmount, penalized, attrIcon))
|
||||
@@ -443,5 +443,5 @@ class ItemAffectedBy(wx.Panel):
|
||||
saved = "%s %s %.2f %s" % (attrName, attrModifier, attrAmount, penalized)
|
||||
|
||||
treeitem = self.affectedBy.AppendItem(child, display, attrIcon)
|
||||
self.affectedBy.SetPyData(treeitem, saved)
|
||||
self.affectedBy.SetItemData(treeitem, saved)
|
||||
self.treeItems.append(treeitem)
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
import sys
|
||||
import csv
|
||||
import config
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from helpers import AutoListCtrl
|
||||
from .helpers import AutoListCtrl
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.market import Market
|
||||
from service.attribute import Attribute
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
@@ -34,19 +33,19 @@ class ItemParams(wx.Panel):
|
||||
mainSizer.Add(self.m_staticline, 0, wx.EXPAND)
|
||||
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, u" ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, " ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.totalAttrsLabel, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
|
||||
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, u"Toggle view mode", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, "Toggle view mode", wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
bSizer.Add(self.toggleViewBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
self.exportStatsBtn = wx.ToggleButton(self, wx.ID_ANY, u"Export Item Stats", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.exportStatsBtn = wx.ToggleButton(self, wx.ID_ANY, "Export Item Stats", wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
bSizer.Add(self.exportStatsBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
if stuff is not None:
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, u"Refresh", wx.DefaultPosition, wx.DefaultSize, wx.BU_EXACTFIT)
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, "Refresh", wx.DefaultPosition, wx.DefaultSize, wx.BU_EXACTFIT)
|
||||
bSizer.Add(self.refreshBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
self.refreshBtn.Bind(wx.EVT_BUTTON, self.RefreshValues)
|
||||
|
||||
@@ -166,7 +165,7 @@ class ItemParams(wx.Panel):
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
self.paramList.SetImageList(self.imageList, wx.IMAGE_LIST_SMALL)
|
||||
|
||||
names = list(self.attrValues.iterkeys())
|
||||
names = list(self.attrValues.keys())
|
||||
names.sort()
|
||||
|
||||
idNameMap = {}
|
||||
@@ -203,7 +202,7 @@ class ItemParams(wx.Panel):
|
||||
else:
|
||||
attrIcon = self.imageList.Add(BitmapLoader.getBitmap("7_15", "icons"))
|
||||
|
||||
index = self.paramList.InsertImageStringItem(sys.maxint, attrName, attrIcon)
|
||||
index = self.paramList.InsertItem(self.paramList.GetItemCount(), attrName, attrIcon)
|
||||
idNameMap[idCount] = attrName
|
||||
self.paramList.SetItemData(index, idCount)
|
||||
idCount += 1
|
||||
@@ -222,11 +221,12 @@ class ItemParams(wx.Panel):
|
||||
else:
|
||||
valueUnitDefault = formatAmount(valueDefault, 3, 0, 0)
|
||||
|
||||
self.paramList.SetStringItem(index, 1, valueUnit)
|
||||
self.paramList.SetItem(index, 1, valueUnit)
|
||||
if self.stuff is not None:
|
||||
self.paramList.SetStringItem(index, 2, valueUnitDefault)
|
||||
|
||||
self.paramList.SortItems(lambda id1, id2: cmp(idNameMap[id1], idNameMap[id2]))
|
||||
self.paramList.SetItem(index, 2, valueUnitDefault)
|
||||
# @todo: pheonix, this lamda used cmp() which no longer exists in py3. Probably a better way to do this in the
|
||||
# long run, take a look
|
||||
self.paramList.SortItems(lambda id1, id2: (idNameMap[id1] > idNameMap[id2]) - (idNameMap[id1] < idNameMap[id2]))
|
||||
self.paramList.RefreshRows()
|
||||
self.totalAttrsLabel.SetLabel("%d attributes. " % idCount)
|
||||
self.Layout()
|
||||
@@ -252,7 +252,7 @@ class ItemParams(wx.Panel):
|
||||
"Inversed Modifier Percent": (lambda: (1 - value) * 100, unitName),
|
||||
"Modifier Percent" : (
|
||||
lambda: ("%+.2f" if ((value - 1) * 100) % 1 else "%+d") % ((value - 1) * 100), unitName),
|
||||
"Volume" : (lambda: value, u"m\u00B3"),
|
||||
"Volume" : (lambda: value, "m\u00B3"),
|
||||
"Sizeclass" : (lambda: value, ""),
|
||||
"Absolute Percent" : (lambda: (value * 100), unitName),
|
||||
"Milliseconds" : (lambda: value / 1000.0, unitName),
|
||||
@@ -266,7 +266,7 @@ class ItemParams(wx.Panel):
|
||||
v = override[0]()
|
||||
if isinstance(v, str):
|
||||
fvalue = v
|
||||
elif isinstance(v, (int, float, long)):
|
||||
elif isinstance(v, (int, float)):
|
||||
fvalue = formatAmount(v, 3, 0, 0)
|
||||
else:
|
||||
fvalue = v
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import sys
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from helpers import AutoListCtrl
|
||||
from .helpers import AutoListCtrl
|
||||
from service.price import Price as ServicePrice
|
||||
from service.market import Market
|
||||
from service.attribute import Attribute
|
||||
@@ -30,17 +28,17 @@ class ItemCompare(wx.Panel):
|
||||
self.sortReverse = False
|
||||
self.item = item
|
||||
self.items = sorted(items,
|
||||
key=lambda x: x.attributes['metaLevel'].value if 'metaLevel' in x.attributes else None)
|
||||
key=lambda x: x.attributes['metaLevel'].value if 'metaLevel' in x.attributes else 0)
|
||||
self.attrs = {}
|
||||
|
||||
# get a dict of attrName: attrInfo of all unique attributes across all items
|
||||
for item in self.items:
|
||||
for attr in item.attributes.keys():
|
||||
for attr in list(item.attributes.keys()):
|
||||
if item.attributes[attr].info.displayName:
|
||||
self.attrs[attr] = item.attributes[attr].info
|
||||
|
||||
# Process attributes for items and find ones that differ
|
||||
for attr in self.attrs.keys():
|
||||
for attr in list(self.attrs.keys()):
|
||||
value = None
|
||||
|
||||
for item in self.items:
|
||||
@@ -65,14 +63,14 @@ class ItemCompare(wx.Panel):
|
||||
mainSizer.Add(self.m_staticline, 0, wx.EXPAND)
|
||||
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, u" ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, " ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.totalAttrsLabel, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
|
||||
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, u"Toggle view mode", wx.DefaultPosition,
|
||||
self.toggleViewBtn = wx.ToggleButton(self, wx.ID_ANY, "Toggle view mode", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
bSizer.Add(self.toggleViewBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, u"Refresh", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.refreshBtn = wx.Button(self, wx.ID_ANY, "Refresh", wx.DefaultPosition, wx.DefaultSize,
|
||||
wx.BU_EXACTFIT)
|
||||
bSizer.Add(self.refreshBtn, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||
self.refreshBtn.Bind(wx.EVT_BUTTON, self.RefreshValues)
|
||||
@@ -109,7 +107,7 @@ class ItemCompare(wx.Panel):
|
||||
|
||||
def processPrices(self, prices):
|
||||
for i, price in enumerate(prices):
|
||||
self.paramList.SetStringItem(i, len(self.attrs) + 1, formatAmount(price.value, 3, 3, 9, currency=True))
|
||||
self.paramList.SetItem(i, len(self.attrs) + 1, formatAmount(price.value, 3, 3, 9, currency=True))
|
||||
|
||||
def PopulateList(self, sort=None):
|
||||
|
||||
@@ -126,7 +124,7 @@ class ItemCompare(wx.Panel):
|
||||
try:
|
||||
# Remember to reduce by 1, because the attrs array
|
||||
# starts at 0 while the list has the item name as column 0.
|
||||
attr = str(self.attrs.keys()[sort - 1])
|
||||
attr = str(list(self.attrs.keys())[sort - 1])
|
||||
func = lambda _val: _val.attributes[attr].value if attr in _val.attributes else None
|
||||
except IndexError:
|
||||
# Clicked on a column that's not part of our array (price most likely)
|
||||
@@ -147,7 +145,7 @@ class ItemCompare(wx.Panel):
|
||||
self.paramList.SetColumnWidth(len(self.attrs) + 1, 60)
|
||||
|
||||
for item in self.items:
|
||||
i = self.paramList.InsertStringItem(sys.maxint, item.name)
|
||||
i = self.paramList.InsertItem(self.paramList.GetItemCount(), item.name)
|
||||
for x, attr in enumerate(self.attrs.keys()):
|
||||
if attr in item.attributes:
|
||||
info = self.attrs[attr]
|
||||
@@ -159,10 +157,10 @@ class ItemCompare(wx.Panel):
|
||||
else:
|
||||
valueUnit = formatAmount(value, 3, 0, 0)
|
||||
|
||||
self.paramList.SetStringItem(i, x + 1, valueUnit)
|
||||
self.paramList.SetItem(i, x + 1, valueUnit)
|
||||
|
||||
# Add prices
|
||||
self.paramList.SetStringItem(i, len(self.attrs) + 1, formatAmount(item.price.price, 3, 3, 9, currency=True))
|
||||
self.paramList.SetItem(i, len(self.attrs) + 1, formatAmount(item.price.price, 3, 3, 9, currency=True))
|
||||
|
||||
self.paramList.RefreshRows()
|
||||
self.Layout()
|
||||
@@ -185,7 +183,7 @@ class ItemCompare(wx.Panel):
|
||||
"Inverse Absolute Percent" : (lambda: (1 - value) * 100, unitName),
|
||||
"Inversed Modifier Percent": (lambda: (1 - value) * 100, unitName),
|
||||
"Modifier Percent" : (lambda: ("%+.2f" if ((value - 1) * 100) % 1 else "%+d") % ((value - 1) * 100), unitName),
|
||||
"Volume" : (lambda: value, u"m\u00B3"),
|
||||
"Volume" : (lambda: value, "m\u00B3"),
|
||||
"Sizeclass" : (lambda: value, ""),
|
||||
"Absolute Percent" : (lambda: (value * 100), unitName),
|
||||
"Milliseconds" : (lambda: value / 1000.0, unitName),
|
||||
@@ -199,7 +197,7 @@ class ItemCompare(wx.Panel):
|
||||
v = override[0]()
|
||||
if isinstance(v, str):
|
||||
fvalue = v
|
||||
elif isinstance(v, (int, float, long)):
|
||||
elif isinstance(v, (int, float)):
|
||||
fvalue = formatAmount(v, 3, 0, 0)
|
||||
else:
|
||||
fvalue = v
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class ItemDependents(wx.Panel):
|
||||
@@ -19,7 +19,7 @@ class ItemDependents(wx.Panel):
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
self.root = self.reqTree.AddRoot("WINRARZOR")
|
||||
self.reqTree.SetPyData(self.root, None)
|
||||
self.reqTree.SetItemData(self.root, None)
|
||||
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
self.reqTree.SetImageList(self.imageList)
|
||||
@@ -32,7 +32,7 @@ class ItemDependents(wx.Panel):
|
||||
def getFullSkillTree(self, parentSkill, parent, sbIconId):
|
||||
levelToItems = {}
|
||||
|
||||
for item, level in parentSkill.requiredFor.iteritems():
|
||||
for item, level in parentSkill.requiredFor.items():
|
||||
if level not in levelToItems:
|
||||
levelToItems[level] = []
|
||||
levelToItems[level].append(item)
|
||||
|
||||
@@ -11,8 +11,8 @@ class ItemDescription(wx.Panel):
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
self.SetSizer(mainSizer)
|
||||
|
||||
bgcolor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
fgcolor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||
bgcolor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
fgcolor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||
|
||||
self.description = wx.html.HtmlWindow(self)
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
import config
|
||||
@@ -6,7 +5,7 @@ import config
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from helpers import AutoListCtrl
|
||||
from .helpers import AutoListCtrl
|
||||
|
||||
|
||||
class ItemEffects(wx.Panel):
|
||||
@@ -47,11 +46,11 @@ class ItemEffects(wx.Panel):
|
||||
|
||||
item = self.item
|
||||
effects = item.effects
|
||||
names = list(effects.iterkeys())
|
||||
names = list(effects.keys())
|
||||
names.sort()
|
||||
|
||||
for name in names:
|
||||
index = self.effectList.InsertStringItem(sys.maxint, name)
|
||||
index = self.effectList.InsertItem(self.effectList.GetItemCount(), name)
|
||||
|
||||
if effects[name].isImplemented:
|
||||
if effects[name].activeByDefault:
|
||||
@@ -72,11 +71,11 @@ class ItemEffects(wx.Panel):
|
||||
else:
|
||||
effectRunTime = ""
|
||||
|
||||
self.effectList.SetStringItem(index, 1, activeByDefault)
|
||||
self.effectList.SetStringItem(index, 2, effectTypeText)
|
||||
self.effectList.SetItem(index, 1, activeByDefault)
|
||||
self.effectList.SetItem(index, 2, effectTypeText)
|
||||
if config.debug:
|
||||
self.effectList.SetStringItem(index, 3, effectRunTime)
|
||||
self.effectList.SetStringItem(index, 4, str(effects[name].ID))
|
||||
self.effectList.SetItem(index, 3, effectRunTime)
|
||||
self.effectList.SetItem(index, 4, str(effects[name].ID))
|
||||
|
||||
self.effectList.RefreshRows()
|
||||
self.Layout()
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
import sys
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from helpers import AutoListCtrl
|
||||
from .helpers import AutoListCtrl
|
||||
|
||||
|
||||
class ItemProperties(wx.Panel):
|
||||
@@ -27,7 +25,7 @@ class ItemProperties(wx.Panel):
|
||||
mainSizer.Add(self.m_staticline, 0, wx.EXPAND)
|
||||
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, u" ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.totalAttrsLabel = wx.StaticText(self, wx.ID_ANY, " ", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
bSizer.Add(self.totalAttrsLabel, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT)
|
||||
|
||||
mainSizer.Add(bSizer, 0, wx.ALIGN_RIGHT)
|
||||
@@ -79,7 +77,7 @@ class ItemProperties(wx.Panel):
|
||||
attrName = name.title()
|
||||
value = getattr(self.item, name)
|
||||
|
||||
index = self.paramList.InsertStringItem(sys.maxint, attrName)
|
||||
index = self.paramList.InsertItem(self.paramList.GetItemCount(), attrName)
|
||||
# index = self.paramList.InsertImageStringItem(sys.maxint, attrName)
|
||||
idNameMap[idCount] = attrName
|
||||
self.paramList.SetItemData(index, idCount)
|
||||
@@ -87,13 +85,13 @@ class ItemProperties(wx.Panel):
|
||||
|
||||
valueUnit = str(value)
|
||||
|
||||
self.paramList.SetStringItem(index, 1, valueUnit)
|
||||
self.paramList.SetItem(index, 1, valueUnit)
|
||||
except:
|
||||
# TODO: Add logging to this.
|
||||
# We couldn't get a property for some reason. Skip it for now.
|
||||
continue
|
||||
|
||||
self.paramList.SortItems(lambda id1, id2: cmp(idNameMap[id1], idNameMap[id2]))
|
||||
self.paramList.SortItems(lambda id1, id2: (idNameMap[id1] > idNameMap[id2]) - (idNameMap[id1] < idNameMap[id2]))
|
||||
self.paramList.RefreshRows()
|
||||
self.totalAttrsLabel.SetLabel("%d attributes. " % idCount)
|
||||
self.Layout()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class ItemRequirements(wx.Panel):
|
||||
@@ -19,7 +19,7 @@ class ItemRequirements(wx.Panel):
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
self.root = self.reqTree.AddRoot("WINRARZOR")
|
||||
self.reqTree.SetPyData(self.root, None)
|
||||
self.reqTree.SetItemData(self.root, None)
|
||||
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
self.reqTree.SetImageList(self.imageList)
|
||||
@@ -32,7 +32,7 @@ class ItemRequirements(wx.Panel):
|
||||
self.Layout()
|
||||
|
||||
def getFullSkillTree(self, parentSkill, parent, sbIconId):
|
||||
for skill, level in parentSkill.requiredSkills.iteritems():
|
||||
for skill, level in parentSkill.requiredSkills.items():
|
||||
child = self.reqTree.AppendItem(parent, "%s %s" % (skill.name, self.romanNb[int(level)]), sbIconId)
|
||||
if skill.ID not in self.skillIdHistory:
|
||||
self.getFullSkillTree(skill, child, sbIconId)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import wx
|
||||
|
||||
import config
|
||||
import gui.builtinMarketBrowser.pfSearchBox as SBox
|
||||
from gui.contextMenu import ContextMenu
|
||||
from gui.display import Display
|
||||
@@ -9,7 +10,7 @@ from gui.utils.staticHelpers import DragDropHelper
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
import events
|
||||
from gui.builtinMarketBrowser.events import RECENTLY_USED_MODULES, MAX_RECENTLY_USED_MODULES, ItemSelected
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
@@ -66,7 +67,7 @@ class ItemView(Display):
|
||||
row = self.GetFirstSelected()
|
||||
|
||||
if row != -1:
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "market:" + str(self.active[row].ID)
|
||||
pyfalog.debug("Dragging from market: " + dataStr)
|
||||
|
||||
@@ -89,10 +90,10 @@ class ItemView(Display):
|
||||
for itemID in self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]:
|
||||
self.recentlyUsedModules.add(self.sMkt.getItem(itemID))
|
||||
|
||||
wx.PostEvent(self.mainFrame, events.ItemSelected(itemID=self.active[sel].ID))
|
||||
wx.PostEvent(self.mainFrame, ItemSelected(itemID=self.active[sel].ID))
|
||||
|
||||
def storeRecentlyUsedMarketItem(self, itemID):
|
||||
if len(self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]) > events.MAX_RECENTLY_USED_MODULES:
|
||||
if len(self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"]) > MAX_RECENTLY_USED_MODULES:
|
||||
self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"].pop(0)
|
||||
|
||||
self.sMkt.serviceMarketRecentlyUsedModules["pyfaMarketRecentlyUsedModules"].append(itemID)
|
||||
@@ -103,8 +104,8 @@ class ItemView(Display):
|
||||
sel = self.marketView.GetSelection()
|
||||
if sel.IsOk():
|
||||
# Get data field of the selected item (which is a marketGroup ID if anything was selected)
|
||||
seldata = self.marketView.GetPyData(sel)
|
||||
if seldata is not None and seldata != events.RECENTLY_USED_MODULES:
|
||||
seldata = self.marketView.GetItemData(sel)
|
||||
if seldata is not None and seldata != RECENTLY_USED_MODULES:
|
||||
# If market group treeview item doesn't have children (other market groups or dummies),
|
||||
# then it should have items in it and we want to request them
|
||||
if self.marketView.ItemHasChildren(sel) is False:
|
||||
@@ -117,7 +118,7 @@ class ItemView(Display):
|
||||
items = set()
|
||||
else:
|
||||
# If method was called but selection wasn't actually made or we have a hit on recently used modules
|
||||
if seldata == events.RECENTLY_USED_MODULES:
|
||||
if seldata == RECENTLY_USED_MODULES:
|
||||
items = self.recentlyUsedModules
|
||||
else:
|
||||
items = set()
|
||||
@@ -126,7 +127,7 @@ class ItemView(Display):
|
||||
self.updateItemStore(items)
|
||||
|
||||
# Set toggle buttons / use search mode flag if recently used modules category is selected (in order to have all modules listed and not filtered)
|
||||
if seldata is not events.RECENTLY_USED_MODULES:
|
||||
if seldata is not RECENTLY_USED_MODULES:
|
||||
self.setToggles()
|
||||
else:
|
||||
self.marketBrowser.searchMode = True
|
||||
@@ -170,10 +171,6 @@ class ItemView(Display):
|
||||
if len(realsearch) == 0:
|
||||
self.selectionMade()
|
||||
return
|
||||
# Show nothing if query is too short
|
||||
elif len(realsearch) < 3:
|
||||
self.clearSearch()
|
||||
return
|
||||
|
||||
self.marketBrowser.searchMode = True
|
||||
self.sMkt.searchItems(search, self.populateSearch)
|
||||
@@ -204,13 +201,14 @@ class ItemView(Display):
|
||||
try:
|
||||
mktgrpid = sMkt.getMarketGroupByItem(item).ID
|
||||
except AttributeError:
|
||||
mktgrpid = None
|
||||
print("unable to find market group for", item.name)
|
||||
mktgrpid = -1
|
||||
print(("unable to find market group for", item.name))
|
||||
parentname = sMkt.getParentItemByItem(item).name
|
||||
# Get position of market group
|
||||
metagrpid = sMkt.getMetaGroupIdByItem(item)
|
||||
metatab = self.metaMap.get(metagrpid)
|
||||
metalvl = self.metalvls.get(item.ID, 0)
|
||||
|
||||
return catname, mktgrpid, parentname, metatab, metalvl, item.name
|
||||
|
||||
def contextMenu(self, event):
|
||||
@@ -266,7 +264,7 @@ class ItemView(Display):
|
||||
"""
|
||||
revmap = {}
|
||||
i = 0
|
||||
for mgids in self.sMkt.META_MAP.itervalues():
|
||||
for mgids in self.sMkt.META_MAP.values():
|
||||
for mgid in mgids:
|
||||
revmap[mgid] = i
|
||||
i += 1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import wx
|
||||
|
||||
from gui.cachingImageList import CachingImageList
|
||||
import gui.builtinMarketBrowser.events as events
|
||||
from gui.builtinMarketBrowser.events import RECENTLY_USED_MODULES
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
@@ -24,7 +24,7 @@ class MarketTree(wx.TreeCtrl):
|
||||
sMkt = self.sMkt
|
||||
for mktGrp in sMkt.getMarketRoot():
|
||||
iconId = self.addImage(sMkt.getIconByMarketGroup(mktGrp))
|
||||
childId = self.AppendItem(self.root, mktGrp.name, iconId, data=wx.TreeItemData(mktGrp.ID))
|
||||
childId = self.AppendItem(self.root, mktGrp.name, iconId, data=mktGrp.ID)
|
||||
# All market groups which were never expanded are dummies, here we assume
|
||||
# that all root market groups are expandable
|
||||
self.AppendItem(childId, "dummy")
|
||||
@@ -32,7 +32,7 @@ class MarketTree(wx.TreeCtrl):
|
||||
|
||||
# Add recently used modules node
|
||||
rumIconId = self.addImage("market_small", "gui")
|
||||
self.AppendItem(self.root, "Recently Used Modules", rumIconId, data=wx.TreeItemData(events.RECENTLY_USED_MODULES))
|
||||
self.AppendItem(self.root, "Recently Used Modules", rumIconId, data=RECENTLY_USED_MODULES)
|
||||
|
||||
# Bind our lookup method to when the tree gets expanded
|
||||
self.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup)
|
||||
@@ -52,14 +52,14 @@ class MarketTree(wx.TreeCtrl):
|
||||
self.Delete(child)
|
||||
# And add real market group contents
|
||||
sMkt = self.sMkt
|
||||
currentMktGrp = sMkt.getMarketGroup(self.GetPyData(root), eager="children")
|
||||
currentMktGrp = sMkt.getMarketGroup(self.GetItemData(root), eager="children")
|
||||
for childMktGrp in sMkt.getMarketGroupChildren(currentMktGrp):
|
||||
# If market should have items but it doesn't, do not show it
|
||||
if sMkt.marketGroupValidityCheck(childMktGrp) is False:
|
||||
continue
|
||||
iconId = self.addImage(sMkt.getIconByMarketGroup(childMktGrp))
|
||||
try:
|
||||
childId = self.AppendItem(root, childMktGrp.name, iconId, data=wx.TreeItemData(childMktGrp.ID))
|
||||
childId = self.AppendItem(root, childMktGrp.name, iconId, data=childMktGrp.ID)
|
||||
except Exception as e:
|
||||
pyfalog.debug("Error appending item.")
|
||||
pyfalog.debug(e)
|
||||
@@ -88,7 +88,7 @@ class MarketTree(wx.TreeCtrl):
|
||||
for i in range(len(jumpList) - 1, -1, -1):
|
||||
target = jumpList[i]
|
||||
child, cookie = self.GetFirstChild(item)
|
||||
while self.GetItemPyData(child) != target:
|
||||
while self.GetItemData(child) != target:
|
||||
child, cookie = self.GetNextChild(item, cookie)
|
||||
|
||||
item = child
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
|
||||
SearchButton, EVT_SEARCH_BTN = wx.lib.newevent.NewEvent()
|
||||
CancelButton, EVT_CANCEL_BTN = wx.lib.newevent.NewEvent()
|
||||
@@ -59,6 +59,8 @@ class PFSearchBox(wx.Window):
|
||||
self.EditBox.Bind(wx.EVT_TEXT, self.OnText)
|
||||
self.EditBox.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter)
|
||||
|
||||
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
|
||||
|
||||
self.SetMinSize(size)
|
||||
|
||||
def OnText(self, event):
|
||||
@@ -224,10 +226,10 @@ class PFSearchBox(wx.Window):
|
||||
self.EditBox.SetSize((self.cancelButtonX - self.padding - self.editX, -1))
|
||||
|
||||
def OnPaint(self, event):
|
||||
dc = wx.BufferedPaintDC(self)
|
||||
dc = wx.AutoBufferedPaintDC(self)
|
||||
|
||||
bkColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
sepColor = colorUtils.GetSuitableColor(bkColor, 0.2)
|
||||
bkColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
sepColor = colorUtils.GetSuitable(bkColor, 0.2)
|
||||
rect = self.GetRect()
|
||||
|
||||
if self.resized:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from pfSearchBox import PFSearchBox
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from .pfSearchBox import PFSearchBox
|
||||
|
||||
|
||||
class SearchBox(PFSearchBox):
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
__all__ = [
|
||||
"pyfaGeneralPreferences",
|
||||
"pyfaHTMLExportPreferences",
|
||||
@@ -9,8 +6,6 @@ __all__ = [
|
||||
"pyfaDatabasePreferences",
|
||||
"pyfaLoggingPreferences",
|
||||
"pyfaEnginePreferences",
|
||||
"pyfaStatViewPreferences",
|
||||
]
|
||||
"pyfaEsiPreferences",
|
||||
"pyfaStatViewPreferences"]
|
||||
|
||||
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
|
||||
__all__.append("pyfaCrestPreferences")
|
||||
|
||||
@@ -50,7 +50,7 @@ class DummyView(PreferenceView):
|
||||
|
||||
def initHeader(self, panel):
|
||||
headerSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
self.stTitle = wx.StaticText(panel, wx.ID_ANY, u"Dummy", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stTitle = wx.StaticText(panel, wx.ID_ANY, "Dummy", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stTitle.Wrap(-1)
|
||||
self.stTitle.SetFont(wx.Font(14, 70, 90, 90, False, wx.EmptyString))
|
||||
headerSizer.Add(self.stTitle, 0, wx.ALL, 5)
|
||||
@@ -60,10 +60,10 @@ class DummyView(PreferenceView):
|
||||
def initContent(self, panel):
|
||||
contentSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.m_checkBox2 = wx.CheckBox(panel, wx.ID_ANY, u"Check Me!", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_checkBox2 = wx.CheckBox(panel, wx.ID_ANY, "Check Me!", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
contentSizer.Add(self.m_checkBox2, 0, wx.ALL, 5)
|
||||
|
||||
self.m_radioBtn2 = wx.RadioButton(panel, wx.ID_ANY, u"RadioBtn", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_radioBtn2 = wx.RadioButton(panel, wx.ID_ANY, "RadioBtn", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
contentSizer.Add(self.m_radioBtn2, 0, wx.ALL, 5)
|
||||
|
||||
self.m_slider2 = wx.Slider(panel, wx.ID_ANY, 50, 0, 100, wx.DefaultPosition, wx.DefaultSize, wx.SL_HORIZONTAL)
|
||||
@@ -80,14 +80,13 @@ class DummyView(PreferenceView):
|
||||
def initFooter(self, panel):
|
||||
footerSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
footerSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
|
||||
self.btnRestore = wx.Button(panel, wx.ID_ANY, u"Restore", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
footerSizer.AddStretchSpacer()
|
||||
self.btnRestore = wx.Button(panel, wx.ID_ANY, "Restore", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnRestore.Enable(False)
|
||||
|
||||
footerSizer.Add(self.btnRestore, 0, wx.ALL, 5)
|
||||
|
||||
self.btnApply = wx.Button(panel, wx.ID_ANY, u"Apply", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnApply = wx.Button(panel, wx.ID_ANY, "Apply", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
footerSizer.Add(self.btnApply, 0, wx.ALL, 5)
|
||||
return footerSizer
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
import gui.mainFrame
|
||||
from service.settings import ContextMenuSettings
|
||||
|
||||
@@ -23,7 +23,7 @@ class PFContextMenuPref(PreferenceView):
|
||||
mainSizer.Add(self.stTitle, 0, wx.ALL, 5)
|
||||
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY,
|
||||
u"Disabling context menus can improve responsiveness.",
|
||||
"Disabling context menus can improve responsiveness.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSubTitle.Wrap(-1)
|
||||
mainSizer.Add(self.stSubTitle, 0, wx.ALL, 5)
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
|
||||
import gui.mainFrame
|
||||
|
||||
from service.settings import CRESTSettings
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from wx.lib.intctrl import IntCtrl
|
||||
|
||||
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
|
||||
from service.crest import Crest
|
||||
|
||||
|
||||
class PFCrestPref(PreferenceView):
|
||||
title = "CREST"
|
||||
|
||||
def populatePanel(self, panel):
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
self.settings = CRESTSettings.getInstance()
|
||||
self.dirtySettings = False
|
||||
dlgWidth = panel.GetParent().GetParent().ClientSize.width
|
||||
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.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.stInfo = wx.StaticText(panel, wx.ID_ANY,
|
||||
u"Please see the pyfa wiki on GitHub for information regarding these options.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stInfo.Wrap(dlgWidth - 50)
|
||||
mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
rbSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.rbMode = wx.RadioBox(panel, -1, "Mode", wx.DefaultPosition, wx.DefaultSize,
|
||||
['Implicit', 'User-supplied details'], 1, wx.RA_SPECIFY_COLS)
|
||||
self.rbServer = wx.RadioBox(panel, -1, "Server", wx.DefaultPosition, wx.DefaultSize,
|
||||
['Tranquility', 'Singularity'], 1, wx.RA_SPECIFY_COLS)
|
||||
|
||||
self.rbMode.SetSelection(self.settings.get('mode'))
|
||||
self.rbServer.SetSelection(self.settings.get('server'))
|
||||
|
||||
rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5)
|
||||
rbSizer.Add(self.rbServer, 1, wx.ALL, 5)
|
||||
|
||||
self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange)
|
||||
self.rbServer.Bind(wx.EVT_RADIOBOX, self.OnServerChange)
|
||||
|
||||
mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0)
|
||||
|
||||
timeoutSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.stTimout = wx.StaticText(panel, wx.ID_ANY, u"Timeout (seconds):", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stTimout.Wrap(-1)
|
||||
|
||||
timeoutSizer.Add(self.stTimout, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.intTimeout = IntCtrl(panel, max=300000, limited=True, value=self.settings.get('timeout'))
|
||||
timeoutSizer.Add(self.intTimeout, 0, wx.ALL, 5)
|
||||
self.intTimeout.Bind(wx.lib.intctrl.EVT_INT, self.OnTimeoutChange)
|
||||
|
||||
mainSizer.Add(timeoutSizer, 0, wx.ALL | wx.EXPAND, 0)
|
||||
|
||||
detailsTitle = wx.StaticText(panel, wx.ID_ANY, "CREST client details", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
detailsTitle.Wrap(-1)
|
||||
detailsTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
|
||||
|
||||
mainSizer.Add(detailsTitle, 0, wx.ALL, 5)
|
||||
mainSizer.Add(wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0,
|
||||
wx.EXPAND, 5)
|
||||
|
||||
fgAddrSizer = wx.FlexGridSizer(2, 2, 0, 0)
|
||||
fgAddrSizer.AddGrowableCol(1)
|
||||
fgAddrSizer.SetFlexibleDirection(wx.BOTH)
|
||||
fgAddrSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
|
||||
self.stSetID = wx.StaticText(panel, wx.ID_ANY, u"Client ID:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetID.Wrap(-1)
|
||||
fgAddrSizer.Add(self.stSetID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputClientID = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientID'), wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
|
||||
fgAddrSizer.Add(self.inputClientID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
self.stSetSecret = wx.StaticText(panel, wx.ID_ANY, u"Client Secret:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetSecret.Wrap(-1)
|
||||
|
||||
fgAddrSizer.Add(self.stSetSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputClientSecret = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientSecret'), wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
|
||||
fgAddrSizer.Add(self.inputClientSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
self.btnApply = wx.Button(panel, wx.ID_ANY, u"Save Client Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnApply.Bind(wx.EVT_BUTTON, self.OnBtnApply)
|
||||
|
||||
mainSizer.Add(fgAddrSizer, 0, wx.EXPAND, 5)
|
||||
mainSizer.Add(self.btnApply, 0, wx.ALIGN_RIGHT, 5)
|
||||
|
||||
self.ToggleProxySettings(self.settings.get('mode'))
|
||||
|
||||
panel.SetSizer(mainSizer)
|
||||
panel.Layout()
|
||||
|
||||
def OnTimeoutChange(self, event):
|
||||
self.settings.set('timeout', event.GetEventObject().GetValue())
|
||||
|
||||
def OnModeChange(self, event):
|
||||
self.settings.set('mode', event.GetInt())
|
||||
self.ToggleProxySettings(self.settings.get('mode'))
|
||||
Crest.restartService()
|
||||
|
||||
def OnServerChange(self, event):
|
||||
self.settings.set('server', event.GetInt())
|
||||
Crest.restartService()
|
||||
|
||||
def OnBtnApply(self, event):
|
||||
self.settings.set('clientID', self.inputClientID.GetValue().strip())
|
||||
self.settings.set('clientSecret', self.inputClientSecret.GetValue().strip())
|
||||
sCrest = Crest.getInstance()
|
||||
sCrest.delAllCharacters()
|
||||
|
||||
def ToggleProxySettings(self, mode):
|
||||
if mode:
|
||||
self.stSetID.Enable()
|
||||
self.inputClientID.Enable()
|
||||
self.stSetSecret.Enable()
|
||||
self.inputClientSecret.Enable()
|
||||
else:
|
||||
self.stSetID.Disable()
|
||||
self.inputClientID.Disable()
|
||||
self.stSetSecret.Disable()
|
||||
self.inputClientSecret.Disable()
|
||||
|
||||
def getImage(self):
|
||||
return BitmapLoader.getBitmap("eve", "gui")
|
||||
|
||||
|
||||
PFCrestPref.register()
|
||||
@@ -1,7 +1,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils import helpers_wxPython as wxHelpers
|
||||
import config
|
||||
from eos.db.saveddata.queries import clearPrices, clearDamagePatterns, clearTargetResists
|
||||
@@ -24,7 +24,7 @@ class PFGeneralPref(PreferenceView):
|
||||
self.stTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
|
||||
mainSizer.Add(self.stTitle, 0, wx.ALL, 5)
|
||||
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY, u"(Cannot be changed while pyfa is running. Set via command line switches.)",
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY, "(Cannot be changed while pyfa is running. Set via command line switches.)",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSubTitle.Wrap(-1)
|
||||
mainSizer.Add(self.stSubTitle, 0, wx.ALL, 3)
|
||||
@@ -33,11 +33,11 @@ class PFGeneralPref(PreferenceView):
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
# Save in Root
|
||||
self.cbsaveInRoot = wx.CheckBox(panel, wx.ID_ANY, u"Using Executable Path for Saved Fit Database and Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbsaveInRoot = wx.CheckBox(panel, wx.ID_ANY, "Using Executable Path for Saved Fit Database and Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbsaveInRoot, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
# Database path
|
||||
self.stSetUserPath = wx.StaticText(panel, wx.ID_ANY, u"pyfa User Path:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetUserPath = wx.StaticText(panel, wx.ID_ANY, "pyfa User Path:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetUserPath.Wrap(-1)
|
||||
mainSizer.Add(self.stSetUserPath, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.inputUserPath = wx.TextCtrl(panel, wx.ID_ANY, config.savePath, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
@@ -46,7 +46,7 @@ class PFGeneralPref(PreferenceView):
|
||||
mainSizer.Add(self.inputUserPath, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
# Save DB
|
||||
self.stFitDB = wx.StaticText(panel, wx.ID_ANY, u"Fitting Database:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stFitDB = wx.StaticText(panel, wx.ID_ANY, "Fitting Database:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stFitDB.Wrap(-1)
|
||||
mainSizer.Add(self.stFitDB, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
@@ -56,7 +56,7 @@ class PFGeneralPref(PreferenceView):
|
||||
mainSizer.Add(self.inputFitDB, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
# Game Data DB
|
||||
self.stGameDB = wx.StaticText(panel, wx.ID_ANY, u"Game Database:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stGameDB = wx.StaticText(panel, wx.ID_ANY, "Game Database:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stGameDB.Wrap(-1)
|
||||
mainSizer.Add(self.stGameDB, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
@@ -76,15 +76,15 @@ class PFGeneralPref(PreferenceView):
|
||||
mainSizer.Add(self.m_staticline3, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
btnSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
btnSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
btnSizer.AddStretchSpacer()
|
||||
|
||||
self.btnDeleteDamagePatterns = wx.Button(panel, wx.ID_ANY, u"Delete All Damage Pattern Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnDeleteDamagePatterns = wx.Button(panel, wx.ID_ANY, "Delete All Damage Pattern Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
btnSizer.Add(self.btnDeleteDamagePatterns, 0, wx.ALL, 5)
|
||||
|
||||
self.btnDeleteTargetResists = wx.Button(panel, wx.ID_ANY, u"Delete All Target Resist Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnDeleteTargetResists = wx.Button(panel, wx.ID_ANY, "Delete All Target Resist Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
btnSizer.Add(self.btnDeleteTargetResists, 0, wx.ALL, 5)
|
||||
|
||||
self.btnPrices = wx.Button(panel, wx.ID_ANY, u"Delete All Prices", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnPrices = wx.Button(panel, wx.ID_ANY, "Delete All Prices", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
btnSizer.Add(self.btnPrices, 0, wx.ALL, 5)
|
||||
|
||||
mainSizer.Add(btnSizer, 0, wx.EXPAND, 5)
|
||||
@@ -97,17 +97,17 @@ class PFGeneralPref(PreferenceView):
|
||||
panel.Layout()
|
||||
|
||||
def DeleteDamagePatterns(self, event):
|
||||
question = u"This is a destructive action that will delete all damage pattern profiles.\nAre you sure you want to do this?"
|
||||
question = "This is a destructive action that will delete all damage pattern profiles.\nAre you sure you want to do this?"
|
||||
if wxHelpers.YesNoDialog(question, "Confirm"):
|
||||
clearDamagePatterns()
|
||||
|
||||
def DeleteTargetResists(self, event):
|
||||
question = u"This is a destructive action that will delete all target resist profiles.\nAre you sure you want to do this?"
|
||||
question = "This is a destructive action that will delete all target resist profiles.\nAre you sure you want to do this?"
|
||||
if wxHelpers.YesNoDialog(question, "Confirm"):
|
||||
clearTargetResists()
|
||||
|
||||
def DeletePrices(self, event):
|
||||
question = u"This is a destructive action that will delete all cached prices out of the database.\nAre you sure you want to do this?"
|
||||
question = "This is a destructive action that will delete all cached prices out of the database.\nAre you sure you want to do this?"
|
||||
if wxHelpers.YesNoDialog(question, "Confirm"):
|
||||
clearPrices()
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import logging
|
||||
import wx
|
||||
|
||||
from service.fit import Fit
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.preferenceView import PreferenceView
|
||||
from service.settings import EOSSettings
|
||||
|
||||
@@ -24,7 +24,7 @@ class PFFittingEnginePref(PreferenceView):
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
helpCursor = wx.StockCursor(wx.CURSOR_QUESTION_ARROW)
|
||||
helpCursor = wx.Cursor(wx.CURSOR_QUESTION_ARROW)
|
||||
|
||||
self.engine_settings = EOSSettings.getInstance()
|
||||
|
||||
@@ -36,25 +36,25 @@ class PFFittingEnginePref(PreferenceView):
|
||||
self.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.cbGlobalForceReload = wx.CheckBox(panel, wx.ID_ANY, u"Factor in reload time when calculating capacitor usage, damage, and tank.",
|
||||
self.cbGlobalForceReload = wx.CheckBox(panel, wx.ID_ANY, "Factor in reload time when calculating capacitor usage, damage, and tank.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
|
||||
mainSizer.Add(self.cbGlobalForceReload, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbStrictSkillLevels = wx.CheckBox(panel, wx.ID_ANY,
|
||||
u"Enforce strict skill level requirements",
|
||||
"Enforce strict skill level requirements",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbStrictSkillLevels.SetCursor(helpCursor)
|
||||
self.cbStrictSkillLevels.SetToolTip(wx.ToolTip(
|
||||
u'When enabled, skills will check their dependencies\' requirements when their levels change and reset ' +
|
||||
u'skills that no longer meet the requirement.\neg: Setting Drones from level V to IV will reset the Heavy ' +
|
||||
u'Drone Operation skill, as that requires Drones V'))
|
||||
'When enabled, skills will check their dependencies\' requirements when their levels change and reset ' +
|
||||
'skills that no longer meet the requirement.\neg: Setting Drones from level V to IV will reset the Heavy ' +
|
||||
'Drone Operation skill, as that requires Drones V'))
|
||||
|
||||
mainSizer.Add(self.cbStrictSkillLevels, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbUniversalAdaptiveArmorHardener = wx.CheckBox(panel, wx.ID_ANY,
|
||||
u"When damage profile is Uniform, set Reactive Armor " +
|
||||
u"Hardener to match (old behavior).",
|
||||
"When damage profile is Uniform, set Reactive Armor " +
|
||||
"Hardener to match (old behavior).",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbUniversalAdaptiveArmorHardener, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
|
||||
203
gui/builtinPreferenceViews/pyfaEsiPreferences.py
Normal file
203
gui/builtinPreferenceViews/pyfaEsiPreferences.py
Normal file
@@ -0,0 +1,203 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
import gui.mainFrame
|
||||
|
||||
from service.settings import EsiSettings
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
from wx.lib.intctrl import IntCtrl
|
||||
|
||||
from service.esi import Esi
|
||||
|
||||
|
||||
class PFEsiPref(PreferenceView):
|
||||
title = "EVE SSO"
|
||||
|
||||
def populatePanel(self, panel):
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
self.settings = EsiSettings.getInstance()
|
||||
self.dirtySettings = False
|
||||
dlgWidth = panel.GetParent().GetParent().ClientSize.width
|
||||
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.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.stInfo = wx.StaticText(panel, wx.ID_ANY,
|
||||
"Please see the pyfa wiki on GitHub for information regarding these options.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stInfo.Wrap(dlgWidth - 50)
|
||||
mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
rbSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.rbMode = wx.RadioBox(panel, -1, "Login Authentication Method", wx.DefaultPosition, wx.DefaultSize,
|
||||
['Local Server', 'Manual'], 1, wx.RA_SPECIFY_COLS)
|
||||
self.rbMode.SetItemToolTip(0, "This options starts a local webserver that the web application will call back to with information about the character login.")
|
||||
self.rbMode.SetItemToolTip(1, "This option prompts users to copy and paste information from the web application to allow for character login. Use this if having issues with the local server.")
|
||||
|
||||
self.rbSsoMode = wx.RadioBox(panel, -1, "SSO Mode", wx.DefaultPosition, wx.DefaultSize,
|
||||
['pyfa.io', 'Custom application'], 1, wx.RA_SPECIFY_COLS)
|
||||
self.rbSsoMode.SetItemToolTip(0, "This options routes SSO Logins through pyfa.io, allowing you to easily login without any configuration. When in doubt, use this option.")
|
||||
self.rbSsoMode.SetItemToolTip(1, "This option goes through EVE SSO directly, but requires more configuration. Use this is pyfa.io is blocked for some reason, or if you do not wish to route data throguh pyfa.io.")
|
||||
|
||||
self.rbMode.SetSelection(self.settings.get('loginMode'))
|
||||
self.rbSsoMode.SetSelection(self.settings.get('ssoMode'))
|
||||
|
||||
rbSizer.Add(self.rbSsoMode, 1, wx.ALL, 5)
|
||||
rbSizer.Add(self.rbMode, 1, wx.TOP | wx.RIGHT, 5)
|
||||
|
||||
self.rbMode.Bind(wx.EVT_RADIOBOX, self.OnModeChange)
|
||||
self.rbSsoMode.Bind(wx.EVT_RADIOBOX, self.OnSSOChange)
|
||||
|
||||
mainSizer.Add(rbSizer, 1, wx.ALL | wx.EXPAND, 0)
|
||||
|
||||
detailsTitle = wx.StaticText(panel, wx.ID_ANY, "Custom Application", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
detailsTitle.Wrap(-1)
|
||||
detailsTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
|
||||
|
||||
mainSizer.Add(detailsTitle, 0, wx.ALL, 5)
|
||||
mainSizer.Add(wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0,
|
||||
wx.EXPAND, 5)
|
||||
|
||||
# self.stInfo = wx.StaticText(panel, wx.ID_ANY,
|
||||
# u"Using custom applications details will let pyfa to access the SSO under your application, rather than the pyfa application that is automatically set up. This requires you to set up your own ESI client application and accept CCPs License Agreement. Additionally, when setting up your client, make sure the callback url is set to 'http://localhost:6461'. Please see the pyfa wiki for more information regarding this",
|
||||
# wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# self.stInfo.Wrap(dlgWidth)
|
||||
# mainSizer.Add(self.stInfo, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
fgAddrSizer = wx.FlexGridSizer(2, 2, 0, 0)
|
||||
fgAddrSizer.AddGrowableCol(1)
|
||||
fgAddrSizer.SetFlexibleDirection(wx.BOTH)
|
||||
fgAddrSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
|
||||
self.stSetID = wx.StaticText(panel, wx.ID_ANY, u"Client ID:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetID.Wrap(-1)
|
||||
fgAddrSizer.Add(self.stSetID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputClientID = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientID'), wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
|
||||
fgAddrSizer.Add(self.inputClientID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
self.stSetSecret = wx.StaticText(panel, wx.ID_ANY, u"Client Secret:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSetSecret.Wrap(-1)
|
||||
|
||||
fgAddrSizer.Add(self.stSetSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputClientSecret = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientSecret'), wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
|
||||
fgAddrSizer.Add(self.inputClientSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
self.inputClientID.Bind(wx.EVT_TEXT, self.OnClientDetailChange)
|
||||
self.inputClientSecret.Bind(wx.EVT_TEXT, self.OnClientDetailChange)
|
||||
|
||||
mainSizer.Add(fgAddrSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
|
||||
|
||||
timeoutSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
# self.stTimout = wx.StaticText(panel, wx.ID_ANY, "Timeout (seconds):", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# self.stTimout.Wrap(-1)
|
||||
#
|
||||
# timeoutSizer.Add(self.stTimout, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
# self.intTimeout = IntCtrl(panel, max=300000, limited=True, value=self.settings.get('timeout'))
|
||||
# timeoutSizer.Add(self.intTimeout, 0, wx.ALL, 5)
|
||||
# self.intTimeout.Bind(wx.lib.intctrl.EVT_INT, self.OnTimeoutChange)
|
||||
#
|
||||
# mainSizer.Add(timeoutSizer, 0, wx.ALL | wx.EXPAND, 0)
|
||||
|
||||
# detailsTitle = wx.StaticText(panel, wx.ID_ANY, "CREST client details", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# detailsTitle.Wrap(-1)
|
||||
# detailsTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
|
||||
#
|
||||
# mainSizer.Add(detailsTitle, 0, wx.ALL, 5)
|
||||
# mainSizer.Add(wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL), 0,
|
||||
# wx.EXPAND, 5)
|
||||
|
||||
# fgAddrSizer = wx.FlexGridSizer(2, 2, 0, 0)
|
||||
# fgAddrSizer.AddGrowableCol(1)
|
||||
# fgAddrSizer.SetFlexibleDirection(wx.BOTH)
|
||||
# fgAddrSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
#
|
||||
# self.stSetID = wx.StaticText(panel, wx.ID_ANY, "Client ID:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# self.stSetID.Wrap(-1)
|
||||
# fgAddrSizer.Add(self.stSetID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
#
|
||||
# self.inputClientID = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientID'), wx.DefaultPosition,
|
||||
# wx.DefaultSize, 0)
|
||||
#
|
||||
# fgAddrSizer.Add(self.inputClientID, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
#
|
||||
# self.stSetSecret = wx.StaticText(panel, wx.ID_ANY, "Client Secret:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# self.stSetSecret.Wrap(-1)
|
||||
#
|
||||
# fgAddrSizer.Add(self.stSetSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
#
|
||||
# self.inputClientSecret = wx.TextCtrl(panel, wx.ID_ANY, self.settings.get('clientSecret'), wx.DefaultPosition,
|
||||
# wx.DefaultSize, 0)
|
||||
#
|
||||
# fgAddrSizer.Add(self.inputClientSecret, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
#
|
||||
# self.btnApply = wx.Button(panel, wx.ID_ANY, "Save Client Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
# self.btnApply.Bind(wx.EVT_BUTTON, self.OnBtnApply)
|
||||
#
|
||||
# mainSizer.Add(fgAddrSizer, 0, wx.EXPAND, 5)
|
||||
# mainSizer.Add(self.btnApply, 0, wx.ALIGN_RIGHT, 5)
|
||||
|
||||
# self.ToggleProxySettings(self.settings.get('loginMode'))
|
||||
|
||||
self.ToggleSSOMode(self.settings.get('ssoMode'))
|
||||
panel.SetSizer(mainSizer)
|
||||
panel.Layout()
|
||||
|
||||
def OnTimeoutChange(self, event):
|
||||
self.settings.set('timeout', event.GetEventObject().GetValue())
|
||||
|
||||
def OnModeChange(self, event):
|
||||
self.settings.set('loginMode', event.GetInt())
|
||||
|
||||
def OnSSOChange(self, event):
|
||||
self.settings.set('ssoMode', event.GetInt())
|
||||
self.ToggleSSOMode(event.GetInt())
|
||||
|
||||
def ToggleSSOMode(self, mode):
|
||||
if mode:
|
||||
self.stSetID.Enable()
|
||||
self.inputClientID.Enable()
|
||||
self.stSetSecret.Enable()
|
||||
self.inputClientSecret.Enable()
|
||||
self.rbMode.Disable()
|
||||
else:
|
||||
self.stSetID.Disable()
|
||||
self.inputClientID.Disable()
|
||||
self.stSetSecret.Disable()
|
||||
self.inputClientSecret.Disable()
|
||||
self.rbMode.Enable()
|
||||
|
||||
def OnClientDetailChange(self, evt):
|
||||
self.settings.set('clientID', self.inputClientID.GetValue().strip())
|
||||
self.settings.set('clientSecret', self.inputClientSecret.GetValue().strip())
|
||||
|
||||
# sEsi = Esi.getInstance()
|
||||
# sEsi.delAllCharacters()
|
||||
#
|
||||
|
||||
def getImage(self):
|
||||
return BitmapLoader.getBitmap("eve", "gui")
|
||||
|
||||
|
||||
PFEsiPref.register()
|
||||
@@ -1,15 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import copy
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.utils import colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.color import CalculateTransition
|
||||
import gui.utils.draw as drawUtils
|
||||
|
||||
|
||||
###########################################################################
|
||||
@@ -49,6 +48,7 @@ class PFGaugePreview(wx.Window):
|
||||
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnWindowLeave)
|
||||
self.Bind(wx.EVT_TIMER, self.OnTimer)
|
||||
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBk)
|
||||
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
|
||||
|
||||
def OnEraseBk(self, event):
|
||||
pass
|
||||
@@ -109,44 +109,45 @@ class PFGaugePreview(wx.Window):
|
||||
self.Refresh()
|
||||
|
||||
def OnPaint(self, event):
|
||||
rect = self.GetClientRect()
|
||||
dc = wx.BufferedPaintDC(self)
|
||||
dc.SetBackground(wx.Brush(self.bkColor))
|
||||
dc.Clear()
|
||||
|
||||
value = float(self.value)
|
||||
if self.percS >= 100:
|
||||
w = rect.width
|
||||
else:
|
||||
w = rect.width * (float(value) / 100)
|
||||
r = copy.copy(rect)
|
||||
r.width = w
|
||||
|
||||
color = colorUtils.CalculateTransitionColor(self.colorS, self.colorE, float(value) / 100)
|
||||
if self.gradientStart > 0:
|
||||
gcolor = colorUtils.BrightenColor(color, float(self.gradientStart) / 100)
|
||||
gMid = colorUtils.BrightenColor(color, float(self.gradientStart / 2) / 100)
|
||||
else:
|
||||
gcolor = colorUtils.DarkenColor(color, float(-self.gradientStart) / 100)
|
||||
gMid = colorUtils.DarkenColor(color, float(-self.gradientStart / 2) / 100)
|
||||
|
||||
gBmp = drawUtils.DrawGradientBar(r.width, r.height, gMid, color, gcolor)
|
||||
dc.DrawBitmap(gBmp, 0, 0)
|
||||
dc.SetFont(self.font)
|
||||
|
||||
r = copy.copy(rect)
|
||||
r.left += 1
|
||||
r.top += 1
|
||||
|
||||
formatStr = "{0:." + str(self._fractionDigits) + "f}%"
|
||||
value = (self.percE - self.percS) * value / (self.percE - self.percS)
|
||||
value = self.percS + (self.percE - self.percS) * value / 100
|
||||
|
||||
dc.SetTextForeground(wx.Colour(80, 80, 80))
|
||||
dc.DrawLabel(formatStr.format(value), r, wx.ALIGN_CENTER)
|
||||
|
||||
dc.SetTextForeground(wx.Colour(255, 255, 255))
|
||||
dc.DrawLabel(formatStr.format(value), rect, wx.ALIGN_CENTER)
|
||||
pass
|
||||
# rect = self.GetClientRect()
|
||||
# dc = wx.AutoBufferedPaintDC(self)
|
||||
# dc.SetBackground(wx.Brush(self.bkColor))
|
||||
# dc.Clear()
|
||||
#
|
||||
# value = float(self.value)
|
||||
# if self.percS >= 100:
|
||||
# w = rect.width
|
||||
# else:
|
||||
# w = rect.width * (float(value) / 100)
|
||||
# r = copy.copy(rect)
|
||||
# r.width = w
|
||||
#
|
||||
# color = CalculateTransitionColor(self.colorS, self.colorE, float(value) / 100)
|
||||
# if self.gradientStart > 0:
|
||||
# gcolor = color.BrightenColor(color, float(self.gradientStart) / 100)
|
||||
# gMid = color.BrightenColor(color, float(self.gradientStart / 2) / 100)
|
||||
# else:
|
||||
# gcolor = color.DarkenColor(color, float(-self.gradientStart) / 100)
|
||||
# gMid = color.DarkenColor(color, float(-self.gradientStart / 2) / 100)
|
||||
#
|
||||
# gBmp = drawUtils.DrawGradientBar(r.width, r.height, gMid, color, gcolor)
|
||||
# dc.DrawBitmap(gBmp, 0, 0)
|
||||
# dc.SetFont(self.font)
|
||||
#
|
||||
# r = copy.copy(rect)
|
||||
# r.left += 1
|
||||
# r.top += 1
|
||||
#
|
||||
# formatStr = "{0:." + str(self._fractionDigits) + "f}%"
|
||||
# value = (self.percE - self.percS) * value / (self.percE - self.percS)
|
||||
# value = self.percS + (self.percE - self.percS) * value / 100
|
||||
#
|
||||
# dc.SetTextForeground(wx.Colour(80, 80, 80))
|
||||
# dc.DrawLabel(formatStr.format(value), r, wx.ALIGN_CENTER)
|
||||
#
|
||||
# dc.SetTextForeground(wx.Colour(255, 255, 255))
|
||||
# dc.DrawLabel(formatStr.format(value), rect, wx.ALIGN_CENTER)
|
||||
|
||||
|
||||
class PFGaugePref(PreferenceView):
|
||||
@@ -160,7 +161,7 @@ class PFGaugePref(PreferenceView):
|
||||
|
||||
gSizer1 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.st0100 = wx.StaticText(panel, wx.ID_ANY, u"0 - 100", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT)
|
||||
self.st0100 = wx.StaticText(panel, wx.ID_ANY, "0 - 100", wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT)
|
||||
self.st0100.Wrap(-1)
|
||||
gSizer1.Add(self.st0100, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
@@ -185,7 +186,7 @@ class PFGaugePref(PreferenceView):
|
||||
|
||||
gSizer2 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.st100101 = wx.StaticText(panel, wx.ID_ANY, u"100 - 101", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.st100101 = wx.StaticText(panel, wx.ID_ANY, "100 - 101", wx.DefaultPosition, wx.DefaultSize,
|
||||
wx.ALIGN_RIGHT)
|
||||
self.st100101.Wrap(-1)
|
||||
gSizer2.Add(self.st100101, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
@@ -211,7 +212,7 @@ class PFGaugePref(PreferenceView):
|
||||
|
||||
gSizer3 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.st101103 = wx.StaticText(panel, wx.ID_ANY, u"101 - 103", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.st101103 = wx.StaticText(panel, wx.ID_ANY, "101 - 103", wx.DefaultPosition, wx.DefaultSize,
|
||||
wx.ALIGN_RIGHT)
|
||||
self.st101103.Wrap(-1)
|
||||
gSizer3.Add(self.st101103, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
@@ -237,7 +238,7 @@ class PFGaugePref(PreferenceView):
|
||||
|
||||
gSizer4 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.st103105 = wx.StaticText(panel, wx.ID_ANY, u"103 - 105", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.st103105 = wx.StaticText(panel, wx.ID_ANY, "103 - 105", wx.DefaultPosition, wx.DefaultSize,
|
||||
wx.ALIGN_RIGHT)
|
||||
self.st103105.Wrap(-1)
|
||||
gSizer4.Add(self.st103105, 1, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
@@ -284,20 +285,20 @@ class PFGaugePref(PreferenceView):
|
||||
|
||||
buttonsSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.cbLink = wx.CheckBox(panel, wx.ID_ANY, u"Link Colors", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbLink = wx.CheckBox(panel, wx.ID_ANY, "Link Colors", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
buttonsSizer.Add(self.cbLink, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.LEFT, 5)
|
||||
|
||||
self.sliderGradientStart = wx.Slider(panel, wx.ID_ANY, self.gradientStart, -100, 100, wx.DefaultPosition,
|
||||
(127, -1), wx.SL_HORIZONTAL | wx.SL_LABELS)
|
||||
buttonsSizer.Add(self.sliderGradientStart, 1, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.btnRestore = wx.Button(panel, wx.ID_ANY, u"Restore Defaults", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnRestore = wx.Button(panel, wx.ID_ANY, "Restore Defaults", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
buttonsSizer.Add(self.btnRestore, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.btnDump = wx.Button(panel, wx.ID_ANY, u"Dump Colors", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnDump = wx.Button(panel, wx.ID_ANY, "Dump Colors", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
buttonsSizer.Add(self.btnDump, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.btnOk = wx.Button(panel, wx.ID_ANY, u"Apply", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnOk = wx.Button(panel, wx.ID_ANY, "Apply", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
buttonsSizer.Add(self.btnOk, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
footerSizer.Add(buttonsSizer, 1, wx.ALIGN_RIGHT, 5)
|
||||
@@ -432,11 +433,11 @@ class PFGaugePref(PreferenceView):
|
||||
event.Skip()
|
||||
|
||||
def DumpColours(self, event):
|
||||
print("Gradient start: %d" % self.sliderGradientStart.GetValue())
|
||||
print(" 0 <-> 100 Start: ", self.c0100S, " End: ", self.c0100E)
|
||||
print("100 <-> 101 Start: ", self.c100101S, " End: ", self.c100101E)
|
||||
print("101 <-> 103 Start: ", self.c101103S, " End: ", self.c101103E)
|
||||
print("103 <-> 105 Start: ", self.c103105S, " End: ", self.c103105E)
|
||||
print(("Gradient start: %d" % self.sliderGradientStart.GetValue()))
|
||||
print((" 0 <-> 100 Start: ", self.c0100S, " End: ", self.c0100E))
|
||||
print(("100 <-> 101 Start: ", self.c100101S, " End: ", self.c100101E))
|
||||
print(("101 <-> 103 Start: ", self.c101103S, " End: ", self.c101103E))
|
||||
print(("103 <-> 105 Start: ", self.c103105S, " End: ", self.c103105E))
|
||||
|
||||
event.Skip()
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import wx
|
||||
from wx.lib.intctrl import IntCtrl
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
@@ -21,7 +21,7 @@ class PFGeneralPref(PreferenceView):
|
||||
self.openFitsSettings = SettingsProvider.getInstance().getSettings("pyfaPrevOpenFits",
|
||||
{"enabled": False, "pyfaOpenFits": []})
|
||||
|
||||
helpCursor = wx.StockCursor(wx.CURSOR_QUESTION_ARROW)
|
||||
helpCursor = wx.Cursor(wx.CURSOR_QUESTION_ARROW)
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
@@ -34,59 +34,59 @@ class PFGeneralPref(PreferenceView):
|
||||
self.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.cbGlobalChar = wx.CheckBox(panel, wx.ID_ANY, u"Use global character", wx.DefaultPosition, wx.DefaultSize,
|
||||
self.cbGlobalChar = wx.CheckBox(panel, wx.ID_ANY, "Use global character", wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
mainSizer.Add(self.cbGlobalChar, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbGlobalDmgPattern = wx.CheckBox(panel, wx.ID_ANY, u"Use global damage pattern", wx.DefaultPosition,
|
||||
self.cbGlobalDmgPattern = wx.CheckBox(panel, wx.ID_ANY, "Use global damage pattern", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbGlobalDmgPattern, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbCompactSkills = wx.CheckBox(panel, wx.ID_ANY, u"Compact skills needed tooltip", wx.DefaultPosition,
|
||||
self.cbCompactSkills = wx.CheckBox(panel, wx.ID_ANY, "Compact skills needed tooltip", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbCompactSkills, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbFitColorSlots = wx.CheckBox(panel, wx.ID_ANY, u"Color fitting view by slot", wx.DefaultPosition,
|
||||
self.cbFitColorSlots = wx.CheckBox(panel, wx.ID_ANY, "Color fitting view by slot", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbFitColorSlots, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbReopenFits = wx.CheckBox(panel, wx.ID_ANY, u"Reopen previous fits on startup", wx.DefaultPosition,
|
||||
self.cbReopenFits = wx.CheckBox(panel, wx.ID_ANY, "Reopen previous fits on startup", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbReopenFits, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbRackSlots = wx.CheckBox(panel, wx.ID_ANY, u"Separate Racks", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbRackSlots = wx.CheckBox(panel, wx.ID_ANY, "Separate Racks", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbRackSlots, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
labelSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
self.cbRackLabels = wx.CheckBox(panel, wx.ID_ANY, u"Show Rack Labels", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbRackLabels = wx.CheckBox(panel, wx.ID_ANY, "Show Rack Labels", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
labelSizer.Add(self.cbRackLabels, 0, wx.ALL | wx.EXPAND, 5)
|
||||
mainSizer.Add(labelSizer, 0, wx.LEFT | wx.EXPAND, 30)
|
||||
|
||||
self.cbShowTooltip = wx.CheckBox(panel, wx.ID_ANY, u"Show tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbShowTooltip = wx.CheckBox(panel, wx.ID_ANY, "Show tab tooltips", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbShowTooltip, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbMarketShortcuts = wx.CheckBox(panel, wx.ID_ANY, u"Show market shortcuts", wx.DefaultPosition,
|
||||
self.cbMarketShortcuts = wx.CheckBox(panel, wx.ID_ANY, "Show market shortcuts", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbMarketShortcuts, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbGaugeAnimation = wx.CheckBox(panel, wx.ID_ANY, u"Animate gauges", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbGaugeAnimation = wx.CheckBox(panel, wx.ID_ANY, "Animate gauges", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbGaugeAnimation, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbExportCharges = wx.CheckBox(panel, wx.ID_ANY, u"Export loaded charges", wx.DefaultPosition,
|
||||
self.cbExportCharges = wx.CheckBox(panel, wx.ID_ANY, "Export loaded charges", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbExportCharges, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbOpenFitInNew = wx.CheckBox(panel, wx.ID_ANY, u"Open fittings in a new page by default",
|
||||
self.cbOpenFitInNew = wx.CheckBox(panel, wx.ID_ANY, "Open fittings in a new page by default",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbOpenFitInNew, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbShowShipBrowserTooltip = wx.CheckBox(panel, wx.ID_ANY, u"Show ship browser tooltip",
|
||||
self.cbShowShipBrowserTooltip = wx.CheckBox(panel, wx.ID_ANY, "Show ship browser tooltip",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbShowShipBrowserTooltip, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
priceSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, u"Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stDefaultSystem = wx.StaticText(panel, wx.ID_ANY, "Default Market Prices:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stDefaultSystem.Wrap(-1)
|
||||
priceSizer.Add(self.stDefaultSystem, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.stDefaultSystem.SetCursor(helpCursor)
|
||||
@@ -95,7 +95,7 @@ class PFGeneralPref(PreferenceView):
|
||||
'source fails. The system you choose is absolute and requests will not be made against other systems.'))
|
||||
|
||||
self.chPriceSource = wx.Choice(panel, choices=sorted(Price.sources.keys()))
|
||||
self.chPriceSystem = wx.Choice(panel, choices=Price.systemsList.keys())
|
||||
self.chPriceSystem = wx.Choice(panel, choices=list(Price.systemsList.keys()))
|
||||
priceSizer.Add(self.chPriceSource, 1, wx.ALL | wx.EXPAND, 5)
|
||||
priceSizer.Add(self.chPriceSystem, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
@@ -103,7 +103,7 @@ class PFGeneralPref(PreferenceView):
|
||||
|
||||
delayTimer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.stMarketDelay = wx.StaticText(panel, wx.ID_ANY, u"Market Search Delay (ms):", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stMarketDelay = wx.StaticText(panel, wx.ID_ANY, "Market Search Delay (ms):", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stMarketDelay.Wrap(-1)
|
||||
self.stMarketDelay.SetCursor(helpCursor)
|
||||
self.stMarketDelay.SetToolTip(
|
||||
|
||||
@@ -3,11 +3,12 @@ import wx
|
||||
import os
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
import gui.mainFrame
|
||||
|
||||
from service.settings import HTMLExportSettings
|
||||
import wx.lib.agw.hyperlink
|
||||
|
||||
|
||||
class PFHTMLExportPref(PreferenceView):
|
||||
@@ -37,10 +38,9 @@ class PFHTMLExportPref(PreferenceView):
|
||||
self.stDesc.Wrap(dlgWidth - 50)
|
||||
mainSizer.Add(self.stDesc, 0, wx.ALL, 5)
|
||||
|
||||
self.PathLinkCtrl = wx.HyperlinkCtrl(panel, wx.ID_ANY, self.HTMLExportSettings.getPath(),
|
||||
u'file:///{}'.format(self.HTMLExportSettings.getPath()),
|
||||
self.PathLinkCtrl = wx.lib.agw.hyperlink.HyperLinkCtrl(panel, wx.ID_ANY, self.HTMLExportSettings.getPath(),
|
||||
wx.DefaultPosition, wx.DefaultSize,
|
||||
wx.HL_ALIGN_LEFT | wx.NO_BORDER | wx.HL_CONTEXTMENU)
|
||||
URL='file:///{}'.format(self.HTMLExportSettings.getPath()),)
|
||||
mainSizer.Add(self.PathLinkCtrl, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.fileSelectDialog = wx.FileDialog(None, "Save Fitting As...",
|
||||
@@ -56,7 +56,7 @@ class PFHTMLExportPref(PreferenceView):
|
||||
self.stDesc4.Wrap(dlgWidth - 50)
|
||||
mainSizer.Add(self.stDesc4, 0, wx.ALL, 5)
|
||||
|
||||
self.exportMinimal = wx.CheckBox(panel, wx.ID_ANY, u"Enable minimal format", wx.DefaultPosition,
|
||||
self.exportMinimal = wx.CheckBox(panel, wx.ID_ANY, "Enable minimal format", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
self.exportMinimal.SetValue(self.HTMLExportSettings.getMinimalEnabled())
|
||||
self.exportMinimal.Bind(wx.EVT_CHECKBOX, self.OnMinimalEnabledChange)
|
||||
@@ -67,7 +67,7 @@ class PFHTMLExportPref(PreferenceView):
|
||||
|
||||
def setPathLinkCtrlValues(self, path):
|
||||
self.PathLinkCtrl.SetLabel(self.HTMLExportSettings.getPath())
|
||||
self.PathLinkCtrl.SetURL(u'file:///{}'.format(self.HTMLExportSettings.getPath()))
|
||||
self.PathLinkCtrl.SetURL('file:///{}'.format(self.HTMLExportSettings.getPath()))
|
||||
self.PathLinkCtrl.SetSize(wx.DefaultSize)
|
||||
self.PathLinkCtrl.Refresh()
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
import config
|
||||
from logbook import Logger
|
||||
|
||||
@@ -25,7 +25,7 @@ class PFGeneralPref(PreferenceView):
|
||||
self.stTitle.SetFont(wx.Font(12, 70, 90, 90, False, wx.EmptyString))
|
||||
mainSizer.Add(self.stTitle, 0, wx.ALL, 5)
|
||||
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY, u"(Cannot be changed while pyfa is running. Set via command line switches.)",
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY, "(Cannot be changed while pyfa is running. Set via command line switches.)",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSubTitle.Wrap(-1)
|
||||
mainSizer.Add(self.stSubTitle, 0, wx.ALL, 3)
|
||||
@@ -34,7 +34,7 @@ class PFGeneralPref(PreferenceView):
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
# Database path
|
||||
self.stLogPath = wx.StaticText(panel, wx.ID_ANY, u"Log file location:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stLogPath = wx.StaticText(panel, wx.ID_ANY, "Log file location:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stLogPath.Wrap(-1)
|
||||
mainSizer.Add(self.stLogPath, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.inputLogPath = wx.TextCtrl(panel, wx.ID_ANY, config.logPath, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
@@ -42,14 +42,23 @@ class PFGeneralPref(PreferenceView):
|
||||
self.inputLogPath.SetBackgroundColour((200, 200, 200))
|
||||
mainSizer.Add(self.inputLogPath, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
import requests
|
||||
self.certPath = wx.StaticText(panel, wx.ID_ANY, "Cert Path:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.certPath .Wrap(-1)
|
||||
mainSizer.Add(self.certPath, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.certPathCtrl = wx.TextCtrl(panel, wx.ID_ANY, requests.certs.where(), wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.certPathCtrl.SetEditable(False)
|
||||
self.certPathCtrl.SetBackgroundColour((200, 200, 200))
|
||||
mainSizer.Add(self.certPathCtrl, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
# Debug Logging
|
||||
self.cbdebugLogging = wx.CheckBox(panel, wx.ID_ANY, u"Debug Logging Enabled", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbdebugLogging = wx.CheckBox(panel, wx.ID_ANY, "Debug Logging Enabled", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbdebugLogging, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.stDumpLogs = wx.StaticText(panel, wx.ID_ANY, u"Pressing this button will cause all logs in memory to write to the log file:",
|
||||
self.stDumpLogs = wx.StaticText(panel, wx.ID_ANY, "Pressing this button will cause all logs in memory to write to the log file:",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.stDumpLogs, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
self.btnDumpLogs = wx.Button(panel, wx.ID_ANY, u"Dump All Logs", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnDumpLogs = wx.Button(panel, wx.ID_ANY, "Dump All Logs", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnDumpLogs.Bind(wx.EVT_BUTTON, OnDumpLogs)
|
||||
mainSizer.Add(self.btnDumpLogs, 0, wx.ALIGN_LEFT, 5)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
import gui.mainFrame
|
||||
from service.settings import NetworkSettings
|
||||
@@ -30,18 +30,18 @@ class PFNetworkPref(PreferenceView):
|
||||
self.m_staticline1 = wx.StaticLine(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL)
|
||||
mainSizer.Add(self.m_staticline1, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.cbEnableNetwork = wx.CheckBox(panel, wx.ID_ANY, u"Enable Network", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbEnableNetwork = wx.CheckBox(panel, wx.ID_ANY, "Enable Network", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.cbEnableNetwork, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
subSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
self.cbEve = wx.CheckBox(panel, wx.ID_ANY, u"EVE Servers (API && CREST import)", wx.DefaultPosition,
|
||||
self.cbEve = wx.CheckBox(panel, wx.ID_ANY, "EVE Servers (API && CREST import)", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
subSizer.Add(self.cbEve, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbPricing = wx.CheckBox(panel, wx.ID_ANY, u"Pricing updates", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbPricing = wx.CheckBox(panel, wx.ID_ANY, "Pricing updates", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
subSizer.Add(self.cbPricing, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.cbPyfaUpdate = wx.CheckBox(panel, wx.ID_ANY, u"Pyfa Update checks", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.cbPyfaUpdate = wx.CheckBox(panel, wx.ID_ANY, "Pyfa Update checks", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
subSizer.Add(self.cbPyfaUpdate, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
mainSizer.Add(subSizer, 0, wx.LEFT | wx.EXPAND, 30)
|
||||
@@ -80,11 +80,11 @@ class PFNetworkPref(PreferenceView):
|
||||
|
||||
ptypeSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
self.stPType = wx.StaticText(panel, wx.ID_ANY, u"Mode:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPType = wx.StaticText(panel, wx.ID_ANY, "Mode:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPType.Wrap(-1)
|
||||
ptypeSizer.Add(self.stPType, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.chProxyTypeChoices = [u"No proxy", u"Auto-detected proxy settings", u"Manual proxy settings"]
|
||||
self.chProxyTypeChoices = ["No proxy", "Auto-detected proxy settings", "Manual proxy settings"]
|
||||
self.chProxyType = wx.Choice(panel, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, self.chProxyTypeChoices, 0)
|
||||
|
||||
self.chProxyType.SetSelection(self.nMode)
|
||||
@@ -98,7 +98,7 @@ class PFNetworkPref(PreferenceView):
|
||||
fgAddrSizer.SetFlexibleDirection(wx.BOTH)
|
||||
fgAddrSizer.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
|
||||
self.stPSetAddr = wx.StaticText(panel, wx.ID_ANY, u"Addr:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetAddr = wx.StaticText(panel, wx.ID_ANY, "Addr:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetAddr.Wrap(-1)
|
||||
fgAddrSizer.Add(self.stPSetAddr, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
@@ -106,7 +106,7 @@ class PFNetworkPref(PreferenceView):
|
||||
|
||||
fgAddrSizer.Add(self.editProxySettingsAddr, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND, 5)
|
||||
|
||||
self.stPSetPort = wx.StaticText(panel, wx.ID_ANY, u"Port:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetPort = wx.StaticText(panel, wx.ID_ANY, "Port:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetPort.Wrap(-1)
|
||||
|
||||
fgAddrSizer.Add(self.stPSetPort, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
@@ -118,14 +118,14 @@ class PFNetworkPref(PreferenceView):
|
||||
mainSizer.Add(fgAddrSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
# proxy auth information: login and pass
|
||||
self.stPSetLogin = wx.StaticText(panel, wx.ID_ANY, u"Username:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetLogin = wx.StaticText(panel, wx.ID_ANY, "Username:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetLogin.Wrap(-1)
|
||||
self.editProxySettingsLogin = wx.TextCtrl(panel, wx.ID_ANY, self.nAuth[0], wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
self.stPSetPassword = wx.StaticText(panel, wx.ID_ANY, u"Password:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
0)
|
||||
self.stPSetPassword = wx.StaticText(panel, wx.ID_ANY, "Password:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stPSetPassword.Wrap(-1)
|
||||
self.editProxySettingsPassword = wx.TextCtrl(panel, wx.ID_ANY, self.nAuth[1], wx.DefaultPosition,
|
||||
wx.DefaultSize, wx.TE_PASSWORD)
|
||||
wx.DefaultSize, wx.TE_PASSWORD)
|
||||
pAuthSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
pAuthSizer.Add(self.stPSetLogin, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
pAuthSizer.Add(self.editProxySettingsLogin, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
@@ -133,15 +133,15 @@ class PFNetworkPref(PreferenceView):
|
||||
pAuthSizer.Add(self.editProxySettingsPassword, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
mainSizer.Add(pAuthSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
self.stPSAutoDetected = wx.StaticText(panel, wx.ID_ANY, u"Auto-detected: ", wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
self.stPSAutoDetected = wx.StaticText(panel, wx.ID_ANY, "Auto-detected: ", wx.DefaultPosition, wx.DefaultSize,
|
||||
0)
|
||||
self.stPSAutoDetected.Wrap(-1)
|
||||
mainSizer.Add(self.stPSAutoDetected, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
btnSizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
btnSizer.AddStretchSpacer()
|
||||
|
||||
self.btnApply = wx.Button(panel, wx.ID_ANY, u"Apply Proxy Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.btnApply = wx.Button(panel, wx.ID_ANY, "Apply Proxy Settings", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
|
||||
btnSizer.Add(self.btnApply, 0, wx.ALL, 5)
|
||||
|
||||
@@ -150,10 +150,10 @@ class PFNetworkPref(PreferenceView):
|
||||
proxy = self.settings.autodetect()
|
||||
|
||||
if proxy is not None:
|
||||
addr, port = proxy
|
||||
txt = addr + ":" + str(port)
|
||||
addr, port = proxy
|
||||
txt = addr + ":" + str(port)
|
||||
else:
|
||||
txt = "None"
|
||||
txt = "None"
|
||||
|
||||
self.stPSAutoDetected.SetLabel("Auto-detected: " + txt)
|
||||
self.stPSAutoDetected.Disable()
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.settings import StatViewSettings
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ class PFStatViewPref(PreferenceView):
|
||||
mainSizer.Add(self.stTitle, 0, wx.ALL, 5)
|
||||
|
||||
self.stSubTitle = wx.StaticText(panel, wx.ID_ANY,
|
||||
u"Changes require restart of pyfa to take effect.",
|
||||
"Changes require restart of pyfa to take effect.",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stSubTitle.Wrap(-1)
|
||||
mainSizer.Add(self.stSubTitle, 0, wx.ALL, 3)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import wx
|
||||
|
||||
from gui.preferenceView import PreferenceView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.settings import UpdateSettings
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ class PFUpdatePref(PreferenceView):
|
||||
self.stDesc.Wrap(dlgWidth - 50)
|
||||
mainSizer.Add(self.stDesc, 0, wx.ALL, 5)
|
||||
|
||||
self.suppressPrerelease = wx.CheckBox(panel, wx.ID_ANY, u"Allow pre-release notifications", wx.DefaultPosition,
|
||||
self.suppressPrerelease = wx.CheckBox(panel, wx.ID_ANY, "Allow pre-release notifications", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
self.suppressPrerelease.Bind(wx.EVT_CHECKBOX, self.OnPrereleaseStateChange)
|
||||
self.suppressPrerelease.SetValue(not self.UpdateSettings.get('prerelease'))
|
||||
@@ -52,11 +52,11 @@ class PFUpdatePref(PreferenceView):
|
||||
"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.AddStretchSpacer()
|
||||
|
||||
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.AddStretchSpacer()
|
||||
|
||||
self.versionSizer.Add(self.versionTitle, 0, wx.EXPAND, 5)
|
||||
self.versionDesc = wx.StaticText(panel, wx.ID_ANY, self.versionInfo, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
|
||||
@@ -4,11 +4,11 @@ import wx
|
||||
from logbook import Logger
|
||||
|
||||
from gui.builtinShipBrowser.sfBrowserItem import SFBrowserItem
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
import gui.utils.fonts as fonts
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
import events
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from .events import Stage2Selected
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
@@ -20,7 +20,7 @@ class CategoryItem(SFBrowserItem):
|
||||
if categoryID:
|
||||
self.shipBmp = BitmapLoader.getBitmap("ship_small", "gui")
|
||||
else:
|
||||
self.shipBmp = wx.EmptyBitmap(16, 16)
|
||||
self.shipBmp = wx.Bitmap(16, 16)
|
||||
|
||||
self.dropShadowBitmap = drawUtils.CreateDropShadowBitmap(self.shipBmp, 0.2)
|
||||
|
||||
@@ -77,7 +77,7 @@ class CategoryItem(SFBrowserItem):
|
||||
|
||||
def selectCategory(self, event):
|
||||
categoryID = self.categoryID
|
||||
wx.PostEvent(self.shipBrowser, events.Stage2Selected(categoryID=categoryID, back=False))
|
||||
wx.PostEvent(self.shipBrowser, Stage2Selected(categoryID=categoryID, back=False))
|
||||
|
||||
def MouseLeftUp(self, event):
|
||||
self.selectCategory(event)
|
||||
@@ -100,8 +100,8 @@ class CategoryItem(SFBrowserItem):
|
||||
# rect = self.GetRect()
|
||||
self.UpdateElementsPos(mdc)
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitable(windowColor, 1)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
mdc.DrawBitmap(self.dropShadowBitmap, self.shipBmpx + 1, self.shipBmpy + 1)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import re
|
||||
import time
|
||||
import config
|
||||
|
||||
import wx
|
||||
from logbook import Logger
|
||||
@@ -9,11 +10,11 @@ from logbook import Logger
|
||||
import gui.builtinShipBrowser.sfBrowserItem as SFItem
|
||||
import gui.globalEvents as GE
|
||||
import gui.mainFrame
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
import gui.utils.fonts as fonts
|
||||
import events
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from .events import ImportSelected, SearchSelected, FitSelected, BoosterListUpdated, Stage3Selected, FitRenamed, FitRemoved
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.builtinShipBrowser.pfBitmapFrame import PFBitmapFrame
|
||||
from service.fit import Fit
|
||||
|
||||
@@ -58,6 +59,9 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
self.shipFittingInfo = shipFittingInfo
|
||||
self.shipName, self.shipTrait, self.fitName, self.fitBooster, self.timestamp, self.notes = shipFittingInfo
|
||||
|
||||
if config.debug:
|
||||
self.fitName = '({}) {}'.format(self.fitID, self.fitName)
|
||||
|
||||
self.shipTrait = re.sub("<.*?>", " ", self.shipTrait)
|
||||
# see GH issue #62
|
||||
|
||||
@@ -72,9 +76,9 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
self.acceptBmp = BitmapLoader.getBitmap("faccept_small", "gui")
|
||||
self.shipEffBk = BitmapLoader.getBitmap("fshipbk_big", "gui")
|
||||
|
||||
img = wx.ImageFromBitmap(self.shipEffBk)
|
||||
img = self.shipEffBk.ConvertToImage()
|
||||
img = img.Mirror(False)
|
||||
self.shipEffBkMirrored = wx.BitmapFromImage(img)
|
||||
self.shipEffBkMirrored = wx.Bitmap(img)
|
||||
|
||||
self.dragTLFBmp = None
|
||||
|
||||
@@ -154,8 +158,8 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
if self.shipTrait and sFit.serviceFittingOptions["showShipBrowserTooltip"]:
|
||||
notes = ""
|
||||
if self.notes:
|
||||
notes = u'─' * 20 + u"\nNotes: {}\n".format(self.notes[:197] + '...' if len(self.notes) > 200 else self.notes)
|
||||
self.SetToolTip(wx.ToolTip(u'{}\n{}{}\n{}'.format(self.shipName, notes, u'─' * 20, self.shipTrait)))
|
||||
notes = '─' * 20 + "\nNotes: {}\n".format(self.notes[:197] + '...' if len(self.notes) > 200 else self.notes)
|
||||
self.SetToolTip(wx.ToolTip('{}\n{}{}\n{}'.format(self.shipName, notes, '─' * 20, self.shipTrait)))
|
||||
|
||||
def OnKeyUp(self, event):
|
||||
if event.GetKeyCode() in (32, 13): # space and enter
|
||||
@@ -171,7 +175,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
self.fitBooster = not self.fitBooster
|
||||
self.boosterBtn.Show(self.fitBooster)
|
||||
self.Refresh()
|
||||
wx.PostEvent(self.mainFrame, events.BoosterListUpdated())
|
||||
wx.PostEvent(self.mainFrame, BoosterListUpdated())
|
||||
event.Skip()
|
||||
|
||||
def OnProjectToFit(self, event):
|
||||
@@ -285,6 +289,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
def editLostFocus(self, event):
|
||||
self.RestoreEditButton()
|
||||
self.Refresh()
|
||||
event.Skip()
|
||||
|
||||
def editCheckEsc(self, event):
|
||||
if event.GetKeyCode() == wx.WXK_ESCAPE:
|
||||
@@ -303,8 +308,8 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
sFit = Fit.getInstance()
|
||||
fitID = sFit.copyFit(self.fitID)
|
||||
self.shipBrowser.fitIDMustEditName = fitID
|
||||
wx.PostEvent(self.shipBrowser, events.Stage3Selected(shipID=self.shipID))
|
||||
wx.PostEvent(self.mainFrame, events.FitSelected(fitID=fitID))
|
||||
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID))
|
||||
|
||||
def renameBtnCB(self):
|
||||
if self.tcFitName.IsShown():
|
||||
@@ -327,7 +332,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
if fitName:
|
||||
self.fitName = fitName
|
||||
sFit.renameFit(self.fitID, self.fitName)
|
||||
wx.PostEvent(self.mainFrame, events.FitRenamed(fitID=self.fitID))
|
||||
wx.PostEvent(self.mainFrame, FitRenamed(fitID=self.fitID))
|
||||
else:
|
||||
self.tcFitName.SetValue(self.fitName)
|
||||
|
||||
@@ -337,7 +342,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
return
|
||||
|
||||
# to prevent accidental deletion, give dialog confirmation unless shift is depressed
|
||||
if wx.GetMouseState().ShiftDown() or wx.GetMouseState().MiddleDown():
|
||||
if wx.GetMouseState().ShiftDown() or wx.GetMouseState().MiddleIsDown():
|
||||
self.deleteFit()
|
||||
else:
|
||||
dlg = wx.MessageDialog(
|
||||
@@ -369,21 +374,21 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
sFit.deleteFit(self.fitID)
|
||||
|
||||
# Notify other areas that a fit has been deleted
|
||||
wx.PostEvent(self.mainFrame, events.FitRemoved(fitID=self.fitID))
|
||||
wx.PostEvent(self.mainFrame, FitRemoved(fitID=self.fitID))
|
||||
|
||||
# todo: would a simple RefreshList() work here instead of posting that a stage has been selected?
|
||||
if self.shipBrowser.GetActiveStage() == 5:
|
||||
wx.PostEvent(self.shipBrowser, events.ImportSelected(fits=self.shipBrowser.lastdata, recent=self.shipBrowser.recentFits))
|
||||
wx.PostEvent(self.shipBrowser, ImportSelected(fits=self.shipBrowser.lastdata, recent=self.shipBrowser.recentFits))
|
||||
elif self.shipBrowser.GetActiveStage() == 4:
|
||||
wx.PostEvent(self.shipBrowser, events.SearchSelected(text=self.shipBrowser.navpanel.lastSearch, back=True))
|
||||
wx.PostEvent(self.shipBrowser, SearchSelected(text=self.shipBrowser.navpanel.lastSearch, back=True))
|
||||
else:
|
||||
wx.PostEvent(self.shipBrowser, events.Stage3Selected(shipID=self.shipID))
|
||||
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID))
|
||||
|
||||
def MouseLeftUp(self, event):
|
||||
if self.dragging and self.dragged:
|
||||
self.OnMouseCaptureLost(event)
|
||||
|
||||
targetWnd = wx.FindWindowAtPointer()
|
||||
targetWnd, _ = wx.FindWindowAtPointer()
|
||||
|
||||
if not targetWnd:
|
||||
return
|
||||
@@ -433,9 +438,9 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
|
||||
def selectFit(self, event=None, newTab=False):
|
||||
if newTab:
|
||||
wx.PostEvent(self.mainFrame, events.FitSelected(fitID=self.fitID, startup=2))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=self.fitID, startup=2))
|
||||
else:
|
||||
wx.PostEvent(self.mainFrame, events.FitSelected(fitID=self.fitID))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=self.fitID))
|
||||
|
||||
def RestoreEditButton(self):
|
||||
self.tcFitName.Show(False)
|
||||
@@ -480,8 +485,8 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
def DrawItem(self, mdc):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitable(windowColor, 1)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
|
||||
@@ -521,7 +526,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
self.AdjustControlSizePos(self.tcFitName, self.textStartx, self.toolbarx - self.editWidth - self.padding)
|
||||
|
||||
tdc = wx.MemoryDC()
|
||||
self.dragTLFBmp = wx.EmptyBitmap((self.toolbarx if self.toolbarx < 200 else 200), rect.height, 24)
|
||||
self.dragTLFBmp = wx.Bitmap((self.toolbarx if self.toolbarx < 200 else 200), rect.height, 24)
|
||||
tdc.SelectObject(self.dragTLFBmp)
|
||||
tdc.Blit(0, 0, (self.toolbarx if self.toolbarx < 200 else 200), rect.height, mdc, 0, 0, wx.COPY)
|
||||
tdc.SelectObject(wx.NullBitmap)
|
||||
@@ -569,7 +574,7 @@ class FitItem(SFItem.SFBrowserItem):
|
||||
def RenderBackground(self):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
|
||||
# activeFitID = self.mainFrame.getActiveFit()
|
||||
state = self.GetState()
|
||||
|
||||
@@ -5,11 +5,11 @@ from logbook import Logger
|
||||
|
||||
import gui.builtinShipBrowser.sfBrowserItem as SFItem
|
||||
import gui.mainFrame
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
import gui.utils.fonts as fonts
|
||||
import events
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from .events import FitSelected, SearchSelected, ImportSelected, Stage1Selected, Stage2Selected, Stage3Selected
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from service.fit import Fit
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
@@ -29,11 +29,11 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
|
||||
switchImg = BitmapLoader.getImage("fit_switch_view_mode_small", "gui")
|
||||
switchImg = switchImg.AdjustChannels(1, 1, 1, 0.4)
|
||||
self.switchBmpD = wx.BitmapFromImage(switchImg)
|
||||
self.switchBmpD = wx.Bitmap(switchImg)
|
||||
|
||||
recentImg = BitmapLoader.getImage("frecent_small", "gui")
|
||||
recentImg = recentImg.AdjustChannels(1, 1, 1, 0.4)
|
||||
self.recentBmpD = wx.BitmapFromImage(recentImg)
|
||||
self.recentBmpD = wx.Bitmap(recentImg)
|
||||
|
||||
self.resetBmp = self.AdjustChannels(self.resetBmpH)
|
||||
self.rewBmp = self.AdjustChannels(self.rewBmpH)
|
||||
@@ -87,7 +87,7 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
realsearch = search.replace("*", "")
|
||||
if len(realsearch) >= 3:
|
||||
self.lastSearch = search
|
||||
wx.PostEvent(self.shipBrowser, events.SearchSelected(text=search, back=False))
|
||||
wx.PostEvent(self.shipBrowser, SearchSelected(text=search, back=False))
|
||||
|
||||
def ToggleSearchBox(self):
|
||||
if self.BrowserSearchBox.IsShown():
|
||||
@@ -122,7 +122,7 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
self.btnRecent.normalBmp = self.recentBmpD
|
||||
|
||||
if emitEvent:
|
||||
wx.PostEvent(self.shipBrowser, events.Stage1Selected())
|
||||
wx.PostEvent(self.shipBrowser, Stage1Selected())
|
||||
else:
|
||||
self.shipBrowser.recentFits = True
|
||||
self.btnRecent.label = "Hide Recent Fits"
|
||||
@@ -131,7 +131,7 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
if emitEvent:
|
||||
sFit = Fit.getInstance()
|
||||
fits = sFit.getRecentFits()
|
||||
wx.PostEvent(self.shipBrowser, events.ImportSelected(fits=fits, back=True, recent=True))
|
||||
wx.PostEvent(self.shipBrowser, ImportSelected(fits=fits, back=True, recent=True))
|
||||
|
||||
def ToggleEmptyGroupsView(self):
|
||||
if self.shipBrowser.filterShipsWithNoFits:
|
||||
@@ -146,10 +146,10 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
stage = self.shipBrowser.GetActiveStage()
|
||||
|
||||
if stage == 1:
|
||||
wx.PostEvent(self.shipBrowser, events.Stage1Selected())
|
||||
wx.PostEvent(self.shipBrowser, Stage1Selected())
|
||||
elif stage == 2:
|
||||
categoryID = self.shipBrowser.GetStageData(stage)
|
||||
wx.PostEvent(self.shipBrowser, events.Stage2Selected(categoryID=categoryID, back=True))
|
||||
wx.PostEvent(self.shipBrowser, Stage2Selected(categoryID=categoryID, back=True))
|
||||
|
||||
def ShowNewFitButton(self, show):
|
||||
self.btnNew.Show(show)
|
||||
@@ -167,8 +167,8 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
sFit = Fit.getInstance()
|
||||
fitID = sFit.newFit(shipID, "%s fit" % shipName)
|
||||
self.shipBrowser.fitIDMustEditName = fitID
|
||||
wx.PostEvent(self.Parent, events.Stage3Selected(shipID=shipID))
|
||||
wx.PostEvent(self.mainFrame, events.FitSelected(fitID=fitID))
|
||||
wx.PostEvent(self.Parent, Stage3Selected(shipID=shipID))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID))
|
||||
|
||||
def OnHistoryReset(self):
|
||||
self.ToggleRecentShips(False, False)
|
||||
@@ -184,9 +184,9 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
|
||||
@staticmethod
|
||||
def AdjustChannels(bitmap):
|
||||
img = wx.ImageFromBitmap(bitmap)
|
||||
img = bitmap.ConvertToImage()
|
||||
img = img.AdjustChannels(1.05, 1.05, 1.05, 1)
|
||||
return wx.BitmapFromImage(img)
|
||||
return wx.Bitmap(img)
|
||||
|
||||
def UpdateElementsPos(self, mdc):
|
||||
rect = self.GetRect()
|
||||
@@ -211,9 +211,9 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
def DrawItem(self, mdc):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
sepColor = colorUtils.GetSuitableColor(windowColor, 0.2)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitable(windowColor, 1)
|
||||
sepColor = colorUtils.GetSuitable(windowColor, 0.2)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
|
||||
@@ -230,7 +230,7 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
def RenderBackground(self):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
|
||||
sFactor = 0.1
|
||||
|
||||
@@ -259,15 +259,15 @@ class NavigationPanel(SFItem.SFBrowserItem):
|
||||
def gotoStage(self, stage, data=None):
|
||||
self.shipBrowser.recentFits = False
|
||||
if stage == 1:
|
||||
wx.PostEvent(self.Parent, events.Stage1Selected())
|
||||
wx.PostEvent(self.Parent, Stage1Selected())
|
||||
elif stage == 2:
|
||||
wx.PostEvent(self.Parent, events.Stage2Selected(categoryID=data, back=True))
|
||||
wx.PostEvent(self.Parent, Stage2Selected(categoryID=data, back=True))
|
||||
elif stage == 3:
|
||||
wx.PostEvent(self.Parent, events.Stage3Selected(shipID=data))
|
||||
wx.PostEvent(self.Parent, Stage3Selected(shipID=data))
|
||||
elif stage == 4:
|
||||
self.shipBrowser._activeStage = 4
|
||||
wx.PostEvent(self.Parent, events.SearchSelected(text=data, back=True))
|
||||
wx.PostEvent(self.Parent, SearchSelected(text=data, back=True))
|
||||
elif stage == 5:
|
||||
wx.PostEvent(self.Parent, events.ImportSelected(fits=data))
|
||||
wx.PostEvent(self.Parent, ImportSelected(fits=data))
|
||||
else:
|
||||
wx.PostEvent(self.Parent, events.Stage1Selected())
|
||||
wx.PostEvent(self.Parent, Stage1Selected())
|
||||
|
||||
@@ -7,7 +7,7 @@ class PFBitmapFrame(wx.Frame):
|
||||
style=wx.NO_BORDER | wx.FRAME_NO_TASKBAR | wx.STAY_ON_TOP)
|
||||
img = bitmap.ConvertToImage()
|
||||
img = img.ConvertToGreyscale()
|
||||
bitmap = wx.BitmapFromImage(img)
|
||||
bitmap = wx.Bitmap(img)
|
||||
self.bitmap = bitmap
|
||||
self.SetSize((bitmap.GetWidth(), bitmap.GetHeight()))
|
||||
self.Bind(wx.EVT_PAINT, self.OnWindowPaint)
|
||||
@@ -19,6 +19,8 @@ class PFBitmapFrame(wx.Frame):
|
||||
self.transp = 0
|
||||
self.SetSize((bitmap.GetWidth(), bitmap.GetHeight()))
|
||||
|
||||
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
|
||||
|
||||
self.SetTransparent(0)
|
||||
self.Refresh()
|
||||
|
||||
@@ -49,8 +51,12 @@ class PFBitmapFrame(wx.Frame):
|
||||
pass
|
||||
|
||||
def OnWindowPaint(self, event):
|
||||
# todo: evaluate wx.DragImage, might make this class obsolete, however might also lose our customizations
|
||||
# (like the sexy fade-in animation)
|
||||
rect = self.GetRect()
|
||||
canvas = wx.EmptyBitmap(rect.width, rect.height)
|
||||
canvas = wx.Bitmap(rect.width, rect.height)
|
||||
# todo: convert to context manager after updating to wxPython >v4.0.1 (4.0.1 has a bug, see #1421)
|
||||
# See #1418 for discussion
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
mdc.SelectObject(canvas)
|
||||
mdc.DrawBitmap(self.bitmap, 0, 0)
|
||||
|
||||
@@ -23,14 +23,13 @@ import wx
|
||||
|
||||
class PFListPane(wx.ScrolledWindow):
|
||||
def __init__(self, parent):
|
||||
wx.ScrolledWindow.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(1, 1),
|
||||
style=wx.TAB_TRAVERSAL)
|
||||
wx.ScrolledWindow.__init__(self, parent, pos=wx.DefaultPosition, style=wx.TAB_TRAVERSAL)
|
||||
|
||||
self._wList = []
|
||||
self._wCount = 0
|
||||
self.itemsHeight = 1
|
||||
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
self.SetVirtualSize((1, 1))
|
||||
self.SetScrollRate(0, 1)
|
||||
@@ -127,7 +126,7 @@ class PFListPane(wx.ScrolledWindow):
|
||||
maxy = 0
|
||||
|
||||
selected = None
|
||||
for i in xrange(len(self._wList)):
|
||||
for i in range(len(self._wList)):
|
||||
iwidth, iheight = self._wList[i].GetSize()
|
||||
xa, ya = self.CalcScrolledPosition((0, maxy))
|
||||
self._wList[i].SetPosition((xa, ya))
|
||||
@@ -144,7 +143,7 @@ class PFListPane(wx.ScrolledWindow):
|
||||
elif doFocus:
|
||||
self.SetFocus()
|
||||
|
||||
for i in xrange(len(self._wList)):
|
||||
for i in range(len(self._wList)):
|
||||
iwidth, iheight = self._wList[i].GetSize()
|
||||
self._wList[i].SetSize((cwidth, iheight))
|
||||
if doRefresh is True:
|
||||
|
||||
@@ -9,7 +9,7 @@ pyfalog = Logger(__name__)
|
||||
class PFStaticText(wx.Panel):
|
||||
def __init__(self, parent, label=wx.EmptyString):
|
||||
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=parent.GetSize())
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
text = wx.StaticText(self, wx.ID_ANY, label, wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_CENTRE)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from gui.builtinShipBrowser.pfListPane import PFListPane
|
||||
import gui.mainFrame
|
||||
import gui.utils.animUtils as animUtils
|
||||
import gui.utils.anim as animUtils
|
||||
|
||||
|
||||
class PFWidgetsContainer(PFListPane):
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
import wx
|
||||
from logbook import Logger
|
||||
|
||||
import gui.utils.animEffects as animEffects
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import events
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
import gui.utils.anim_effects as animEffects
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
from .events import Stage2Selected
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
@@ -70,7 +70,7 @@ class RaceSelector(wx.Window):
|
||||
if layout == wx.VERTICAL:
|
||||
img = img.Scale(self.minWidth, 8, wx.IMAGE_QUALITY_HIGH)
|
||||
|
||||
self.bmpArrow = wx.BitmapFromImage(img)
|
||||
self.bmpArrow = wx.Bitmap(img)
|
||||
|
||||
self.RebuildRaces(self.shipBrowser.RACE_ORDER)
|
||||
|
||||
@@ -85,6 +85,8 @@ class RaceSelector(wx.Window):
|
||||
|
||||
self.Layout()
|
||||
|
||||
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
|
||||
|
||||
def OnMouseMove(self, event):
|
||||
mx, my = event.GetPosition()
|
||||
|
||||
@@ -93,9 +95,9 @@ class RaceSelector(wx.Window):
|
||||
self.hoveredItem = location
|
||||
self.Refresh()
|
||||
if location is not None:
|
||||
self.SetCursor(wx.StockCursor(wx.CURSOR_HAND))
|
||||
self.SetCursor(wx.Cursor(wx.CURSOR_HAND))
|
||||
else:
|
||||
self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
|
||||
self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
||||
|
||||
def OnSizeUpdate(self, event):
|
||||
self.CalcButtonsBarPos()
|
||||
@@ -134,7 +136,7 @@ class RaceSelector(wx.Window):
|
||||
|
||||
if stage == 2:
|
||||
categoryID = self.shipBrowser.GetStageData(stage)
|
||||
wx.PostEvent(self.shipBrowser, events.Stage2Selected(categoryID=categoryID, back=True))
|
||||
wx.PostEvent(self.shipBrowser, Stage2Selected(categoryID=categoryID, back=True))
|
||||
event.Skip()
|
||||
|
||||
def HitTest(self, mx, my):
|
||||
@@ -166,11 +168,11 @@ class RaceSelector(wx.Window):
|
||||
def OnPaint(self, event):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
# bkColor = colorUtils.GetSuitableColor(windowColor, 0.1)
|
||||
sepColor = colorUtils.GetSuitableColor(windowColor, 0.2)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
# bkColor = colorUtils.GetSuitable(windowColor, 0.1)
|
||||
sepColor = colorUtils.GetSuitable(windowColor, 0.2)
|
||||
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
mdc = wx.AutoBufferedPaintDC(self)
|
||||
|
||||
bkBitmap = drawUtils.RenderGradientBar(windowColor, rect.width, rect.height, 0.1, 0.1, 0.2, 2)
|
||||
mdc.DrawBitmap(bkBitmap, 0, 0, True)
|
||||
@@ -184,12 +186,12 @@ class RaceSelector(wx.Window):
|
||||
if self.shipBrowser.GetRaceFilterState(self.raceNames[self.raceBmps.index(raceBmp)]):
|
||||
bmp = raceBmp
|
||||
else:
|
||||
img = wx.ImageFromBitmap(raceBmp)
|
||||
img = raceBmp.ConvertToImage()
|
||||
if self.hoveredItem == self.raceBmps.index(raceBmp):
|
||||
img = img.AdjustChannels(1, 1, 1, 0.7)
|
||||
else:
|
||||
img = img.AdjustChannels(1, 1, 1, 0.4)
|
||||
bmp = wx.BitmapFromImage(img)
|
||||
bmp = wx.Bitmap(img)
|
||||
|
||||
if self.layout == wx.VERTICAL:
|
||||
mdc.DrawBitmap(dropShadow, rect.width - self.buttonsPadding - bmp.GetWidth() + 1, y + 1)
|
||||
@@ -257,7 +259,7 @@ class RaceSelector(wx.Window):
|
||||
def OnWindowLeave(self, event):
|
||||
if self.hoveredItem is not None:
|
||||
self.hoveredItem = None
|
||||
self.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
|
||||
self.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
||||
self.Refresh()
|
||||
|
||||
if not self.animate:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
|
||||
SB_ITEM_NORMAL = 0
|
||||
SB_ITEM_SELECTED = 1
|
||||
@@ -122,7 +122,7 @@ class PFToolbar(object):
|
||||
if not state & BTN_HOVER:
|
||||
button.SetState(state | BTN_HOVER)
|
||||
self.hoverLabel = button.GetLabel()
|
||||
self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_HAND))
|
||||
self.Parent.SetCursor(wx.Cursor(wx.CURSOR_HAND))
|
||||
doRefresh = True
|
||||
else:
|
||||
if state & BTN_HOVER:
|
||||
@@ -133,7 +133,7 @@ class PFToolbar(object):
|
||||
bx += bwidth + self.padding
|
||||
|
||||
if not changeCursor:
|
||||
self.Parent.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
|
||||
self.Parent.SetCursor(wx.Cursor(wx.CURSOR_ARROW))
|
||||
return doRefresh
|
||||
|
||||
def MouseClick(self, event):
|
||||
@@ -241,7 +241,7 @@ class PFToolbar(object):
|
||||
class SFBrowserItem(wx.Window):
|
||||
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=(0, 16), style=0):
|
||||
wx.Window.__init__(self, parent, id, pos, size, style)
|
||||
|
||||
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
|
||||
self.highlighted = False
|
||||
self.selected = False
|
||||
self.bkBitmap = None
|
||||
@@ -280,7 +280,7 @@ class SFBrowserItem(wx.Window):
|
||||
wx.Window.Refresh(self)
|
||||
|
||||
def OnPaint(self, event):
|
||||
mdc = wx.BufferedPaintDC(self)
|
||||
mdc = wx.AutoBufferedPaintDC(self)
|
||||
|
||||
self.RenderBackground()
|
||||
|
||||
@@ -399,7 +399,7 @@ class SFBrowserItem(wx.Window):
|
||||
def RenderBackground(self):
|
||||
rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
|
||||
state = self.GetState()
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ from logbook import Logger
|
||||
|
||||
import gui.builtinShipBrowser.sfBrowserItem as SFItem
|
||||
import gui.mainFrame
|
||||
import gui.utils.colorUtils as colorUtils
|
||||
import gui.utils.drawUtils as drawUtils
|
||||
import gui.utils.color as colorUtils
|
||||
import gui.utils.draw as drawUtils
|
||||
import gui.utils.fonts as fonts
|
||||
import events
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from .events import Stage3Selected, Stage2Selected, Stage1Selected, FitSelected
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.contextMenu import ContextMenu
|
||||
from service.fit import Fit
|
||||
from service.market import Market
|
||||
@@ -50,9 +50,9 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
|
||||
self.shipEffBk = BitmapLoader.getBitmap("fshipbk_big", "gui")
|
||||
|
||||
img = wx.ImageFromBitmap(self.shipEffBk)
|
||||
img = self.shipEffBk.ConvertToImage()
|
||||
img = img.Mirror(False)
|
||||
self.shipEffBkMirrored = wx.BitmapFromImage(img)
|
||||
self.shipEffBkMirrored = wx.Bitmap(img)
|
||||
|
||||
self.raceBmp = BitmapLoader.getBitmap("race_%s_small" % self.shipRace, "gui")
|
||||
|
||||
@@ -147,7 +147,7 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
else:
|
||||
shipName, shipTrait, fittings = self.shipFittingInfo
|
||||
if fittings > 0:
|
||||
wx.PostEvent(self.shipBrowser, events.Stage3Selected(shipID=self.shipID, back=True))
|
||||
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID, back=True))
|
||||
else:
|
||||
self.newBtnCB()
|
||||
|
||||
@@ -186,8 +186,8 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
sFit = Fit.getInstance()
|
||||
fitID = sFit.newFit(self.shipID, self.tcFitName.GetValue())
|
||||
|
||||
wx.PostEvent(self.shipBrowser, events.Stage3Selected(shipID=self.shipID, back=False))
|
||||
wx.PostEvent(self.mainFrame, events.FitSelected(fitID=fitID))
|
||||
wx.PostEvent(self.shipBrowser, Stage3Selected(shipID=self.shipID, back=False))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID))
|
||||
|
||||
def UpdateElementsPos(self, mdc):
|
||||
rect = self.GetRect()
|
||||
@@ -232,8 +232,8 @@ class ShipItem(SFItem.SFBrowserItem):
|
||||
def DrawItem(self, mdc):
|
||||
# rect = self.GetRect()
|
||||
|
||||
windowColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitableColor(windowColor, 1)
|
||||
windowColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
|
||||
textColor = colorUtils.GetSuitable(windowColor, 1)
|
||||
|
||||
mdc.SetTextForeground(textColor)
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class CapacitorViewFull(StatsView):
|
||||
|
||||
panel = "full"
|
||||
|
||||
sizerCapacitor = wx.GridSizer(1, 2)
|
||||
sizerCapacitor = wx.GridSizer(1, 2, 0, 0)
|
||||
contentSizer.Add(sizerCapacitor, 0, wx.EXPAND, 0)
|
||||
# Capacitor capacity and time
|
||||
baseBox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
@@ -91,7 +91,7 @@ class CapacitorViewFull(StatsView):
|
||||
baseBox.Add(bitmap, 0, wx.ALIGN_CENTER)
|
||||
|
||||
# Recharge
|
||||
chargeSizer = wx.FlexGridSizer(2, 3)
|
||||
chargeSizer = wx.FlexGridSizer(2, 3, 0, 0)
|
||||
baseBox.Add(chargeSizer, 0, wx.ALIGN_CENTER)
|
||||
|
||||
chargeSizer.Add(wx.StaticText(parent, wx.ID_ANY, "+ "), 0, wx.ALIGN_CENTER)
|
||||
@@ -124,7 +124,7 @@ class CapacitorViewFull(StatsView):
|
||||
label = getattr(self, labelName % panel)
|
||||
value = value() if fit is not None else 0
|
||||
value = value if value is not None else 0
|
||||
if isinstance(value, basestring):
|
||||
if isinstance(value, str):
|
||||
label.SetLabel(value)
|
||||
label.SetToolTip(wx.ToolTip(value))
|
||||
else:
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
import wx
|
||||
import gui.mainFrame
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from service.fit import Fit
|
||||
|
||||
@@ -53,7 +53,7 @@ class FirepowerViewFull(StatsView):
|
||||
|
||||
panel = "full"
|
||||
|
||||
sizerFirepower = wx.FlexGridSizer(1, 4)
|
||||
sizerFirepower = wx.FlexGridSizer(1, 4, 0, 0)
|
||||
sizerFirepower.AddGrowableCol(1)
|
||||
|
||||
contentSizer.Add(sizerFirepower, 0, wx.EXPAND, 0)
|
||||
@@ -128,8 +128,8 @@ class FirepowerViewFull(StatsView):
|
||||
|
||||
# Remove effective label
|
||||
hsizer = self.headerPanel.GetSizer()
|
||||
hsizer.Remove(self.stEff)
|
||||
self.stEff.Destroy()
|
||||
hsizer.Hide(self.stEff)
|
||||
#self.stEff.Destroy()
|
||||
|
||||
# Get the new view
|
||||
view = StatsView.getView("miningyieldViewFull")(self.parent)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
import wx
|
||||
import gui.mainFrame
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from service.fit import Fit
|
||||
|
||||
@@ -48,7 +48,7 @@ class MiningYieldViewFull(StatsView):
|
||||
|
||||
panel = "full"
|
||||
|
||||
sizerMiningYield = wx.FlexGridSizer(1, 4)
|
||||
sizerMiningYield = wx.FlexGridSizer(1, 4, 0, 0)
|
||||
sizerMiningYield.AddGrowableCol(1)
|
||||
|
||||
contentSizer.Add(sizerMiningYield, 0, wx.EXPAND, 0)
|
||||
@@ -69,7 +69,7 @@ class MiningYieldViewFull(StatsView):
|
||||
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
box.Add(hbox, 1, wx.ALIGN_CENTER)
|
||||
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0.0 m\u00B3/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0.0 m\u00B3/s")
|
||||
setattr(self, "label%sminingyield%s" % (panel.capitalize(), miningType.capitalize()), lbl)
|
||||
|
||||
hbox.Add(lbl, 0, wx.ALIGN_CENTER)
|
||||
@@ -90,7 +90,7 @@ class MiningYieldViewFull(StatsView):
|
||||
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||
box.Add(hbox, 1, wx.EXPAND)
|
||||
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0.0 m\u00B3/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0.0 m\u00B3/s")
|
||||
setattr(self, "label%sminingyieldTotal" % panel.capitalize(), lbl)
|
||||
hbox.Add(lbl, 0, wx.ALIGN_LEFT)
|
||||
|
||||
@@ -123,16 +123,16 @@ class MiningYieldViewFull(StatsView):
|
||||
# Get the TogglePanel
|
||||
tp = self.panel.GetParent()
|
||||
# Bind the new panel's children to allow context menu access
|
||||
self.parent.applyBinding(self.parent, tp.GetContentPane())
|
||||
self.parent.applyBinding(self.parent, tp.content_panel)
|
||||
tp.SetLabel(view.getHeaderText(fit))
|
||||
view.refreshPanel(fit)
|
||||
|
||||
def refreshPanel(self, fit):
|
||||
# If we did anything intresting, we'd update our labels to reflect the new fit's stats here
|
||||
|
||||
stats = (("labelFullminingyieldMiner", lambda: fit.minerYield, 3, 0, 0, u"%s m\u00B3/s", None),
|
||||
("labelFullminingyieldDrone", lambda: fit.droneYield, 3, 0, 0, u"%s m\u00B3/s", None),
|
||||
("labelFullminingyieldTotal", lambda: fit.totalYield, 3, 0, 0, u"%s m\u00B3/s", None))
|
||||
stats = (("labelFullminingyieldMiner", lambda: fit.minerYield, 3, 0, 0, "%s m\u00B3/s", None),
|
||||
("labelFullminingyieldDrone", lambda: fit.droneYield, 3, 0, 0, "%s m\u00B3/s", None),
|
||||
("labelFullminingyieldTotal", lambda: fit.totalYield, 3, 0, 0, "%s m\u00B3/s", None))
|
||||
|
||||
counter = 0
|
||||
for labelName, value, prec, lowest, highest, valueFormat, altFormat in stats:
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ class OutgoingViewFull(StatsView):
|
||||
parent = self.panel = contentPanel
|
||||
self.headerPanel = headerPanel
|
||||
|
||||
sizerOutgoing = wx.GridSizer(1, 4)
|
||||
sizerOutgoing = wx.GridSizer(1, 4, 0, 0)
|
||||
|
||||
contentSizer.Add(sizerOutgoing, 0, wx.EXPAND, 0)
|
||||
|
||||
@@ -63,9 +63,9 @@ class OutgoingViewFull(StatsView):
|
||||
baseBox.Add(BitmapLoader.getStaticBitmap("%s_big" % image, parent, "gui"), 0, wx.ALIGN_CENTER)
|
||||
|
||||
if "Capacitor" in outgoingType:
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0 GJ/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0 GJ/s")
|
||||
else:
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0 HP/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0 HP/s")
|
||||
|
||||
lbl.SetToolTip(wx.ToolTip(tooltip))
|
||||
|
||||
@@ -81,10 +81,10 @@ class OutgoingViewFull(StatsView):
|
||||
# If we did anything intresting, we'd update our labels to reflect the new fit's stats here
|
||||
|
||||
stats = [
|
||||
("labelRemoteArmor", lambda: fit.remoteReps["Armor"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteShield", lambda: fit.remoteReps["Shield"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteHull", lambda: fit.remoteReps["Hull"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteCapacitor", lambda: fit.remoteReps["Capacitor"], 3, 0, 0, u"%s GJ/s", None),
|
||||
("labelRemoteArmor", lambda: fit.remoteReps["Armor"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteShield", lambda: fit.remoteReps["Shield"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteHull", lambda: fit.remoteReps["Hull"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteCapacitor", lambda: fit.remoteReps["Capacitor"], 3, 0, 0, "%s GJ/s", None),
|
||||
]
|
||||
|
||||
counter = 0
|
||||
|
||||
@@ -43,7 +43,7 @@ class OutgoingViewMinimal(StatsView):
|
||||
parent = self.panel = contentPanel
|
||||
self.headerPanel = headerPanel
|
||||
|
||||
sizerOutgoing = wx.GridSizer(1, 4)
|
||||
sizerOutgoing = wx.GridSizer(1, 4, 0, 0)
|
||||
|
||||
contentSizer.Add(sizerOutgoing, 0, wx.EXPAND, 0)
|
||||
|
||||
@@ -62,9 +62,9 @@ class OutgoingViewMinimal(StatsView):
|
||||
baseBox.Add(wx.StaticText(contentPanel, wx.ID_ANY, label), 0, wx.ALIGN_CENTER)
|
||||
|
||||
if "Capacitor" in outgoingType:
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0 GJ/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0 GJ/s")
|
||||
else:
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, u"0 HP/s")
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "0 HP/s")
|
||||
|
||||
lbl.SetToolTip(wx.ToolTip(tooltip))
|
||||
|
||||
@@ -80,10 +80,10 @@ class OutgoingViewMinimal(StatsView):
|
||||
# If we did anything intresting, we'd update our labels to reflect the new fit's stats here
|
||||
|
||||
stats = [
|
||||
("labelRemoteArmor", lambda: fit.remoteReps["Armor"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteShield", lambda: fit.remoteReps["Shield"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteHull", lambda: fit.remoteReps["Hull"], 3, 0, 0, u"%s HP/s", None),
|
||||
("labelRemoteCapacitor", lambda: fit.remoteReps["Capacitor"], 3, 0, 0, u"%s GJ/s", None),
|
||||
("labelRemoteArmor", lambda: fit.remoteReps["Armor"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteShield", lambda: fit.remoteReps["Shield"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteHull", lambda: fit.remoteReps["Hull"], 3, 0, 0, "%s HP/s", None),
|
||||
("labelRemoteCapacitor", lambda: fit.remoteReps["Capacitor"], 3, 0, 0, "%s GJ/s", None),
|
||||
]
|
||||
|
||||
counter = 0
|
||||
|
||||
@@ -19,9 +19,8 @@
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from service.price import Price
|
||||
from service.settings import PriceMenuSettings
|
||||
@@ -50,7 +49,7 @@ class PriceViewFull(StatsView):
|
||||
headerContentSizer.Add(self.labelEMStatus)
|
||||
headerPanel.GetParent().AddToggleItem(self.labelEMStatus)
|
||||
|
||||
gridPrice = wx.GridSizer(2, 3)
|
||||
gridPrice = wx.GridSizer(2, 3, 0, 0)
|
||||
contentSizer.Add(gridPrice, 0, wx.EXPAND | wx.ALL, 0)
|
||||
for _type in ("ship", "fittings", "total", "drones", "cargoBay", "character"):
|
||||
if _type in "ship":
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from service.price import Price
|
||||
from service.settings import PriceMenuSettings
|
||||
@@ -49,7 +49,7 @@ class PriceViewMinimal(StatsView):
|
||||
headerContentSizer.Add(self.labelEMStatus)
|
||||
headerPanel.GetParent().AddToggleItem(self.labelEMStatus)
|
||||
|
||||
gridPrice = wx.GridSizer(1, 3)
|
||||
gridPrice = wx.GridSizer(1, 3, 0, 0)
|
||||
contentSizer.Add(gridPrice, 0, wx.EXPAND | wx.ALL, 0)
|
||||
for _type in ("ship", "fittings", "total"):
|
||||
image = "%sPrice_big" % _type if _type != "ship" else "ship_big"
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
import gui.mainFrame
|
||||
from gui.builtinStatsViews.resistancesViewFull import EFFECTIVE_HP_TOGGLED
|
||||
@@ -55,7 +55,7 @@ class RechargeViewFull(StatsView):
|
||||
|
||||
self.panel = contentPanel
|
||||
self.headerPanel = headerPanel
|
||||
sizerTankStats = wx.FlexGridSizer(3, 5)
|
||||
sizerTankStats = wx.FlexGridSizer(3, 5, 0, 0)
|
||||
for i in range(4):
|
||||
sizerTankStats.AddGrowableCol(i + 1)
|
||||
|
||||
|
||||
@@ -20,11 +20,12 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.pygauge import PyGauge
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.pyfa_gauge import PyGauge
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
from gui.utils import fonts
|
||||
|
||||
EffectiveHpToggled, EFFECTIVE_HP_TOGGLED = wx.lib.newevent.NewEvent()
|
||||
|
||||
@@ -93,7 +94,7 @@ class ResistancesViewFull(StatsView):
|
||||
|
||||
self.stEHPs.Bind(wx.EVT_BUTTON, self.toggleEHP)
|
||||
|
||||
for i in xrange(4):
|
||||
for i in range(4):
|
||||
sizerResistances.AddGrowableCol(i + 1)
|
||||
|
||||
sizerResistances.Add(self.stEHPs, wx.GBPosition(row, col), wx.GBSpan(1, 1), wx.ALIGN_CENTER)
|
||||
@@ -122,6 +123,8 @@ class ResistancesViewFull(StatsView):
|
||||
continue
|
||||
currGColour = 0
|
||||
|
||||
font = wx.Font(fonts.NORMAL, wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
|
||||
for damageType in ("em", "thermal", "kinetic", "explosive"):
|
||||
box = wx.BoxSizer(wx.HORIZONTAL)
|
||||
sizerResistances.Add(box, wx.GBPosition(row, col), wx.GBSpan(1, 1), wx.ALIGN_CENTER)
|
||||
@@ -133,7 +136,7 @@ class ResistancesViewFull(StatsView):
|
||||
bc = pgColour[1]
|
||||
currGColour += 1
|
||||
|
||||
lbl = PyGauge(contentPanel, wx.ID_ANY, 100)
|
||||
lbl = PyGauge(contentPanel, font, 100)
|
||||
lbl.SetMinSize((48, 16))
|
||||
lbl.SetBackgroundColour(wx.Colour(bc[0], bc[1], bc[2]))
|
||||
lbl.SetBarColour(wx.Colour(fc[0], fc[1], fc[2]))
|
||||
|
||||
@@ -20,10 +20,11 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.pygauge import PyGauge
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.pyfa_gauge import PyGauge
|
||||
import gui.mainFrame
|
||||
from gui.chromeTabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
from gui.utils import fonts
|
||||
|
||||
from eos.saveddata.module import Hardpoint
|
||||
|
||||
@@ -101,7 +102,7 @@ class ResourcesViewFull(StatsView):
|
||||
panel = "full"
|
||||
|
||||
base = sizerResources
|
||||
sizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
sizer.AddStretchSpacer()
|
||||
# Turrets & launcher hardslots display
|
||||
tooltipText = {"turret": "Turret hardpoints", "launcher": "Launcher hardpoints", "drones": "Drones active",
|
||||
"fighter": "Fighter squadrons active", "calibration": "Calibration"}
|
||||
@@ -133,7 +134,9 @@ class ResourcesViewFull(StatsView):
|
||||
# Hack - We add a spacer after each thing, but we are always hiding something. The spacer is stil there.
|
||||
# This way, we only have one space after the drones/fighters
|
||||
if type_ != "drones":
|
||||
sizer.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
sizer.AddStretchSpacer()
|
||||
|
||||
gauge_font = wx.Font(fonts.NORMAL, wx.SWISS, wx.NORMAL, wx.NORMAL, False)
|
||||
|
||||
# PG, Cpu & drone stuff
|
||||
tooltipText = {"cpu": "CPU", "pg": "PowerGrid", "droneBay": "Drone bay", "fighterBay": "Fighter bay",
|
||||
@@ -169,14 +172,14 @@ class ResourcesViewFull(StatsView):
|
||||
setattr(self, "label%sTotal%s" % (panel.capitalize(), capitalizedType), lbl)
|
||||
absolute.Add(lbl, 0, wx.ALIGN_LEFT)
|
||||
|
||||
units = {"cpu": " tf", "pg": " MW", "droneBandwidth": " mbit/s", "droneBay": u" m\u00B3",
|
||||
"fighterBay": u" m\u00B3", "cargoBay": u" m\u00B3"}
|
||||
units = {"cpu": " tf", "pg": " MW", "droneBandwidth": " mbit/s", "droneBay": " m\u00B3",
|
||||
"fighterBay": " m\u00B3", "cargoBay": " m\u00B3"}
|
||||
lbl = wx.StaticText(parent, wx.ID_ANY, "%s" % units[type_])
|
||||
absolute.Add(lbl, 0, wx.ALIGN_LEFT)
|
||||
|
||||
# Gauges modif. - Darriele
|
||||
|
||||
gauge = PyGauge(parent, wx.ID_ANY, 1)
|
||||
gauge = PyGauge(parent, gauge_font, 1)
|
||||
gauge.SetValueRange(0, 0)
|
||||
gauge.SetMinSize((self.getTextExtentW("1.999M/1.99M MW"), 23))
|
||||
gauge.SetFractionDigits(2)
|
||||
@@ -275,7 +278,7 @@ class ResourcesViewFull(StatsView):
|
||||
totalCalibrationPoints = value
|
||||
labelTCP = label
|
||||
|
||||
if isinstance(value, basestring):
|
||||
if isinstance(value, str):
|
||||
label.SetLabel(value)
|
||||
label.SetToolTip(wx.ToolTip(value))
|
||||
else:
|
||||
@@ -283,7 +286,7 @@ class ResourcesViewFull(StatsView):
|
||||
label.SetToolTip(wx.ToolTip("%.1f" % value))
|
||||
|
||||
colorWarn = wx.Colour(204, 51, 51)
|
||||
colorNormal = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||
colorNormal = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||
|
||||
if usedTurretHardpoints > totalTurretHardpoints:
|
||||
colorT = colorWarn
|
||||
|
||||
@@ -21,11 +21,7 @@
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from utils.compat import OrderedDict
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
class TargetingMiscViewFull(StatsView):
|
||||
@@ -48,13 +44,13 @@ class TargetingMiscViewFull(StatsView):
|
||||
|
||||
self.panel = contentPanel
|
||||
self.headerPanel = headerPanel
|
||||
gridTargetingMisc = wx.FlexGridSizer(1, 3)
|
||||
gridTargetingMisc = wx.FlexGridSizer(1, 3, 0, 0)
|
||||
contentSizer.Add(gridTargetingMisc, 0, wx.EXPAND | wx.ALL, 0)
|
||||
gridTargetingMisc.AddGrowableCol(0)
|
||||
gridTargetingMisc.AddGrowableCol(2)
|
||||
# Targeting
|
||||
|
||||
gridTargeting = wx.FlexGridSizer(5, 2)
|
||||
gridTargeting = wx.FlexGridSizer(5, 2, 0, 0)
|
||||
gridTargeting.AddGrowableCol(1)
|
||||
|
||||
gridTargetingMisc.Add(gridTargeting, 0, wx.ALIGN_LEFT | wx.ALL, 5)
|
||||
@@ -79,7 +75,7 @@ class TargetingMiscViewFull(StatsView):
|
||||
|
||||
# Misc
|
||||
gridTargetingMisc.Add(wx.StaticLine(contentPanel, wx.ID_ANY, style=wx.VERTICAL), 0, wx.EXPAND, 3)
|
||||
gridMisc = wx.FlexGridSizer(5, 2)
|
||||
gridMisc = wx.FlexGridSizer(5, 2, 0, 0)
|
||||
gridMisc.AddGrowableCol(1)
|
||||
gridTargetingMisc.Add(gridMisc, 0, wx.ALIGN_LEFT | wx.ALL, 5)
|
||||
|
||||
@@ -87,7 +83,7 @@ class TargetingMiscViewFull(StatsView):
|
||||
("Align time", "AlignTime", "s"),
|
||||
("Signature", "SigRadius", "m"),
|
||||
("Warp Speed", "WarpSpeed", "AU/s"),
|
||||
("Cargo", "Cargo", u"m\u00B3"))
|
||||
("Cargo", "Cargo", "m\u00B3"))
|
||||
|
||||
for header, labelShort, unit in labels:
|
||||
gridMisc.Add(wx.StaticText(contentPanel, wx.ID_ANY, "%s: " % header), 0, wx.ALIGN_LEFT)
|
||||
@@ -157,7 +153,7 @@ class TargetingMiscViewFull(StatsView):
|
||||
("labelFullAlignTime", {"main": lambda: fit.alignTime}, 3, 0, 0, "s"),
|
||||
("labelFullSigRadius", {"main": lambda: fit.ship.getModifiedItemAttr("signatureRadius")}, 3, 0, 9, ""),
|
||||
("labelFullWarpSpeed", {"main": lambda: fit.warpSpeed}, 3, 0, 0, "AU/s"),
|
||||
("labelFullCargo", cargoValues, 4, 0, 9, u"m\u00B3"))
|
||||
("labelFullCargo", cargoValues, 4, 0, 9, "m\u00B3"))
|
||||
|
||||
counter = 0
|
||||
RADII = [("Pod", 25), ("Interceptor", 33), ("Frigate", 38),
|
||||
@@ -167,13 +163,13 @@ class TargetingMiscViewFull(StatsView):
|
||||
for labelName, valueDict, prec, lowest, highest, unit in stats:
|
||||
label = getattr(self, labelName)
|
||||
newValues = {}
|
||||
for valueAlias, value in valueDict.items():
|
||||
for valueAlias, value in list(valueDict.items()):
|
||||
value = value() if fit is not None else 0
|
||||
value = value if value is not None else 0
|
||||
newValues[valueAlias] = value
|
||||
if self._cachedValues[counter] != newValues:
|
||||
mainValue = newValues["main"]
|
||||
otherValues = dict((k, newValues[k]) for k in filter(lambda k: k != "main", newValues))
|
||||
otherValues = dict((k, newValues[k]) for k in [k for k in newValues if k != "main"])
|
||||
if labelName == "labelFullCargo":
|
||||
# Get sum of all cargoholds except for maintenance bay
|
||||
additionalCargo = sum(otherValues.values())
|
||||
@@ -215,11 +211,11 @@ class TargetingMiscViewFull(StatsView):
|
||||
agility = "Agility:\t%.3fx" % (fit.ship.getModifiedItemAttr("agility") or 0)
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s\n%s" % (alignTime, mass, agility)))
|
||||
elif labelName == "labelFullCargo":
|
||||
tipLines = [u"Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, newValues["main"])]
|
||||
for attrName, tipAlias in cargoNamesOrder.items():
|
||||
tipLines = ["Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, newValues["main"])]
|
||||
for attrName, tipAlias in list(cargoNamesOrder.items()):
|
||||
if newValues[attrName] > 0:
|
||||
tipLines.append(u"{}: {:,.2f}m\u00B3".format(tipAlias, newValues[attrName]))
|
||||
label.SetToolTip(wx.ToolTip(u"\n".join(tipLines)))
|
||||
tipLines.append("{}: {:,.2f}m\u00B3".format(tipAlias, newValues[attrName]))
|
||||
label.SetToolTip(wx.ToolTip("\n".join(tipLines)))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip("%.1f" % mainValue))
|
||||
else:
|
||||
@@ -246,11 +242,11 @@ class TargetingMiscViewFull(StatsView):
|
||||
cachedCargo = self._cachedValues[counter]
|
||||
# if you add stuff to cargo, the capacity doesn't change and thus it is still cached
|
||||
# This assures us that we force refresh of cargo tooltip
|
||||
tipLines = [u"Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, cachedCargo["main"])]
|
||||
for attrName, tipAlias in cargoNamesOrder.items():
|
||||
tipLines = ["Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, cachedCargo["main"])]
|
||||
for attrName, tipAlias in list(cargoNamesOrder.items()):
|
||||
if cachedCargo[attrName] > 0:
|
||||
tipLines.append(u"{}: {:,.2f}m\u00B3".format(tipAlias, cachedCargo[attrName]))
|
||||
label.SetToolTip(wx.ToolTip(u"\n".join(tipLines)))
|
||||
tipLines.append("{}: {:,.2f}m\u00B3".format(tipAlias, cachedCargo[attrName]))
|
||||
label.SetToolTip(wx.ToolTip("\n".join(tipLines)))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip(""))
|
||||
|
||||
|
||||
@@ -21,11 +21,7 @@
|
||||
import wx
|
||||
from gui.statsView import StatsView
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from utils.compat import OrderedDict
|
||||
from collections import OrderedDict
|
||||
|
||||
|
||||
class TargetingMiscViewMinimal(StatsView):
|
||||
@@ -48,13 +44,13 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
|
||||
self.panel = contentPanel
|
||||
self.headerPanel = headerPanel
|
||||
gridTargetingMisc = wx.FlexGridSizer(1, 3)
|
||||
gridTargetingMisc = wx.FlexGridSizer(1, 3, 0, 0)
|
||||
contentSizer.Add(gridTargetingMisc, 0, wx.EXPAND | wx.ALL, 0)
|
||||
gridTargetingMisc.AddGrowableCol(0)
|
||||
gridTargetingMisc.AddGrowableCol(2)
|
||||
# Targeting
|
||||
|
||||
gridTargeting = wx.FlexGridSizer(5, 2)
|
||||
gridTargeting = wx.FlexGridSizer(5, 2, 0, 0)
|
||||
gridTargeting.AddGrowableCol(1)
|
||||
|
||||
gridTargetingMisc.Add(gridTargeting, 0, wx.ALIGN_LEFT | wx.ALL, 5)
|
||||
@@ -79,7 +75,7 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
|
||||
# Misc
|
||||
gridTargetingMisc.Add(wx.StaticLine(contentPanel, wx.ID_ANY, style=wx.VERTICAL), 0, wx.EXPAND, 3)
|
||||
gridMisc = wx.FlexGridSizer(5, 2)
|
||||
gridMisc = wx.FlexGridSizer(5, 2, 0, 0)
|
||||
gridMisc.AddGrowableCol(1)
|
||||
gridTargetingMisc.Add(gridMisc, 0, wx.ALIGN_LEFT | wx.ALL, 5)
|
||||
|
||||
@@ -87,7 +83,7 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
("Align time", "AlignTime", "s"),
|
||||
("Signature", "SigRadius", "m"),
|
||||
("Warp Speed", "WarpSpeed", "AU/s"),
|
||||
("Cargo", "Cargo", u"m\u00B3"))
|
||||
("Cargo", "Cargo", "m\u00B3"))
|
||||
|
||||
for header, labelShort, unit in labels:
|
||||
gridMisc.Add(wx.StaticText(contentPanel, wx.ID_ANY, "%s: " % header), 0, wx.ALIGN_LEFT)
|
||||
@@ -154,7 +150,7 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
("labelFullAlignTime", {"main": lambda: fit.alignTime}, 3, 0, 0, "s"),
|
||||
("labelFullSigRadius", {"main": lambda: fit.ship.getModifiedItemAttr("signatureRadius")}, 3, 0, 9, ""),
|
||||
("labelFullWarpSpeed", {"main": lambda: fit.warpSpeed}, 3, 0, 0, "AU/s"),
|
||||
("labelFullCargo", cargoValues, 4, 0, 9, u"m\u00B3"))
|
||||
("labelFullCargo", cargoValues, 4, 0, 9, "m\u00B3"))
|
||||
|
||||
counter = 0
|
||||
RADII = [("Pod", 25), ("Interceptor", 33), ("Frigate", 38),
|
||||
@@ -164,13 +160,13 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
for labelName, valueDict, prec, lowest, highest, unit in stats:
|
||||
label = getattr(self, labelName)
|
||||
newValues = {}
|
||||
for valueAlias, value in valueDict.items():
|
||||
for valueAlias, value in list(valueDict.items()):
|
||||
value = value() if fit is not None else 0
|
||||
value = value if value is not None else 0
|
||||
newValues[valueAlias] = value
|
||||
if self._cachedValues[counter] != newValues:
|
||||
mainValue = newValues["main"]
|
||||
otherValues = dict((k, newValues[k]) for k in filter(lambda k: k != "main", newValues))
|
||||
otherValues = dict((k, newValues[k]) for k in [k for k in newValues if k != "main"])
|
||||
if labelName == "labelFullCargo":
|
||||
# Get sum of all cargoholds except for maintenance bay
|
||||
additionalCargo = sum(otherValues.values())
|
||||
@@ -209,11 +205,11 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
agility = "Agility:\t%.3fx" % (fit.ship.getModifiedItemAttr("agility") or 0)
|
||||
label.SetToolTip(wx.ToolTip("%s\n%s\n%s" % (alignTime, mass, agility)))
|
||||
elif labelName == "labelFullCargo":
|
||||
tipLines = [u"Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, newValues["main"])]
|
||||
for attrName, tipAlias in cargoNamesOrder.items():
|
||||
tipLines = ["Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, newValues["main"])]
|
||||
for attrName, tipAlias in list(cargoNamesOrder.items()):
|
||||
if newValues[attrName] > 0:
|
||||
tipLines.append(u"{}: {:,.2f}m\u00B3".format(tipAlias, newValues[attrName]))
|
||||
label.SetToolTip(wx.ToolTip(u"\n".join(tipLines)))
|
||||
tipLines.append("{}: {:,.2f}m\u00B3".format(tipAlias, newValues[attrName]))
|
||||
label.SetToolTip(wx.ToolTip("\n".join(tipLines)))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip("%.1f" % mainValue))
|
||||
else:
|
||||
@@ -242,11 +238,11 @@ class TargetingMiscViewMinimal(StatsView):
|
||||
cachedCargo = self._cachedValues[counter]
|
||||
# if you add stuff to cargo, the capacity doesn't change and thus it is still cached
|
||||
# This assures us that we force refresh of cargo tooltip
|
||||
tipLines = [u"Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, cachedCargo["main"])]
|
||||
for attrName, tipAlias in cargoNamesOrder.items():
|
||||
tipLines = ["Cargohold: {:,.2f}m\u00B3 / {:,.2f}m\u00B3".format(fit.cargoBayUsed, cachedCargo["main"])]
|
||||
for attrName, tipAlias in list(cargoNamesOrder.items()):
|
||||
if cachedCargo[attrName] > 0:
|
||||
tipLines.append(u"{}: {:,.2f}m\u00B3".format(tipAlias, cachedCargo[attrName]))
|
||||
label.SetToolTip(wx.ToolTip(u"\n".join(tipLines)))
|
||||
tipLines.append("{}: {:,.2f}m\u00B3".format(tipAlias, cachedCargo[attrName]))
|
||||
label.SetToolTip(wx.ToolTip("\n".join(tipLines)))
|
||||
else:
|
||||
label.SetToolTip(wx.ToolTip(""))
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
import wx
|
||||
from eos.saveddata.fighter import Fighter
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class Ammo(ViewColumn):
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
import wx
|
||||
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
from service.attribute import Attribute
|
||||
@@ -72,7 +72,7 @@ class AttributeDisplay(ViewColumn):
|
||||
|
||||
def getText(self, mod):
|
||||
if hasattr(mod, "item"):
|
||||
attr = mod.getModifiedItemAttr(self.info.name)
|
||||
attr = mod.getModifiedItemAttr(self.info.name, None)
|
||||
else:
|
||||
if self.direct:
|
||||
info = self.directInfo
|
||||
@@ -80,16 +80,19 @@ class AttributeDisplay(ViewColumn):
|
||||
else:
|
||||
attr = mod.getAttribute(self.info.name)
|
||||
|
||||
if attr is None:
|
||||
return ""
|
||||
|
||||
if self.info.name == "volume":
|
||||
str_ = (formatAmount(attr, 3, 0, 3))
|
||||
if hasattr(mod, "amount"):
|
||||
str_ += u"m\u00B3 (%s m\u00B3)" % (formatAmount(attr * mod.amount, 3, 0, 3))
|
||||
str_ += "m\u00B3 (%s m\u00B3)" % (formatAmount(attr * mod.amount, 3, 0, 3))
|
||||
attr = str_
|
||||
|
||||
if isinstance(attr, (float, int)):
|
||||
attr = (formatAmount(attr, 3, 0, 3))
|
||||
|
||||
return attr if attr is not None else ""
|
||||
return attr
|
||||
|
||||
def getImageId(self, mod):
|
||||
return -1
|
||||
|
||||
@@ -71,9 +71,9 @@ class BaseName(ViewColumn):
|
||||
elif isinstance(stuff, Rack):
|
||||
if FitSvc.getInstance().serviceFittingOptions["rackLabels"]:
|
||||
if stuff.slot == Slot.MODE:
|
||||
return u'─ Tactical Mode ─'
|
||||
return '─ Tactical Mode ─'
|
||||
else:
|
||||
return u'─ {} Slots ─'.format(Slot.getName(stuff.slot).capitalize())
|
||||
return '─ {} Slots ─'.format(Slot.getName(stuff.slot).capitalize())
|
||||
else:
|
||||
return ""
|
||||
elif isinstance(stuff, Module):
|
||||
@@ -91,7 +91,7 @@ class BaseName(ViewColumn):
|
||||
|
||||
if marketShortcut:
|
||||
# use unicode subscript to display shortcut value
|
||||
shortcut = unichr(marketShortcut + 8320) + u" "
|
||||
shortcut = chr(marketShortcut + 8320) + " "
|
||||
del item.marketShortcut
|
||||
return shortcut + item.name
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ from eos.saveddata.mode import Mode
|
||||
from service.attribute import Attribute
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class CapacitorUse(ViewColumn):
|
||||
|
||||
@@ -23,7 +23,7 @@ import wx
|
||||
from eos.saveddata.mode import Mode
|
||||
from service.attribute import Attribute
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ class MaxRange(ViewColumn):
|
||||
if isinstance(stuff, Mode):
|
||||
return ""
|
||||
|
||||
maxRange = stuff.maxRange if hasattr(stuff, "maxRange") else stuff.getModifiedItemAttr("maxRange")
|
||||
maxRange = stuff.maxRange if hasattr(stuff, "maxRange") else stuff.getModifiedItemAttr("maxRange", None)
|
||||
falloff = stuff.falloff
|
||||
if falloff:
|
||||
falloff = "+%sm" % formatAmount(falloff, 3, 0, 3)
|
||||
|
||||
@@ -24,7 +24,7 @@ from service.fit import Fit
|
||||
from service.market import Market
|
||||
import gui.mainFrame
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
from gui.utils.listFormatter import formatList
|
||||
from eos.saveddata.drone import Drone
|
||||
@@ -223,7 +223,7 @@ class Miscellanea(ViewColumn):
|
||||
"falloff range": falloffRangeBonus,
|
||||
"tracking speed": trackingSpeedBonus}
|
||||
|
||||
isTrackingDisruptor = any(map(lambda x: x is not None and x != 0, trackingDisruptorAttributes.values()))
|
||||
isTrackingDisruptor = any([x is not None and x != 0 for x in list(trackingDisruptorAttributes.values())])
|
||||
|
||||
# Then get the attributes for guidance disruptors
|
||||
explosionVelocityBonus = stuff.getModifiedItemAttr("aoeVelocityBonus")
|
||||
@@ -238,7 +238,7 @@ class Miscellanea(ViewColumn):
|
||||
"flight time": flightTimeBonus,
|
||||
"missile velocity": missileVelocityBonus}
|
||||
|
||||
isGuidanceDisruptor = any(map(lambda x: x is not None and x != 0, guidanceDisruptorAttributes.values()))
|
||||
isGuidanceDisruptor = any([x is not None and x != 0 for x in list(guidanceDisruptorAttributes.values())])
|
||||
|
||||
if isTrackingDisruptor:
|
||||
attributes = trackingDisruptorAttributes
|
||||
@@ -247,12 +247,12 @@ class Miscellanea(ViewColumn):
|
||||
else:
|
||||
return "", None
|
||||
|
||||
display = max(attributes.values(), key=lambda x: abs(x))
|
||||
display = max(list(attributes.values()), key=lambda x: abs(x))
|
||||
|
||||
text = "{0}%".format(formatAmount(display, 3, 0, 3, forceSign=True))
|
||||
|
||||
ttEntries = []
|
||||
for attributeName, attributeValue in attributes.items():
|
||||
for attributeName, attributeValue in list(attributes.items()):
|
||||
if attributeValue == display:
|
||||
ttEntries.append(attributeName)
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ from eos.saveddata.cargo import Cargo
|
||||
from eos.saveddata.drone import Drone
|
||||
from service.price import Price as ServicePrice
|
||||
from gui.viewColumn import ViewColumn
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.utils.numberFormatter import formatAmount
|
||||
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import gui.globalEvents as GE
|
||||
from gui.chromeTabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
import gui.mainFrame
|
||||
|
||||
|
||||
@@ -13,12 +13,13 @@ class BlankPage(wx.Panel):
|
||||
self.parent = parent
|
||||
|
||||
self.parent.Bind(EVT_NOTEBOOK_PAGE_CHANGED, self.pageChanged)
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=None))
|
||||
|
||||
def Destroy(self):
|
||||
self.parent.Unbind(EVT_NOTEBOOK_PAGE_CHANGED, handler=self.pageChanged)
|
||||
# todo: This unbind caused fits to not recalc when switching to their tabs; find out why
|
||||
# self.parent.Unbind(EVT_NOTEBOOK_PAGE_CHANGED)
|
||||
wx.Panel.Destroy(self)
|
||||
|
||||
def pageChanged(self, event):
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class BaseValidator(wx.PyValidator):
|
||||
class BaseValidator(wx.Validator):
|
||||
def __init__(self):
|
||||
wx.PyValidator.__init__(self)
|
||||
wx.Validator.__init__(self)
|
||||
|
||||
def Validate(self, win):
|
||||
raise NotImplementedError()
|
||||
@@ -22,7 +22,9 @@ class TextEntryValidatedDialog(wx.TextEntryDialog):
|
||||
wx.TextEntryDialog.__init__(self, parent, *args, **kargs)
|
||||
self.parent = parent
|
||||
|
||||
self.txtctrl = self.FindWindowById(3000)
|
||||
# See https://github.com/wxWidgets/Phoenix/issues/611
|
||||
self.txtctrl = self.FindWindowById(3000, self)
|
||||
|
||||
if validator:
|
||||
self.txtctrl.SetValidator(validator())
|
||||
|
||||
@@ -42,7 +44,7 @@ class EntityEditor(wx.Panel):
|
||||
|
||||
self.choices = []
|
||||
self.choices.sort(key=lambda p: p.name)
|
||||
self.entityChoices = wx.Choice(self, choices=map(lambda p: p.name, self.choices))
|
||||
self.entityChoices = wx.Choice(self, choices=[p.name for p in self.choices])
|
||||
self.navSizer.Add(self.entityChoices, 1, wx.ALL, 5)
|
||||
|
||||
buttons = (("new", wx.ART_NEW, self.OnNew),
|
||||
@@ -60,7 +62,7 @@ class EntityEditor(wx.Panel):
|
||||
btn.SetMinSize(size)
|
||||
btn.SetMaxSize(size)
|
||||
|
||||
btn.SetToolTipString("{} {}".format(name.capitalize(), self.entityName))
|
||||
btn.SetToolTip("{} {}".format(name.capitalize(), self.entityName))
|
||||
btn.Bind(wx.EVT_BUTTON, func)
|
||||
setattr(self, "btn%s" % name.capitalize(), btn)
|
||||
self.navSizer.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 2)
|
||||
@@ -96,8 +98,8 @@ class EntityEditor(wx.Panel):
|
||||
|
||||
def OnNew(self, event):
|
||||
dlg = TextEntryValidatedDialog(self, self.validator,
|
||||
u"Enter a name for your new {}:".format(self.entityName),
|
||||
u"New {}".format(self.entityName))
|
||||
"Enter a name for your new {}:".format(self.entityName),
|
||||
"New {}".format(self.entityName))
|
||||
dlg.CenterOnParent()
|
||||
|
||||
if dlg.ShowModal() == wx.ID_OK:
|
||||
@@ -110,10 +112,10 @@ class EntityEditor(wx.Panel):
|
||||
|
||||
def OnCopy(self, event):
|
||||
dlg = TextEntryValidatedDialog(self, self.validator,
|
||||
u"Enter a name for your {} copy:".format(self.entityName),
|
||||
u"Copy {}".format(self.entityName))
|
||||
"Enter a name for your {} copy:".format(self.entityName),
|
||||
"Copy {}".format(self.entityName))
|
||||
active = self.getActiveEntity()
|
||||
dlg.SetValue(u"{} Copy".format(active.name))
|
||||
dlg.SetValue("{} Copy".format(active.name))
|
||||
dlg.txtctrl.SetInsertionPointEnd()
|
||||
dlg.CenterOnParent()
|
||||
|
||||
@@ -124,8 +126,8 @@ class EntityEditor(wx.Panel):
|
||||
|
||||
def OnRename(self, event):
|
||||
dlg = TextEntryValidatedDialog(self, self.validator,
|
||||
u"Enter a new name for your {}:".format(self.entityName),
|
||||
u"Rename {}".format(self.entityName))
|
||||
"Enter a new name for your {}:".format(self.entityName),
|
||||
"Rename {}".format(self.entityName))
|
||||
active = self.getActiveEntity()
|
||||
dlg.SetValue(active.name)
|
||||
dlg.txtctrl.SetInsertionPointEnd()
|
||||
@@ -138,9 +140,9 @@ class EntityEditor(wx.Panel):
|
||||
|
||||
def OnDelete(self, event):
|
||||
dlg = wx.MessageDialog(self,
|
||||
u"Do you really want to delete the {} {}?".format(self.getActiveEntity().name,
|
||||
"Do you really want to delete the {} {}?".format(self.getActiveEntity().name,
|
||||
self.entityName),
|
||||
u"Confirm Delete", wx.YES | wx.NO | wx.ICON_QUESTION)
|
||||
"Confirm Delete", wx.YES | wx.NO | wx.ICON_QUESTION)
|
||||
dlg.CenterOnParent()
|
||||
|
||||
if dlg.ShowModal() == wx.ID_YES:
|
||||
@@ -152,7 +154,7 @@ class EntityEditor(wx.Panel):
|
||||
self.choices = self.getEntitiesFromContext()
|
||||
self.entityChoices.Clear()
|
||||
|
||||
self.entityChoices.AppendItems(map(lambda p: p.name, self.choices))
|
||||
self.entityChoices.AppendItems([p.name for p in self.choices])
|
||||
if selected:
|
||||
idx = self.choices.index(selected)
|
||||
self.entityChoices.SetSelection(idx)
|
||||
|
||||
@@ -25,15 +25,15 @@ import gui.mainFrame
|
||||
from gui.builtinMarketBrowser.events import ItemSelected, ITEM_SELECTED
|
||||
import gui.display as d
|
||||
from gui.contextMenu import ContextMenu
|
||||
import gui.builtinShipBrowser.events as sbEvents
|
||||
from gui.builtinShipBrowser.events import EVT_FIT_RENAMED, EVT_FIT_REMOVED, FitSelected, EVT_FIT_SELECTED
|
||||
import gui.multiSwitch
|
||||
from eos.saveddata.mode import Mode
|
||||
from eos.saveddata.module import Module, Slot, Rack
|
||||
from gui.builtinViewColumns.state import State
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
import gui.builtinViews.emptyView
|
||||
from logbook import Logger
|
||||
from gui.chromeTabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
from gui.chrome_tabs import EVT_NOTEBOOK_PAGE_CHANGED
|
||||
|
||||
from service.fit import Fit
|
||||
from service.market import Market
|
||||
@@ -50,12 +50,13 @@ class FitSpawner(gui.multiSwitch.TabSpawner):
|
||||
def __init__(self, multiSwitch):
|
||||
self.multiSwitch = multiSwitch
|
||||
self.mainFrame = mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
mainFrame.Bind(sbEvents.EVT_FIT_SELECTED, self.fitSelected)
|
||||
self.multiSwitch.tabsContainer.handleDrag = self.handleDrag
|
||||
mainFrame.Bind(EVT_FIT_SELECTED, self.fitSelected)
|
||||
self.multiSwitch.tabs_container.handleDrag = self.handleDrag
|
||||
|
||||
def fitSelected(self, event):
|
||||
count = -1
|
||||
for index, page in enumerate(self.multiSwitch.pages):
|
||||
# @todo pheonix: _pages is supposed to be private?
|
||||
for index, page in enumerate(self.multiSwitch._pages):
|
||||
if not isinstance(page, gui.builtinViews.emptyView.BlankPage): # Don't try and process it if it's a blank page.
|
||||
try:
|
||||
if page.activeFitID == event.fitID:
|
||||
@@ -76,13 +77,18 @@ class FitSpawner(gui.multiSwitch.TabSpawner):
|
||||
if from_import or (not openFitInNew and mstate.CmdDown()) or startup or (openFitInNew and not mstate.CmdDown()):
|
||||
self.multiSwitch.AddPage()
|
||||
|
||||
view = FittingView(self.multiSwitch)
|
||||
self.multiSwitch.ReplaceActivePage(view)
|
||||
view = self.multiSwitch.GetSelectedPage()
|
||||
|
||||
if not isinstance(view, FittingView):
|
||||
view = FittingView(self.multiSwitch)
|
||||
print("###################### Created new view:" + repr(view))
|
||||
self.multiSwitch.ReplaceActivePage(view)
|
||||
|
||||
view.fitSelected(event)
|
||||
|
||||
def handleDrag(self, type, fitID):
|
||||
if type == "fit":
|
||||
for page in self.multiSwitch.pages:
|
||||
for page in self.multiSwitch._pages:
|
||||
if isinstance(page, FittingView) and page.activeFitID == fitID:
|
||||
index = self.multiSwitch.GetPageIndex(page)
|
||||
self.multiSwitch.SetSelection(index)
|
||||
@@ -103,12 +109,12 @@ FitSpawner.register()
|
||||
|
||||
|
||||
# Drag'n'drop handler
|
||||
class FittingViewDrop(wx.PyDropTarget):
|
||||
class FittingViewDrop(wx.DropTarget):
|
||||
def __init__(self, dropFn, *args, **kwargs):
|
||||
super(FittingViewDrop, self).__init__(*args, **kwargs)
|
||||
self.dropFn = dropFn
|
||||
# this is really transferring an EVE itemID
|
||||
self.dropData = wx.PyTextDataObject()
|
||||
self.dropData = wx.TextDataObject()
|
||||
self.SetDataObject(self.dropData)
|
||||
|
||||
def OnData(self, x, y, t):
|
||||
@@ -139,8 +145,8 @@ class FittingView(d.Display):
|
||||
self.Show(False)
|
||||
self.parent = parent
|
||||
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
|
||||
self.mainFrame.Bind(sbEvents.EVT_FIT_RENAMED, self.fitRenamed)
|
||||
self.mainFrame.Bind(sbEvents.EVT_FIT_REMOVED, self.fitRemoved)
|
||||
self.mainFrame.Bind(EVT_FIT_RENAMED, self.fitRenamed)
|
||||
self.mainFrame.Bind(EVT_FIT_REMOVED, self.fitRemoved)
|
||||
self.mainFrame.Bind(ITEM_SELECTED, self.appendItem)
|
||||
|
||||
self.Bind(wx.EVT_LEFT_DCLICK, self.removeItem)
|
||||
@@ -166,6 +172,8 @@ class FittingView(d.Display):
|
||||
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
|
||||
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
|
||||
self.parent.Bind(EVT_NOTEBOOK_PAGE_CHANGED, self.pageChanged)
|
||||
print("------------------ new fitting view -------------------")
|
||||
print(self)
|
||||
|
||||
def OnLeaveWindow(self, event):
|
||||
self.SetToolTip(None)
|
||||
@@ -185,7 +193,7 @@ class FittingView(d.Display):
|
||||
mod = self.mods[self.GetItemData(row)]
|
||||
tooltip = self.activeColumns[col].getToolTip(mod)
|
||||
if tooltip is not None:
|
||||
self.SetToolTipString(tooltip)
|
||||
self.SetToolTip(tooltip)
|
||||
else:
|
||||
self.SetToolTip(None)
|
||||
else:
|
||||
@@ -211,14 +219,15 @@ class FittingView(d.Display):
|
||||
def handleDrag(self, type, fitID):
|
||||
# Those are drags coming from pyfa sources, NOT builtin wx drags
|
||||
if type == "fit":
|
||||
wx.PostEvent(self.mainFrame, sbEvents.FitSelected(fitID=fitID))
|
||||
wx.PostEvent(self.mainFrame, FitSelected(fitID=fitID))
|
||||
|
||||
def Destroy(self):
|
||||
self.parent.Unbind(EVT_NOTEBOOK_PAGE_CHANGED, handler=self.pageChanged)
|
||||
self.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.fitChanged)
|
||||
self.mainFrame.Unbind(sbEvents.EVT_FIT_RENAMED, handler=self.fitRenamed)
|
||||
self.mainFrame.Unbind(sbEvents.EVT_FIT_REMOVED, handler=self.fitRemoved)
|
||||
self.mainFrame.Unbind(ITEM_SELECTED, handler=self.appendItem)
|
||||
print("+++++ Destroy " + repr(self))
|
||||
print(self.parent.Unbind(EVT_NOTEBOOK_PAGE_CHANGED))
|
||||
print(self.mainFrame.Unbind(GE.FIT_CHANGED))
|
||||
print(self.mainFrame.Unbind(EVT_FIT_RENAMED))
|
||||
print(self.mainFrame.Unbind(EVT_FIT_REMOVED))
|
||||
print(self.mainFrame.Unbind(ITEM_SELECTED))
|
||||
|
||||
d.Display.Destroy(self)
|
||||
|
||||
@@ -238,7 +247,7 @@ class FittingView(d.Display):
|
||||
row = event.GetIndex()
|
||||
|
||||
if row != -1 and row not in self.blanks and isinstance(self.mods[row], Module) and not self.mods[row].isEmpty:
|
||||
data = wx.PyTextDataObject()
|
||||
data = wx.TextDataObject()
|
||||
dataStr = "fitting:" + str(self.mods[row].modPosition)
|
||||
data.SetText(dataStr)
|
||||
|
||||
@@ -278,20 +287,26 @@ class FittingView(d.Display):
|
||||
If fit is removed and active, the page is deleted.
|
||||
We also refresh the fit of the new current page in case
|
||||
delete fit caused change in stats (projected)
|
||||
todo: move this to the notebook, not the page. We don't want the page being responsible for deleting itself
|
||||
"""
|
||||
print('_+_+_+_+_+_ Fit Removed: {} {} activeFitID: {}, eventFitID: {}'.format(repr(self), str(bool(self)), self.activeFitID, event.fitID))
|
||||
pyfalog.debug("FittingView::fitRemoved")
|
||||
if event.fitID == self.getActiveFit():
|
||||
pyfalog.debug(" Deleted fit is currently active")
|
||||
self.parent.DeletePage(self.parent.GetPageIndex(self))
|
||||
|
||||
try:
|
||||
# Sometimes there is no active page after deletion, hence the try block
|
||||
sFit = Fit.getInstance()
|
||||
sFit.refreshFit(self.getActiveFit())
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID))
|
||||
except wx._core.PyDeadObjectError:
|
||||
pyfalog.warning("Caught dead object")
|
||||
pass
|
||||
try:
|
||||
# Sometimes there is no active page after deletion, hence the try block
|
||||
sFit = Fit.getInstance()
|
||||
|
||||
# stopgap for #1384
|
||||
fit = sFit.getFit(self.getActiveFit())
|
||||
if fit:
|
||||
sFit.refreshFit(self.getActiveFit())
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.activeFitID))
|
||||
except RuntimeError:
|
||||
pyfalog.warning("Caught dead object")
|
||||
pass
|
||||
|
||||
event.Skip()
|
||||
|
||||
@@ -303,6 +318,8 @@ class FittingView(d.Display):
|
||||
event.Skip()
|
||||
|
||||
def fitSelected(self, event):
|
||||
print('====== Fit Selected: ' + repr(self) + str(bool(self)))
|
||||
|
||||
if self.parent.IsActive(self):
|
||||
fitID = event.fitID
|
||||
startup = getattr(event, "startup", False)
|
||||
@@ -313,6 +330,7 @@ class FittingView(d.Display):
|
||||
self.Show(fitID is not None)
|
||||
self.slotsChanged()
|
||||
sFit.switchFit(fitID)
|
||||
# @todo pheonix: had to disable this as it was causing a crash at the wxWidgets level. Dunno why, investigate
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
|
||||
|
||||
event.Skip()
|
||||
@@ -322,7 +340,7 @@ class FittingView(d.Display):
|
||||
fit = sFit.getFit(self.getActiveFit(), basic=True)
|
||||
|
||||
bitmap = BitmapLoader.getImage("race_%s_small" % fit.ship.item.race, "gui")
|
||||
text = u"%s: %s" % (fit.ship.item.name, fit.name)
|
||||
text = "%s: %s" % (fit.ship.item.name, fit.name)
|
||||
|
||||
pageIndex = self.parent.GetPageIndex(self)
|
||||
if pageIndex is not None:
|
||||
@@ -509,6 +527,8 @@ class FittingView(d.Display):
|
||||
self.populate(self.mods)
|
||||
|
||||
def fitChanged(self, event):
|
||||
print('====== Fit Changed: {} {} activeFitID: {}, eventFitID: {}'.format(repr(self), str(bool(self)), self.activeFitID, event.fitID))
|
||||
|
||||
try:
|
||||
if self.activeFitID is not None and self.activeFitID == event.fitID:
|
||||
self.generateMods()
|
||||
@@ -519,7 +539,7 @@ class FittingView(d.Display):
|
||||
self.Refresh()
|
||||
|
||||
self.Show(self.activeFitID is not None and self.activeFitID == event.fitID)
|
||||
except wx._core.PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Caught dead object")
|
||||
finally:
|
||||
event.Skip()
|
||||
@@ -604,14 +624,14 @@ class FittingView(d.Display):
|
||||
|
||||
sFit = Fit.getInstance()
|
||||
fitID = self.mainFrame.getActiveFit()
|
||||
ctrl = wx.GetMouseState().CmdDown() or wx.GetMouseState().MiddleDown()
|
||||
ctrl = event.cmdDown or event.middleIsDown
|
||||
click = "ctrl" if ctrl is True else "right" if event.GetButton() == 3 else "left"
|
||||
sFit.toggleModulesState(fitID, self.mods[self.GetItemData(row)], mods, click)
|
||||
|
||||
# update state tooltip
|
||||
tooltip = self.activeColumns[col].getToolTip(self.mods[self.GetItemData(row)])
|
||||
if tooltip:
|
||||
self.SetToolTipString(tooltip)
|
||||
self.SetToolTip(tooltip)
|
||||
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.mainFrame.getActiveFit()))
|
||||
else:
|
||||
@@ -645,7 +665,7 @@ class FittingView(d.Display):
|
||||
slot = Slot.getValue(slotType)
|
||||
slotMap[slot] = fit.getSlotsFree(slot) < 0
|
||||
|
||||
font = (self.GetClassDefaultAttributes()).font
|
||||
font = wx.Font(self.GetClassDefaultAttributes().font)
|
||||
|
||||
for i, mod in enumerate(self.mods):
|
||||
self.SetItemBackgroundColour(i, self.GetBackgroundColour())
|
||||
@@ -670,15 +690,15 @@ class FittingView(d.Display):
|
||||
self.Thaw()
|
||||
self.itemCount = self.GetItemCount()
|
||||
|
||||
if 'wxMac' in wx.PlatformInfo:
|
||||
try:
|
||||
self.MakeSnapshot()
|
||||
except Exception as e:
|
||||
pyfalog.critical("Failed to make snapshot")
|
||||
pyfalog.critical(e)
|
||||
# if 'wxMac' in wx.PlatformInfo:
|
||||
# try:
|
||||
# self.MakeSnapshot()
|
||||
# except Exception as e:
|
||||
# pyfalog.critical("Failed to make snapshot")
|
||||
# pyfalog.critical(e)
|
||||
|
||||
def OnShow(self, event):
|
||||
if event.GetShow():
|
||||
if self and not self.IsShown():
|
||||
try:
|
||||
self.MakeSnapshot()
|
||||
except Exception as e:
|
||||
@@ -691,14 +711,13 @@ class FittingView(d.Display):
|
||||
|
||||
# noinspection PyPropertyAccess
|
||||
def MakeSnapshot(self, maxColumns=1337):
|
||||
|
||||
if self.FVsnapshot:
|
||||
del self.FVsnapshot
|
||||
|
||||
tbmp = wx.EmptyBitmap(16, 16)
|
||||
tbmp = wx.Bitmap(16, 16)
|
||||
tdc = wx.MemoryDC()
|
||||
tdc.SelectObject(tbmp)
|
||||
font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
||||
font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
|
||||
tdc.SetFont(font)
|
||||
|
||||
columnsWidths = []
|
||||
@@ -711,6 +730,7 @@ class FittingView(d.Display):
|
||||
except Exception as e:
|
||||
pyfalog.critical("Failed to get fit")
|
||||
pyfalog.critical(e)
|
||||
return
|
||||
|
||||
if fit is None:
|
||||
return
|
||||
@@ -732,7 +752,7 @@ class FittingView(d.Display):
|
||||
break
|
||||
name = col.getText(st)
|
||||
|
||||
if not isinstance(name, basestring):
|
||||
if not isinstance(name, str):
|
||||
name = ""
|
||||
|
||||
nx, ny = tdc.GetTextExtent(name)
|
||||
@@ -762,7 +782,7 @@ class FittingView(d.Display):
|
||||
name = col.columnText
|
||||
imgId = col.imageId
|
||||
|
||||
if not isinstance(name, basestring):
|
||||
if not isinstance(name, str):
|
||||
name = ""
|
||||
|
||||
opts = wx.HeaderButtonParams()
|
||||
@@ -771,7 +791,7 @@ class FittingView(d.Display):
|
||||
opts.m_labelText = name
|
||||
|
||||
if imgId != -1:
|
||||
opts.m_labelBitmap = wx.EmptyBitmap(isize, isize)
|
||||
opts.m_labelBitmap = wx.Bitmap(isize, isize)
|
||||
|
||||
width = render.DrawHeaderButton(self, tdc, (0, 0, 16, 16), sortArrow=wx.HDR_SORT_ICON_NONE, params=opts)
|
||||
|
||||
@@ -787,15 +807,15 @@ class FittingView(d.Display):
|
||||
maxWidth += columnsWidths[i]
|
||||
|
||||
mdc = wx.MemoryDC()
|
||||
mbmp = wx.EmptyBitmap(maxWidth, maxRowHeight * rows + padding * 4 + headerSize)
|
||||
mbmp = wx.Bitmap(maxWidth, maxRowHeight * rows + padding * 4 + headerSize)
|
||||
|
||||
mdc.SelectObject(mbmp)
|
||||
|
||||
mdc.SetBackground(wx.Brush(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)))
|
||||
mdc.SetBackground(wx.Brush(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)))
|
||||
mdc.Clear()
|
||||
|
||||
mdc.SetFont(font)
|
||||
mdc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT))
|
||||
mdc.SetTextForeground(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
|
||||
|
||||
cx = padding
|
||||
for i, col in enumerate(self.activeColumns):
|
||||
@@ -805,7 +825,7 @@ class FittingView(d.Display):
|
||||
name = col.columnText
|
||||
imgId = col.imageId
|
||||
|
||||
if not isinstance(name, basestring):
|
||||
if not isinstance(name, str):
|
||||
name = ""
|
||||
|
||||
opts = wx.HeaderButtonParams()
|
||||
@@ -839,7 +859,7 @@ class FittingView(d.Display):
|
||||
break
|
||||
|
||||
name = col.getText(st)
|
||||
if not isinstance(name, basestring):
|
||||
if not isinstance(name, str):
|
||||
name = ""
|
||||
|
||||
imgId = col.getImageId(st)
|
||||
|
||||
@@ -5,7 +5,7 @@ from wx.lib.buttons import GenBitmapButton
|
||||
|
||||
import gui.builtinMarketBrowser.pfSearchBox as SBox
|
||||
import gui.display as d
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.marketBrowser import SearchBox
|
||||
from service.market import Market
|
||||
|
||||
@@ -23,7 +23,7 @@ class BaseImplantEditorView(wx.Panel):
|
||||
def __init__(self, parent):
|
||||
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
||||
style=wx.TAB_TRAVERSAL)
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
pmainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
@@ -54,7 +54,7 @@ class BaseImplantEditorView(wx.Panel):
|
||||
pmainSizer.Add(availableSizer, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
buttonSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
buttonSizer.AddSpacer((0, 0), 1)
|
||||
buttonSizer.AddStretchSpacer()
|
||||
|
||||
self.btnAdd = GenBitmapButton(self, wx.ID_ADD, BitmapLoader.getBitmap("fit_add_small", "gui"),
|
||||
style=wx.BORDER_NONE)
|
||||
@@ -64,7 +64,7 @@ class BaseImplantEditorView(wx.Panel):
|
||||
style=wx.BORDER_NONE)
|
||||
buttonSizer.Add(self.btnRemove, 0)
|
||||
|
||||
buttonSizer.AddSpacer((0, 0), 1)
|
||||
buttonSizer.AddStretchSpacer()
|
||||
pmainSizer.Add(buttonSizer, 0, wx.EXPAND, 0)
|
||||
|
||||
characterImplantSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
@@ -79,7 +79,7 @@ class BaseImplantEditorView(wx.Panel):
|
||||
sMkt = Market.getInstance()
|
||||
for mktGrp in sMkt.getImplantTree():
|
||||
iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(mktGrp))
|
||||
childId = self.availableImplantsTree.AppendItem(root, mktGrp.name, iconId, data=wx.TreeItemData(mktGrp.ID))
|
||||
childId = self.availableImplantsTree.AppendItem(root, mktGrp.name, iconId, data=mktGrp.ID)
|
||||
if sMkt.marketGroupHasTypesCheck(mktGrp) is False:
|
||||
self.availableImplantsTree.AppendItem(childId, "dummy")
|
||||
|
||||
@@ -142,10 +142,10 @@ class BaseImplantEditorView(wx.Panel):
|
||||
# if the dummy item is a market group, replace with actual market groups
|
||||
if text == "dummy":
|
||||
# Add 'real stoof!' instead
|
||||
currentMktGrp = sMkt.getMarketGroup(tree.GetPyData(parent), eager="children")
|
||||
currentMktGrp = sMkt.getMarketGroup(tree.GetItemData(parent), eager="children")
|
||||
for childMktGrp in sMkt.getMarketGroupChildren(currentMktGrp):
|
||||
iconId = self.addMarketViewImage(sMkt.getIconByMarketGroup(childMktGrp))
|
||||
childId = tree.AppendItem(parent, childMktGrp.name, iconId, data=wx.TreeItemData(childMktGrp.ID))
|
||||
childId = tree.AppendItem(parent, childMktGrp.name, iconId, data=childMktGrp.ID)
|
||||
if sMkt.marketGroupHasTypesCheck(childMktGrp) is False:
|
||||
tree.AppendItem(childId, "dummy")
|
||||
else:
|
||||
@@ -153,11 +153,11 @@ class BaseImplantEditorView(wx.Panel):
|
||||
|
||||
# replace dummy with actual items
|
||||
if text == "itemdummy":
|
||||
currentMktGrp = sMkt.getMarketGroup(tree.GetPyData(parent))
|
||||
currentMktGrp = sMkt.getMarketGroup(tree.GetItemData(parent))
|
||||
items = sMkt.getItemsByMarketGroup(currentMktGrp)
|
||||
for item in items:
|
||||
iconId = self.addMarketViewImage(item.icon.iconFile)
|
||||
tree.AppendItem(parent, item.name, iconId, data=wx.TreeItemData(item))
|
||||
tree.AppendItem(parent, item.name, iconId, data=item)
|
||||
|
||||
tree.SortChildren(parent)
|
||||
|
||||
@@ -185,7 +185,7 @@ class BaseImplantEditorView(wx.Panel):
|
||||
|
||||
nchilds = self.availableImplantsTree.GetChildrenCount(root)
|
||||
if nchilds == 0:
|
||||
item = self.availableImplantsTree.GetPyData(root)
|
||||
item = self.availableImplantsTree.GetItemData(root)
|
||||
self.addImplantToContext(item)
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
|
||||
class CachingImageList(wx.ImageList):
|
||||
|
||||
@@ -19,27 +19,33 @@
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import wx.dataview
|
||||
import wx.lib.agw.hyperlink
|
||||
|
||||
from utils.floatspin import FloatSpin
|
||||
# noinspection PyPackageRequirements
|
||||
import wx.lib.newevent
|
||||
# noinspection PyPackageRequirements
|
||||
import wx.gizmos
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from wx.dataview import TreeListCtrl
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.contextMenu import ContextMenu
|
||||
import gui.globalEvents as GE
|
||||
from gui.builtinViews.implantEditor import BaseImplantEditorView
|
||||
from gui.builtinViews.entityEditor import EntityEditor, BaseValidator, TextEntryValidatedDialog
|
||||
from service.fit import Fit
|
||||
from service.character import Character
|
||||
from service.esi import Esi
|
||||
from service.network import AuthenticationError, TimeoutError
|
||||
from service.market import Market
|
||||
from logbook import Logger
|
||||
|
||||
from wx.lib.agw.floatspin import FloatSpin
|
||||
|
||||
|
||||
from gui.utils.clipboard import toClipboard, fromClipboard
|
||||
|
||||
import utils.roman as roman
|
||||
import roman
|
||||
import re
|
||||
import webbrowser
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
@@ -72,9 +78,9 @@ class CharacterTextValidor(BaseValidator):
|
||||
raise ValueError("Character name already in use, please choose another.")
|
||||
|
||||
return True
|
||||
except ValueError, e:
|
||||
except ValueError as e:
|
||||
pyfalog.error(e)
|
||||
wx.MessageBox(u"{}".format(e), "Error")
|
||||
wx.MessageBox("{}".format(e), "Error")
|
||||
textCtrl.SetFocus()
|
||||
return False
|
||||
|
||||
@@ -143,10 +149,10 @@ class CharacterEntityEditor(EntityEditor):
|
||||
|
||||
class CharacterEditor(wx.Frame):
|
||||
def __init__(self, parent):
|
||||
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"pyfa: Character Editor", pos=wx.DefaultPosition,
|
||||
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="pyfa: Character Editor", pos=wx.DefaultPosition,
|
||||
size=wx.Size(640, 600), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER)
|
||||
|
||||
i = wx.IconFromBitmap(BitmapLoader.getBitmap("character_small", "gui"))
|
||||
i = wx.Icon(BitmapLoader.getBitmap("character_small", "gui"))
|
||||
self.SetIcon(i)
|
||||
|
||||
self.mainFrame = parent
|
||||
@@ -170,7 +176,7 @@ class CharacterEditor(wx.Frame):
|
||||
|
||||
self.viewsNBContainer.AddPage(self.sview, "Skills")
|
||||
self.viewsNBContainer.AddPage(self.iview, "Implants")
|
||||
self.viewsNBContainer.AddPage(self.aview, "API")
|
||||
self.viewsNBContainer.AddPage(self.aview, "EVE SSO")
|
||||
|
||||
mainSizer.Add(self.viewsNBContainer, 1, wx.EXPAND | wx.ALL, 5)
|
||||
|
||||
@@ -303,7 +309,7 @@ class SkillTreeView(wx.Panel):
|
||||
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize,
|
||||
style=wx.TAB_TRAVERSAL)
|
||||
self.charEditor = self.Parent.Parent # first parent is Notebook, second is Character Editor
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
pmainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
@@ -338,35 +344,38 @@ class SkillTreeView(wx.Panel):
|
||||
self.searchTimer = wx.Timer(self)
|
||||
self.Bind(wx.EVT_TIMER, self.populateSkillTreeSkillSearch, self.searchTimer)
|
||||
|
||||
tree = self.skillTreeListCtrl = wx.gizmos.TreeListCtrl(self, wx.ID_ANY, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT)
|
||||
tree = self.skillTreeListCtrl = TreeListCtrl(self, wx.ID_ANY, style=wx.dataview.TL_DEFAULT_STYLE)
|
||||
pmainSizer.Add(tree, 1, wx.EXPAND | wx.ALL, 5)
|
||||
|
||||
self.imageList = wx.ImageList(16, 16)
|
||||
tree.SetImageList(self.imageList)
|
||||
self.skillBookImageId = self.imageList.Add(BitmapLoader.getBitmap("skill_small", "gui"))
|
||||
self.skillBookImageId = self.imageList.Add(wx.Icon(BitmapLoader.getBitmap("skill_small", "gui")))
|
||||
self.skillBookDirtyImageId = self.imageList.Add(wx.Icon(BitmapLoader.getBitmap("skill_small_red", "gui")))
|
||||
|
||||
tree.AddColumn("Skill")
|
||||
tree.AddColumn("Level")
|
||||
tree.SetMainColumn(0)
|
||||
tree.AppendColumn("Skill")
|
||||
tree.AppendColumn("Level")
|
||||
# tree.SetMainColumn(0)
|
||||
|
||||
self.root = tree.AddRoot("Skills")
|
||||
tree.SetItemText(self.root, "Levels", 1)
|
||||
self.root = tree.GetRootItem()
|
||||
# self.root = tree.AppendItem(root, "Skills")
|
||||
#
|
||||
# tree.SetItemText(self.root, 1, "Levels")
|
||||
|
||||
tree.SetColumnWidth(0, 500)
|
||||
# tree.SetColumnWidth(0, 300)
|
||||
|
||||
self.btnSecStatus = wx.Button(self, wx.ID_ANY, "Sec Status: {0:.2f}".format(char.secStatus or 0.0))
|
||||
self.btnSecStatus.Bind(wx.EVT_BUTTON, self.onSecStatus)
|
||||
|
||||
self.populateSkillTree()
|
||||
|
||||
tree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.expandLookup)
|
||||
tree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.scheduleMenu)
|
||||
tree.Bind(wx.dataview.EVT_TREELIST_ITEM_EXPANDING, self.expandLookup)
|
||||
tree.Bind(wx.dataview.EVT_TREELIST_ITEM_CONTEXT_MENU, self.scheduleMenu)
|
||||
|
||||
bSizerButtons = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
bSizerButtons.Add(self.btnSecStatus, 0, wx.ALL, 5)
|
||||
|
||||
bSizerButtons.AddSpacer((0, 0), 1, wx.EXPAND, 5)
|
||||
bSizerButtons.AddStretchSpacer()
|
||||
|
||||
importExport = (("Import", wx.ART_FILE_OPEN, "from"),
|
||||
("Export", wx.ART_FILE_SAVE_AS, "to"))
|
||||
@@ -381,7 +390,7 @@ class SkillTreeView(wx.Panel):
|
||||
btn.Layout()
|
||||
setattr(self, "{}Btn".format(name.lower()), btn)
|
||||
btn.Enable(True)
|
||||
btn.SetToolTipString("%s skills %s clipboard" % (name, direction))
|
||||
btn.SetToolTip("%s skills %s clipboard" % (name, direction))
|
||||
bSizerButtons.Add(btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_RIGHT | wx.ALL, 5)
|
||||
btn.Bind(wx.EVT_BUTTON, getattr(self, "{}Skills".format(name.lower())))
|
||||
|
||||
@@ -403,7 +412,7 @@ class SkillTreeView(wx.Panel):
|
||||
self.levelIds[idUnlearned] = "Not learned"
|
||||
self.levelChangeMenu.Append(idUnlearned, "Unlearn")
|
||||
|
||||
for level in xrange(6):
|
||||
for level in range(6):
|
||||
id = wx.NewId()
|
||||
self.levelIds[id] = level
|
||||
self.levelChangeMenu.Append(id, "Level %d" % level)
|
||||
@@ -505,15 +514,17 @@ class SkillTreeView(wx.Panel):
|
||||
|
||||
root = self.root
|
||||
tree = self.skillTreeListCtrl
|
||||
tree.DeleteChildren(root)
|
||||
tree.DeleteAllItems()
|
||||
|
||||
for id, name in sChar.getSkillsByName(search):
|
||||
iconId = self.skillBookImageId
|
||||
childId = tree.AppendItem(root, name, iconId, data=wx.TreeItemData(('skill', id)))
|
||||
level, dirty = sChar.getSkillLevel(char.ID, id)
|
||||
tree.SetItemText(childId, "Level %d" % int(level) if isinstance(level, float) else level, 1)
|
||||
|
||||
if dirty:
|
||||
tree.SetItemTextColour(childId, wx.BLUE)
|
||||
iconId = self.skillBookDirtyImageId
|
||||
|
||||
childId = tree.AppendItem(root, name, iconId, data=('skill', id))
|
||||
tree.SetItemText(childId, 1, "Level %d" % int(level) if isinstance(level, float) else level)
|
||||
|
||||
def populateSkillTree(self, event=None):
|
||||
sChar = Character.getInstance()
|
||||
@@ -528,56 +539,56 @@ class SkillTreeView(wx.Panel):
|
||||
self.btnSecStatus.Enable()
|
||||
|
||||
groups = sChar.getSkillGroups()
|
||||
imageId = self.skillBookImageId
|
||||
root = self.root
|
||||
tree = self.skillTreeListCtrl
|
||||
tree.DeleteChildren(root)
|
||||
tree.DeleteAllItems()
|
||||
|
||||
for id, name in groups:
|
||||
childId = tree.AppendItem(root, name, imageId)
|
||||
tree.SetPyData(childId, ('group', id))
|
||||
tree.AppendItem(childId, "dummy")
|
||||
imageId = self.skillBookImageId
|
||||
if id in dirtyGroups:
|
||||
tree.SetItemTextColour(childId, wx.BLUE)
|
||||
imageId = self.skillBookDirtyImageId
|
||||
|
||||
tree.SortChildren(root)
|
||||
childId = tree.AppendItem(root, name, imageId, data=('group', id))
|
||||
tree.AppendItem(childId, "dummy")
|
||||
|
||||
if event:
|
||||
event.Skip()
|
||||
|
||||
def expandLookup(self, event):
|
||||
root = event.Item
|
||||
root = event.GetItem()
|
||||
tree = self.skillTreeListCtrl
|
||||
child, cookie = tree.GetFirstChild(root)
|
||||
child = tree.GetFirstChild(root)
|
||||
if tree.GetItemText(child) == "dummy":
|
||||
tree.Delete(child)
|
||||
tree.DeleteItem(child)
|
||||
|
||||
# Get the real intrestin' stuff
|
||||
sChar = Character.getInstance()
|
||||
char = self.charEditor.entityEditor.getActiveEntity()
|
||||
data = tree.GetPyData(root)
|
||||
data = tree.GetItemData(root)
|
||||
for id, name in sChar.getSkills(data[1]):
|
||||
iconId = self.skillBookImageId
|
||||
childId = tree.AppendItem(root, name, iconId, data=wx.TreeItemData(('skill', id)))
|
||||
level, dirty = sChar.getSkillLevel(char.ID, id)
|
||||
tree.SetItemText(childId, "Level %d" % int(level) if isinstance(level, float) else level, 1)
|
||||
if dirty:
|
||||
tree.SetItemTextColour(childId, wx.BLUE)
|
||||
|
||||
tree.SortChildren(root)
|
||||
if dirty:
|
||||
iconId = self.skillBookDirtyImageId
|
||||
|
||||
childId = tree.AppendItem(root, name, iconId, data=('skill', id))
|
||||
|
||||
tree.SetItemText(childId, 1, "Level %d" % int(level) if isinstance(level, float) else level)
|
||||
|
||||
def scheduleMenu(self, event):
|
||||
event.Skip()
|
||||
wx.CallAfter(self.spawnMenu, event.Item)
|
||||
wx.CallAfter(self.spawnMenu, event.GetItem())
|
||||
|
||||
def spawnMenu(self, item):
|
||||
self.skillTreeListCtrl.SelectItem(item)
|
||||
if self.skillTreeListCtrl.GetChildrenCount(item) > 0:
|
||||
self.skillTreeListCtrl.Select(item)
|
||||
thing = self.skillTreeListCtrl.GetFirstChild(item).IsOk()
|
||||
if thing:
|
||||
return
|
||||
|
||||
char = self.charEditor.entityEditor.getActiveEntity()
|
||||
sMkt = Market.getInstance()
|
||||
id = self.skillTreeListCtrl.GetPyData(item)[1]
|
||||
id = self.skillTreeListCtrl.GetItemData(item)[1]
|
||||
if char.name not in ("All 0", "All 5"):
|
||||
self.levelChangeMenu.selection = sMkt.getItem(id)
|
||||
self.PopupMenu(self.levelChangeMenu)
|
||||
@@ -591,7 +602,7 @@ class SkillTreeView(wx.Panel):
|
||||
sChar = Character.getInstance()
|
||||
char = self.charEditor.entityEditor.getActiveEntity()
|
||||
selection = self.skillTreeListCtrl.GetSelection()
|
||||
dataType, skillID = self.skillTreeListCtrl.GetPyData(selection)
|
||||
dataType, skillID = self.skillTreeListCtrl.GetItemData(selection)
|
||||
|
||||
if level is not None:
|
||||
sChar.changeLevel(char.ID, skillID, level, persist=True)
|
||||
@@ -604,41 +615,43 @@ class SkillTreeView(wx.Panel):
|
||||
# level setting. We don't want to refresh tree, as that will lose all expanded categories and users location
|
||||
# within the tree. Thus, we loop through the tree and refresh the info.
|
||||
# @todo: when collapsing branch, remove the data. This will make this loop more performant
|
||||
child, cookie = self.skillTreeListCtrl.GetFirstChild(self.root)
|
||||
|
||||
child = self.skillTreeListCtrl.GetFirstChild(self.root)
|
||||
|
||||
def _setTreeSkillLevel(treeItem, skillID):
|
||||
lvl, dirty = sChar.getSkillLevel(char.ID, skillID)
|
||||
self.skillTreeListCtrl.SetItemText(treeItem,
|
||||
"Level {}".format(int(lvl)) if not isinstance(lvl, basestring) else lvl,
|
||||
1)
|
||||
1,
|
||||
"Level {}".format(int(lvl)) if not isinstance(lvl, str) else lvl)
|
||||
|
||||
if not dirty:
|
||||
self.skillTreeListCtrl.SetItemTextColour(treeItem, None)
|
||||
self.skillTreeListCtrl.SetItemImage(treeItem, self.skillBookImageId)
|
||||
|
||||
while child.IsOk():
|
||||
# child = Skill category
|
||||
dataType, id = self.skillTreeListCtrl.GetPyData(child)
|
||||
dataType, id = self.skillTreeListCtrl.GetItemData(child)
|
||||
|
||||
if dataType == 'skill':
|
||||
_setTreeSkillLevel(child, id)
|
||||
else:
|
||||
grand, cookie2 = self.skillTreeListCtrl.GetFirstChild(child)
|
||||
|
||||
grand = self.skillTreeListCtrl.GetFirstChild(child)
|
||||
while grand.IsOk():
|
||||
if self.skillTreeListCtrl.GetItemText(grand) != "dummy":
|
||||
_, skillID = self.skillTreeListCtrl.GetPyData(grand)
|
||||
_, skillID = self.skillTreeListCtrl.GetItemData(grand)
|
||||
_setTreeSkillLevel(grand, skillID)
|
||||
grand, cookie2 = self.skillTreeListCtrl.GetNextChild(child, cookie2)
|
||||
grand = self.skillTreeListCtrl.GetNextSibling(grand)
|
||||
|
||||
child, cookie = self.skillTreeListCtrl.GetNextChild(self.root, cookie)
|
||||
child = self.skillTreeListCtrl.GetNextSibling(child)
|
||||
|
||||
dirtySkills = sChar.getDirtySkills(char.ID)
|
||||
dirtyGroups = set([skill.item.group.ID for skill in dirtySkills])
|
||||
|
||||
parentID = self.skillTreeListCtrl.GetItemParent(selection)
|
||||
parent = self.skillTreeListCtrl.GetPyData(parentID)
|
||||
parent = self.skillTreeListCtrl.GetItemData(parentID)
|
||||
|
||||
if parent:
|
||||
if parent[1] in dirtyGroups:
|
||||
self.skillTreeListCtrl.SetItemTextColour(parentID, None)
|
||||
self.skillTreeListCtrl.SetItemImage(parentID, self.skillBookImageId)
|
||||
|
||||
event.Skip()
|
||||
|
||||
@@ -709,20 +722,24 @@ class APIView(wx.Panel):
|
||||
wx.Panel.__init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.Size(500, 300),
|
||||
style=wx.TAB_TRAVERSAL)
|
||||
self.charEditor = self.Parent.Parent # first parent is Notebook, second is Character Editor
|
||||
self.SetBackgroundColour(wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
self.apiUrlCreatePredefined = u"https://community.eveonline.com/support/api-key/CreatePredefined?accessMask=8"
|
||||
self.apiUrlKeyList = u"https://community.eveonline.com/support/api-key/"
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW))
|
||||
|
||||
pmainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
hintSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
hintSizer.AddStretchSpacer()
|
||||
self.stDisabledTip = wx.StaticText(self, wx.ID_ANY,
|
||||
u"You cannot add API Details for All 0 and All 5 characters.\n"
|
||||
u"Please select another character or make a new one.", style=wx.ALIGN_CENTER)
|
||||
"You cannot link All 0 or All 5 characters to an EVE character.\n"
|
||||
"Please select another character or make a new one.", style=wx.ALIGN_CENTER)
|
||||
self.stDisabledTip.Wrap(-1)
|
||||
hintSizer.Add(self.stDisabledTip, 0, wx.TOP | wx.BOTTOM, 10)
|
||||
|
||||
self.noCharactersTip = wx.StaticText(self, wx.ID_ANY,
|
||||
"You haven't logging into EVE SSO with any characters yet. Please use the "
|
||||
"button below to log into EVE.", style=wx.ALIGN_CENTER)
|
||||
self.noCharactersTip.Wrap(-1)
|
||||
hintSizer.Add(self.noCharactersTip, 0, wx.TOP | wx.BOTTOM, 10)
|
||||
|
||||
self.stDisabledTip.Hide()
|
||||
hintSizer.AddStretchSpacer()
|
||||
pmainSizer.Add(hintSizer, 0, wx.EXPAND, 5)
|
||||
@@ -732,99 +749,97 @@ class APIView(wx.Panel):
|
||||
fgSizerInput.SetFlexibleDirection(wx.BOTH)
|
||||
fgSizerInput.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_SPECIFIED)
|
||||
|
||||
self.m_staticIDText = wx.StaticText(self, wx.ID_ANY, u"keyID:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_staticIDText.Wrap(-1)
|
||||
fgSizerInput.Add(self.m_staticIDText, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputID = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
fgSizerInput.Add(self.inputID, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.m_staticKeyText = wx.StaticText(self, wx.ID_ANY, u"vCode:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_staticKeyText.Wrap(-1)
|
||||
fgSizerInput.Add(self.m_staticKeyText, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
|
||||
self.inputKey = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
fgSizerInput.Add(self.inputKey, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.m_staticCharText = wx.StaticText(self, wx.ID_ANY, u"Character:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_staticCharText = wx.StaticText(self, wx.ID_ANY, "Character:", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_staticCharText.Wrap(-1)
|
||||
fgSizerInput.Add(self.m_staticCharText, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||
fgSizerInput.Add(self.m_staticCharText, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 10)
|
||||
|
||||
self.charChoice = wx.Choice(self, wx.ID_ANY, style=0)
|
||||
self.charChoice.Append("No Selection", 0)
|
||||
fgSizerInput.Add(self.charChoice, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.charChoice.Enable(False)
|
||||
fgSizerInput.Add(self.charChoice, 1, wx.ALL | wx.EXPAND, 10)
|
||||
|
||||
pmainSizer.Add(fgSizerInput, 0, wx.EXPAND, 5)
|
||||
|
||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
btnSizer.AddStretchSpacer()
|
||||
|
||||
self.btnFetchCharList = wx.Button(self, wx.ID_ANY, u"Get Characters")
|
||||
btnSizer.Add(self.btnFetchCharList, 0, wx.ALL, 2)
|
||||
self.btnFetchCharList.Bind(wx.EVT_BUTTON, self.fetchCharList)
|
||||
|
||||
self.btnFetchSkills = wx.Button(self, wx.ID_ANY, u"Fetch Skills")
|
||||
btnSizer.Add(self.btnFetchSkills, 0, wx.ALL, 2)
|
||||
self.btnFetchSkills.Bind(wx.EVT_BUTTON, self.fetchSkills)
|
||||
self.btnFetchSkills.Enable(False)
|
||||
|
||||
btnSizer.AddStretchSpacer()
|
||||
pmainSizer.Add(btnSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
self.addButton = wx.Button(self, wx.ID_ANY, "Log In with EVE SSO", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.addButton.Bind(wx.EVT_BUTTON, self.addCharacter)
|
||||
pmainSizer.Add(self.addButton, 0, wx.ALL | wx.ALIGN_CENTER, 5)
|
||||
self.stStatus = wx.StaticText(self, wx.ID_ANY, wx.EmptyString)
|
||||
pmainSizer.Add(self.stStatus, 0, wx.ALL, 5)
|
||||
|
||||
pmainSizer.AddStretchSpacer()
|
||||
self.stAPITip = wx.StaticText(self, wx.ID_ANY,
|
||||
u"You can create a pre-defined key here (only CharacterSheet is required):",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.stAPITip.Wrap(-1)
|
||||
|
||||
pmainSizer.Add(self.stAPITip, 0, wx.ALL, 2)
|
||||
|
||||
self.hlEveAPI = wx.HyperlinkCtrl(self, wx.ID_ANY, self.apiUrlCreatePredefined, self.apiUrlCreatePredefined,
|
||||
wx.DefaultPosition, wx.DefaultSize, wx.HL_DEFAULT_STYLE)
|
||||
pmainSizer.Add(self.hlEveAPI, 0, wx.ALL, 2)
|
||||
|
||||
self.stAPITip2 = wx.StaticText(self, wx.ID_ANY, u"Or, you can choose an existing key from:", wx.DefaultPosition,
|
||||
wx.DefaultSize, 0)
|
||||
self.stAPITip2.Wrap(-1)
|
||||
pmainSizer.Add(self.stAPITip2, 0, wx.ALL, 2)
|
||||
|
||||
self.hlEveAPI2 = wx.HyperlinkCtrl(self, wx.ID_ANY, self.apiUrlKeyList, self.apiUrlKeyList, wx.DefaultPosition,
|
||||
wx.DefaultSize, wx.HL_DEFAULT_STYLE)
|
||||
pmainSizer.Add(self.hlEveAPI2, 0, wx.ALL, 2)
|
||||
|
||||
self.charEditor.mainFrame.Bind(GE.EVT_SSO_LOGOUT, self.ssoListChanged)
|
||||
self.charEditor.mainFrame.Bind(GE.EVT_SSO_LOGIN, self.ssoListChanged)
|
||||
self.charEditor.entityEditor.Bind(wx.EVT_CHOICE, self.charChanged)
|
||||
|
||||
self.charChoice.Bind(wx.EVT_CHOICE, self.ssoCharChanged)
|
||||
|
||||
self.SetSizer(pmainSizer)
|
||||
self.Layout()
|
||||
self.charChanged(None)
|
||||
self.ssoListChanged(None)
|
||||
|
||||
def ssoCharChanged(self, event):
|
||||
sChar = Character.getInstance()
|
||||
activeChar = self.charEditor.entityEditor.getActiveEntity()
|
||||
sChar.setSsoCharacter(activeChar.ID, self.getActiveCharacter())
|
||||
event.Skip()
|
||||
|
||||
def addCharacter(self, event):
|
||||
sEsi = Esi.getInstance()
|
||||
sEsi.login()
|
||||
|
||||
def getActiveCharacter(self):
|
||||
selection = self.charChoice.GetCurrentSelection()
|
||||
return self.charChoice.GetClientData(selection) if selection is not -1 else None
|
||||
|
||||
def ssoListChanged(self, event):
|
||||
if not self: # todo: fix event not unbinding properly
|
||||
return
|
||||
sEsi = Esi.getInstance()
|
||||
ssoChars = sEsi.getSsoCharacters()
|
||||
|
||||
if len(ssoChars) == 0:
|
||||
self.charChoice.Hide()
|
||||
self.m_staticCharText.Hide()
|
||||
self.noCharactersTip.Show()
|
||||
else:
|
||||
self.noCharactersTip.Hide()
|
||||
self.m_staticCharText.Show()
|
||||
self.charChoice.Show()
|
||||
|
||||
self.charChanged(event)
|
||||
|
||||
def charChanged(self, event):
|
||||
sChar = Character.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
activeChar = self.charEditor.entityEditor.getActiveEntity()
|
||||
|
||||
ID, key, char, chars = sChar.getApiDetails(activeChar.ID)
|
||||
self.inputID.SetValue(str(ID))
|
||||
self.inputKey.SetValue(key)
|
||||
if event and event.EventType == GE.EVT_SSO_LOGIN.typeId and hasattr(event, 'character'):
|
||||
# Automatically assign the character that was just logged into
|
||||
sChar.setSsoCharacter(activeChar.ID, event.character.ID)
|
||||
|
||||
sso = sChar.getSsoCharacter(activeChar.ID)
|
||||
|
||||
ssoChars = sEsi.getSsoCharacters()
|
||||
|
||||
self.charChoice.Clear()
|
||||
|
||||
if chars:
|
||||
for charName in chars:
|
||||
self.charChoice.Append(charName)
|
||||
self.charChoice.SetStringSelection(char)
|
||||
self.charChoice.Enable(True)
|
||||
self.btnFetchSkills.Enable(True)
|
||||
else:
|
||||
self.charChoice.Append("No characters...", 0)
|
||||
self.charChoice.SetSelection(0)
|
||||
self.charChoice.Enable(False)
|
||||
self.btnFetchSkills.Enable(False)
|
||||
noneID = self.charChoice.Append("None", None)
|
||||
|
||||
for char in ssoChars:
|
||||
currId = self.charChoice.Append(char.characterName, char.ID)
|
||||
|
||||
if sso is not None and char.ID == sso.ID:
|
||||
self.charChoice.SetSelection(currId)
|
||||
if sso is None:
|
||||
self.charChoice.SetSelection(noneID)
|
||||
|
||||
|
||||
#
|
||||
# if chars:
|
||||
# for charName in chars:
|
||||
# self.charChoice.Append(charName)
|
||||
# self.charChoice.SetStringSelection(char)
|
||||
# else:
|
||||
# self.charChoice.Append("No characters...", 0)
|
||||
# self.charChoice.SetSelection(0)
|
||||
#
|
||||
if activeChar.name in ("All 0", "All 5"):
|
||||
self.Enable(False)
|
||||
self.stDisabledTip.Show()
|
||||
@@ -837,47 +852,6 @@ class APIView(wx.Panel):
|
||||
if event is not None:
|
||||
event.Skip()
|
||||
|
||||
def fetchCharList(self, event):
|
||||
self.stStatus.SetLabel("")
|
||||
if self.inputID.GetLineText(0) == "" or self.inputKey.GetLineText(0) == "":
|
||||
self.stStatus.SetLabel("Invalid keyID or vCode!")
|
||||
return
|
||||
|
||||
sChar = Character.getInstance()
|
||||
try:
|
||||
activeChar = self.charEditor.entityEditor.getActiveEntity()
|
||||
list = sChar.apiCharList(activeChar.ID, self.inputID.GetLineText(0), self.inputKey.GetLineText(0))
|
||||
except AuthenticationError, e:
|
||||
msg = "Authentication failure. Please check keyID and vCode combination."
|
||||
pyfalog.info(msg)
|
||||
self.stStatus.SetLabel(msg)
|
||||
except TimeoutError, e:
|
||||
msg = "Request timed out. Please check network connectivity and/or proxy settings."
|
||||
pyfalog.info(msg)
|
||||
self.stStatus.SetLabel(msg)
|
||||
except Exception, e:
|
||||
pyfalog.error(e)
|
||||
self.stStatus.SetLabel("Error:\n%s" % e.message)
|
||||
else:
|
||||
self.charChoice.Clear()
|
||||
for charName in list:
|
||||
self.charChoice.Append(charName)
|
||||
|
||||
self.btnFetchSkills.Enable(True)
|
||||
self.charChoice.Enable(True)
|
||||
|
||||
self.Layout()
|
||||
|
||||
self.charChoice.SetSelection(0)
|
||||
|
||||
def fetchSkills(self, event):
|
||||
charName = self.charChoice.GetString(self.charChoice.GetSelection())
|
||||
if charName:
|
||||
sChar = Character.getInstance()
|
||||
activeChar = self.charEditor.entityEditor.getActiveEntity()
|
||||
sChar.apiFetch(activeChar.ID, charName, self.__fetchCallback)
|
||||
self.stStatus.SetLabel("Getting skills for {}".format(charName))
|
||||
|
||||
def __fetchCallback(self, e=None):
|
||||
charName = self.charChoice.GetString(self.charChoice.GetSelection())
|
||||
if e is None:
|
||||
@@ -893,12 +867,12 @@ class SecStatusDialog(wx.Dialog):
|
||||
def __init__(self, parent, sec):
|
||||
wx.Dialog.__init__(self, parent, title="Set Security Status", size=(275, 175))
|
||||
|
||||
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
|
||||
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
|
||||
|
||||
bSizer1 = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.m_staticText1 = wx.StaticText(self, wx.ID_ANY,
|
||||
u"Security Status is used in some CONCORD hull calculations; you can set the characters security status here",
|
||||
"Security Status is used in some CONCORD hull calculations; you can set the characters security status here",
|
||||
wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.m_staticText1.Wrap(-1)
|
||||
bSizer1.Add(self.m_staticText1, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
@@ -19,15 +19,15 @@
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
from logbook import Logger
|
||||
|
||||
import gui.globalEvents as GE
|
||||
import gui.mainFrame
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.utils.clipboard import toClipboard
|
||||
from service.character import Character
|
||||
from service.fit import Fit
|
||||
from gui.utils.clipboard import toClipboard
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
@@ -61,7 +61,7 @@ class CharacterSelection(wx.Panel):
|
||||
|
||||
self.btnRefresh.SetMinSize(size)
|
||||
self.btnRefresh.SetMaxSize(size)
|
||||
self.btnRefresh.SetToolTipString("Refresh API")
|
||||
self.btnRefresh.SetToolTip("Refresh API")
|
||||
|
||||
self.btnRefresh.Bind(wx.EVT_BUTTON, self.refreshApi)
|
||||
self.btnRefresh.Enable(False)
|
||||
@@ -79,6 +79,7 @@ class CharacterSelection(wx.Panel):
|
||||
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
|
||||
|
||||
self.SetMinSize(wx.Size(25, -1))
|
||||
self.toggleRefreshButton()
|
||||
|
||||
self.charChoice.Enable(False)
|
||||
|
||||
@@ -142,7 +143,7 @@ class CharacterSelection(wx.Panel):
|
||||
sFit = Fit.getInstance()
|
||||
sFit.changeChar(fitID, charID)
|
||||
|
||||
choice.Append(u"\u2015 Open Character Editor \u2015", -1)
|
||||
choice.Append("\u2015 Open Character Editor \u2015", -1)
|
||||
self.charCache = self.charChoice.GetCurrentSelection()
|
||||
|
||||
if event is not None:
|
||||
@@ -151,9 +152,7 @@ class CharacterSelection(wx.Panel):
|
||||
def refreshApi(self, event):
|
||||
self.btnRefresh.Enable(False)
|
||||
sChar = Character.getInstance()
|
||||
ID, key, charName, chars = sChar.getApiDetails(self.getActiveCharacter())
|
||||
if charName:
|
||||
sChar.apiFetch(self.getActiveCharacter(), charName, self.refreshAPICallback)
|
||||
sChar.apiFetch(self.getActiveCharacter(), self.refreshAPICallback)
|
||||
|
||||
def refreshAPICallback(self, e=None):
|
||||
self.btnRefresh.Enable(True)
|
||||
@@ -161,11 +160,11 @@ class CharacterSelection(wx.Panel):
|
||||
self.refreshCharacterList()
|
||||
else:
|
||||
exc_type, exc_obj, exc_trace = e
|
||||
pyfalog.warn("Error fetching API information for character")
|
||||
pyfalog.warn("Error fetching skill information for character")
|
||||
pyfalog.warn(exc_obj)
|
||||
|
||||
wx.MessageBox(
|
||||
"Error fetching API information, please check your API details in the character editor and try again later",
|
||||
"Error fetching skill information",
|
||||
"Error", wx.ICON_ERROR | wx.STAY_ON_TOP)
|
||||
|
||||
def charChanged(self, event):
|
||||
@@ -178,16 +177,23 @@ class CharacterSelection(wx.Panel):
|
||||
self.charChoice.SetSelection(self.charCache)
|
||||
self.mainFrame.showCharacterEditor(event)
|
||||
return
|
||||
if sChar.getCharName(charID) not in ("All 0", "All 5") and sChar.apiEnabled(charID):
|
||||
self.btnRefresh.Enable(True)
|
||||
else:
|
||||
self.btnRefresh.Enable(False)
|
||||
|
||||
self.toggleRefreshButton()
|
||||
|
||||
sFit = Fit.getInstance()
|
||||
sFit.changeChar(fitID, charID)
|
||||
self.charCache = self.charChoice.GetCurrentSelection()
|
||||
wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fitID))
|
||||
|
||||
def toggleRefreshButton(self):
|
||||
charID = self.getActiveCharacter()
|
||||
sChar = Character.getInstance()
|
||||
char = sChar.getCharacter(charID)
|
||||
if sChar.getCharName(charID) not in ("All 0", "All 5") and sChar.getSsoCharacter(char.ID) is not None:
|
||||
self.btnRefresh.Enable(True)
|
||||
else:
|
||||
self.btnRefresh.Enable(False)
|
||||
|
||||
def selectChar(self, charID):
|
||||
choice = self.charChoice
|
||||
numItems = len(choice.GetItems())
|
||||
@@ -212,7 +218,7 @@ class CharacterSelection(wx.Panel):
|
||||
|
||||
if event.fitID is None:
|
||||
self.skillReqsStaticBitmap.SetBitmap(self.cleanSkills)
|
||||
self.skillReqsStaticBitmap.SetToolTipString("No active fit")
|
||||
self.skillReqsStaticBitmap.SetToolTip("No active fit")
|
||||
else:
|
||||
sCharacter = Character.getInstance()
|
||||
self.reqs = sCharacter.checkRequirements(fit)
|
||||
@@ -233,7 +239,7 @@ class CharacterSelection(wx.Panel):
|
||||
else:
|
||||
tip += self._buildSkillsTooltip(self.reqs)
|
||||
self.skillReqsStaticBitmap.SetBitmap(self.redSkills)
|
||||
self.skillReqsStaticBitmap.SetToolTipString(tip.strip())
|
||||
self.skillReqsStaticBitmap.SetToolTip(tip.strip())
|
||||
|
||||
if newCharID is None:
|
||||
sChar = Character.getInstance()
|
||||
@@ -244,6 +250,8 @@ class CharacterSelection(wx.Panel):
|
||||
if not fit.calculated:
|
||||
self.charChanged(None)
|
||||
|
||||
self.toggleRefreshButton()
|
||||
|
||||
event.Skip()
|
||||
|
||||
def exportSkills(self, evt):
|
||||
@@ -260,11 +268,11 @@ class CharacterSelection(wx.Panel):
|
||||
sCharacter = Character.getInstance()
|
||||
|
||||
if tabulationLevel == 0:
|
||||
for item, subReqs in reqs.iteritems():
|
||||
for item, subReqs in reqs.items():
|
||||
tip += "%s:\n" % item.name
|
||||
tip += self._buildSkillsTooltip(subReqs, item.name, 1)
|
||||
else:
|
||||
for name, info in reqs.iteritems():
|
||||
for name, info in reqs.items():
|
||||
level, ID, more = info
|
||||
sCharacter.skillReqsDict['skills'].append({
|
||||
'item': currItem,
|
||||
@@ -286,11 +294,11 @@ class CharacterSelection(wx.Panel):
|
||||
sCharacter = Character.getInstance()
|
||||
|
||||
if tabulationLevel == 0:
|
||||
for item, subReqs in reqs.iteritems():
|
||||
for item, subReqs in reqs.items():
|
||||
skillsMap = self._buildSkillsTooltipCondensed(subReqs, item.name, 1, skillsMap)
|
||||
sorted(skillsMap, key=skillsMap.get)
|
||||
else:
|
||||
for name, info in reqs.iteritems():
|
||||
for name, info in reqs.items():
|
||||
level, ID, more = info
|
||||
sCharacter.skillReqsDict['skills'].append({
|
||||
'item': currItem,
|
||||
|
||||
1439
gui/chromeTabs.py
1439
gui/chromeTabs.py
File diff suppressed because it is too large
Load Diff
1481
gui/chrome_tabs.py
Normal file
1481
gui/chrome_tabs.py
Normal file
File diff suppressed because it is too large
Load Diff
@@ -72,7 +72,7 @@ class ContextMenu(object):
|
||||
display_amount += 1
|
||||
texts = m.getText(itemContext, selection)
|
||||
|
||||
if isinstance(texts, basestring):
|
||||
if isinstance(texts, str):
|
||||
texts = (texts,)
|
||||
|
||||
bitmap = m.getBitmap(srcContext, selection)
|
||||
@@ -112,7 +112,7 @@ class ContextMenu(object):
|
||||
else:
|
||||
rootItem.SetBitmap(bitmap)
|
||||
|
||||
rootMenu.AppendItem(rootItem)
|
||||
rootMenu.Append(rootItem)
|
||||
|
||||
empty = False
|
||||
|
||||
|
||||
@@ -27,25 +27,25 @@ class CopySelectDialog(wx.Dialog):
|
||||
copyFormatEftImps = 1
|
||||
copyFormatXml = 2
|
||||
copyFormatDna = 3
|
||||
copyFormatCrest = 4
|
||||
copyFormatEsi = 4
|
||||
copyFormatMultiBuy = 5
|
||||
|
||||
def __init__(self, parent):
|
||||
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"Select a format", size=(-1, -1),
|
||||
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Select a format", size=(-1, -1),
|
||||
style=wx.DEFAULT_DIALOG_STYLE)
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
copyFormats = [u"EFT", u"EFT (Implants)", u"XML", u"DNA", u"CREST", u"MultiBuy"]
|
||||
copyFormatTooltips = {CopySelectDialog.copyFormatEft: u"EFT text format",
|
||||
CopySelectDialog.copyFormatEftImps: u"EFT text format",
|
||||
CopySelectDialog.copyFormatXml: u"EVE native XML format",
|
||||
CopySelectDialog.copyFormatDna: u"A one-line text format",
|
||||
CopySelectDialog.copyFormatCrest: u"A JSON format used for EVE CREST",
|
||||
CopySelectDialog.copyFormatMultiBuy: u"MultiBuy text format"}
|
||||
selector = wx.RadioBox(self, wx.ID_ANY, label=u"Copy to the clipboard using:", choices=copyFormats,
|
||||
copyFormats = ["EFT", "EFT (Implants)", "XML", "DNA", "CREST", "MultiBuy"]
|
||||
copyFormatTooltips = {CopySelectDialog.copyFormatEft: "EFT text format",
|
||||
CopySelectDialog.copyFormatEftImps: "EFT text format",
|
||||
CopySelectDialog.copyFormatXml: "EVE native XML format",
|
||||
CopySelectDialog.copyFormatDna: "A one-line text format",
|
||||
CopySelectDialog.copyFormatEsi: "A JSON format used for EVE CREST",
|
||||
CopySelectDialog.copyFormatMultiBuy: "MultiBuy text format"}
|
||||
selector = wx.RadioBox(self, wx.ID_ANY, label="Copy to the clipboard using:", choices=copyFormats,
|
||||
style=wx.RA_SPECIFY_ROWS)
|
||||
selector.Bind(wx.EVT_RADIOBOX, self.Selected)
|
||||
for format, tooltip in copyFormatTooltips.iteritems():
|
||||
for format, tooltip in copyFormatTooltips.items():
|
||||
selector.SetItemToolTip(format, tooltip)
|
||||
|
||||
self.copyFormat = CopySelectDialog.copyFormatEft
|
||||
|
||||
114
gui/devTools.py
Normal file
114
gui/devTools.py
Normal file
@@ -0,0 +1,114 @@
|
||||
# =============================================================================
|
||||
# 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 <http://www.gnu.org/licenses/>.
|
||||
# =============================================================================
|
||||
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
from logbook import Logger
|
||||
import gc
|
||||
import eos
|
||||
import time
|
||||
import threading
|
||||
from gui.builtinShipBrowser.events import FitSelected
|
||||
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
|
||||
class DevTools(wx.Dialog):
|
||||
DAMAGE_TYPES = ("em", "thermal", "kinetic", "explosive")
|
||||
|
||||
def __init__(self, parent):
|
||||
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Damage Pattern Editor", size=wx.Size(400, 240))
|
||||
|
||||
self.block = False
|
||||
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
|
||||
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.id_get = wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition)
|
||||
mainSizer.Add(self.id_get, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
self.idBtn = wx.Button(self, wx.ID_ANY, "Print object", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.idBtn, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.idBtn.Bind(wx.EVT_BUTTON, self.objects_by_id)
|
||||
|
||||
self.gcCollect = wx.Button(self, wx.ID_ANY, "GC Collect", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.gcCollect, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.gcCollect.Bind(wx.EVT_BUTTON, self.gc_collect)
|
||||
|
||||
self.fitTest = wx.Button(self, wx.ID_ANY, "Test fits", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
mainSizer.Add(self.fitTest, 0, wx.EXPAND | wx.TOP | wx.BOTTOM, 5)
|
||||
|
||||
self.fitTest .Bind(wx.EVT_BUTTON, self.fit_test)
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
|
||||
self.Layout()
|
||||
self.CenterOnParent()
|
||||
self.Show()
|
||||
|
||||
def objects_by_id(self, evt):
|
||||
input = self.id_get.GetValue()
|
||||
if input.startswith("0x"):
|
||||
input = int(input, 16)
|
||||
|
||||
print("Finding {} ({})".format(str(input), hex(input)))
|
||||
|
||||
for obj in gc.get_objects():
|
||||
if id(obj) == input:
|
||||
print(obj)
|
||||
print(bool(obj))
|
||||
print(str(len(gc.get_referents(obj))) + " references")
|
||||
|
||||
break
|
||||
else:
|
||||
print(None)
|
||||
|
||||
def gc_collect(self, evt):
|
||||
print(gc.collect())
|
||||
print(gc.get_debug())
|
||||
print(gc.get_stats())
|
||||
|
||||
def fit_test(self, evt):
|
||||
fits = eos.db.getFitList()
|
||||
self.thread = FitTestThread([x.ID for x in fits], self.Parent)
|
||||
self.thread.start()
|
||||
|
||||
|
||||
class FitTestThread(threading.Thread):
|
||||
def __init__(self, fitIDs, mainFrame):
|
||||
threading.Thread.__init__(self)
|
||||
self.name = "FitTestThread"
|
||||
self.mainFrame = mainFrame
|
||||
self.stopRunning = False
|
||||
self.fits = fitIDs
|
||||
|
||||
def stop(self):
|
||||
self.stopRunning = True
|
||||
|
||||
def run(self):
|
||||
# wait 1 second just in case a lot of modifications get made
|
||||
if self.stopRunning:
|
||||
return
|
||||
|
||||
for fit in self.fits:
|
||||
time.sleep(1)
|
||||
e = FitSelected(fitID=fit)
|
||||
wx.PostEvent(self.mainFrame, e)
|
||||
@@ -17,7 +17,6 @@
|
||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||
# =============================================================================
|
||||
|
||||
import sys
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import gui.mainFrame
|
||||
@@ -38,9 +37,6 @@ class Display(wx.ListCtrl):
|
||||
self.Bind(wx.EVT_LIST_COL_END_DRAG, self.resizeChecker)
|
||||
self.Bind(wx.EVT_LIST_COL_BEGIN_DRAG, self.resizeSkip)
|
||||
|
||||
if "wxMSW" in wx.PlatformInfo:
|
||||
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBk)
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
|
||||
i = 0
|
||||
@@ -55,7 +51,7 @@ class Display(wx.ListCtrl):
|
||||
name, type, defaultValue = param
|
||||
value = params[x] if len(params) > x else defaultValue
|
||||
value = value if value != "" else defaultValue
|
||||
if type == bool and isinstance(value, basestring):
|
||||
if type == bool and isinstance(value, str):
|
||||
value = bool(value) if value.lower() != "false" and value != "0" else False
|
||||
paramDict[name] = value
|
||||
col = colClass(self, paramDict)
|
||||
@@ -69,7 +65,7 @@ class Display(wx.ListCtrl):
|
||||
info = wx.ListItem()
|
||||
# noinspection PyPropertyAccess
|
||||
info.m_mask = wx.LIST_MASK_WIDTH
|
||||
self.InsertColumnInfo(i, info)
|
||||
self.InsertColumn(i, info)
|
||||
self.SetColumnWidth(i, 0)
|
||||
|
||||
self.imageListBase = self.imageList.ImageCount
|
||||
@@ -113,50 +109,16 @@ class Display(wx.ListCtrl):
|
||||
|
||||
return rowIndex, 0, -1
|
||||
|
||||
def OnEraseBk(self, event):
|
||||
if self.GetItemCount() > 0:
|
||||
width, height = self.GetClientSize()
|
||||
dc = event.GetDC()
|
||||
|
||||
dc.DestroyClippingRegion()
|
||||
dc.SetClippingRegion(0, 0, width, height)
|
||||
x, y, w, h = dc.GetClippingBox()
|
||||
|
||||
topItem = self.GetTopItem()
|
||||
bottomItem = topItem + self.GetCountPerPage()
|
||||
|
||||
if bottomItem >= self.GetItemCount():
|
||||
bottomItem = self.GetItemCount() - 1
|
||||
|
||||
topRect = self.GetItemRect(topItem, wx.LIST_RECT_LABEL)
|
||||
bottomRect = self.GetItemRect(bottomItem, wx.LIST_RECT_BOUNDS)
|
||||
|
||||
items_rect = wx.Rect(topRect.left, 0, bottomRect.right - topRect.left, bottomRect.bottom)
|
||||
|
||||
updateRegion = wx.Region(x, y, w, h)
|
||||
updateRegion.SubtractRect(items_rect)
|
||||
|
||||
dc.DestroyClippingRegion()
|
||||
dc.SetClippingRegionAsRegion(updateRegion)
|
||||
|
||||
dc.SetBackground(wx.Brush(self.GetBackgroundColour(), wx.SOLID))
|
||||
dc.Clear()
|
||||
|
||||
dc.DestroyClippingRegion()
|
||||
|
||||
else:
|
||||
event.Skip()
|
||||
|
||||
# noinspection PyPropertyAccess
|
||||
def addColumn(self, i, col):
|
||||
self.activeColumns.append(col)
|
||||
info = wx.ListItem()
|
||||
info.m_mask = col.mask | wx.LIST_MASK_FORMAT | wx.LIST_MASK_WIDTH
|
||||
info.m_image = col.imageId
|
||||
info.m_text = col.columnText
|
||||
info.m_width = -1
|
||||
info.m_format = wx.LIST_FORMAT_LEFT
|
||||
self.InsertColumnInfo(i, info)
|
||||
info.SetMask(col.mask | wx.LIST_MASK_FORMAT | wx.LIST_MASK_WIDTH)
|
||||
info.SetImage(col.imageId)
|
||||
info.SetText(col.columnText)
|
||||
info.SetWidth(-1)
|
||||
info.SetAlign(wx.LIST_FORMAT_LEFT)
|
||||
self.InsertColumn(i, info)
|
||||
col.resized = False
|
||||
if i == 0 and col.size != wx.LIST_AUTOSIZE_USEHEADER:
|
||||
col.size += 4
|
||||
@@ -219,13 +181,13 @@ class Display(wx.ListCtrl):
|
||||
|
||||
if listItemCount < stuffItemCount:
|
||||
for i in range(stuffItemCount - listItemCount):
|
||||
self.InsertStringItem(sys.maxint, "")
|
||||
self.InsertItem(self.GetItemCount(), "")
|
||||
|
||||
if listItemCount > stuffItemCount:
|
||||
if listItemCount - stuffItemCount > 20 > stuffItemCount:
|
||||
self.DeleteAllItems()
|
||||
for i in range(stuffItemCount):
|
||||
self.InsertStringItem(sys.maxint, "")
|
||||
self.InsertItem(self.GetItemCount(), "")
|
||||
else:
|
||||
for i in range(listItemCount - stuffItemCount):
|
||||
self.DeleteItem(self.getLastItem())
|
||||
@@ -247,7 +209,7 @@ class Display(wx.ListCtrl):
|
||||
newText = col.getText(st)
|
||||
if newText is False:
|
||||
col.delayedText(st, self, colItem)
|
||||
newText = u"\u21bb"
|
||||
newText = "\u21bb"
|
||||
|
||||
newImageId = col.getImageId(st)
|
||||
|
||||
|
||||
@@ -17,42 +17,57 @@
|
||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||
# ===============================================================================
|
||||
|
||||
import platform
|
||||
# import platform
|
||||
import sys
|
||||
|
||||
#
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
import traceback
|
||||
import config
|
||||
from logbook import Logger
|
||||
from service.prereqsCheck import version_block
|
||||
|
||||
try:
|
||||
import config
|
||||
except:
|
||||
config = None
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
try:
|
||||
import sqlalchemy
|
||||
|
||||
sqlalchemy_version = sqlalchemy.__version__
|
||||
except:
|
||||
sqlalchemy_version = "Unknown"
|
||||
class ErrorHandler(object):
|
||||
__parent = None
|
||||
__frame = None
|
||||
|
||||
try:
|
||||
from logbook import __version__ as logbook_version
|
||||
except:
|
||||
logbook_version = "Unknown"
|
||||
@classmethod
|
||||
def HandleException(cls, exc_type, exc_value, exc_traceback):
|
||||
with config.logging_setup.threadbound():
|
||||
# Print the base level traceback
|
||||
t = traceback.format_exception(exc_type, exc_value, exc_traceback)
|
||||
pyfalog.critical("\n\n" + "".join(t))
|
||||
|
||||
if cls.__parent is None:
|
||||
app = wx.App(False)
|
||||
cls.__frame = ErrorFrame(None)
|
||||
cls.__frame.addException("".join(t))
|
||||
app.MainLoop()
|
||||
sys.exit()
|
||||
else:
|
||||
if not cls.__frame:
|
||||
cls.__frame = ErrorFrame(cls.__parent)
|
||||
cls.__frame.Show()
|
||||
cls.__frame.addException("".join(t))
|
||||
|
||||
@classmethod
|
||||
def SetParent(cls, parent):
|
||||
cls.__parent = parent
|
||||
|
||||
|
||||
class ErrorFrame(wx.Frame):
|
||||
def __init__(self, exception=None, tb=None, error_title='Error!'):
|
||||
v = sys.version_info
|
||||
|
||||
wx.Frame.__init__(self, None, id=wx.ID_ANY, title="pyfa error", pos=wx.DefaultPosition, size=wx.Size(500, 600),
|
||||
def __init__(self, parent=None, error_title='Error!'):
|
||||
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="pyfa error", pos=wx.DefaultPosition, size=wx.Size(500, 600),
|
||||
style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER | wx.STAY_ON_TOP)
|
||||
|
||||
desc = "pyfa has experienced an unexpected issue. Below is a message that contains crucial\n" \
|
||||
"information about how this was triggered. Please contact the developers with the\n" \
|
||||
"information provided through the EVE Online forums or file a GitHub issue."
|
||||
|
||||
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
|
||||
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
|
||||
|
||||
if 'wxMSW' in wx.PlatformInfo:
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
|
||||
@@ -74,69 +89,32 @@ class ErrorFrame(wx.Frame):
|
||||
descText = wx.StaticText(self, wx.ID_ANY, desc)
|
||||
box.Add(descText, 1, wx.ALL, 5)
|
||||
|
||||
github = wx.HyperlinkCtrl(self, wx.ID_ANY, "Github", "https://github.com/pyfa-org/Pyfa/issues",
|
||||
wx.DefaultPosition, wx.DefaultSize, wx.HL_DEFAULT_STYLE)
|
||||
box.Add(github, 0, wx.ALL, 5)
|
||||
|
||||
eveForums = wx.HyperlinkCtrl(self, wx.ID_ANY, "EVE Forums", "https://forums.eveonline.com/t/27156",
|
||||
wx.DefaultPosition, wx.DefaultSize, wx.HL_DEFAULT_STYLE)
|
||||
box.Add(eveForums, 0, wx.ALL, 5)
|
||||
# github = wx.lib.agw.hyperlink.HyperLinkCtrl(self, wx.ID_ANY, label="Github", URL="https://github.com/pyfa-org/Pyfa/issues")
|
||||
# box.Add(github, 0, wx.ALL, 5)
|
||||
#
|
||||
# eveForums = wx.lib.agw.hyperlink.HyperLinkCtrl(self, wx.ID_ANY, label="EVE Forums", URL="https://forums.eveonline.com/t/27156")
|
||||
# box.Add(eveForums, 0, wx.ALL, 5)
|
||||
|
||||
# mainSizer.AddSpacer((0, 5), 0, wx.EXPAND, 5)
|
||||
|
||||
errorTextCtrl = wx.TextCtrl(self, wx.ID_ANY, "", wx.DefaultPosition, (-1, 400), wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH2 | wx.TE_DONTWRAP)
|
||||
errorTextCtrl.SetFont(wx.Font(8, wx.FONTFAMILY_TELETYPE, wx.NORMAL, wx.NORMAL))
|
||||
mainSizer.Add(errorTextCtrl, 0, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, 5)
|
||||
|
||||
try:
|
||||
errorTextCtrl.AppendText("OS version: \t" + str(platform.platform()))
|
||||
except:
|
||||
errorTextCtrl.AppendText("OS version: Unknown")
|
||||
errorTextCtrl.AppendText("\n")
|
||||
|
||||
try:
|
||||
errorTextCtrl.AppendText("Python: \t" + '{}.{}.{}'.format(v.major, v.minor, v.micro))
|
||||
except:
|
||||
errorTextCtrl.AppendText("Python: Unknown")
|
||||
errorTextCtrl.AppendText("\n")
|
||||
|
||||
try:
|
||||
errorTextCtrl.AppendText("wxPython: \t" + wx.VERSION_STRING)
|
||||
except:
|
||||
errorTextCtrl.AppendText("wxPython: Unknown")
|
||||
errorTextCtrl.AppendText("\n")
|
||||
|
||||
errorTextCtrl.AppendText("SQLAlchemy: \t" + str(sqlalchemy_version))
|
||||
errorTextCtrl.AppendText("\n")
|
||||
|
||||
errorTextCtrl.AppendText("Logbook: \t" + str(logbook_version))
|
||||
errorTextCtrl.AppendText("\n")
|
||||
|
||||
try:
|
||||
errorTextCtrl.AppendText("pyfa version: {0} {1} - {2} {3}".format(config.version, config.tag, config.expansionName, config.expansionVersion))
|
||||
except:
|
||||
errorTextCtrl.AppendText("pyfa version: Unknown")
|
||||
errorTextCtrl.AppendText('\n')
|
||||
|
||||
errorTextCtrl.AppendText("pyfa root: " + str(config.pyfaPath or "Unknown"))
|
||||
errorTextCtrl.AppendText('\n')
|
||||
errorTextCtrl.AppendText("save path: " + str(config.savePath or "Unknown"))
|
||||
errorTextCtrl.AppendText('\n')
|
||||
errorTextCtrl.AppendText("fs encoding: " + str(sys.getfilesystemencoding() or "Unknown"))
|
||||
errorTextCtrl.AppendText('\n\n')
|
||||
|
||||
errorTextCtrl.AppendText("EXCEPTION: " + str(exception or "Unknown"))
|
||||
errorTextCtrl.AppendText('\n\n')
|
||||
|
||||
if tb:
|
||||
for line in tb:
|
||||
errorTextCtrl.AppendText(line)
|
||||
errorTextCtrl.Layout()
|
||||
self.errorTextCtrl = wx.TextCtrl(self, wx.ID_ANY, version_block.strip(), wx.DefaultPosition,
|
||||
(-1, 400), wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_RICH2 | wx.TE_DONTWRAP)
|
||||
self.errorTextCtrl.SetFont(wx.Font(8, wx.FONTFAMILY_TELETYPE, wx.NORMAL, wx.NORMAL))
|
||||
mainSizer.Add(self.errorTextCtrl, 0, wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, 5)
|
||||
self.errorTextCtrl.AppendText("\n")
|
||||
self.errorTextCtrl.Layout()
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
mainSizer.Layout()
|
||||
self.Layout()
|
||||
|
||||
self.Centre(wx.BOTH)
|
||||
self.Bind(wx.EVT_CLOSE, self.OnClose)
|
||||
|
||||
self.Show()
|
||||
|
||||
def OnClose(self, evt):
|
||||
self.Hide()
|
||||
|
||||
def addException(self, text):
|
||||
self.errorTextCtrl.AppendText("\n{}\n\n{}".format("#" * 20, text))
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import time
|
||||
import webbrowser
|
||||
import json
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
@@ -15,13 +13,14 @@ from gui.display import Display
|
||||
import gui.globalEvents as GE
|
||||
|
||||
from logbook import Logger
|
||||
from service.esi import Esi
|
||||
from service.esiAccess import APIException
|
||||
from service.port import ESIExportException
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
|
||||
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
|
||||
from service.crest import Crest, CrestModes
|
||||
|
||||
|
||||
class CrestFittings(wx.Frame):
|
||||
class EveFittings(wx.Frame):
|
||||
def __init__(self, parent):
|
||||
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="Browse EVE Fittings", pos=wx.DefaultPosition,
|
||||
size=wx.Size(550, 450), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)
|
||||
@@ -30,22 +29,15 @@ class CrestFittings(wx.Frame):
|
||||
|
||||
self.mainFrame = parent
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
sCrest = Crest.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
characterSelectSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
if sCrest.settings.get('mode') == CrestModes.IMPLICIT:
|
||||
self.stLogged = wx.StaticText(self, wx.ID_ANY, "Currently logged in as %s" % sCrest.implicitCharacter.name,
|
||||
wx.DefaultPosition, wx.DefaultSize)
|
||||
self.stLogged.Wrap(-1)
|
||||
self.charChoice = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [])
|
||||
characterSelectSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
self.updateCharList()
|
||||
|
||||
characterSelectSizer.Add(self.stLogged, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
else:
|
||||
self.charChoice = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [])
|
||||
characterSelectSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
self.updateCharList()
|
||||
|
||||
self.fetchBtn = wx.Button(self, wx.ID_ANY, u"Fetch Fits", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.fetchBtn = wx.Button(self, wx.ID_ANY, "Fetch Fits", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
characterSelectSizer.Add(self.fetchBtn, 0, wx.ALL, 5)
|
||||
mainSizer.Add(characterSelectSizer, 0, wx.EXPAND, 5)
|
||||
|
||||
@@ -64,8 +56,8 @@ class CrestFittings(wx.Frame):
|
||||
fitSizer.Add(self.fitView, 1, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
btnSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
self.importBtn = wx.Button(self, wx.ID_ANY, u"Import to pyfa", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.deleteBtn = wx.Button(self, wx.ID_ANY, u"Delete from EVE", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.importBtn = wx.Button(self, wx.ID_ANY, "Import to pyfa", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.deleteBtn = wx.Button(self, wx.ID_ANY, "Delete from EVE", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
btnSizer.Add(self.importBtn, 1, wx.ALL, 5)
|
||||
btnSizer.Add(self.deleteBtn, 1, wx.ALL, 5)
|
||||
fitSizer.Add(btnSizer, 0, wx.EXPAND)
|
||||
@@ -77,112 +69,109 @@ class CrestFittings(wx.Frame):
|
||||
self.importBtn.Bind(wx.EVT_BUTTON, self.importFitting)
|
||||
self.deleteBtn.Bind(wx.EVT_BUTTON, self.deleteFitting)
|
||||
|
||||
self.mainFrame.Bind(GE.EVT_SSO_LOGOUT, self.ssoLogout)
|
||||
self.mainFrame.Bind(GE.EVT_SSO_LOGIN, self.ssoLogin)
|
||||
self.Bind(wx.EVT_CLOSE, self.OnClose)
|
||||
|
||||
self.statusbar = wx.StatusBar(self)
|
||||
self.statusbar.SetFieldsCount()
|
||||
self.SetStatusBar(self.statusbar)
|
||||
|
||||
self.cacheTimer = wx.Timer(self)
|
||||
self.Bind(wx.EVT_TIMER, self.updateCacheStatus, self.cacheTimer)
|
||||
|
||||
self.SetSizer(mainSizer)
|
||||
self.Layout()
|
||||
|
||||
self.Centre(wx.BOTH)
|
||||
|
||||
def ssoLogin(self, event):
|
||||
self.updateCharList()
|
||||
event.Skip()
|
||||
|
||||
def updateCharList(self):
|
||||
sCrest = Crest.getInstance()
|
||||
chars = sCrest.getCrestCharacters()
|
||||
sEsi = Esi.getInstance()
|
||||
chars = sEsi.getSsoCharacters()
|
||||
|
||||
if len(chars) == 0:
|
||||
self.Close()
|
||||
|
||||
self.charChoice.Clear()
|
||||
for char in chars:
|
||||
self.charChoice.Append(char.name, char.ID)
|
||||
self.charChoice.Append(char.characterName, char.ID)
|
||||
|
||||
self.charChoice.SetSelection(0)
|
||||
|
||||
def updateCacheStatus(self, event):
|
||||
t = time.gmtime(self.cacheTime - time.time())
|
||||
if t < 0:
|
||||
self.cacheTimer.Stop()
|
||||
else:
|
||||
sTime = time.strftime("%H:%M:%S", t)
|
||||
self.statusbar.SetStatusText("Cached for %s" % sTime, 0)
|
||||
|
||||
def ssoLogout(self, event):
|
||||
if event.type == CrestModes.IMPLICIT:
|
||||
self.Close()
|
||||
else:
|
||||
self.updateCharList()
|
||||
event.Skip() # continue event
|
||||
|
||||
def OnClose(self, event):
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGOUT, handler=self.ssoLogout)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGIN, handler=self.ssoLogin)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGOUT)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGIN)
|
||||
# self.cacheTimer.Stop() # must be manually stopped, otherwise crash. See https://github.com/wxWidgets/Phoenix/issues/632
|
||||
event.Skip()
|
||||
|
||||
def getActiveCharacter(self):
|
||||
sCrest = Crest.getInstance()
|
||||
|
||||
if sCrest.settings.get('mode') == CrestModes.IMPLICIT:
|
||||
return sCrest.implicitCharacter.ID
|
||||
|
||||
selection = self.charChoice.GetCurrentSelection()
|
||||
return self.charChoice.GetClientData(selection) if selection is not None else None
|
||||
|
||||
def fetchFittings(self, event):
|
||||
sCrest = Crest.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
waitDialog = wx.BusyInfo("Fetching fits, please wait...", parent=self)
|
||||
|
||||
try:
|
||||
waitDialog = wx.BusyInfo("Fetching fits, please wait...", parent=self)
|
||||
fittings = sCrest.getFittings(self.getActiveCharacter())
|
||||
self.cacheTime = fittings.get('cached_until')
|
||||
self.updateCacheStatus(None)
|
||||
self.cacheTimer.Start(1000)
|
||||
self.fitTree.populateSkillTree(fittings)
|
||||
self.fittings = sEsi.getFittings(self.getActiveCharacter())
|
||||
# self.cacheTime = fittings.get('cached_until')
|
||||
# self.updateCacheStatus(None)
|
||||
# self.cacheTimer.Start(1000)
|
||||
self.fitTree.populateSkillTree(self.fittings)
|
||||
del waitDialog
|
||||
except requests.exceptions.ConnectionError:
|
||||
msg = "Connection error, please check your internet connection"
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
except APIException as ex:
|
||||
del waitDialog # Can't do this in a finally because then it obscures the message dialog
|
||||
ESIExceptionHandler(self, ex)
|
||||
except Exception as ex:
|
||||
del waitDialog
|
||||
raise ex
|
||||
|
||||
def importFitting(self, event):
|
||||
selection = self.fitView.fitSelection
|
||||
if not selection:
|
||||
return
|
||||
data = self.fitTree.fittingsTreeCtrl.GetPyData(selection)
|
||||
data = self.fitTree.fittingsTreeCtrl.GetItemData(selection)
|
||||
sPort = Port.getInstance()
|
||||
fits = sPort.importFitFromBuffer(data)
|
||||
self.mainFrame._openAfterImport(fits)
|
||||
|
||||
def deleteFitting(self, event):
|
||||
sCrest = Crest.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
selection = self.fitView.fitSelection
|
||||
if not selection:
|
||||
return
|
||||
data = json.loads(self.fitTree.fittingsTreeCtrl.GetPyData(selection))
|
||||
data = json.loads(self.fitTree.fittingsTreeCtrl.GetItemData(selection))
|
||||
|
||||
dlg = wx.MessageDialog(self,
|
||||
"Do you really want to delete %s (%s) from EVE?" % (data['name'], data['ship']['name']),
|
||||
"Do you really want to delete %s (%s) from EVE?" % (data['name'], getItem(data['ship_type_id']).name),
|
||||
"Confirm Delete", wx.YES | wx.NO | wx.ICON_QUESTION)
|
||||
|
||||
if dlg.ShowModal() == wx.ID_YES:
|
||||
try:
|
||||
sCrest.delFitting(self.getActiveCharacter(), data['fittingID'])
|
||||
sEsi.delFitting(self.getActiveCharacter(), data['fitting_id'])
|
||||
# repopulate the fitting list
|
||||
self.fitTree.populateSkillTree(self.fittings)
|
||||
self.fitView.update([])
|
||||
except requests.exceptions.ConnectionError:
|
||||
msg = "Connection error, please check your internet connection"
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
|
||||
|
||||
class ESIExceptionHandler(object):
|
||||
# todo: make this a generate excetpion handler for all calls
|
||||
def __init__(self, parentWindow, ex):
|
||||
if ex.response['error'].startswith('Token is not valid') or ex.response['error'] == 'invalid_token': # todo: this seems messy, figure out a better response
|
||||
dlg = wx.MessageDialog(parentWindow,
|
||||
"There was an error validating characters' SSO token. Please try "
|
||||
"logging into the character again to reset the token.", "Invalid Token",
|
||||
wx.OK | wx.ICON_ERROR)
|
||||
dlg.ShowModal()
|
||||
pyfalog.error(ex)
|
||||
else:
|
||||
# We don't know how to handle the error, raise it for the global error handler to pick it up
|
||||
raise ex
|
||||
|
||||
|
||||
class ExportToEve(wx.Frame):
|
||||
def __init__(self, parent):
|
||||
wx.Frame.__init__(self, parent, id=wx.ID_ANY, title="Export fit to EVE", pos=wx.DefaultPosition,
|
||||
@@ -191,23 +180,16 @@ class ExportToEve(wx.Frame):
|
||||
self.mainFrame = parent
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
|
||||
|
||||
sCrest = Crest.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
hSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
|
||||
if sCrest.settings.get('mode') == CrestModes.IMPLICIT:
|
||||
self.stLogged = wx.StaticText(self, wx.ID_ANY, "Currently logged in as %s" % sCrest.implicitCharacter.name,
|
||||
wx.DefaultPosition, wx.DefaultSize)
|
||||
self.stLogged.Wrap(-1)
|
||||
self.charChoice = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [])
|
||||
hSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
self.updateCharList()
|
||||
self.charChoice.SetSelection(0)
|
||||
|
||||
hSizer.Add(self.stLogged, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
else:
|
||||
self.charChoice = wx.Choice(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, [])
|
||||
hSizer.Add(self.charChoice, 1, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 5)
|
||||
self.updateCharList()
|
||||
self.charChoice.SetSelection(0)
|
||||
|
||||
self.exportBtn = wx.Button(self, wx.ID_ANY, u"Export Fit", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
self.exportBtn = wx.Button(self, wx.ID_ANY, "Export Fit", wx.DefaultPosition, wx.DefaultSize, 5)
|
||||
hSizer.Add(self.exportBtn, 0, wx.ALL, 5)
|
||||
|
||||
mainSizer.Add(hSizer, 0, wx.EXPAND, 5)
|
||||
@@ -218,52 +200,34 @@ class ExportToEve(wx.Frame):
|
||||
self.statusbar.SetFieldsCount(2)
|
||||
self.statusbar.SetStatusWidths([100, -1])
|
||||
|
||||
self.mainFrame.Bind(GE.EVT_SSO_LOGOUT, self.ssoLogout)
|
||||
self.mainFrame.Bind(GE.EVT_SSO_LOGIN, self.ssoLogin)
|
||||
self.Bind(wx.EVT_CLOSE, self.OnClose)
|
||||
|
||||
self.SetSizer(hSizer)
|
||||
self.SetSizer(mainSizer)
|
||||
self.SetStatusBar(self.statusbar)
|
||||
self.Layout()
|
||||
|
||||
self.Centre(wx.BOTH)
|
||||
|
||||
def updateCharList(self):
|
||||
sCrest = Crest.getInstance()
|
||||
chars = sCrest.getCrestCharacters()
|
||||
sEsi = Esi.getInstance()
|
||||
chars = sEsi.getSsoCharacters()
|
||||
|
||||
if len(chars) == 0:
|
||||
self.Close()
|
||||
|
||||
self.charChoice.Clear()
|
||||
for char in chars:
|
||||
self.charChoice.Append(char.name, char.ID)
|
||||
self.charChoice.Append(char.characterName, char.ID)
|
||||
|
||||
self.charChoice.SetSelection(0)
|
||||
|
||||
def ssoLogin(self, event):
|
||||
self.updateCharList()
|
||||
event.Skip()
|
||||
|
||||
def ssoLogout(self, event):
|
||||
if event.type == CrestModes.IMPLICIT:
|
||||
self.Close()
|
||||
else:
|
||||
self.updateCharList()
|
||||
event.Skip() # continue event
|
||||
|
||||
def OnClose(self, event):
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGOUT, handler=self.ssoLogout)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGIN, handler=self.ssoLogin)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGOUT)
|
||||
self.mainFrame.Unbind(GE.EVT_SSO_LOGIN)
|
||||
|
||||
event.Skip()
|
||||
|
||||
def getActiveCharacter(self):
|
||||
sCrest = Crest.getInstance()
|
||||
|
||||
if sCrest.settings.get('mode') == CrestModes.IMPLICIT:
|
||||
return sCrest.implicitCharacter.ID
|
||||
|
||||
selection = self.charChoice.GetCurrentSelection()
|
||||
return self.charChoice.GetClientData(selection) if selection is not None else None
|
||||
|
||||
@@ -278,29 +242,36 @@ class ExportToEve(wx.Frame):
|
||||
return
|
||||
|
||||
self.statusbar.SetStatusText("Sending request and awaiting response", 1)
|
||||
sCrest = Crest.getInstance()
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
try:
|
||||
sFit = Fit.getInstance()
|
||||
data = sPort.exportCrest(sFit.getFit(fitID))
|
||||
res = sCrest.postFitting(self.getActiveCharacter(), data)
|
||||
data = sPort.exportESI(sFit.getFit(fitID))
|
||||
res = sEsi.postFitting(self.getActiveCharacter(), data)
|
||||
|
||||
self.statusbar.SetStatusText("%d: %s" % (res.status_code, res.reason), 0)
|
||||
try:
|
||||
text = json.loads(res.text)
|
||||
self.statusbar.SetStatusText(text['message'], 1)
|
||||
except ValueError:
|
||||
pyfalog.warning("Value error on loading JSON.")
|
||||
self.statusbar.SetStatusText("", 1)
|
||||
self.statusbar.SetStatusText("", 0)
|
||||
self.statusbar.SetStatusText("", 1)
|
||||
# try:
|
||||
# text = json.loads(res.text)
|
||||
# self.statusbar.SetStatusText(text['message'], 1)
|
||||
# except ValueError:
|
||||
# pyfalog.warning("Value error on loading JSON.")
|
||||
# self.statusbar.SetStatusText("", 1)
|
||||
except requests.exceptions.ConnectionError:
|
||||
msg = "Connection error, please check your internet connection"
|
||||
pyfalog.error(msg)
|
||||
self.statusbar.SetStatusText(msg)
|
||||
except ESIExportException as ex:
|
||||
pyfalog.error(ex)
|
||||
self.statusbar.SetStatusText("ERROR", 0)
|
||||
self.statusbar.SetStatusText(ex.args[0], 1)
|
||||
except APIException as ex:
|
||||
ESIExceptionHandler(self, ex)
|
||||
|
||||
|
||||
class CrestMgmt(wx.Dialog):
|
||||
class SsoCharacterMgmt(wx.Dialog):
|
||||
def __init__(self, parent):
|
||||
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="CREST Character Management", pos=wx.DefaultPosition,
|
||||
wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="SSO Character Management", pos=wx.DefaultPosition,
|
||||
size=wx.Size(550, 250), style=wx.DEFAULT_DIALOG_STYLE)
|
||||
self.mainFrame = parent
|
||||
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||
@@ -308,7 +279,7 @@ class CrestMgmt(wx.Dialog):
|
||||
self.lcCharacters = wx.ListCtrl(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_REPORT)
|
||||
|
||||
self.lcCharacters.InsertColumn(0, heading='Character')
|
||||
self.lcCharacters.InsertColumn(1, heading='Refresh Token')
|
||||
self.lcCharacters.InsertColumn(1, heading='Character ID')
|
||||
|
||||
self.popCharList()
|
||||
|
||||
@@ -316,10 +287,10 @@ class CrestMgmt(wx.Dialog):
|
||||
|
||||
btnSizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.addBtn = wx.Button(self, wx.ID_ANY, u"Add Character", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.addBtn = wx.Button(self, wx.ID_ANY, "Add Character", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
btnSizer.Add(self.addBtn, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
self.deleteBtn = wx.Button(self, wx.ID_ANY, u"Revoke Character", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.deleteBtn = wx.Button(self, wx.ID_ANY, "Revoke Character", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
btnSizer.Add(self.deleteBtn, 0, wx.ALL | wx.EXPAND, 5)
|
||||
|
||||
mainSizer.Add(btnSizer, 0, wx.EXPAND, 5)
|
||||
@@ -335,18 +306,20 @@ class CrestMgmt(wx.Dialog):
|
||||
self.Centre(wx.BOTH)
|
||||
|
||||
def ssoLogin(self, event):
|
||||
self.popCharList()
|
||||
event.Skip()
|
||||
if (self):
|
||||
#todo: these events don't unbind properly when window is closed (?), hence the `if`. Figure out better way of doing this.
|
||||
self.popCharList()
|
||||
event.Skip()
|
||||
|
||||
def popCharList(self):
|
||||
sCrest = Crest.getInstance()
|
||||
chars = sCrest.getCrestCharacters()
|
||||
sEsi = Esi.getInstance()
|
||||
chars = sEsi.getSsoCharacters()
|
||||
|
||||
self.lcCharacters.DeleteAllItems()
|
||||
|
||||
for index, char in enumerate(chars):
|
||||
self.lcCharacters.InsertStringItem(index, char.name)
|
||||
self.lcCharacters.SetStringItem(index, 1, char.refresh_token)
|
||||
self.lcCharacters.InsertItem(index, char.characterName)
|
||||
self.lcCharacters.SetItem(index, 1, str(char.characterID))
|
||||
self.lcCharacters.SetItemData(index, char.ID)
|
||||
|
||||
self.lcCharacters.SetColumnWidth(0, wx.LIST_AUTOSIZE)
|
||||
@@ -354,16 +327,15 @@ class CrestMgmt(wx.Dialog):
|
||||
|
||||
@staticmethod
|
||||
def addChar(event):
|
||||
sCrest = Crest.getInstance()
|
||||
uri = sCrest.startServer()
|
||||
webbrowser.open(uri)
|
||||
sEsi = Esi.getInstance()
|
||||
sEsi.login()
|
||||
|
||||
def delChar(self, event):
|
||||
item = self.lcCharacters.GetFirstSelected()
|
||||
if item > -1:
|
||||
charID = self.lcCharacters.GetItemData(item)
|
||||
sCrest = Crest.getInstance()
|
||||
sCrest.delCrestCharacter(charID)
|
||||
sEsi = Esi.getInstance()
|
||||
sEsi.delSsoCharacter(charID)
|
||||
self.popCharList()
|
||||
|
||||
|
||||
@@ -379,7 +351,7 @@ class FittingsTreeView(wx.Panel):
|
||||
self.root = tree.AddRoot("Fits")
|
||||
self.populateSkillTree(None)
|
||||
|
||||
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.displayFit)
|
||||
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.displayFit)
|
||||
|
||||
self.SetSizer(pmainSizer)
|
||||
|
||||
@@ -392,24 +364,29 @@ class FittingsTreeView(wx.Panel):
|
||||
tree = self.fittingsTreeCtrl
|
||||
tree.DeleteChildren(root)
|
||||
|
||||
dict = {}
|
||||
fits = data['items']
|
||||
for fit in fits:
|
||||
if fit['ship']['name'] not in dict:
|
||||
dict[fit['ship']['name']] = []
|
||||
dict[fit['ship']['name']].append(fit)
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
for name, fits in dict.iteritems():
|
||||
dict = {}
|
||||
fits = data
|
||||
for fit in fits:
|
||||
if (fit['fitting_id'] in sEsi.fittings_deleted):
|
||||
continue
|
||||
ship = getItem(fit['ship_type_id'])
|
||||
if ship.name not in dict:
|
||||
dict[ship.name] = []
|
||||
dict[ship.name].append(fit)
|
||||
|
||||
for name, fits in dict.items():
|
||||
shipID = tree.AppendItem(root, name)
|
||||
for fit in fits:
|
||||
fitId = tree.AppendItem(shipID, fit['name'])
|
||||
tree.SetPyData(fitId, json.dumps(fit))
|
||||
tree.SetItemData(fitId, json.dumps(fit))
|
||||
|
||||
tree.SortChildren(root)
|
||||
|
||||
def displayFit(self, event):
|
||||
selection = self.fittingsTreeCtrl.GetSelection()
|
||||
data = self.fittingsTreeCtrl.GetPyData(selection)
|
||||
data = self.fittingsTreeCtrl.GetItemData(selection)
|
||||
|
||||
if data is None:
|
||||
event.Skip()
|
||||
@@ -420,7 +397,7 @@ class FittingsTreeView(wx.Panel):
|
||||
|
||||
for item in fit['items']:
|
||||
try:
|
||||
cargo = Cargo(getItem(item['type']['id']))
|
||||
cargo = Cargo(getItem(item['type_id']))
|
||||
cargo.amount = item['quantity']
|
||||
list.append(cargo)
|
||||
except Exception as e:
|
||||
@@ -5,5 +5,6 @@ FitChanged, FIT_CHANGED = wx.lib.newevent.NewEvent()
|
||||
CharListUpdated, CHAR_LIST_UPDATED = wx.lib.newevent.NewEvent()
|
||||
CharChanged, CHAR_CHANGED = wx.lib.newevent.NewEvent()
|
||||
|
||||
SsoLoggingIn, EVT_SSO_LOGGING_IN = wx.lib.newevent.NewEvent()
|
||||
SsoLogin, EVT_SSO_LOGIN = wx.lib.newevent.NewEvent()
|
||||
SsoLogout, EVT_SSO_LOGOUT = wx.lib.newevent.NewEvent()
|
||||
|
||||
@@ -28,7 +28,7 @@ import gui.display
|
||||
import gui.mainFrame
|
||||
import gui.globalEvents as GE
|
||||
from gui.graph import Graph
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
import traceback
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
@@ -93,15 +93,15 @@ class GraphFrame(wx.Frame):
|
||||
|
||||
graphFrame_enabled = True
|
||||
if int(mpl.__version__[0]) < 1:
|
||||
print("pyfa: Found matplotlib version ", mpl.__version__, " - activating OVER9000 workarounds")
|
||||
print(("pyfa: Found matplotlib version ", mpl.__version__, " - activating OVER9000 workarounds"))
|
||||
print("pyfa: Recommended minimum matplotlib version is 1.0.0")
|
||||
self.legendFix = True
|
||||
|
||||
mplImported = True
|
||||
|
||||
wx.Frame.__init__(self, parent, title=u"pyfa: Graph Generator", style=style, size=(520, 390))
|
||||
wx.Frame.__init__(self, parent, title="pyfa: Graph Generator", style=style, size=(520, 390))
|
||||
|
||||
i = wx.IconFromBitmap(BitmapLoader.getBitmap("graphs_small", "gui"))
|
||||
i = wx.Icon(BitmapLoader.getBitmap("graphs_small", "gui"))
|
||||
self.SetIcon(i)
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
self.CreateStatusBar()
|
||||
@@ -143,7 +143,7 @@ class GraphFrame(wx.Frame):
|
||||
dummyBox = wx.BoxSizer(wx.VERTICAL)
|
||||
self.gridPanel.SetSizer(dummyBox)
|
||||
|
||||
self.gridSizer = wx.FlexGridSizer(0, 4)
|
||||
self.gridSizer = wx.FlexGridSizer(0, 4, 0, 0)
|
||||
self.gridSizer.AddGrowableCol(1)
|
||||
dummyBox.Add(self.gridSizer, 0, wx.EXPAND)
|
||||
|
||||
@@ -179,7 +179,7 @@ class GraphFrame(wx.Frame):
|
||||
|
||||
def getValues(self):
|
||||
values = {}
|
||||
for fieldName, field in self.fields.iteritems():
|
||||
for fieldName, field in self.fields.items():
|
||||
values[fieldName] = field.GetValue()
|
||||
|
||||
return values
|
||||
@@ -193,14 +193,14 @@ class GraphFrame(wx.Frame):
|
||||
self.fields.clear()
|
||||
|
||||
# Setup textboxes
|
||||
for field, defaultVal in view.getFields().iteritems():
|
||||
for field, defaultVal in view.getFields().items():
|
||||
|
||||
textBox = wx.TextCtrl(self.gridPanel, wx.ID_ANY, style=0)
|
||||
self.fields[field] = textBox
|
||||
textBox.Bind(wx.EVT_TEXT, self.onFieldChanged)
|
||||
sizer.Add(textBox, 1, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 3)
|
||||
if defaultVal is not None:
|
||||
if not isinstance(defaultVal, basestring):
|
||||
if not isinstance(defaultVal, str):
|
||||
defaultVal = ("%f" % defaultVal).rstrip("0")
|
||||
if defaultVal[-1:] == ".":
|
||||
defaultVal += "0"
|
||||
@@ -229,6 +229,15 @@ class GraphFrame(wx.Frame):
|
||||
def draw(self, event=None):
|
||||
global mpl_version
|
||||
|
||||
if event is not None:
|
||||
event.Skip()
|
||||
|
||||
# todo: FIX THIS, see #1430. draw() is not being unbound properly when the window closes, this is an easy fix,
|
||||
# but not a proper solution
|
||||
if not self:
|
||||
pyfalog.warning("GraphFrame handled event, however GraphFrame no longer exists. Ignoring event")
|
||||
return
|
||||
|
||||
values = self.getValues()
|
||||
view = self.getView()
|
||||
self.subplot.clear()
|
||||
@@ -247,9 +256,9 @@ class GraphFrame(wx.Frame):
|
||||
|
||||
self.subplot.plot(x, y)
|
||||
legend.append(fit.name)
|
||||
except:
|
||||
pyfalog.warning(u"Invalid values in '{0}'", fit.name)
|
||||
self.SetStatusText(u"Invalid values in '%s'" % fit.name)
|
||||
except Exception as ex:
|
||||
pyfalog.warning("Invalid values in '{0}'", fit.name)
|
||||
self.SetStatusText("Invalid values in '%s'" % fit.name)
|
||||
self.canvas.draw()
|
||||
return
|
||||
|
||||
@@ -299,8 +308,6 @@ class GraphFrame(wx.Frame):
|
||||
|
||||
self.canvas.draw()
|
||||
self.SetStatusText("")
|
||||
if event is not None:
|
||||
event.Skip()
|
||||
|
||||
def onFieldChanged(self, event):
|
||||
self.draw()
|
||||
|
||||
@@ -23,7 +23,7 @@ import wx
|
||||
import config
|
||||
from service.market import Market
|
||||
import gui.mainFrame
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
|
||||
from gui.builtinItemStatsViews.itemTraits import ItemTraits
|
||||
from gui.builtinItemStatsViews.itemDescription import ItemDescription
|
||||
@@ -84,7 +84,7 @@ class ItemStatsDialog(wx.Dialog):
|
||||
iconFile = "%s%s%s" % (before, sep, "0%s" % after if len(after) < 2 else after)
|
||||
itemImg = BitmapLoader.getBitmap(iconFile, "icons")
|
||||
if itemImg is not None:
|
||||
self.SetIcon(wx.IconFromBitmap(itemImg))
|
||||
self.SetIcon(wx.Icon(itemImg))
|
||||
self.SetTitle("%s: %s%s" % ("%s Stats" % itmContext if itmContext is not None else "Stats", item.name,
|
||||
" (%d)" % item.ID if config.debug else ""))
|
||||
|
||||
@@ -99,7 +99,7 @@ class ItemStatsDialog(wx.Dialog):
|
||||
self.mainSizer.Add(self.container, 1, wx.EXPAND)
|
||||
|
||||
if "wxGTK" in wx.PlatformInfo:
|
||||
self.closeBtn = wx.Button(self, wx.ID_ANY, u"Close", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.closeBtn = wx.Button(self, wx.ID_ANY, "Close", wx.DefaultPosition, wx.DefaultSize, 0)
|
||||
self.mainSizer.Add(self.closeBtn, 0, wx.ALL | wx.ALIGN_RIGHT, 5)
|
||||
self.closeBtn.Bind(wx.EVT_BUTTON, self.closeEvent)
|
||||
|
||||
|
||||
188
gui/mainFrame.py
188
gui/mainFrame.py
@@ -25,8 +25,6 @@ import sqlalchemy
|
||||
# noinspection PyPackageRequirements
|
||||
import wx
|
||||
# noinspection PyPackageRequirements
|
||||
from wx._core import PyDeadObjectError
|
||||
# noinspection PyPackageRequirements
|
||||
from wx.lib.wordwrap import wordwrap
|
||||
# noinspection PyPackageRequirements
|
||||
from wx.lib.inspection import InspectionTool
|
||||
@@ -39,10 +37,10 @@ import config
|
||||
from eos.config import gamedata_version
|
||||
|
||||
import gui.aboutData
|
||||
from gui.chromeTabs import PFNotebook
|
||||
from gui.chrome_tabs import ChromeNotebook
|
||||
import gui.globalEvents as GE
|
||||
|
||||
from gui.bitmapLoader import BitmapLoader
|
||||
from gui.bitmap_loader import BitmapLoader
|
||||
from gui.mainMenuBar import MainMenuBar
|
||||
from gui.additionsPane import AdditionsPane
|
||||
from gui.marketBrowser import MarketBrowser
|
||||
@@ -56,8 +54,10 @@ from gui.characterSelection import CharacterSelection
|
||||
from gui.patternEditor import DmgPatternEditorDlg
|
||||
from gui.resistsEditor import ResistsEditorDlg
|
||||
from gui.setEditor import ImplantSetEditorDlg
|
||||
from gui.devTools import DevTools
|
||||
from gui.preferenceDialog import PreferenceDialog
|
||||
from gui.graphFrame import GraphFrame
|
||||
from gui.ssoLogin import SsoLogin
|
||||
from gui.copySelectDialog import CopySelectDialog
|
||||
from gui.utils.clipboard import toClipboard, fromClipboard
|
||||
from gui.updateDialog import UpdateDialog
|
||||
@@ -69,6 +69,7 @@ from service.settings import SettingsProvider
|
||||
from service.fit import Fit
|
||||
from service.character import Character
|
||||
from service.update import Update
|
||||
from service.esiAccess import SsoMode
|
||||
|
||||
# import this to access override setting
|
||||
from eos.modifiedAttributeDict import ModifiedAttributeDict
|
||||
@@ -81,11 +82,10 @@ from time import gmtime, strftime
|
||||
|
||||
import threading
|
||||
import webbrowser
|
||||
import wx.adv
|
||||
|
||||
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
|
||||
from service.crest import Crest
|
||||
from service.crest import CrestModes
|
||||
from gui.crestFittings import CrestFittings, ExportToEve, CrestMgmt
|
||||
from service.esi import Esi, LoginMethod
|
||||
from gui.esiFittings import EveFittings, ExportToEve, SsoCharacterMgmt
|
||||
|
||||
disableOverrideEditor = False
|
||||
|
||||
@@ -93,7 +93,7 @@ try:
|
||||
from gui.propertyEditor import AttributeEditor
|
||||
except ImportError as e:
|
||||
AttributeEditor = None
|
||||
print("Error loading Attribute Editor: %s.\nAccess to Attribute Editor is disabled." % e.message)
|
||||
print(("Error loading Attribute Editor: %s.\nAccess to Attribute Editor is disabled." % e.message))
|
||||
disableOverrideEditor = True
|
||||
|
||||
pyfalog = Logger(__name__)
|
||||
@@ -139,7 +139,8 @@ class OpenFitsThread(threading.Thread):
|
||||
wx.CallAfter(self.callback)
|
||||
|
||||
|
||||
class MainFrame(wx.Frame, IPortUser):
|
||||
# todo: include IPortUser again
|
||||
class MainFrame(wx.Frame):
|
||||
__instance = None
|
||||
|
||||
@classmethod
|
||||
@@ -163,7 +164,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
self.SetBackgroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE))
|
||||
|
||||
# Load and set the icon for pyfa main window
|
||||
i = wx.IconFromBitmap(BitmapLoader.getBitmap("pyfa", "gui"))
|
||||
i = wx.Icon(BitmapLoader.getBitmap("pyfa", "gui"))
|
||||
self.SetIcon(i)
|
||||
|
||||
# Create the layout and windows
|
||||
@@ -177,17 +178,17 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
self.fitMultiSwitch = MultiSwitch(self.fitting_additions_split)
|
||||
self.additionsPane = AdditionsPane(self.fitting_additions_split)
|
||||
|
||||
self.notebookBrowsers = PFNotebook(self.browser_fitting_split, False)
|
||||
self.notebookBrowsers = ChromeNotebook(self.browser_fitting_split, False)
|
||||
|
||||
marketImg = BitmapLoader.getImage("market_small", "gui")
|
||||
shipBrowserImg = BitmapLoader.getImage("ship_small", "gui")
|
||||
|
||||
self.marketBrowser = MarketBrowser(self.notebookBrowsers)
|
||||
self.notebookBrowsers.AddPage(self.marketBrowser, "Market", tabImage=marketImg, showClose=False)
|
||||
self.notebookBrowsers.AddPage(self.marketBrowser, "Market", image=marketImg, closeable=False)
|
||||
self.marketBrowser.splitter.SetSashPosition(self.marketHeight)
|
||||
|
||||
self.shipBrowser = ShipBrowser(self.notebookBrowsers)
|
||||
self.notebookBrowsers.AddPage(self.shipBrowser, "Fittings", tabImage=shipBrowserImg, showClose=False)
|
||||
self.notebookBrowsers.AddPage(self.shipBrowser, "Fittings", image=shipBrowserImg, closeable=False)
|
||||
|
||||
self.notebookBrowsers.SetSelection(1)
|
||||
|
||||
@@ -205,6 +206,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
self.charSelection = CharacterSelection(self)
|
||||
cstatsSizer.Add(self.charSelection, 0, wx.EXPAND)
|
||||
|
||||
# @todo pheonix: fix all stats stuff
|
||||
self.statsPane = StatsPane(self)
|
||||
cstatsSizer.Add(self.statsPane, 0, wx.EXPAND)
|
||||
|
||||
@@ -236,15 +238,19 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
self.sUpdate = Update.getInstance()
|
||||
self.sUpdate.CheckUpdate(self.ShowUpdateBox)
|
||||
|
||||
if 'wxMac' not in wx.PlatformInfo or ('wxMac' in wx.PlatformInfo and wx.VERSION >= (3, 0)):
|
||||
self.Bind(GE.EVT_SSO_LOGIN, self.onSSOLogin)
|
||||
self.Bind(GE.EVT_SSO_LOGOUT, self.onSSOLogout)
|
||||
self.Bind(GE.EVT_SSO_LOGIN, self.onSSOLogin)
|
||||
self.Bind(GE.EVT_SSO_LOGGING_IN, self.ShowSsoLogin)
|
||||
|
||||
self.titleTimer = wx.Timer(self)
|
||||
self.Bind(wx.EVT_TIMER, self.updateTitle, self.titleTimer)
|
||||
def ShowSsoLogin(self, event):
|
||||
if getattr(event, "login_mode", LoginMethod.SERVER) == LoginMethod.MANUAL and getattr(event, "sso_mode", SsoMode.AUTO) == SsoMode.AUTO:
|
||||
dlg = SsoLogin(self)
|
||||
if dlg.ShowModal() == wx.ID_OK:
|
||||
sEsi = Esi.getInstance()
|
||||
# todo: verify that this is a correct SSO Info block
|
||||
sEsi.handleLogin({'SSOInfo': [dlg.ssoInfoCtrl.Value.strip()]})
|
||||
|
||||
def ShowUpdateBox(self, release):
|
||||
dlg = UpdateDialog(self, release)
|
||||
def ShowUpdateBox(self, release, version):
|
||||
dlg = UpdateDialog(self, release, version)
|
||||
dlg.ShowModal()
|
||||
|
||||
def LoadPreviousOpenFits(self):
|
||||
@@ -343,7 +349,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
|
||||
# save open fits
|
||||
self.prevOpenFits['pyfaOpenFits'] = [] # clear old list
|
||||
for page in self.fitMultiSwitch.pages:
|
||||
for page in self.fitMultiSwitch._pages:
|
||||
m = getattr(page, "getActiveFit", None)
|
||||
if m is not None:
|
||||
self.prevOpenFits['pyfaOpenFits'].append(m())
|
||||
@@ -357,34 +363,37 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
event.Skip()
|
||||
|
||||
def ShowAboutBox(self, evt):
|
||||
v = sys.version_info
|
||||
info = wx.AboutDialogInfo()
|
||||
info = wx.adv.AboutDialogInfo()
|
||||
info.Name = "pyfa"
|
||||
info.Version = gui.aboutData.versionString
|
||||
info.Version = config.getVersion() # gui.aboutData.versionString
|
||||
#
|
||||
# try:
|
||||
# import matplotlib
|
||||
# matplotlib_version = matplotlib.__version__
|
||||
# except:
|
||||
# matplotlib_version = None
|
||||
#
|
||||
# info.Description = wordwrap(gui.aboutData.description + "\n\nDevelopers:\n\t" +
|
||||
# "\n\t".join(gui.aboutData.developers) +
|
||||
# "\n\nAdditional credits:\n\t" +
|
||||
# "\n\t".join(gui.aboutData.credits) +
|
||||
# "\n\nLicenses:\n\t" +
|
||||
# "\n\t".join(gui.aboutData.licenses) +
|
||||
# "\n\nEVE Data: \t" + gamedata_version +
|
||||
# "\nPython: \t\t" + '{}.{}.{}'.format(v.major, v.minor, v.micro) +
|
||||
# "\nwxPython: \t" + wx.__version__ +
|
||||
# "\nSQLAlchemy: \t" + sqlalchemy.__version__ +
|
||||
# "\nmatplotlib: \t {}".format(matplotlib_version if matplotlib_version else "Not Installed"),
|
||||
# 500, wx.ClientDC(self))
|
||||
# if "__WXGTK__" in wx.PlatformInfo:
|
||||
# forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425"
|
||||
# else:
|
||||
# forumUrl = "http://forums.eveonline.com/default.aspx?g=posts&t=466425"
|
||||
# info.WebSite = (forumUrl, "pyfa thread at EVE Online forum")
|
||||
wx.adv.AboutBox(info)
|
||||
|
||||
try:
|
||||
import matplotlib
|
||||
matplotlib_version = matplotlib.__version__
|
||||
except:
|
||||
matplotlib_version = None
|
||||
|
||||
info.Description = wordwrap(gui.aboutData.description + "\n\nDevelopers:\n\t" +
|
||||
"\n\t".join(gui.aboutData.developers) +
|
||||
"\n\nAdditional credits:\n\t" +
|
||||
"\n\t".join(gui.aboutData.credits) +
|
||||
"\n\nLicenses:\n\t" +
|
||||
"\n\t".join(gui.aboutData.licenses) +
|
||||
"\n\nEVE Data: \t" + gamedata_version +
|
||||
"\nPython: \t\t" + '{}.{}.{}'.format(v.major, v.minor, v.micro) +
|
||||
"\nwxPython: \t" + wx.__version__ +
|
||||
"\nSQLAlchemy: \t" + sqlalchemy.__version__ +
|
||||
"\nmatplotlib: \t {}".format(matplotlib_version if matplotlib_version else "Not Installed"),
|
||||
500, wx.ClientDC(self))
|
||||
|
||||
forumUrl = "https://forums.eveonline.com/t/27156"
|
||||
|
||||
info.WebSite = (forumUrl, "pyfa thread at EVE Online forum")
|
||||
wx.AboutBox(info)
|
||||
def showDevTools(self, event):
|
||||
DevTools(self)
|
||||
|
||||
def showCharacterEditor(self, event):
|
||||
dlg = CharacterEditor(self)
|
||||
@@ -402,7 +411,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
dlg.ShowModal()
|
||||
try:
|
||||
dlg.Destroy()
|
||||
except PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Tried to destroy an object that doesn't exist in <showDamagePatternEditor>.")
|
||||
|
||||
def showImplantSetEditor(self, event):
|
||||
@@ -412,7 +421,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
""" Export active fit """
|
||||
sFit = Fit.getInstance()
|
||||
fit = sFit.getFit(self.getActiveFit())
|
||||
defaultFile = u"%s - %s.xml" % (fit.ship.item.name, fit.name) if fit else None
|
||||
defaultFile = "%s - %s.xml" % (fit.ship.item.name, fit.name) if fit else None
|
||||
|
||||
dlg = wx.FileDialog(self, "Save Fitting As...",
|
||||
wildcard="EVE XML fitting files (*.xml)|*.xml",
|
||||
@@ -426,10 +435,10 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
if '.' not in os.path.basename(path):
|
||||
path += ".xml"
|
||||
else:
|
||||
print("oops, invalid fit format %d" % format_)
|
||||
print(("oops, invalid fit format %d" % format_))
|
||||
try:
|
||||
dlg.Destroy()
|
||||
except PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Tried to destroy an object that doesn't exist in <showExportDialog>.")
|
||||
return
|
||||
|
||||
@@ -439,7 +448,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
|
||||
try:
|
||||
dlg.Destroy()
|
||||
except PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Tried to destroy an object that doesn't exist in <showExportDialog>.")
|
||||
|
||||
def showPreferenceDialog(self, event):
|
||||
@@ -472,6 +481,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
# Widgets Inspector
|
||||
if config.debug:
|
||||
self.Bind(wx.EVT_MENU, self.openWXInspectTool, id=self.widgetInspectMenuID)
|
||||
self.Bind(wx.EVT_MENU, self.showDevTools, id=menuBar.devToolsId)
|
||||
# About
|
||||
self.Bind(wx.EVT_MENU, self.ShowAboutBox, id=wx.ID_ABOUT)
|
||||
# Char editor
|
||||
@@ -606,68 +616,26 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
wx.PostEvent(self, GE.FitChanged(fitID=fitID))
|
||||
|
||||
def eveFittings(self, event):
|
||||
dlg = CrestFittings(self)
|
||||
dlg = EveFittings(self)
|
||||
dlg.Show()
|
||||
|
||||
def updateTitle(self, event):
|
||||
sCrest = Crest.getInstance()
|
||||
char = sCrest.implicitCharacter
|
||||
if char:
|
||||
t = time.gmtime(char.eve.expires - time.time())
|
||||
sTime = time.strftime("%H:%M:%S", t if t >= 0 else 0)
|
||||
newTitle = "%s | %s - %s" % (self.title, char.name, sTime)
|
||||
self.SetTitle(newTitle)
|
||||
|
||||
def onSSOLogin(self, event):
|
||||
menu = self.GetMenuBar()
|
||||
menu.Enable(menu.eveFittingsId, True)
|
||||
menu.Enable(menu.exportToEveId, True)
|
||||
|
||||
if event.type == CrestModes.IMPLICIT:
|
||||
menu.SetLabel(menu.ssoLoginId, "Logout Character")
|
||||
self.titleTimer.Start(1000)
|
||||
|
||||
def onSSOLogout(self, event):
|
||||
self.titleTimer.Stop()
|
||||
self.SetTitle(self.title)
|
||||
|
||||
def updateEsiMenus(self, type):
|
||||
menu = self.GetMenuBar()
|
||||
if event.type == CrestModes.IMPLICIT or event.numChars == 0:
|
||||
menu.Enable(menu.eveFittingsId, False)
|
||||
menu.Enable(menu.exportToEveId, False)
|
||||
sEsi = Esi.getInstance()
|
||||
|
||||
if event.type == CrestModes.IMPLICIT:
|
||||
menu.SetLabel(menu.ssoLoginId, "Login to EVE")
|
||||
|
||||
def updateCrestMenus(self, type):
|
||||
# in case we are logged in when switching, change title back
|
||||
self.titleTimer.Stop()
|
||||
self.SetTitle(self.title)
|
||||
|
||||
menu = self.GetMenuBar()
|
||||
sCrest = Crest.getInstance()
|
||||
|
||||
if type == CrestModes.IMPLICIT:
|
||||
menu.SetLabel(menu.ssoLoginId, "Login to EVE")
|
||||
menu.Enable(menu.eveFittingsId, False)
|
||||
menu.Enable(menu.exportToEveId, False)
|
||||
else:
|
||||
menu.SetLabel(menu.ssoLoginId, "Manage Characters")
|
||||
enable = len(sCrest.getCrestCharacters()) == 0
|
||||
menu.Enable(menu.eveFittingsId, not enable)
|
||||
menu.Enable(menu.exportToEveId, not enable)
|
||||
menu.SetLabel(menu.ssoLoginId, "Manage Characters")
|
||||
enable = len(sEsi.getSsoCharacters()) == 0
|
||||
menu.Enable(menu.eveFittingsId, not enable)
|
||||
menu.Enable(menu.exportToEveId, not enable)
|
||||
|
||||
def ssoHandler(self, event):
|
||||
sCrest = Crest.getInstance()
|
||||
if sCrest.settings.get('mode') == CrestModes.IMPLICIT:
|
||||
if sCrest.implicitCharacter is not None:
|
||||
sCrest.logout()
|
||||
else:
|
||||
uri = sCrest.startServer()
|
||||
webbrowser.open(uri)
|
||||
else:
|
||||
dlg = CrestMgmt(self)
|
||||
dlg.Show()
|
||||
dlg = SsoCharacterMgmt(self)
|
||||
dlg.Show()
|
||||
|
||||
def exportToEve(self, event):
|
||||
dlg = ExportToEve(self)
|
||||
@@ -742,9 +710,9 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
fit = db_getFit(self.getActiveFit())
|
||||
toClipboard(Port.exportDna(fit))
|
||||
|
||||
def clipboardCrest(self):
|
||||
def clipboardEsi(self):
|
||||
fit = db_getFit(self.getActiveFit())
|
||||
toClipboard(Port.exportCrest(fit))
|
||||
toClipboard(Port.exportESI(fit))
|
||||
|
||||
def clipboardXml(self):
|
||||
fit = db_getFit(self.getActiveFit())
|
||||
@@ -768,7 +736,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
CopySelectDialog.copyFormatEftImps: self.clipboardEftImps,
|
||||
CopySelectDialog.copyFormatXml: self.clipboardXml,
|
||||
CopySelectDialog.copyFormatDna: self.clipboardDna,
|
||||
CopySelectDialog.copyFormatCrest: self.clipboardCrest,
|
||||
CopySelectDialog.copyFormatEsi: self.clipboardEsi,
|
||||
CopySelectDialog.copyFormatMultiBuy: self.clipboardMultiBuy}
|
||||
dlg = CopySelectDialog(self)
|
||||
dlg.ShowModal()
|
||||
@@ -778,7 +746,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
|
||||
try:
|
||||
dlg.Destroy()
|
||||
except PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Tried to destroy an object that doesn't exist in <exportToClipboard>.")
|
||||
|
||||
def exportSkillsNeeded(self, event):
|
||||
@@ -834,7 +802,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
self.progressDialog.ShowModal()
|
||||
try:
|
||||
dlg.Destroy()
|
||||
except PyDeadObjectError:
|
||||
except RuntimeError:
|
||||
pyfalog.error("Tried to destroy an object that doesn't exist in <fileImportDialog>.")
|
||||
|
||||
def backupToXml(self, event):
|
||||
@@ -1025,7 +993,7 @@ class MainFrame(wx.Frame, IPortUser):
|
||||
|
||||
# Find a widget to be selected in the tree. Use either the
|
||||
# one under the cursor, if any, or this frame.
|
||||
wnd = wx.FindWindowAtPointer()
|
||||
wnd, _ = wx.FindWindowAtPointer()
|
||||
if not wnd:
|
||||
wnd = self
|
||||
InspectionTool().Show(wnd, True)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user