370 lines
13 KiB
Python
370 lines
13 KiB
Python
|
|
import sys
|
|
from time import sleep
|
|
|
|
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.QtCore import (QCoreApplication, QDate, QDateTime, QMetaObject,
|
|
QAbstractTableModel, QObject, QPoint, QRect, QSize, QTime,
|
|
QUrl, Qt, QThread, Signal, QTimer)
|
|
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 *
|
|
|
|
# import binary resource file(kmanapp_rc.py)
|
|
import kmanapp_rc
|
|
|
|
ONLY_TEST = 1
|
|
|
|
class kmanWindow(QMainWindow):
|
|
"""
|
|
def __init__(self, *args, **kwargs):
|
|
super(kmanWindow, self).__init__(*args, **kwargs)
|
|
"""
|
|
flag = True
|
|
def __init__(self, parent=None):
|
|
super(kmanWindow, self).__init__(parent)
|
|
|
|
# create ui and initial it
|
|
ui = Ui_MainWindow()
|
|
ui.setupUi(self)
|
|
self.ui = ui
|
|
|
|
self.km = kMan()
|
|
self.books = self.km.import_clips()
|
|
|
|
self.add_ui_component()
|
|
|
|
self.show_status_info()
|
|
self.fill_treeview()
|
|
|
|
# timer to check status of kindle
|
|
self.timer = QTimer(self)
|
|
self.timer.timeout.connect(self.show_status_info)
|
|
self.timer.start(1000)
|
|
|
|
# connect action/toolbutton to slot functions
|
|
ui.actionimportkindle.triggered.connect(lambda: self.import_kindle(self.books))
|
|
ui.actionimportlocal.triggered.connect(lambda: self.import_local())
|
|
ui.actionconfig.triggered.connect(lambda: self.config())
|
|
ui.actionwords.triggered.connect(lambda: self.words())
|
|
ui.actionstatistic.triggered.connect(lambda: self.statistic())
|
|
ui.actionhomepage.triggered.connect(lambda: self.homepage())
|
|
ui.actionabout.triggered.connect(lambda: self.about())
|
|
ui.actionflush.triggered.connect(lambda: self.refresh())
|
|
|
|
ui.searchComboBox.currentIndexChanged.connect(self.search_scope_change)
|
|
ui.searchToolButton.clicked.connect(self.search_button_clicked)
|
|
ui.treeView.clicked.connect(self.tree_item_clicked)
|
|
ui.tableView.clicked.connect(self.table_item_clicked)
|
|
|
|
def add_ui_component(self):
|
|
self.ui.searchComboBox.addItems(['ALL','bookname','content','author'])
|
|
|
|
# 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))
|
|
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)
|
|
|
|
"""
|
|
if not ONLY_TEST: # XXXXXXXXXXXXX
|
|
model = QStandardItemModel()
|
|
rootItem = model.invisibleRootItem()
|
|
idx = 0
|
|
for i in range(4):
|
|
idx += 1
|
|
item = QStandardItem('item {}'.format(idx))
|
|
rootItem.appendRow(item)
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/book_open_bookmark.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
if i==0:
|
|
parentItem = item
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/emblem_library.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
parentItem.appendRows([QStandardItem('append rows {}'.format(i+idx)) for i in range(5)])
|
|
if i==1:
|
|
parentItem = item
|
|
for i in range(5):
|
|
idx += 1
|
|
item = QStandardItem('type item {}'.format(i+idx))
|
|
#item.setEnabled(False)
|
|
item.setEditable(False)
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/register.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
parentItem.appendRow(item)
|
|
if i==3:
|
|
parentItem = item
|
|
for i in range(5):
|
|
idx += 1
|
|
item = QStandardItem('another item {}'.format(i+idx))
|
|
#item.setEnabled(False)
|
|
item.setEditable(False)
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/book_open.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
parentItem.appendRow(item)
|
|
self.ui.treeView.setModel(model)
|
|
"""
|
|
|
|
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())
|
|
|
|
# filter clips
|
|
|
|
#item = self.ui.treeView.selectedIndexes()[0]
|
|
#print(item.model().itemFromIndex(modelidx).text())
|
|
|
|
def table_item_clicked(self, item):
|
|
content = item.data()
|
|
#print('call table_item_clicked() {}'.format(content))
|
|
|
|
def search_button_clicked(self):
|
|
print( 'call search_button_clicked()' )
|
|
|
|
def search_scope_change(self,t):
|
|
p = {0:'ALL',1:'TITLE',2:'AUTHOR',3:'CONTENT'}
|
|
s = self.ui.searchLineEdit.text()
|
|
#print(self.books)
|
|
#print(search_clip(self.books,s,'ALL',p[t]))
|
|
print('call search_scope_change()')
|
|
|
|
## XXXX
|
|
def check_kindle_status(self):
|
|
while self.flag:
|
|
self.show_status_info()
|
|
sleep(2)
|
|
|
|
def show_status_info(self):
|
|
""" show status information on statusbar
|
|
Args:
|
|
conn: 1 if kindle is connected else 0
|
|
Return:
|
|
conn
|
|
"""
|
|
status = self.km.status_info()
|
|
self.ui.statusbar.showMessage(status[0],0)
|
|
self.ui.status_label.setText(status[1])
|
|
if not self.km.status:
|
|
self.ui.pe.setColor(QPalette.WindowText,Qt.red)
|
|
#self.ui.status_label.setAutoFillBackground(True)
|
|
self.ui.status_label.setPalette(pe)
|
|
self.ui.statusbar.addPermanentWidget(self.ui.status_label, stretch=0)
|
|
|
|
# define slot functions
|
|
def import_kindle(self,bks):
|
|
fp = self.km.get_kindle_path()
|
|
if not fp:
|
|
self.messagebox(ico=2, info='\n\n kindle is not connected')
|
|
return 0
|
|
|
|
self.books = self.km.import_clips(self.km.get_kindle_path())
|
|
|
|
status = self.km.status_info()
|
|
self.show_status_info()
|
|
|
|
print(bks)
|
|
|
|
def import_local(self):
|
|
fn, ft = QFileDialog.getOpenFileName(self,
|
|
"choose file to import",
|
|
'./', # start path
|
|
"All Files (*);;Text Files (*.txt)") # filter file type
|
|
self.fn = fn
|
|
|
|
self.books = self.km.import_clips(fn)
|
|
|
|
self.show_status_info()
|
|
|
|
#print('filename ', fn, 'filetype ', ft)
|
|
if fn == "": return False
|
|
|
|
def fill_treeview(self):
|
|
self.ui.model = QStandardItemModel()
|
|
rootItem = self.ui.model.invisibleRootItem()
|
|
item = QStandardItem('All Notes')
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/emblem_library.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
item.setAccessibleDescription('top')
|
|
rootItem.appendRow(item)
|
|
parent_item = item
|
|
|
|
# add bookname tree
|
|
[totalnum, booknum] = self.km.get_bookname_num(self.books)
|
|
bookname_item = QStandardItem('Bookname ({})'.format(totalnum))
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/book_open.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
bookname_item.setIcon(icon)
|
|
bookname_item.setAccessibleDescription('root')
|
|
parent_item.appendRow(bookname_item)
|
|
|
|
if totalnum > 0:
|
|
for k, v in booknum.items():
|
|
item = QStandardItem('{} ({})'.format(k, v))
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/book_open_bookmark.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
item.setAccessibleDescription('leaf')
|
|
bookname_item.appendRow(item)
|
|
|
|
# add author tree
|
|
[totalnum, authnum] = self.km.get_author_num(self.books)
|
|
author_item = QStandardItem('Author ({})'.format(totalnum))
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/person.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
author_item.setIcon(icon)
|
|
author_item.setAccessibleDescription('root')
|
|
parent_item.appendRow(author_item)
|
|
parent_item = author_item
|
|
|
|
if totalnum > 0:
|
|
for k, v in authnum.items():
|
|
item = QStandardItem('{} ({})'.format(k, v))
|
|
icon = QIcon()
|
|
icon.addFile(u":/icons/user.png", QSize(), QIcon.Normal, QIcon.Off)
|
|
item.setIcon(icon)
|
|
item.setAccessibleDescription('leaf')
|
|
author_item.appendRow(item)
|
|
|
|
self.ui.treeView.setModel(self.ui.model)
|
|
self.ui.treeView.expandAll()
|
|
|
|
def config(self):
|
|
print("call slot config()")
|
|
pass
|
|
|
|
def words(self):
|
|
print("call slot words()")
|
|
pass
|
|
|
|
def statistic(self):
|
|
print("call slot statistic()")
|
|
pass
|
|
|
|
def homepage(self):
|
|
print("call slot homepage()")
|
|
pass
|
|
|
|
def about(self):
|
|
self.messagebox(ico=1, info='\n'+ \
|
|
' kindle management tool \n\n' + \
|
|
' v1.0.4\n\n' + \
|
|
' Author: chengan\n\n' + \
|
|
' douboer@gmail.com')
|
|
|
|
print("call slot about()")
|
|
pass
|
|
|
|
def refresh(self):
|
|
print("call slot refresh()")
|
|
pass
|
|
|
|
def messagebox(self, ico=1, info=''):
|
|
""" unify messagebox
|
|
Args: ico - QMessageBox.NoIcon 0
|
|
QMessageBox.Information 1
|
|
QMessageBox.Warning 2
|
|
QMessageBox.Critical 3
|
|
QMessageBox.Question 4
|
|
"""
|
|
icons = {0:QMessageBox.NoIcon, \
|
|
1:QMessageBox.Information, \
|
|
2:QMessageBox.Warning, \
|
|
3:QMessageBox.Critical, \
|
|
4:QMessageBox.Question }
|
|
msgBox = QMessageBox()
|
|
msgBox.setText(info)
|
|
msgBox.setInformativeText("")
|
|
msgBox.setIcon(icons[ico])
|
|
msgBox.setStandardButtons(QMessageBox.Cancel | QMessageBox.Ok)
|
|
msgBox.setBaseSize(QSize(600, 300))
|
|
r = msgBox.exec()
|
|
|
|
## XXXX
|
|
def closeEvent(self, e):
|
|
# 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):
|
|
super(nTableModel, self).__init__()
|
|
self.seclist = None
|
|
|
|
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()"))
|
|
|
|
self.seclist = sorted(self.seclist, key=operator.itemgetter(col))
|
|
if order == Qt.DescendingOrder:
|
|
self.seclist.reverse()
|
|
|
|
self.emit(SIGNAL("layoutChanged()"))
|
|
|
|
if __name__ == "__main__":
|
|
|
|
app = QApplication(sys.argv)
|
|
kmw = kmanWindow()
|
|
kmw.resize(900, 600)
|
|
kmw.show()
|
|
|
|
# loop check kindle is connected or not
|
|
# BUG to be implement XXXX
|
|
"""
|
|
try:
|
|
t = threading.Thread(target=kmw.check_kindle_status)
|
|
t.start()
|
|
except:
|
|
print ("Error: can not start thread")
|
|
"""
|
|
|
|
app.exec_()
|
|
|