From 78cbed516a1d67b7ccbe94b25e04099b81488fd7 Mon Sep 17 00:00:00 2001 From: Resin Neublem Date: Sat, 19 Nov 2016 21:09:59 -0500 Subject: [PATCH] Adds a new notes pane for each fit This allows users to save text notes for each fit. They may do this for history, or usage, etc. --- eos/db/migrations/upgrade16.py | 14 +++++++++++ eos/db/saveddata/fit.py | 1 + eos/saveddata/fit.py | 1 + gui/additionsPane.py | 7 +++++- gui/notesView.py | 45 ++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 eos/db/migrations/upgrade16.py create mode 100644 gui/notesView.py diff --git a/eos/db/migrations/upgrade16.py b/eos/db/migrations/upgrade16.py new file mode 100644 index 000000000..7dfaac97c --- /dev/null +++ b/eos/db/migrations/upgrade16.py @@ -0,0 +1,14 @@ +""" +Migration 16 + +- Alters fits table to introduce notes attribute +""" + +import sqlalchemy + +def upgrade(saveddata_engine): + # Update fits schema to include notes attribute + try: + saveddata_engine.execute("SELECT notes FROM fits LIMIT 1") + except sqlalchemy.exc.DatabaseError: + saveddata_engine.execute("ALTER TABLE fits ADD COLUMN notes VARCHAR;") diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 40b92af04..ba8f81a79 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -45,6 +45,7 @@ fits_table = Table("fits", saveddata_meta, Column("targetResistsID", ForeignKey("targetResists.ID"), nullable=True), Column("modeID", Integer, nullable=True), Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT), + Column("notes", String, nullable = True), ) projectedFits_table = Table("projectedFits", saveddata_meta, diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 69b17a269..104b0d06b 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -1085,6 +1085,7 @@ class Fit(object): copy.name = "%s copy" % self.name copy.damagePattern = self.damagePattern copy.targetResists = self.targetResists + copy.notes = self.notes toCopy = ( "modules", diff --git a/gui/additionsPane.py b/gui/additionsPane.py index 8c855dc95..de7b58b71 100644 --- a/gui/additionsPane.py +++ b/gui/additionsPane.py @@ -25,6 +25,7 @@ from gui.fighterView import FighterView from gui.cargoView import CargoView from gui.implantView import ImplantView from gui.projectedView import ProjectedView +from gui.notesView import NotesView from gui.pyfatogglepanel import TogglePanel from gui.gangView import GangView from gui.bitmapLoader import BitmapLoader @@ -57,6 +58,7 @@ class AdditionsPane(TogglePanel): projectedImg = BitmapLoader.getImage("projected_small", "gui") gangImg = BitmapLoader.getImage("fleet_fc_small", "gui") cargoImg = BitmapLoader.getImage("cargo_small", "gui") + notesImg = BitmapLoader.getImage("skill_small", "gui") self.drone = DroneView(self.notebook) self.notebook.AddPage(self.drone, "Drones", tabImage = droneImg, showClose = False) @@ -79,9 +81,12 @@ class AdditionsPane(TogglePanel): self.gangPage = GangView(self.notebook) self.notebook.AddPage(self.gangPage, "Fleet", tabImage = gangImg, showClose = False) + self.notes = NotesView(self.notebook) + self.notebook.AddPage(self.notes, "Notes", tabImage = notesImg, showClose = False) + self.notebook.SetSelection(0) - PANES = ["Drones", "Fighters", "Cargo", "Implants", "Boosters", "Projected", "Fleet"] + PANES = ["Drones", "Fighters", "Cargo", "Implants", "Boosters", "Projected", "Fleet", "Notes"] def select(self, name): self.notebook.SetSelection(self.PANES.index(name)) diff --git a/gui/notesView.py b/gui/notesView.py new file mode 100644 index 000000000..74a1992f7 --- /dev/null +++ b/gui/notesView.py @@ -0,0 +1,45 @@ +import wx + +import service +import gui.globalEvents as GE +import gui.mainFrame + +class NotesView(wx.Panel): + def __init__(self, parent): + wx.Panel.__init__(self, parent) + self.lastFitId = None + self.mainFrame = gui.mainFrame.MainFrame.getInstance() + mainSizer = wx.BoxSizer(wx.VERTICAL) + self.editNotes = wx.TextCtrl(self, style=wx.TE_MULTILINE) + mainSizer.Add(self.editNotes, 1, wx.EXPAND) + self.SetSizer(mainSizer) + self.mainFrame.Bind(GE.FIT_CHANGED, self.fitChanged) + self.Bind(wx.EVT_TEXT, self.onText) + self.saveTimer = wx.Timer(self) + self.Bind(wx.EVT_TIMER, self.delayedSave, self.saveTimer) + + def fitChanged(self, event): + sFit = service.Fit.getInstance() + fit = sFit.getFit(event.fitID) + + self.Parent.Parent.DisablePage(self, not fit or fit.isStructure) + + if event.fitID is None and self.lastFitId is not None: + self.lastFitId = None + event.Skip() + return + elif event.fitID != self.lastFitId: + self.lastFitId = event.fitID + self.editNotes.SetValue(fit.notes or "") + + def onText(self, event): + # delay the save so we're not writing to sqlite on every keystroke + self.saveTimer.Stop() # cancel the existing timer + self.saveTimer.Start(1000, True) + + def delayedSave(self, event): + sFit = service.Fit.getInstance() + fit = sFit.getFit(self.lastFitId) + newNotes = self.editNotes.GetValue() + fit.notes = newNotes + wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=fit.ID))