From ea68335124ca789f72c61618dc59c7f93f58abfd Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Fri, 14 Dec 2018 15:17:52 +0700 Subject: [PATCH] Mainwindow: show unsaved files --- src/nailab/ui/mainwindow.py | 14 ++++++++++++-- src/nailab/ui/strategywidget.py | 34 +++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/nailab/ui/mainwindow.py b/src/nailab/ui/mainwindow.py index 0021e1b..6808ca3 100644 --- a/src/nailab/ui/mainwindow.py +++ b/src/nailab/ui/mainwindow.py @@ -30,8 +30,10 @@ class MainWindow(QtWidgets.QMainWindow): self.ui = Ui_MainWindow() self.ui.setupUi(self) - def openTrades(self): - pass + def savedChanged(self): + for i in range(0, self.ui.tabs.count()): + print(i, self.ui.tabs.widget(i).is_saved()) + self.update_tab_name(i) def newStrategy(self): self._makeEditor(content=new_strategy_template) @@ -44,6 +46,13 @@ class MainWindow(QtWidgets.QMainWindow): self._makeEditor(filename, os.path.basename(filename), f.read()) settings.setValue("open_strategy_path", os.path.dirname(filename)) + def update_tab_name(self, index): + tabname = os.path.basename(self.ui.tabs.widget(index).source_file) + if not self.ui.tabs.widget(index).is_saved(): + tabname += " *" + + self.ui.tabs.setTabText(index, tabname) + def saveStrategy(self): settings = QtCore.QSettings() currentWidget = self.ui.tabs.currentWidget() @@ -81,4 +90,5 @@ class MainWindow(QtWidgets.QMainWindow): editor = StrategyWidget(self.datasourcemanager, source_file, self, content) self.sources.append(source_file) self.ui.tabs.addTab(editor, tab_name) + editor.savedChanged.connect(self.savedChanged) diff --git a/src/nailab/ui/strategywidget.py b/src/nailab/ui/strategywidget.py index 098297f..4d4f081 100644 --- a/src/nailab/ui/strategywidget.py +++ b/src/nailab/ui/strategywidget.py @@ -1,5 +1,6 @@ import os.path +import datetime import numpy as np from PyQt5 import QtCore, QtGui, QtWidgets @@ -27,13 +28,18 @@ class FileModifiedHandler(FileSystemEventHandler): class StrategyWidget(QtWidgets.QWidget): + savedChanged = QtCore.pyqtSignal(name="savedChanged") + def __init__(self, datasourcemanager, source_file, parent=None, content=None): super().__init__(parent) self.ui = Ui_StrategyWidget() self.ui.setupUi(self) - self.source_file = source_file + self.saved = False + self.save_timestamp = datetime.datetime.now() + + self.ui.editor.textChanged.connect(self.editorTextChanged) s = QtCore.QSettings() @@ -51,6 +57,11 @@ class StrategyWidget(QtWidgets.QWidget): if content is not None: self.ui.editor.setText(content) + self.source_file = source_file + if self.source_file is not None: + self.saved = True + + lexer = QsciLexerPython() lexer.setFont(font) self.ui.editor.setLexer(lexer) @@ -78,6 +89,15 @@ class StrategyWidget(QtWidgets.QWidget): except Exception as e: print("Exception: ", e) + def is_saved(self): + return self.saved + + def editorTextChanged(self): + saved = self.saved + self.saved = False + if saved: + self.savedChanged.emit() + def addDataSource(self): dlg = NewDataSourceDialog(self) if dlg.exec() == QtWidgets.QDialog.Accepted: @@ -109,8 +129,13 @@ class StrategyWidget(QtWidgets.QWidget): def save(self): + self.save_timestamp = datetime.datetime.now() with open(self.source_file, "w") as f: f.write(self.ui.editor.text()) + saved = self.saved + self.saved = True + if not saved: + self.savedChanged.emit() def get_time_window(self): if self.ui.rb_allData.isChecked(): @@ -248,9 +273,10 @@ class StrategyWidget(QtWidgets.QWidget): def file_modified(self, fname): try: - if self.source_file is not None and os.path.samefile(self.source_file, fname): - with open(self.source_file, "r") as f: - self.ui.editor.setText(f.read()) + if datetime.datetime.now() - self.save_timestamp > datetime.timedelta(seconds=2): + if self.source_file is not None and os.path.samefile(self.source_file, fname): + with open(self.source_file, "r") as f: + self.ui.editor.setText(f.read()) except: # Saving file from the outside generates a lot of events, as temporary and backup files are created and removed. # Hence, we ignore errors