From e68b634f250c410eefb3651fdc0f4e45dbdb8987 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 31 Jul 2018 09:41:48 +0200 Subject: [PATCH] [new] event modification status saved with "dirty" attribute, only save event-XML when modified --- PyLoT.py | 32 +++++++++++++++++++++++++------- pylot/core/util/event.py | 10 ++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/PyLoT.py b/PyLoT.py index 88448276..e188f9b7 100755 --- a/PyLoT.py +++ b/PyLoT.py @@ -1028,7 +1028,7 @@ class MainWindow(QMainWindow): ''' if not eventbox: eventbox = self.eventBox - path = eventbox.currentText() + path = eventbox.currentText().split('*')[0] return self.project.getEventFromPath(path) def get_current_event_path(self, eventbox=None): @@ -1291,7 +1291,10 @@ class MainWindow(QMainWindow): # p=event_npicks, # a=event_nautopicks) - item_path = QtGui.QStandardItem('{path:{plen}}'.format(path=event_path, plen=plmax)) + event_str = '{path:{plen}}'.format(path=event_path, plen=plmax) + if event.dirty: + event_str += '*' + item_path = QtGui.QStandardItem(event_str) item_time = QtGui.QStandardItem('{}'.format(time)) item_lat = QtGui.QStandardItem('{}'.format(lat)) item_lon = QtGui.QStandardItem('{}'.format(lon)) @@ -1334,7 +1337,7 @@ class MainWindow(QMainWindow): self.setItemColor(itemlist, id, event, current_event) model.appendRow(itemlist) - if not event.path == self.eventBox.itemText(id).strip(): + if not event.path == self.eventBox.itemText(id).split('*')[0].strip(): message = ('Path missmatch creating eventbox.\n' '{} unequal {}.' .format(event.path, self.eventBox.itemText(id))) @@ -1433,6 +1436,8 @@ class MainWindow(QMainWindow): self.update_status(msg) print(msg) + event.dirty = False + self.fill_eventbox() return True def exportEvents(self, outformats=['.xml'], events='all'): @@ -1440,11 +1445,15 @@ class MainWindow(QMainWindow): events = self.project.eventlist assert type(events) == list, 'Wrong input type: {}'.format(type(events)) for event in events: + if not event.dirty: + continue self.get_data().setEvtData(event) try: self.saveData(event, event.path, outformats) + event.dirty = False except Exception as e: print('WARNING! Could not save event {}. Reason: {}'.format(event.path, e)) + self.fill_eventbox() def enableSaveEventAction(self): self.saveEventAction.setEnabled(True) @@ -3031,7 +3040,11 @@ class MainWindow(QMainWindow): item_test = QtGui.QTableWidgetItem() item_notes = QtGui.QTableWidgetItem() - item_path.setText(event.path) + event_str = event.path + if event.dirty: + event_str += '*' + + item_path.setText(event_str) if hasattr(event, 'origins'): if event.origins: origin = event.origins[0] @@ -3245,6 +3258,10 @@ class MainWindow(QMainWindow): if self.project.parameter: self._inputs = self.project.parameter self.updateFilteroptions() + # added for backwards compatibility with older events not having a 'dirty' attribute + for event in self.project.eventlist: + if not hasattr(event, 'dirty'): + event.dirty = False self.tabs.setCurrentIndex(0) # implemented to prevent double-loading of waveform data self.init_events(new=True) self.setDirty(False) @@ -3264,10 +3281,10 @@ class MainWindow(QMainWindow): if not filename.split('.')[-1] == 'plp': filename = fnm[0] + '.plp' self.project.parameter = self._inputs + self.exportEvents() self.project.save(filename) self.setDirty(False) self.saveProjectAsAction.setEnabled(True) - self.exportEvents() self.update_status('Saved new project to {}'.format(filename), duration=5000) return True @@ -3282,11 +3299,11 @@ class MainWindow(QMainWindow): return False else: self.project.parameter = self._inputs - self.project.save() self.exportEvents() + self.project.save() if not self.project.dirty: - self.update_status('Saved back project to file:\n{}'.format(self.project.location), duration=5000) self.setDirty(False) + self.update_status('Saved back project to file:\n{}'.format(self.project.location), duration=5000) return True else: # if still dirty because saving failed @@ -3312,6 +3329,7 @@ class MainWindow(QMainWindow): self.saveProjectAsAction.setEnabled(True) self.project.setDirty(value) self.dirty = value + self.fill_eventbox() def closeEvent(self, event): if self.okToContinue(): diff --git a/pylot/core/util/event.py b/pylot/core/util/event.py index 8146d1f8..d721a7fe 100644 --- a/pylot/core/util/event.py +++ b/pylot/core/util/event.py @@ -35,6 +35,7 @@ class Event(ObsPyEvent): self._refEvent = False self.get_notes() self.get_obspy_event_info() + self.dirty = False def get_notes_path(self): """ @@ -143,6 +144,7 @@ class Event(ObsPyEvent): for index, pick in reversed(list(enumerate(self.picks))): if picktype in str(pick.method_id): self.picks.pop(index) + self.dirty = True def addPicks(self, picks): """ @@ -157,6 +159,7 @@ class Event(ObsPyEvent): # add ObsPy picks (clear old manual and copy all new manual from pylot) self.clearObsPyPicks('manual') self.picks += picks_from_picksdict(self.pylot_picks) + self.dirty = True def addAutopicks(self, autopicks): """ @@ -170,6 +173,7 @@ class Event(ObsPyEvent): # add ObsPy picks (clear old auto and copy all new auto from pylot) self.clearObsPyPicks('auto') self.picks += picks_from_picksdict(self.pylot_autopicks) + self.dirty = True def setPick(self, station, pick): """ @@ -191,6 +195,7 @@ class Event(ObsPyEvent): print('Could not remove pick {} from station {}: {}'.format(pick, station, e)) self.clearObsPyPicks('manual') self.picks += picks_from_picksdict(self.pylot_picks) + self.dirty = True def setPicks(self, picks): """ @@ -203,6 +208,7 @@ class Event(ObsPyEvent): self.pylot_picks = picks self.clearObsPyPicks('manual') self.picks += picks_from_picksdict(self.pylot_picks) + self.dirty = True def getPick(self, station): """ @@ -243,6 +249,7 @@ class Event(ObsPyEvent): print('Could not remove pick {} from station {}: {}'.format(pick, station, e)) self.clearObsPyPicks('auto') self.picks += picks_from_picksdict(self.pylot_autopicks) + self.dirty = True def setAutopicks(self, picks): """ @@ -255,6 +262,7 @@ class Event(ObsPyEvent): self.pylot_autopicks = picks self.clearObsPyPicks('auto') self.picks += picks_from_picksdict(self.pylot_autopicks) + self.dirty = True def getAutopick(self, station): """ @@ -293,6 +301,7 @@ class Event(ObsPyEvent): try: outfile = open(filename, 'wb') cPickle.dump(self, outfile, -1) + self.dirty = False except Exception as e: print('Could not pickle PyLoT event. Reason: {}'.format(e)) @@ -311,5 +320,6 @@ class Event(ObsPyEvent): import _pickle as cPickle infile = open(filename, 'rb') event = cPickle.load(infile) + event.dirty = False print('Loaded %s' % filename) return event