66from gui .utils .helpers_wxPython import HandleCtrlBackspace
77from gui .utils .numberFormatter import formatAmount
88from 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
1135class 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
0 commit comments