Skip to content

Commit

Permalink
Added support to show errors for resist imports, as well as many impr…
Browse files Browse the repository at this point in the history
…ovements to GUI logic.
  • Loading branch information
blitzmann committed Sep 3, 2014
1 parent a95eaba commit f0473f1
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 60 deletions.
21 changes: 13 additions & 8 deletions eos/saveddata/targetResists.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,22 @@ def __init__(self, emAmount = 0, thermalAmount = 0, kineticAmount = 0, explosive
def importPatterns(cls, text):
lines = re.split('[\n\r]+', text)
patterns = []

numPatterns = 0
for line in lines:
if line.strip()[0] == "#": # comments
try:
if line.strip()[0] == "#": # comments
continue
line = line.split('#',1)[0] # allows for comments
type, data = line.rsplit('=',1)
type, data = type.strip(), data.split(',')
except:
# Data isn't in correct format, continue to next line
continue
line = line.split('#',1)[0] # allows for comments
type, data = line.rsplit('=',1)
type, data = type.strip(), data.split(',')

#if type != "TargetResists":
#continue
if type != "TargetResists":
continue

numPatterns += 1
name, data = data[0], data[1:5]
#print name, data
fields = {}
Expand All @@ -63,7 +68,7 @@ def importPatterns(cls, text):
pattern.name = name.strip()
patterns.append(pattern)

return patterns
return patterns, numPatterns

EXPORT_FORMAT = "TargetResists = %s,%.1f,%.1f,%.1f,%.1f\n"
@classmethod
Expand Down
107 changes: 78 additions & 29 deletions gui/resistsEditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import bitmapLoader
import service
from gui.utils.clipboard import toClipboard, fromClipboard
from service.targetResists import ImportError

class ResistsEditorDlg (wx.Dialog):

Expand Down Expand Up @@ -168,10 +169,14 @@ def closeEvent(self, event):
self.Destroy()

def ValuesUpdated(self, event=None):
'''
Event that is fired when resists values change. Iterates through all
resist edit fields. If blank, sets it to 0.0. If it is not a proper
decimal value, sets text color to red and refuses to save changes until
issue is resolved
'''
if self.block:
return
if event is not None:
print event.GetString()

try:
p = self.getActivePattern()
Expand All @@ -181,7 +186,7 @@ def ValuesUpdated(self, event=None):

if editObj.GetValue() == "":
# if we are blank, overwrite with 0
editObj.ChangeValue("0")
editObj.ChangeValue("0.0")
editObj.SetInsertionPointEnd()

value = float(editObj.GetValue())
Expand All @@ -208,8 +213,8 @@ def ValuesUpdated(self, event=None):
except AssertionError:
event.EventObject.SetForegroundColour(wx.RED)
self.stNotice.SetLabel("Incorrect Range (must be 0-100)")
finally:
self.Refresh() # Refresh for color changes to take effect immediately
finally: # Refresh for color changes to take effect immediately
self.Refresh()

def restrict(self):
for type in self.DAMAGE_TYPES:
Expand All @@ -232,11 +237,16 @@ def getActivePattern(self):
return self.choices[self.ccResists.GetSelection()]

def patternChanged(self, event=None):
"Event fired when user selects pattern. Can also be called from script"
p = self.getActivePattern()
if p is None:
# This happens when there are no patterns in the DB. As such, force
# user to create one first or exit dlg.
self.newPattern(None)
return

self.block = True
# Set new values
for field in self.DAMAGE_TYPES:
edit = getattr(self, "%sEdit" % field)
amount = getattr(p, "%sAmount" % field)*100
Expand All @@ -245,32 +255,35 @@ def patternChanged(self, event=None):
self.block = False
self.ValuesUpdated()

def newPattern(self,event):
sTR = service.TargetResists.getInstance()
p = sTR.newPattern()
self.choices.append(p)
id = self.ccResists.Append(p.name)
self.ccResists.SetSelection(id)
def newPattern(self, event):
'''
Simply does new-pattern specifics: replaces label on button, restricts,
and resets values to default. Hands off to the rename function for
further handling.
'''
self.btnSave.SetLabel("Create")

self.restrict()
# reset values
for type in self.DAMAGE_TYPES:
editObj = getattr(self, "%sEdit"%type)
editObj.ChangeValue("0")
editObj.ChangeValue("0.0")
editObj.SetForegroundColour(wx.NullColor)

self.Refresh()
self.renamePattern()

def renamePattern(self,event=None):
if event is not None:
self.btnSave.SetLabel("Rename")
def renamePattern(self, event=None):
"Changes layout to facilitate naming a pattern"

self.ccResists.Hide()
self.namePicker.Show()
self.headerSizer.Replace(self.ccResists, self.namePicker)
self.namePicker.SetFocus()
self.namePicker.SetValue(self.getActivePattern().name)
if event is not None: # Rename mode
self.btnSave.SetLabel("Rename")
self.namePicker.SetValue(self.getActivePattern().name)
else: # Create mode
self.namePicker.SetValue("")

for btn in (self.new, self.rename, self.delete, self.copy):
btn.Hide()
Expand All @@ -283,22 +296,37 @@ def renamePattern(self,event=None):
event.Skip()

def processRename(self, event):
'''
Processes rename event (which can be new or old patterns). If new
pattern, creates it; if old, selects it. if checks are valid, rename
saves pattern to DB.
Also resets to default layout and unrestricts.
'''
newName = self.namePicker.GetLineText(0)
self.stNotice.SetLabel("")

p = self.getActivePattern()
for pattern in self.choices:
if pattern.name == newName and p != pattern:
self.stNotice.SetLabel("Name already used, please pick another")
return

if newName == "":
self.stNotice.SetLabel("Invalid name")
return

sTR = service.TargetResists.getInstance()
if event.EventObject.Label == "Create":
p = sTR.newPattern()
else:
# we are renaming, so get the current selection
p = self.getActivePattern()

# test for patterns of the same name
for pattern in self.choices:
if pattern.name == newName and p != pattern:
self.stNotice.SetLabel("Name already used, please pick another")
return

# rename regardless of new or rename
sTR.renamePattern(p, newName)

self.updateChoices()
self.headerSizer.Replace(self.namePicker, self.ccResists)
self.ccResists.Show()
self.namePicker.Hide()
Expand All @@ -309,9 +337,6 @@ def processRename(self, event):
btn.Show()

sel = self.ccResists.GetSelection()
self.ccResists.Delete(sel)
self.ccResists.Insert(newName, sel)
self.ccResists.SetSelection(sel)
self.ValuesUpdated()
self.unrestrict()

Expand All @@ -337,17 +362,41 @@ def deletePattern(self,event):
def __del__( self ):
pass

def updateChoices(self):
"Gathers list of patterns and updates choice selections"
sTR = service.TargetResists.getInstance()
self.choices = sTR.getTargetResistsList()

# Sort the remaining list and continue on
self.choices.sort(key=lambda p: p.name)
self.ccResists.Clear()

for choice in map(lambda p: p.name, self.choices):
self.ccResists.Append(choice)
self.ccResists.SetSelection(0)
self.patternChanged()

def importPatterns(self, event):
"Event fired when import from clipboard button is clicked"

text = fromClipboard()
if text:
sTR = service.TargetResists.getInstance()
# @todo: fix return value and use that to determine label
sTR.importPatterns(text)
self.stNotice.SetLabel("Patterns imported from clipboard")
try:
sTR.importPatterns(text)
self.stNotice.SetLabel("Patterns successfully imported from clipboard")
except service.targetResists.ImportError, e:
self.stNotice.SetLabel(str(e))
except Exception, e:
self.stNotice.SetLabel("Could not import from clipboard: unknown errors")
finally:
self.updateChoices()
else:
self.stNotice.SetLabel("Could not import from clipboard")

def exportPatterns(self, event):
"Event fired when export to clipboard button is clicked"

sTR = service.TargetResists.getInstance()
toClipboard( sTR.exportPatterns() )
self.stNotice.SetLabel("Patterns exported to clipboard")
42 changes: 19 additions & 23 deletions service/targetResists.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
import eos.types
import copy

class ImportError(Exception):
pass

class TargetResists():
instance = None
@classmethod
Expand All @@ -30,13 +33,6 @@ def getInstance(cls):

return cls.instance

def __init__(self):
uniform = eos.db.getTargetResists("None")
if uniform is None:
uniform = eos.types.TargetResists(0,0,0,0)
uniform.name = "None"
eos.db.save(uniform)

def getTargetResistsList(self):
return eos.db.getTargetResistsList()

Expand All @@ -45,7 +41,7 @@ def getTargetResists(self, name):
return eos.db.getTargetResists(name)

def newPattern(self):
p = eos.types.TargetResists(0, 0, 0, 0)
p = eos.types.TargetResists(0.0, 0.0, 0.0, 0.0)
p.name = ""
return p

Expand All @@ -69,24 +65,24 @@ def importPatterns(self, text):
current = self.getTargetResistsList()
for pattern in current:
lookup[pattern.name] = pattern
try:
imports = eos.types.TargetResists.importPatterns(text)
for pattern in imports:
if pattern.name in lookup:
match = lookup[pattern.name]
match.__dict__.update(pattern.__dict__)
else:
eos.db.save(pattern)
eos.db.commit()
except:
pass

imports, num = eos.types.TargetResists.importPatterns(text)
for pattern in imports:
if pattern.name in lookup:
match = lookup[pattern.name]
match.__dict__.update(pattern.__dict__)
else:
eos.db.save(pattern)
eos.db.commit()

lenImports = len(imports)
if lenImports == 0:
raise ImportError("No patterns found for import")
if lenImports != num:
raise ImportError("%d patterns imported from clipboard; %d had errors"%(num, num-lenImports))

def exportPatterns(self):
patterns = self.getTargetResistsList()
for i in xrange(len(patterns) - 1, -1, -1):
if patterns[i].name in ("None"):
del patterns[i]

patterns.sort(key=lambda p: p.name)
return eos.types.TargetResists.exportPatterns(*patterns)

0 comments on commit f0473f1

Please sign in to comment.