Contents : markdown files are basicaly editable, previewed, synchronized with summary list
This commit is contained in:
+127
-33
@@ -5,22 +5,26 @@ import sys, os
|
|||||||
|
|
||||||
from PyQt5 import QtCore
|
from PyQt5 import QtCore
|
||||||
from PyQt5.QtCore import QSettings
|
from PyQt5.QtCore import QSettings
|
||||||
from PyQt5.QtGui import QFont, QSyntaxHighlighter
|
from PyQt5.QtGui import QFont, QSyntaxHighlighter, QKeySequence
|
||||||
from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QVBoxLayout, QSplitter, QListWidget, QListWidgetItem, QAbstractItemView, QButtonGroup, QPushButton, QInputDialog
|
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 re
|
||||||
import json
|
import json
|
||||||
|
|
||||||
# from classes import orderablelist
|
|
||||||
|
|
||||||
|
|
||||||
|
# _____
|
||||||
|
# / ___/__ ______ ___ ____ ___ ____ ________ __
|
||||||
|
# \__ \/ / / / __ `__ \/ __ `__ \/ __ `/ ___/ / / /
|
||||||
|
# ___/ / /_/ / / / / / / / / / / / /_/ / / / /_/ /
|
||||||
|
# /____/\__,_/_/ /_/ /_/_/ /_/ /_/\__,_/_/ \__, /
|
||||||
|
# /____/
|
||||||
class Summary(QWidget):
|
class Summary(QWidget):
|
||||||
def __init__(self, core):
|
def __init__(self, parent):
|
||||||
super(Summary, self).__init__()
|
super(Summary, self).__init__(parent)
|
||||||
self.core = core
|
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()
|
sum_json = open(self.jsonfilepath).read()
|
||||||
self.sum = json.loads(sum_json)
|
self.sum = json.loads(sum_json)
|
||||||
|
|
||||||
@@ -30,7 +34,7 @@ class Summary(QWidget):
|
|||||||
self.list = SummaryList(self)
|
self.list = SummaryList(self)
|
||||||
vbox.addWidget(self.list)
|
vbox.addWidget(self.list)
|
||||||
|
|
||||||
self.actions = SummaryActions(self, core)
|
self.actions = SummaryActions(self)
|
||||||
vbox.addWidget(self.actions)
|
vbox.addWidget(self.actions)
|
||||||
|
|
||||||
self.setLayout(vbox)
|
self.setLayout(vbox)
|
||||||
@@ -63,6 +67,7 @@ class Summary(QWidget):
|
|||||||
json.dump(newdata, fp, ensure_ascii=False, indent="\t")
|
json.dump(newdata, fp, ensure_ascii=False, indent="\t")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SummaryList(QListWidget):
|
class SummaryList(QListWidget):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super(SummaryList, self).__init__(parent)
|
super(SummaryList, self).__init__(parent)
|
||||||
@@ -77,41 +82,50 @@ class SummaryList(QListWidget):
|
|||||||
self.setDragDropMode(QAbstractItemView.InternalMove)
|
self.setDragDropMode(QAbstractItemView.InternalMove)
|
||||||
|
|
||||||
self.model().rowsMoved.connect(self.onRowsMoved)
|
self.model().rowsMoved.connect(self.onRowsMoved)
|
||||||
print(self.model())
|
# print(self.model())
|
||||||
|
|
||||||
for item in self.parent.sum:
|
self.itemActivated.connect(self.onItemActivated)
|
||||||
self.addNewItem(item)
|
|
||||||
|
# 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):
|
def onRowsMoved(self, model, start, end, dest):
|
||||||
# print("onRowsMoved")
|
# print("onRowsMoved")
|
||||||
self.parent.recordNewList()
|
self.parent.recordNewList()
|
||||||
|
|
||||||
def addNewItem(self, item):
|
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))
|
self.addItem(SummaryListWidgetItem(self,item))
|
||||||
|
|
||||||
|
def onItemActivated(self, item):
|
||||||
|
# print('onItemActivated', item.data)
|
||||||
|
self.parent.parent.editor.openFile()
|
||||||
|
|
||||||
|
|
||||||
class SummaryListWidgetItem(QListWidgetItem):
|
class SummaryListWidgetItem(QListWidgetItem):
|
||||||
def __init__(self,parent,item):
|
def __init__(self,parent,data):
|
||||||
super(SummaryListWidgetItem, self).__init__(parent)
|
super(SummaryListWidgetItem, self).__init__(parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.item = item
|
self.data = data
|
||||||
|
|
||||||
self.setText(item['title'])
|
self.setText(data['title'])
|
||||||
self.setToolTip(item['file'])
|
self.setToolTip(data['file'])
|
||||||
|
|
||||||
|
|
||||||
class SummaryActions(QWidget):
|
class SummaryActions(QWidget):
|
||||||
def __init__(self,parent,core):
|
def __init__(self,parent):
|
||||||
super(SummaryActions, self).__init__(parent)
|
super(SummaryActions, self).__init__(parent)
|
||||||
|
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.core = core
|
|
||||||
|
|
||||||
self.hbox = QHBoxLayout()
|
self.hbox = QHBoxLayout()
|
||||||
self.hbox.setContentsMargins(0,0,0,0)
|
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: ask for confirmation for deleting the current selecred page
|
||||||
# TODO: call for summary widget to delete the 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):
|
class ContentStack(QWidget):
|
||||||
def __init__(self, core):
|
def __init__(self, core):
|
||||||
super(ContentStack, self).__init__()
|
super(ContentStack, self).__init__()
|
||||||
|
self.core = core
|
||||||
|
|
||||||
# self.grid = QGridLayout()
|
|
||||||
hbox = QHBoxLayout()
|
hbox = QHBoxLayout()
|
||||||
hbox.setContentsMargins(0,0,0,0)
|
hbox.setContentsMargins(0,0,0,0)
|
||||||
self.setLayout(hbox)
|
self.setLayout(hbox)
|
||||||
|
|
||||||
self.hsplitter = QSplitter(QtCore.Qt.Horizontal)
|
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.hsplitter.addWidget(self.summary)
|
||||||
|
|
||||||
self.mdsource = QLabel("Content (markdown src).")
|
self.editor = MarkdownEditor(self)
|
||||||
self.hsplitter.addWidget(self.mdsource)
|
self.hsplitter.addWidget(self.editor)
|
||||||
|
|
||||||
self.mdpreview = QLabel("Content (markdown preview).")
|
|
||||||
self.hsplitter.addWidget(self.mdpreview)
|
|
||||||
|
|
||||||
self.hsplitter.splitterMoved.connect(self.movedSplitter)
|
self.hsplitter.splitterMoved.connect(self.movedSplitter)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user