kindle manager
This commit is contained in:
171
kmanapp.py
171
kmanapp.py
@@ -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_()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user