kindle manager

This commit is contained in:
gavin
2020-06-07 17:48:28 +08:00
parent 76cc0d8c6d
commit 32d9f53897
7 changed files with 324 additions and 63 deletions

View File

@@ -1,12 +1,17 @@
#########################################################
## @file : kmanapp.py
## @desc : kindle note managerment tool GUI
## @create : 2020/06/03
## @author : Chengan
## @email : douboer@gmail.com
#########################################################
import sys
from time import sleep
import pandas as pd
from PySide2.QtWidgets import QApplication
from PySide2.QtWidgets import QMainWindow
from PySide2.QtWidgets import QLabel
from PySide2.QtWidgets import QMessageBox
from PySide2.QtWidgets import QFileDialog
from PySide2.QtWidgets import *
from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
QAbstractTableModel, QObject, QPoint, QRect, QSize, QTime,
@@ -14,7 +19,6 @@ from PySide2.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
from PySide2.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QFont,
QFontDatabase, QIcon, QKeySequence, QLinearGradient, QPalette, QPainter,
QPixmap, QRadialGradient, QStandardItem, QStandardItemModel)
#from PySide2.QtWidgets import *
from mainwindow import Ui_MainWindow
from kman import *
@@ -40,6 +44,7 @@ class kmanWindow(QMainWindow):
self.km = kMan()
self.books = self.km.import_clips()
self.filter_data = self.km.filter_clips(self.books)
self.add_ui_component()
@@ -65,26 +70,41 @@ class kmanWindow(QMainWindow):
ui.searchToolButton.clicked.connect(self.search_button_clicked)
ui.treeView.clicked.connect(self.tree_item_clicked)
ui.tableView.clicked.connect(self.table_item_clicked)
ui.tableView.setColumnWidth(0, 40) # type
ui.tableView.setColumnWidth(2, 50) # author
ui.tableView.selectRow(0)
def add_ui_component(self):
self.ui.searchComboBox.addItems(['ALL','bookname','content','author'])
self.ui.treeView.resize(200,200)
# status bar
self.ui.status_label = QLabel()
self.ui.pe = QPalette()
# table
#self.ui.tablemodel=QStandardItemModel(100,5)
self.ui.tablemodel= nTableModel(100,5)
self.ui.tablemodel.setHorizontalHeaderLabels(
[u'Content',u'Type',u'Bookname',u'Author',u'Position',u'Date'])
self.ui.tablemodel.update(self.km.filter_clips(self.books))
# table view
self.ui.tablemodel = nTableModel(self.convert_to_panda(self.filter_data))
self.ui.tableView.verticalHeader().hide()
for row in range(5):
for column in range(5):
i=QStandardItem("row %s,column %s"%(row,column))
self.ui.tablemodel.setItem(row,column,i)
self.ui.tableView.setModel(self.ui.tablemodel)
self.ui.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
# fit window
#headerView = self.ui.tableView.horizontalHeader()
#headerView.setSectionResizeMode(QHeaderView.Stretch)
self.ui.tableView.horizontalHeader().setStretchLastSection(True)
self.ui.tablemodel.tabledata_update.connect(self.tabledata_update_slot)
# initial textedit content
[stype,sbookname,sauthor,sposition,stime,scontent] = self.filter_data[0]
self.ui.textEdit.setHtml("""<span style='font-size:22pt;color:maroon'>《{bookname}》</span>
<span style='font-size:22pt;color:maroon'>{author}</span>
<span style='font-size:22pt;color:maroon'>{time}</span>
<span style='font-size:11pt;color:maroon'>【{note}】</span><br><br>
<span>********************************************************</span><br><br>
<span style='font-size:22pt;color:#31849B'>{content}</span>
<span style='font-size:11pt;color:maroon'>【P{position}】</span><br>""".
format(bookname=sbookname, author=sauthor, time=stime,
note=stype, content=scontent, position=sposition))
"""
if not ONLY_TEST: # XXXXXXXXXXXXX
@@ -129,22 +149,60 @@ class kmanWindow(QMainWindow):
self.ui.treeView.setModel(model)
"""
def convert_to_panda(self, seclist):
pdframe = pd.DataFrame(seclist, \
columns = ['Type','Bookname','Author','Position','Date','Content'])
return pdframe
def tabledata_update_slot(self, s):
print('call tabledata_update_slot() {}'.format(s))
def tree_item_clicked(self, modelidx):
model_index_list = self.ui.treeView.selectedIndexes() # QModelIndexList
model_index = model_index_list[0] # QModelIndex
itemmodel = model_index.model() #QAbstractItemModel/QStandardItemModel
item = itemmodel.itemFromIndex(modelidx) #QStandardItem
print(item.text())
description = item.accessibleDescription()
print(description, item.text())
# filter clips
self.filter_data = None
if description in ['root', 'bookname', 'author']:
self.filter_data = self.km.filter_clips(self.books)
elif description == 'bleaf': # bookname leaf
info = re.split(r'\s+',item.text())[0]
self.filter_data = self.km.filter_clips(self.books, info, 1)
else: # author leaf
info = re.split(r'\s+',item.text())[0]
self.filter_data = self.km.filter_clips(self.books, info, 2)
#item = self.ui.treeView.selectedIndexes()[0]
#print(item.model().itemFromIndex(modelidx).text())
data = self.convert_to_panda(self.filter_data)
self.ui.tablemodel= nTableModel(data)
self.ui.tableView.verticalHeader().hide()
self.ui.tableView.setModel(self.ui.tablemodel)
def table_item_clicked(self, item):
content = item.data()
#print('call table_item_clicked() {}'.format(content))
def table_item_clicked(self, index):
if index.isValid():
row = index.row()
stype = index.sibling(row, 0).data()
sbookname = index.sibling(row, 1).data()
sauthor = index.sibling(row, 2).data()
sposition = index.sibling(row, 3).data()
stime = index.sibling(row, 4).data()
scontent = index.sibling(row, 5).data()
else: return
self.ui.textEdit.setHtml("""<span style='font-size:22pt;color:maroon'>《{bookname}》</span>
<span style='font-size:22pt;color:maroon'>{author}</span>
<span style='font-size:22pt;color:maroon'>{time}</span>
<span style='font-size:11pt;color:maroon'>【{note}】</span><br><br>
<span>********************************************************</span><br><br>
<span style='font-size:22pt;color:#31849B'>{content}</span>
<span style='font-size:11pt;color:maroon'>【P{position}】</span><br>""".
format(bookname=sbookname, author=sauthor, time=stime,
note=stype, content=scontent, position=sposition))
def search_button_clicked(self):
print( 'call search_button_clicked()' )
@@ -213,7 +271,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/emblem_library.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
item.setAccessibleDescription('top')
item.setAccessibleDescription('root')
rootItem.appendRow(item)
parent_item = item
@@ -223,7 +281,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/book_open.png", QSize(), QIcon.Normal, QIcon.Off)
bookname_item.setIcon(icon)
bookname_item.setAccessibleDescription('root')
bookname_item.setAccessibleDescription('bookname')
parent_item.appendRow(bookname_item)
if totalnum > 0:
@@ -232,7 +290,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/book_open_bookmark.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
item.setAccessibleDescription('leaf')
item.setAccessibleDescription('bleaf')
bookname_item.appendRow(item)
# add author tree
@@ -241,7 +299,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/person.png", QSize(), QIcon.Normal, QIcon.Off)
author_item.setIcon(icon)
author_item.setAccessibleDescription('root')
author_item.setAccessibleDescription('author')
parent_item.appendRow(author_item)
parent_item = author_item
@@ -251,7 +309,7 @@ class kmanWindow(QMainWindow):
icon = QIcon()
icon.addFile(u":/icons/user.png", QSize(), QIcon.Normal, QIcon.Off)
item.setIcon(icon)
item.setAccessibleDescription('leaf')
item.setAccessibleDescription('aleaf')
author_item.appendRow(item)
self.ui.treeView.setModel(self.ui.model)
@@ -313,46 +371,42 @@ class kmanWindow(QMainWindow):
# stop check thread
self.flag = False
## thanks 勤奋的小青蛙 ^_^ - http://www.jyguagua.com/?p=2615
#class nTableModel(QAbstractTableModel):
class nTableModel(QStandardItemModel):
def __init__(self, parent=None, seclist=None, *args):
# thanks Martin Fitzpatrick ^_^
# https://www.learnpyqt.com/courses/model-views/qtableview-modelviews-numpy-pandas/
class nTableModel(QAbstractTableModel):
tabledata_update = Signal(str)
def __init__(self, data):
super(nTableModel, self).__init__()
self.seclist = None
self._data = data
def update(self, seclist):
self.seclist = seclist
def rowCount(self, parent):
if not self.seclist: return 0
return len(self.seclist)
def columnCount(self, parent):
if not self.seclist: return 0
return len(self.seclist[0])
def data(self, index, role):
if not index.isValid():
return None
elif role != Qt.DisplayRole:
return None
return self.seclist[index.row()][index.column()]
def sort(self, col, order):
"""sort table by given column number col"""
self.emit(SIGNAL("layoutAboutToBeChanged()"))
if role == Qt.DisplayRole:
value = self._data.iloc[index.row(), index.column()]
self.tabledata_update[str].emit('{} {}'.format(index.row(),index.column()))
return str(value)
self.seclist = sorted(self.seclist, key=operator.itemgetter(col))
if order == Qt.DescendingOrder:
self.seclist.reverse()
def rowCount(self, index):
return self._data.shape[0]
def columnCount(self, index):
return self._data.shape[1]
def headerData(self, section, orientation, role):
# section is the index of the column/row.
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._data.columns[section])
if orientation == Qt.Vertical:
return str(self._data.index[section])
self.emit(SIGNAL("layoutChanged()"))
if __name__ == "__main__":
app = QApplication(sys.argv)
kmw = kmanWindow()
kmw.resize(900, 600)
#kmw.resize(900, 600)
kmw.showFullScreen()
kmw.show()
# loop check kindle is connected or not
@@ -364,6 +418,5 @@ if __name__ == "__main__":
except:
print ("Error: can not start thread")
"""
app.exec_()