184 lines
5.2 KiB
Python
184 lines
5.2 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
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
|
|
|
|
import markdown
|
|
import re
|
|
import json
|
|
|
|
# from classes import orderablelist
|
|
|
|
|
|
class Summary(QWidget):
|
|
def __init__(self, core):
|
|
super(Summary, self).__init__()
|
|
self.core = core
|
|
|
|
self.jsonfilepath = os.path.join(self.core.cwd,'.config/summary.json')
|
|
sum_json = open(self.jsonfilepath).read()
|
|
self.sum = json.loads(sum_json)
|
|
|
|
vbox = QVBoxLayout()
|
|
vbox.setContentsMargins(0,0,0,0)
|
|
|
|
self.list = SummaryList(self)
|
|
vbox.addWidget(self.list)
|
|
|
|
self.actions = SummaryActions(self, core)
|
|
vbox.addWidget(self.actions)
|
|
|
|
self.setLayout(vbox)
|
|
|
|
def addItem(self, text):
|
|
# file
|
|
filename = re.sub(r'\W', "_", text)+".md"
|
|
# TODO: check if file does not already exists
|
|
filepath = os.path.join(self.core.cwd,'contents',filename)
|
|
with open(filepath, 'w') as fp:
|
|
fp.write('#'+text)
|
|
# json
|
|
item = {"title":text,"file":filename}
|
|
self.sum.append(item)
|
|
with open(self.jsonfilepath, "w") as fp:
|
|
json.dump(self.sum, fp, ensure_ascii=False, indent="\t")
|
|
# refresh list
|
|
self.list.addNewItem(item)
|
|
|
|
def recordNewList(self):
|
|
|
|
newdata = []
|
|
for i in range(0,self.list.count()):
|
|
# print(self.item(i).item['title'])
|
|
newdata.append(self.list.item(i).item)
|
|
|
|
# print(newdata)
|
|
self.sum = newdata
|
|
with open(self.jsonfilepath, "w") as fp:
|
|
json.dump(newdata, fp, ensure_ascii=False, indent="\t")
|
|
|
|
|
|
class SummaryList(QListWidget):
|
|
def __init__(self, parent):
|
|
super(SummaryList, self).__init__(parent)
|
|
self.parent = parent
|
|
# self.sum = sum
|
|
# print(self.sum)
|
|
# self.setSortingEnabled(True)
|
|
self.setDragEnabled(True)
|
|
self.setSelectionMode(QAbstractItemView.SingleSelection)
|
|
self.setAcceptDrops(True)
|
|
self.setDropIndicatorShown(True)
|
|
self.setDragDropMode(QAbstractItemView.InternalMove)
|
|
|
|
self.model().rowsMoved.connect(self.onRowsMoved)
|
|
print(self.model())
|
|
|
|
for item in self.parent.sum:
|
|
self.addNewItem(item)
|
|
|
|
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))
|
|
|
|
class SummaryListWidgetItem(QListWidgetItem):
|
|
def __init__(self,parent,item):
|
|
super(SummaryListWidgetItem, self).__init__(parent)
|
|
self.parent = parent
|
|
self.item = item
|
|
|
|
self.setText(item['title'])
|
|
self.setToolTip(item['file'])
|
|
|
|
|
|
class SummaryActions(QWidget):
|
|
def __init__(self,parent,core):
|
|
super(SummaryActions, self).__init__(parent)
|
|
|
|
self.parent = parent
|
|
self.core = core
|
|
|
|
self.hbox = QHBoxLayout()
|
|
self.hbox.setContentsMargins(0,0,0,0)
|
|
|
|
new = QPushButton("New Page", self)
|
|
new.setShortcut('Ctrl+Shift+n')
|
|
# new.setIcon(Icon(ico)))
|
|
new.clicked.connect(self.onAddPage)
|
|
self.hbox.addWidget(new)
|
|
|
|
delete = QPushButton("Delete Page", self)
|
|
delete.setShortcut('Ctrl+Shift+sup')
|
|
# delete.setIcon(Icon(ico)))
|
|
delete.clicked.connect(self.onDeletePage)
|
|
self.hbox.addWidget(delete)
|
|
|
|
|
|
self.setLayout(self.hbox)
|
|
|
|
def onAddPage(self):
|
|
text, ok = QInputDialog.getText(self, 'Input Dialog', 'Page Name:')
|
|
if ok:
|
|
self.parent.addItem(text)
|
|
|
|
def onDeletePage(self):
|
|
print("onDeletePage")
|
|
# TODO: get the current selected page
|
|
# TODO: ask for confirmation for deleting the current selecred page
|
|
# TODO: call for summary widget to delete the page
|
|
|
|
class ContentStack(QWidget):
|
|
def __init__(self, core):
|
|
super(ContentStack, self).__init__()
|
|
|
|
# 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.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.hsplitter.splitterMoved.connect(self.movedSplitter)
|
|
|
|
hbox.addWidget(self.hsplitter)
|
|
|
|
self.restorePrefs()
|
|
|
|
|
|
def restorePrefs(self):
|
|
settings = QSettings('FiguresLibres', 'Cascade')
|
|
vals = settings.value('content/hsplitter/sizes', None)
|
|
if vals:
|
|
sizes = []
|
|
for size in vals: sizes.append(int(size))
|
|
self.hsplitter.setSizes(sizes)
|
|
|
|
def movedSplitter(self):
|
|
settings = QSettings('FiguresLibres', 'Cascade')
|
|
# print(self.hsplitter.sizes())
|
|
settings.setValue('content/hsplitter/sizes', self.hsplitter.sizes())
|