From c248b2fae64747869c1b1132a7ecae63a56fbcd5 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Mon, 29 May 2017 11:05:44 +0200 Subject: [PATCH] Contents : markdown files are basicaly editable, previewed, synchronized with summary list --- classes/content.py | 160 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 127 insertions(+), 33 deletions(-) diff --git a/classes/content.py b/classes/content.py index b2aaba0..a33d83d 100644 --- a/classes/content.py +++ b/classes/content.py @@ -5,22 +5,26 @@ import sys, os from PyQt5 import QtCore from PyQt5.QtCore import QSettings -from PyQt5.QtGui import QFont, QSyntaxHighlighter -from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSplitter, QListWidget, QListWidgetItem, QAbstractItemView, QButtonGroup, QPushButton, QInputDialog +from PyQt5.QtGui import QFont, QSyntaxHighlighter, QKeySequence +from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSplitter, QListWidget, QListWidgetItem, QAbstractItemView, QButtonGroup, QPushButton, QInputDialog, QPlainTextEdit, QTextEdit,QShortcut -import markdown +import markdown2 import re import json -# from classes import orderablelist - +# _____ +# / ___/__ ______ ___ ____ ___ ____ ________ __ +# \__ \/ / / / __ `__ \/ __ `__ \/ __ `/ ___/ / / / +# ___/ / /_/ / / / / / / / / / / / /_/ / / / /_/ / +# /____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \__, / +# /____/ class Summary(QWidget): - def __init__(self, core): - super(Summary, self).__init__() - self.core = core + def __init__(self, parent): + super(Summary, self).__init__(parent) + self.parent = parent - self.jsonfilepath = os.path.join(self.core.cwd,'.config/summary.json') + self.jsonfilepath = os.path.join(self.parent.core.cwd,'.config/summary.json') sum_json = open(self.jsonfilepath).read() self.sum = json.loads(sum_json) @@ -30,7 +34,7 @@ class Summary(QWidget): self.list = SummaryList(self) vbox.addWidget(self.list) - self.actions = SummaryActions(self, core) + self.actions = SummaryActions(self) vbox.addWidget(self.actions) self.setLayout(vbox) @@ -63,6 +67,7 @@ class Summary(QWidget): json.dump(newdata, fp, ensure_ascii=False, indent="\t") + class SummaryList(QListWidget): def __init__(self, parent): super(SummaryList, self).__init__(parent) @@ -77,41 +82,50 @@ class SummaryList(QListWidget): self.setDragDropMode(QAbstractItemView.InternalMove) self.model().rowsMoved.connect(self.onRowsMoved) - print(self.model()) + # print(self.model()) - for item in self.parent.sum: - self.addNewItem(item) + self.itemActivated.connect(self.onItemActivated) + + # add markdown files to the list + for itemdata in self.parent.sum: + self.addNewItem(itemdata) + + # self.setCurrentRow(0) + # self.setCurrentIndex() + # self.setCurrentItem() + self.item(0).setSelected(True) + # TODO: activate first item by default as it will open it with editor + + # TODO: show activated item on the list + # TODO: show modifed item on the list def onRowsMoved(self, model, start, end, dest): # print("onRowsMoved") self.parent.recordNewList() def addNewItem(self, item): - # slw = SummaryListWidgetItem(self,item) - # lwi = QListWidgetItem(self) - # # Set size hint - # lwi.setSizeHint(slw.sizeHint()) - # self.addItem(lwi) - # self.setItemWidget(lwi, slw) - # # self.addItem(QListWidgetItem()) self.addItem(SummaryListWidgetItem(self,item)) + def onItemActivated(self, item): + # print('onItemActivated', item.data) + self.parent.parent.editor.openFile() + + class SummaryListWidgetItem(QListWidgetItem): - def __init__(self,parent,item): + def __init__(self,parent,data): super(SummaryListWidgetItem, self).__init__(parent) self.parent = parent - self.item = item + self.data = data - self.setText(item['title']) - self.setToolTip(item['file']) + self.setText(data['title']) + self.setToolTip(data['file']) class SummaryActions(QWidget): - def __init__(self,parent,core): + def __init__(self,parent): super(SummaryActions, self).__init__(parent) self.parent = parent - self.core = core self.hbox = QHBoxLayout() self.hbox.setContentsMargins(0,0,0,0) @@ -142,25 +156,105 @@ class SummaryActions(QWidget): # TODO: ask for confirmation for deleting the current selecred page # TODO: call for summary widget to delete the page +# ______ ___ __ +# / ____/___/ (_) /_____ _____ +# / __/ / __ / / __/ __ \/ ___/ +# / /___/ /_/ / / /_/ /_/ / / +# /_____/\__,_/_/\__/\____/_/ +class MarkdownEditor(QWidget): + def __init__(self,parent): + super(MarkdownEditor, self).__init__(parent) + self.parent = parent + self.changed = False + + self.hbox = QHBoxLayout() + self.hbox.setContentsMargins(0,0,0,0) + + self.styles = """ + background-color:white; + color:black; + padding:20px; + """ + + self.editor = QPlainTextEdit(self) + self.editor.setStyleSheet(self.styles) + self.hbox.addWidget(self.editor) + + self.viewer = QTextEdit(self) + self.viewer.setReadOnly(True) + self.viewer.setStyleSheet(self.styles) + # TODO: show all html blocks on viewer + self.hbox.addWidget(self.viewer) + + self.setLayout(self.hbox) + + self.editor.textChanged.connect(self.onTextChanged) + self.openFile() + + self.shortcut = QShortcut(QKeySequence("Ctrl+s"), self) + self.shortcut.activated.connect(self.save) + + self.refreshViewer() + + def openFile(self): + # print("openFile") + sumlist = self.parent.summary.list + currentitem = sumlist.currentItem() + if currentitem: + if not self.changed: + self.editor.textChanged.disconnect(self.onTextChanged) + filename = currentitem.data['file'] + self.file = os.path.join(self.parent.core.cwd,'contents',filename) + self.editor.clear() + self.editor.insertPlainText(open(self.file, 'r').read()) + self.refreshViewer() + self.editor.textChanged.connect(self.onTextChanged) + else: + print("Can't changed file, current id modified, please save first") + # TODO: ask for saving current file + + def onTextChanged(self): + self.refreshViewer() + if not self.changed: + self.changed = True + # i = self.tabs.currentIndex() + # self.tabs.setTabText(i, "* "+self.tabs.tabText(i)) + + def refreshViewer(self): + markdown = self.editor.toPlainText() + html = markdown2.markdown(markdown) + self.viewer.setHtml(html) + + def save(self): + if self.changed: + open(self.file, 'w').write(self.editor.toPlainText()) + self.changed = False + # i = self.tabs.currentIndex() + # self.tabs.setTabText(i, re.sub(r'^\*\s', '', self.tabs.tabText(i))) + # TODO: how to combine file save and project save + +# __ ___ _ +# / |/ /___ _(_)___ +# / /|_/ / __ `/ / __ \ +# / / / / /_/ / / / / / +# /_/ /_/\__,_/_/_/ /_/ class ContentStack(QWidget): def __init__(self, core): super(ContentStack, self).__init__() + self.core = core - # self.grid = QGridLayout() hbox = QHBoxLayout() hbox.setContentsMargins(0,0,0,0) self.setLayout(hbox) self.hsplitter = QSplitter(QtCore.Qt.Horizontal) - self.summary = Summary(core) + self.summary = Summary(self) + # TODO: detect external changes (file changed or new file) self.hsplitter.addWidget(self.summary) - self.mdsource = QLabel("Content (markdown src).") - self.hsplitter.addWidget(self.mdsource) - - self.mdpreview = QLabel("Content (markdown preview).") - self.hsplitter.addWidget(self.mdpreview) + self.editor = MarkdownEditor(self) + self.hsplitter.addWidget(self.editor) self.hsplitter.splitterMoved.connect(self.movedSplitter)