| 9 | |
| 10 | |
| 11 | class NotesView(wx.Panel): |
| 12 | |
| 13 | def __init__(self, parent): |
| 14 | wx.Panel.__init__(self, parent) |
| 15 | self.lastFitId = None |
| 16 | self.mainFrame = gui.mainFrame.MainFrame.getInstance() |
| 17 | mainSizer = wx.BoxSizer(wx.VERTICAL) |
| 18 | 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) |
| 22 | self.Bind(wx.EVT_TEXT, self.onText) |
| 23 | self.editNotes.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown) |
| 24 | self.changeTimer = wx.Timer(self) |
| 25 | self.Bind(wx.EVT_TIMER, self.delayedSave, self.changeTimer) |
| 26 | |
| 27 | def OnKeyDown(self, event): |
| 28 | if event.RawControlDown() and event.GetKeyCode() == wx.WXK_BACK: |
| 29 | try: |
| 30 | HandleCtrlBackspace(self.editNotes) |
| 31 | except (KeyboardInterrupt, SystemExit): |
| 32 | raise |
| 33 | except: |
| 34 | pass |
| 35 | else: |
| 36 | event.Skip() |
| 37 | |
| 38 | def fitChanged(self, event): |
| 39 | event.Skip() |
| 40 | activeFitID = self.mainFrame.getActiveFit() |
| 41 | if activeFitID is not None and activeFitID not in event.fitIDs: |
| 42 | return |
| 43 | |
| 44 | sFit = Fit.getInstance() |
| 45 | fit = sFit.getFit(activeFitID) |
| 46 | |
| 47 | self.changeTimer.Stop() # cancel any pending timers |
| 48 | |
| 49 | self.Parent.Parent.DisablePage(self, not fit or fit.isStructure) |
| 50 | |
| 51 | # when switching fits, ensure that we save the notes for the previous fit |
| 52 | if self.lastFitId is not None: |
| 53 | sFit.editNotes(self.lastFitId, self.editNotes.GetValue()) |
| 54 | |
| 55 | if activeFitID is None and self.lastFitId is not None: |
| 56 | self.lastFitId = None |
| 57 | return |
| 58 | elif activeFitID != self.lastFitId: |
| 59 | self.lastFitId = activeFitID |
| 60 | self.editNotes.ChangeValue(fit.notes or "") |
| 61 | wx.PostEvent(self.mainFrame, GE.FitNotesChanged()) |
| 62 | |
| 63 | def onText(self, event): |
| 64 | # delay the save so we're not writing to sqlite on every keystroke |
| 65 | self.changeTimer.Stop() # cancel the existing timer |
| 66 | self.changeTimer.Start(1000, True) |
| 67 | |
| 68 | def delayedSave(self, event): |