diff --git a/i18n/manuskript_fr.qm b/i18n/manuskript_fr.qm index c1b4d66a..6a6f66e9 100644 Binary files a/i18n/manuskript_fr.qm and b/i18n/manuskript_fr.qm differ diff --git a/i18n/manuskript_fr.ts b/i18n/manuskript_fr.ts index d5733d6d..2f332b7b 100644 --- a/i18n/manuskript_fr.ts +++ b/i18n/manuskript_fr.ts @@ -214,7 +214,7 @@ Contexte - + Outline Plan @@ -329,62 +329,62 @@ Mode - + (~{} pages) (~{} pages) - + Enter infos about your book, and yourself. Entrez toutes les informations relatives au livre, ainsi qu'à vous. - + Take time to think about a one sentance (~50 words) summary of your book. Then expand it to a paragraph, then to a page, then to a full summary. Prenez le temps de réfléchir à un résumé de votre livre, en une phrase (~50 mots). Puis augmentez cette phrase en un paragraphe, puis en une page, puis en un résumé complet. - + Create your characters. Créez ici vos personnage. - + Develop plots. Développez vos intrigues. - + Create the outline of your masterpiece. Créez le plan de votre chef-d'œuvre. - + Write. Écrivez. - + Debug infos. Sometimes useful. Des infos pour débugger des fois pendant qu'on code c'est utile. - + Dictionary Dictionnaire - + Install PyEnchant to use spellcheck Installez PyEnchant pour profiter du correcteur orthographique - + Words: {}{} Mots: {}{} - + Text Texte @@ -424,7 +424,7 @@ Et si...? - + Index cards Cartes @@ -444,7 +444,7 @@ F9 - + Tree Arbre @@ -469,77 +469,77 @@ Réglages - + Project {} saved. Le projet {} a été enregistré. - + Project {} loaded. Le projet {} a été chargé. - + The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous evil wizard could wasn't abled to kill a baby?' (Harry Potter) La situation de base, sous la forme d'une question: "Et si...?" Par exemple: "Et si le plus dangereux magiciens mauvais n'était pas capable de tuer un bébé?" (Harry Potter) - + Nothing Rien - + POV POV - + Label Label - + Progress Progrès - + Compile Compilation - + Icon color Couleur de l'icone - + Text color Couleur du texte - + Background color Couleur de l'arrière-plan - + Icon Icone - + Background Arrière-plan - + Border Bordure - + Corner Coin @@ -554,17 +554,17 @@ Le fichier {} n'existe pas. Essayez encore. - + Project {} loaded with some errors: Le projet {} a été chargé, avec des erreurs: - + * {} wasn't found in project file. * {} n'a pas été trouvé dans le fichier du projet. - + Project {} loaded with some errors. Le projet {} a été chargé avec des erreurs. @@ -1826,27 +1826,27 @@ des lignes: Supprimer - + 1 day ago Il y a un jour - + {} days ago Il y a {} jours - + {} hours ago Il y a {} heures - + {} minutes ago Il y a {} minutes - + {} seconds ago Il y a {} secondes @@ -1856,25 +1856,30 @@ des lignes: Options - + Show modifications Montrer les modifications - + Show ancient version Montrer la version ancienne - + Show spaces Montrer les espaces - + Show modifications only Montrer les modifications seulement + + + Line {}: + Ligne {}: + settingsWindow diff --git a/src/mainWindow.py b/src/mainWindow.py index 844e0f7e..ed2e7950 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -457,6 +457,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): if sttgns.contains("searchState"): state = False if sttgns.value("searchState") == "false" else True self.grpSearch.restoreState(state) + if sttgns.contains("revisionsState"): + state = [False if v == "false" else True for v in sttgns.value("revisionsState")] + self.redacMetadata.revisions.restoreState(state) def closeEvent(self, event): @@ -469,6 +472,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): sttgns.setValue("redacInfosState", self.tabRedacInfos.currentIndex()) sttgns.setValue("cheatSheetState", self.grpCheatSheet.saveState()) sttgns.setValue("searchState", self.grpSearch.saveState()) + sttgns.setValue("revisionsState", self.redacMetadata.revisions.saveState()) # Specific settings to save before quitting settings.lastTab = self.tabMain.currentIndex() diff --git a/src/ui/revisions.py b/src/ui/revisions.py index 5bd1ca90..2601a27d 100644 --- a/src/ui/revisions.py +++ b/src/ui/revisions.py @@ -9,6 +9,7 @@ from functions import * import models.references as Ref import datetime import difflib +import re class revisions(QWidget, Ui_revisions): @@ -21,6 +22,10 @@ class revisions(QWidget, Ui_revisions): self.listDelegate = listCompleterDelegate(self) self.list.setItemDelegate(self.listDelegate) self.list.itemActivated.connect(self.showDiff) + self.btnDelete.setEnabled(False) + self.btnRestore.clicked.connect(self.restore) + self.btnRestore.setEnabled(False) + #self.list.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.menu = QMenu(self) @@ -101,12 +106,21 @@ class revisions(QWidget, Ui_revisions): return self.tr("{} seconds ago").format(str(delta.seconds)) def showDiff(self): - #FIXME: doesn't work for HTML formatting. + # UI stuff + self.actShowSpaces.setEnabled(self.actShowDiff.isChecked()) + self.actDiffOnly.setEnabled(self.actShowDiff.isChecked()) + + #FIXME: Errors in line number i = self.list.currentItem() if not i: + self.btnDelete.setEnabled(False) + self.btnRestore.setEnabled(False) return + self.btnDelete.setEnabled(True) + self.btnRestore.setEnabled(True) + ts = i.data(Qt.UserRole) item = self._index.internalPointer() @@ -145,25 +159,40 @@ class revisions(QWidget, Ui_revisions): skip = False continue + # Same line if op == " " and not self.actDiffOnly.isChecked(): if item.type() == "t2t": txt = Ref.basicT2TFormat(txt) mydiff += "{}{}".format(txt, extra) + elif op == "- " and op2 == "+ ": if self.actDiffOnly.isChecked(): - mydiff += "
{}:
".format(str(n)) + mydiff += "
{}
".format( + self.tr("Line {}:").format(str(n))) s = difflib.SequenceMatcher(None, txt, txt2, autojunk=False) + newline = "" for tag, i1, i2, j1, j2 in s.get_opcodes(): if tag == "equal": - mydiff += txt[i1:i2] + newline += txt[i1:i2] elif tag == "delete": - mydiff += "{}".format(_format(txt[i1:i2])) + newline += "{}".format(_format(txt[i1:i2])) elif tag == "insert": - mydiff += "{}".format(_format(txt2[j1:j2])) + newline += "{}".format(_format(txt2[j1:j2])) elif tag == "replace": - mydiff += "{}".format(_format(txt[i1:i2])) - mydiff += "{}".format(_format(txt2[j1:j2])) - mydiff += extra + newline += "{}".format(_format(txt[i1:i2])) + newline += "{}".format(_format(txt2[j1:j2])) + + # Few ugly tweaks for html diffs + newline = re.sub(r"(()", + "\\1\\2\\3", newline) + newline = re.sub(r"

cenrighter\" style=\" -qt-block-indent:0; -qt-user-state:0; \">(.*?)

", + "

\\1

", newline) + newline = re.sub(r"

centeright\" style=\" -qt-block-indent:0; -qt-user-state:0; \">(.*)

", + "

\\1

", newline) + newline = re.sub(r")(.*?)()(.*?)>(.*?)

", + "\\1\\5\\3

", newline) + + mydiff += newline + extra skip = True elif op == "- ": if self.actDiffOnly.isChecked(): @@ -176,6 +205,34 @@ class revisions(QWidget, Ui_revisions): self.view.setText(mydiff) + def restore(self): + i = self.list.currentItem() + if not i: + return + ts = i.data(Qt.UserRole) + item = self._index.internalPointer() + textBefore = [r[1] for r in item.revisions() if r[0] == ts][0] + index = self._index.sibling(self._index.row(), Outline.text.value) + self._index.model().setData(index, textBefore) + #item.setData(Outline.text.value, textBefore) + + + def saveState(self): + return [ + self.actShowDiff.isChecked(), + self.actShowVersion.isChecked(), + self.actShowSpaces.isChecked(), + self.actDiffOnly.isChecked(), + ] + + def restoreState(self, state): + self.actShowDiff.setChecked(state[0]) + self.actShowVersion.setChecked(state[1]) + self.actShowSpaces.setChecked(state[2]) + self.actDiffOnly.setChecked(state[3]) + self.actShowSpaces.setEnabled(self.actShowDiff.isChecked()) + self.actDiffOnly.setEnabled(self.actShowDiff.isChecked()) + class listCompleterDelegate(QStyledItemDelegate): def __init__(self, parent=None): diff --git a/src/ui/revisions_ui.py b/src/ui/revisions_ui.py index c8f84716..7bd8ce5d 100644 --- a/src/ui/revisions_ui.py +++ b/src/ui/revisions_ui.py @@ -57,11 +57,9 @@ class Ui_revisions(object): spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem) self.btnRestore = QtWidgets.QPushButton(self.layoutWidget) - self.btnRestore.setEnabled(False) self.btnRestore.setObjectName("btnRestore") self.horizontalLayout_2.addWidget(self.btnRestore) self.btnDelete = QtWidgets.QPushButton(self.layoutWidget) - self.btnDelete.setEnabled(False) self.btnDelete.setObjectName("btnDelete") self.horizontalLayout_2.addWidget(self.btnDelete) self.verticalLayout_2.addWidget(self.splitter) diff --git a/src/ui/revisions_ui.ui b/src/ui/revisions_ui.ui index 5f2d098f..333ce9d9 100644 --- a/src/ui/revisions_ui.ui +++ b/src/ui/revisions_ui.ui @@ -93,9 +93,6 @@ - - false - Restore @@ -103,9 +100,6 @@ - - false - Delete diff --git a/src/ui/views/metadataView.py b/src/ui/views/metadataView.py index fbdcb7cd..c99304fb 100644 --- a/src/ui/views/metadataView.py +++ b/src/ui/views/metadataView.py @@ -79,11 +79,11 @@ class metadataView(QWidget, Ui_metadataView): self.grpSummary.saveState(), self.grpNotes.saveState(), self.grpRevisions.saveState(), + self.revisions.saveState() ] def restoreState(self, state): - self.grpProperties.restoreState(state[0]), - self.grpSummary.restoreState(state[1]), - self.grpNotes.restoreState(state[2]), - self.grpRevisions.restoreState(state[3]), - \ No newline at end of file + self.grpProperties.restoreState(state[0]) + self.grpSummary.restoreState(state[1]) + self.grpNotes.restoreState(state[2]) + self.grpRevisions.restoreState(state[3]) \ No newline at end of file