Skip to content

Commit 663720a

Browse files
committed
fix localized import problem
Fitting description limit extended to 500 characters localized fitting file sample
1 parent b5d3dc6 commit 663720a

File tree

31 files changed

+597
-2185
lines changed

31 files changed

+597
-2185
lines changed

config.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@
6666

6767
CATALOG = 'lang'
6868

69+
EVE_FIT_NOTE_MAX = 500
70+
'''
71+
eve fit (xml) "description" limit
72+
73+
Description can contain html tags like <font size="14" color="#ff000000">
74+
75+
If it contains html tags, they will be converted to html entities
76+
'''
6977

7078
slotColourMapDark = {
7179
FittingSlot.LOW: wx.Colour(44, 36, 19), # yellow = low slots 24/13

dist_assets/win/dist.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
os.environ["PYFA_DIST_DIR"] = os.path.join(os.getcwd(), 'dist')
1515

1616
os.environ["PYFA_VERSION"] = version
17-
iscc = r"C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
17+
iscc = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe"
1818

1919
source = os.path.join(os.environ["PYFA_DIST_DIR"], "pyfa")
2020

eos/db/saveddata/queries.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ def getCharactersForUser(lookfor, eager=None):
205205

206206
@cachedQuery(Fit, 1, "lookfor")
207207
def getFit(lookfor, eager=None):
208+
# type: (int, bool) -> Fit
208209
if isinstance(lookfor, int):
209210
if eager is None:
210211
with sd_lock:
@@ -319,6 +320,7 @@ def countFitsWithShip(lookfor, ownerID=None, where=None, eager=None):
319320

320321

321322
def getFitList(eager=None):
323+
# type: (list[str]) -> list[Fit]
322324
eager = processEager(eager)
323325
with sd_lock:
324326
fits = removeInvalid(saveddata_session.query(Fit).options(*eager).all())

eos/db/util.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636

3737
def processEager(eager):
38+
# type: (list[str]) -> str
3839
if eager is None:
3940
return tuple()
4041
else:
@@ -49,6 +50,7 @@ def processEager(eager):
4950

5051

5152
def _replacements(eagerString):
53+
# type: (str) -> str
5254
splitEager = eagerString.split(".")
5355
for i in range(len(splitEager)):
5456
part = splitEager[i]

gui/builtinAdditionPanes/notesView.py

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,65 @@
66
from gui.utils.helpers_wxPython import HandleCtrlBackspace
77
from gui.utils.numberFormatter import formatAmount
88
from service.fit import Fit
9+
from config import EVE_FIT_NOTE_MAX
10+
11+
12+
LATER = 1000
13+
'''timer interval, delay the save'''
14+
15+
# 3
16+
EXPAND_LF_LEN = len("<br>") - 1
17+
'''
18+
If you save `Fit.notes` to "description" in eve fit(xml export),
19+
newline characters must be converted to "<br>"
20+
'''
21+
22+
def computeEVEFitDescSize(note):
23+
# type: (str) -> int
24+
return len(note) + (note.count("\n") * EXPAND_LF_LEN)
25+
26+
def ifExceedsTheUpperLimit(nv, note=None):
27+
# type: (wx.TextCtrl, str) -> None
28+
'''When the note size exceeds the upper limit, the text will turn red.'''
29+
if note is None: note = nv.GetValue()
30+
color = '#FF0000' if computeEVEFitDescSize(note) > EVE_FIT_NOTE_MAX else '#000000'
31+
nv.SetForegroundColour(color)
32+
nv.Refresh(False)
933

1034

1135
class NotesView(wx.Panel):
1236

1337
def __init__(self, parent):
1438
wx.Panel.__init__(self, parent)
1539
self.lastFitId = None
40+
self.changeTimer = wx.Timer(self)
1641
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
17-
mainSizer = wx.BoxSizer(wx.VERTICAL)
1842
self.editNotes = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.BORDER_NONE)
19-
mainSizer.Add(self.editNotes, 1, wx.EXPAND | wx.ALL, 10)
20-
self.SetSizer(mainSizer)
21-
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
2243
self.Bind(wx.EVT_TEXT, self.onText)
23-
self.editNotes.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
24-
self.changeTimer = wx.Timer(self)
2544
self.Bind(wx.EVT_TIMER, self.delayedSave, self.changeTimer)
45+
self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged)
46+
self.editNotes.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
47+
mainSizer = wx.BoxSizer(wx.VERTICAL)
48+
mainSizer.Add(self.editNotes, 1, wx.EXPAND | wx.ALL, 10)
49+
self.SetSizer(mainSizer)
2650

2751
def OnKeyDown(self, event):
52+
# type: (wx.KeyEvent) -> None
53+
nv = self.editNotes
2854
if event.RawControlDown() and event.GetKeyCode() == wx.WXK_BACK:
2955
try:
30-
HandleCtrlBackspace(self.editNotes)
56+
HandleCtrlBackspace(nv)
3157
except (KeyboardInterrupt, SystemExit):
3258
raise
3359
except:
3460
pass
3561
else:
3662
event.Skip()
3763

64+
ifExceedsTheUpperLimit(nv)
65+
3866
def fitChanged(self, event):
67+
# type: (wx.Event) -> None
3968
event.Skip()
4069
activeFitID = self.mainFrame.getActiveFit()
4170
if activeFitID is not None and activeFitID not in event.fitIDs:
@@ -57,21 +86,29 @@ def fitChanged(self, event):
5786
return
5887
elif activeFitID != self.lastFitId:
5988
self.lastFitId = activeFitID
60-
self.editNotes.ChangeValue(fit.notes or "")
89+
note = fit.notes or ""
90+
nv = self.editNotes
91+
nv.ChangeValue(note)
92+
ifExceedsTheUpperLimit(nv, note)
6193
wx.PostEvent(self.mainFrame, GE.FitNotesChanged())
6294

6395
def onText(self, event):
96+
# type: (wx.Event) -> None
6497
# delay the save so we're not writing to sqlite on every keystroke
6598
self.changeTimer.Stop() # cancel the existing timer
66-
self.changeTimer.Start(1000, True)
99+
self.changeTimer.Start(LATER, True)
100+
# When the note size exceeds the upper limit, the text will turn red.
101+
ifExceedsTheUpperLimit(self.editNotes)
67102

68103
def delayedSave(self, event):
104+
# type: (wx.Event) -> None
69105
event.Skip()
70106
sFit = Fit.getInstance()
71107
sFit.editNotes(self.lastFitId, self.editNotes.GetValue())
72108
wx.PostEvent(self.mainFrame, GE.FitNotesChanged())
73109

74110
def getTabExtraText(self):
111+
# type: () -> str|None
75112
fitID = self.mainFrame.getActiveFit()
76113
if fitID is None:
77114
return None
@@ -82,7 +119,7 @@ def getTabExtraText(self):
82119
opt = sFit.serviceFittingOptions["additionsLabels"]
83120
# Amount of active implants
84121
if opt in (1, 2):
85-
amount = len(self.editNotes.GetValue())
122+
amount = computeEVEFitDescSize(self.editNotes.GetValue())
86123
return ' ({})'.format(formatAmount(amount, 2, 0, 3)) if amount else None
87124
else:
88125
return None

gui/builtinItemStatsViews/itemDescription.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ def __init__(self, parent, stuff, item):
2222

2323
desc = item.description.replace("\n", "<br>")
2424
# Strip font tags
25-
desc = re.sub("<( *)font( *)color( *)=(.*?)>(?P<inside>.*?)<( *)/( *)font( *)>", r"\g<inside>", desc)
25+
desc = re.sub(r"<( *)font( *)color( *)=(.*?)>(?P<inside>.*?)<( *)/( *)font( *)>", r"\g<inside>", desc)
2626
# Strip URLs
27-
desc = re.sub("<( *)a(.*?)>(?P<inside>.*?)<( *)/( *)a( *)>", r"\g<inside>", desc)
27+
desc = re.sub(r"<( *)a(.*?)>(?P<inside>.*?)<( *)/( *)a( *)>", r"\g<inside>", desc)
2828
desc = "<body bgcolor='{}' text='{}'>{}</body>".format(
2929
bgcolor.GetAsString(wx.C2S_HTML_SYNTAX),
3030
fgcolor.GetAsString(wx.C2S_HTML_SYNTAX),

gui/globalEvents.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
# noinspection PyPackageRequirements
2-
import wx.lib.newevent
2+
from wx.lib.newevent import NewEvent
33

4-
FitRenamed, FIT_RENAMED = wx.lib.newevent.NewEvent()
5-
FitChanged, FIT_CHANGED = wx.lib.newevent.NewEvent()
6-
FitRemoved, FIT_REMOVED = wx.lib.newevent.NewEvent()
7-
FitNotesChanged, FIT_NOTES_CHANGED = wx.lib.newevent.NewEvent()
8-
CharListUpdated, CHAR_LIST_UPDATED = wx.lib.newevent.NewEvent()
9-
CharChanged, CHAR_CHANGED = wx.lib.newevent.NewEvent()
10-
GraphOptionChanged, GRAPH_OPTION_CHANGED = wx.lib.newevent.NewEvent()
11-
TargetProfileRenamed, TARGET_PROFILE_RENAMED = wx.lib.newevent.NewEvent()
12-
TargetProfileChanged, TARGET_PROFILE_CHANGED = wx.lib.newevent.NewEvent()
13-
TargetProfileRemoved, TARGET_PROFILE_REMOVED = wx.lib.newevent.NewEvent()
4+
FitRenamed, FIT_RENAMED = NewEvent()
5+
FitChanged, FIT_CHANGED = NewEvent()
6+
FitRemoved, FIT_REMOVED = NewEvent()
7+
FitNotesChanged, FIT_NOTES_CHANGED = NewEvent()
8+
CharListUpdated, CHAR_LIST_UPDATED = NewEvent()
9+
CharChanged, CHAR_CHANGED = NewEvent()
10+
GraphOptionChanged, GRAPH_OPTION_CHANGED = NewEvent()
11+
TargetProfileRenamed, TARGET_PROFILE_RENAMED = NewEvent()
12+
TargetProfileChanged, TARGET_PROFILE_CHANGED = NewEvent()
13+
TargetProfileRemoved, TARGET_PROFILE_REMOVED = NewEvent()
1414
# For events when item is actually replaced under the hood,
1515
# but from user's perspective it's supposed to change/mutate
16-
ItemChangedInplace, ITEM_CHANGED_INPLACE = wx.lib.newevent.NewEvent()
16+
ItemChangedInplace, ITEM_CHANGED_INPLACE = NewEvent()
1717

18-
EffectiveHpToggled, EFFECTIVE_HP_TOGGLED = wx.lib.newevent.NewEvent()
18+
EffectiveHpToggled, EFFECTIVE_HP_TOGGLED = NewEvent()
1919

20-
SsoLoggingIn, EVT_SSO_LOGGING_IN = wx.lib.newevent.NewEvent()
21-
SsoLogin, EVT_SSO_LOGIN = wx.lib.newevent.NewEvent()
22-
SsoLogout, EVT_SSO_LOGOUT = wx.lib.newevent.NewEvent()
20+
SsoLoggingIn, EVT_SSO_LOGGING_IN = NewEvent()
21+
SsoLogin, EVT_SSO_LOGIN = NewEvent()
22+
SsoLogout, EVT_SSO_LOGOUT = NewEvent()

gui/mainFrame.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ def UnregisterStatsWindow(self, wnd):
363363
self.statsWnds.remove(wnd)
364364

365365
def getActiveFit(self):
366+
# type: () -> int
366367
p = self.fitMultiSwitch.GetSelectedPage()
367368
m = getattr(p, "getActiveFit", None)
368369
return m() if m is not None else None
@@ -845,7 +846,7 @@ def fileImportDialog(self, event):
845846
style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE
846847
) as dlg:
847848
if dlg.ShowModal() == wx.ID_OK:
848-
# set some arbitrary spacing to create width in window
849+
# set some arbitrary spacing to create width in window
849850
progress = ProgressHelper(message=" " * 100, callback=self._openAfterImport)
850851
call = (Port.importFitsThreaded, [dlg.GetPaths(), progress], {})
851852
self.handleProgress(

pyfa.spec

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# -*- mode: python -*-
22

3+
# If you get a cp65001 error during build, set the environment variable PYTHONIOENCODING="utf8"
4+
35
import os
46
from itertools import chain
57
import subprocess

service/fit.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ def switchFit(self, fitID):
321321
self.fill(fit)
322322

323323
def getFit(self, fitID, projected=False, basic=False):
324+
# type: (int, bool, bool) -> Fit
324325
"""
325326
Gets fit from database
326327

0 commit comments

Comments
 (0)