Exemple #1
0
 def do_update(self):
     self.when_progress(10)
     proxy = self.conf.getProxy()
     self.special = Special(proxy[0], proxy[1], proxy[2])
     self.special.bind(Special.EVT_FIND_LINK, self.cbAddUrl)
     self.special.bind(Special.EVT_FIND_BOOK, self.cbAddBook)
     self.special.start()
     self.when_progress(100)
Exemple #2
0
 def onUpdate(self, event):
     self.gauge.SetValue(10)
     proxy = self.conf.getProxy()
     special = Special(proxy[0], proxy[1], proxy[2])
     special.bind(Special.EVT_FIND_LINK, self.cbAddUrl)
     special.bind(Special.EVT_FIND_BOOK, self.cbAddBook)
     special.start()
     self.gauge.SetValue(100)
Exemple #3
0
 def onUpdate(self, event):
     self.gauge.SetValue(10)
     proxy = self.conf.getProxy()
     special = Special(proxy[0], proxy[1], proxy[2])
     special.bind(Special.EVT_FIND_LINK, self.cbAddUrl)
     special.bind(Special.EVT_FIND_BOOK, self.cbAddBook)
     special.start()
     self.gauge.SetValue(100)
Exemple #4
0
class MainWindow(QMainWindow):
    tsize = (20, 20)

    BG_FREED = QtGui.QColor(255, 255, 153)
    BG_DOWN = QtGui.QColor(146, 208, 80)

    (COLUMN_ID, COLUMN_TITLE, COLUMN_AUTHOR, COLUMN_LINK, COLUMN_PROGRESS) = range(0, 5)
    COLUMNS_WIDTH = [50, 200, 200, 200, 200, 100]

    def __init__(self):
        self.duokan     = Duokan()
        self.conf       = Config()
        self.special    = None
        self.downloader = None
        self.powerOff   = False

        self.tag = MainWindow.__name__
        super( MainWindow, self ).__init__()

        self.ui= Ui_MainWindow()
        self.ui.setupUi(self)
        self.setupPopup()

        self.bindSignal()

    def setupPopup(self):
        self.ui.tableWidget_books.addAction(self.ui.action_list_view_in_browser)
        self.ui.tableWidget_books.addAction(self.ui.action_list_download)
        self.ui.tableWidget_books.addAction(self.ui.action_list_remove)
        self.ui.tableWidget_books.addAction(self.ui.action_list_merge)
        self.ui.tableWidget_books.addAction(self.ui.action_list_crop)
        self.ui.tableWidget_books.addAction(self.ui.action_list_rename)
        self.ui.tableWidget_books.addAction(self.ui.action_list_mark_download)

    def bindSignal(self):
        QtCore.QObject.connect(self, QtCore.SIGNAL("when_information(QString, QString)"), self.do_message)
        QtCore.QObject.connect(self, QtCore.SIGNAL("when_item_progress(QString, QString)"), self.do_itemProgress)
        QtCore.QObject.connect(self, QtCore.SIGNAL("when_add_book(QString, QString, QString, QString, bool, bool)"), self.appendItem)

    def appendItem(self, id, title='', author='', link='', freed=False, done=False):
        row = self.ui.tableWidget_books.rowCount()
        self.when_add_book(row)

        item = QTableWidgetItem(id)
        self.ui.tableWidget_books.setItem(row, MainWindow.COLUMN_ID, item)

        item = QTableWidgetItem(title)
        self.ui.tableWidget_books.setItem(row, MainWindow.COLUMN_TITLE, item)

        item = QTableWidgetItem(author)
        self.ui.tableWidget_books.setItem(row, MainWindow.COLUMN_AUTHOR, item)

        item = QTableWidgetItem(link)
        self.ui.tableWidget_books.setItem(row, MainWindow.COLUMN_LINK, item)

        # item = QTableWidgetItem(progress)
        item = QProgressBar(self)
        item.setRange(0, 100)
        item.setValue(0)
        item.setTextVisible(True)
        item.setMaximumHeight(15)
        item.setTextDirection(QtGui.QProgressBar.TopToBottom)
        self.ui.tableWidget_books.setCellWidget(row, MainWindow.COLUMN_PROGRESS, item)

        if freed:
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).setBackgroundColor(MainWindow.BG_FREED)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).setBackgroundColor(MainWindow.BG_FREED)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_AUTHOR).setBackgroundColor(MainWindow.BG_FREED)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_LINK).setBackgroundColor(MainWindow.BG_FREED)
        if done:
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).setBackgroundColor(MainWindow.BG_DOWN)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).setBackgroundColor(MainWindow.BG_DOWN)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_AUTHOR).setBackgroundColor(MainWindow.BG_DOWN)
            self.ui.tableWidget_books.item(row, MainWindow.COLUMN_LINK).setBackgroundColor(MainWindow.BG_DOWN)

        self.adjustListWidth()

    def adjustListWidth(self):
        self.ui.tableWidget_books.resizeColumnsToContents()

    # set download column progress
    def setProgress(self, row, prog):
        if row >= 0 and row < self.ui.tableWidget_books.rowCount():
            item = self.ui.tableWidget_books.cellWidget(row, MainWindow.COLUMN_PROGRESS)
            item.setValue(prog)

    # for duoSpider
    def cbAddUrl(self, event, url):
        self.when_special_url(url)

    # for duoSpider
    def cbAddBook(self, event, id, title, author, link):
        notFreed = self.duokan.addBook(id, title, author, link)
        download = self.duokan.isDownload(id)
        self.when_add_book_info(id, title, author, link, (not notFreed), download)

    def startDownload(self):
        if self.downloadRow < self.ui.tableWidget_books.rowCount():
            id = _fromQString(self.ui.tableWidget_books.item(self.downloadRow, MainWindow.COLUMN_ID).text())
            proxy = self.conf.getProxy()
            self.downloader = Downloader(id, id, proxy[0], proxy[1], proxy[2])
            self.downloader.bind(Downloader.EVT_START, self.cbStart)
            self.downloader.bind(Downloader.EVT_STOP, self.cbStop)
            self.downloader.bind(Downloader.EVT_LOG, self.cbLog)
            self.downloader.bind(Downloader.EVT_PROG, self.cbProgress)
            self.downloader.start()

    # for downloader
    def cbStart(self, event):
        self.when_itemProgress(self.downloadRow, 100)
        self.when_progress(0)

    # for downloader
    def cbStop(self, event):
        self.when_itemProgress(self.downloadRow, 100)
        self.when_progress(100)
        # self.list.SetItemBackgroundColour(self.downloadIdx, MainWindow.BG_DOWN)

        # start next
        self.downloadRow += 1
        self.startDownload()

        if self.downloadRow >= self.ui.tableWidget_books.rowCount():
            if self.powerOff:
                os.system('shutdown -t 60 -f -s')

    # for downloader
    def cbLog(self, event, str):
        self.when_logging(str)

    # for downloader
    def cbProgress(self, event, prog):
        self.when_progress(prog)

### signals and slots
    # signals
    def when_logging(self, logStr):
        self.emit(QtCore.SIGNAL("when_logging(QString)"), logStr)

    def when_special_url(self, url):
        self.emit(QtCore.SIGNAL("when_special_url(QString)"), url)

    def when_status(self, text):
        self.emit(QtCore.SIGNAL("when_status(QString)"), text)
    def when_add_book(self, row):
        self.emit(QtCore.SIGNAL("when_add_book(int)"), row)

    def when_del_book(self, row):
        self.emit(QtCore.SIGNAL("when_del_book(int)"), row)

    def when_progress(self, prog):
        self.emit(QtCore.SIGNAL("when_progress(int)"), prog)

    # self defined signal##############################################################################################
    def when_information(self, text, title='', info=True):
        self.emit(QtCore.SIGNAL("when_status(QString)"), '%s --> %s' % (title, text))
        if info:
            self.emit(QtCore.SIGNAL("when_information(QString, QString)"), text, title)

    def when_itemProgress(self, row, prog):
        self.emit(QtCore.SIGNAL("when_item_progress(int, int)"), row, prog)

    def when_add_book_info(self, id, title, author, link, freed=False, done=False):
        self.emit(QtCore.SIGNAL("when_add_book(QString, QString, QString, QString, bool, bool)"),
                  _fromUtf8(id), _fromUtf8(title), _fromUtf8(author), _fromUtf8(link), freed, done)

    # slots
    def do_update(self):
        self.when_progress(10)
        proxy = self.conf.getProxy()
        self.special = Special(proxy[0], proxy[1], proxy[2])
        self.special.bind(Special.EVT_FIND_LINK, self.cbAddUrl)
        self.special.bind(Special.EVT_FIND_BOOK, self.cbAddBook)
        self.special.start()
        self.when_progress(100)

    def do_update_stop(self):
        if self.special:
            self.special.stop()
            self.special = None

    def do_download_all(self):
        self.dlgs = []
        for row in range(self.ui.tableWidget_books.rowCount()):
            id    = self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text()
            title = self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).text()
            dlg = DownloaderDlg(self, self.conf, title)
            dlg.setId(id)
            dlg.setName(id)
            dlg.show()
            dlg.resize(640, 200)
            self.dlgs.append(dlg)

        if self.dlgs:
            for i, dlg in enumerate(self.dlgs):
                if i < 5:
                    x = 0
                    y = 190 * i
                else:
                    x = 640
                    y = 190 * (i - 5)
                dlg.resize(640, 190)
                dlg.move(x, y)

    def do_download_stop(self):
        pass

    def do_open_special_in_browser(self):
        self.duokan.openInNewTab(_fromQString(self.ui.lineEdit_specialUrl.text()))

    def do_open_books_folder(self):
        '''open books/new folder'''
        self.duokan.openNewFolder()

    def do_clean_tmp_folder(self):
        self.duokan.cleanTmp()
        self.when_information( 'Finished', 'Clear tmp folder')

    def do_merge_all(self):
        for row in range(self.ui.tableWidget_books.rowCount()):
            id = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            self.duokan.merge(id)
        self.when_information('merge all finished')

    def do_crop_all(self):
        for row in range(self.ui.tableWidget_books.rowCount()):
            id = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            self.duokan.crop(id)
        self.when_information('crop all finished')

    def do_rename_all(self):
        self.duokan.renameAll()
        self.when_information('Finished', 'Rename All')

    def do_done_all(self):
        for row in range(self.ui.tableWidget_books.rowCount()):
            id    = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            title = self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).text()
            self.when_information('Start', 'Merge & Crop & Rename [%s]' % title, False)
            self.duokan.setDownload(id)
            self.duokan.merge(id)
            self.duokan.crop(id)
            self.duokan.rename(id)
            self.when_information('Finished!', 'Merge & Crop & Rename [%s]' % title, False)
        self.when_information('Finished!', 'All Merge & Crop & Rename')

    def do_crop_book(self):
        file_wildcard = "Pdf files (*.pdf)"
        filePath = QFileDialog.getOpenFileName(self, 'Open file to crop', _fromUtf8(os.path.join(os.getcwd(), 'books')), _fromUtf8(file_wildcard))
        if filePath:
            self.duokan.cropSingle(_fromQString(filePath))
            self.when_information( 'Finished!', 'Crop single')

    def do_merge_book(self):
        filePath = QFileDialog.getExistingDirectory(self, 'Open file to crop', _fromUtf8(os.path.join(os.getcwd(), 'tmp')))
        if filePath:
            print _fromQString(filePath)
            self.duokan.mergeSingle(_fromQString(filePath))
            self.when_information('Finished!', 'Merge single')

    def do_crop_4print(self):
        file_wildcard = "Pdf files (*.pdf)"
        filePath = QFileDialog.getOpenFileName(self, 'Open file to crop for printing', _fromUtf8(os.path.join(os.getcwd(), 'books')), _fromUtf8(file_wildcard))
        if filePath:
            self.duokan.crop4Print(_fromQString(filePath))
            self.when_information( 'Finished!', 'Crop for printing')

    def do_crop_4kindle(self):
        file_wildcard = "Pdf files (*.pdf)"
        filePath = QFileDialog.getOpenFileName(self, 'Open file to crop for printing', _fromUtf8(os.path.join(os.getcwd(), 'books')), _fromUtf8(file_wildcard))
        if filePath:
            self.duokan.crop4Kindle(_fromQString(filePath))
            self.when_information( 'Finished!', 'Crop for kindle')

    def do_crop_4nook(self):
        file_wildcard = "Pdf files (*.pdf)"
        filePath = QFileDialog.getOpenFileName(self, 'Open file to crop for printing', _fromUtf8(os.path.join(os.getcwd(), 'books')), _fromUtf8(file_wildcard))
        if filePath:
            self.duokan.crop4Nook(_fromQString(filePath))
            self.when_information('Finished!', 'Crop for nook')

    def on_power_off_setting(self, powerOff):
        self.powerOff = powerOff
        # print powerOff

    def do_destroyed(self):
        print 'destroyed'

    def do_list_view_in_browser(self):
        ''' open link in browser '''
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            url = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_LINK).text())
            self.duokan.openInNewTab(url)

    def do_list_download(self):
        '''download a book'''
        row = self.ui.tableWidget_books.currentRow()
        if row >=0 and row < self.ui.tableWidget_books.rowCount():
            id    = self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text()
            title = self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).text()
            dlg = DownloaderDlg(self, self.conf, title)
            dlg.setId(id)
            dlg.setName(id)
            dlg.show()
        else:
            dlg = DownloaderDlg(self, self.conf)
            dlg.show()

    def do_list_remove(self):
        ''' delete an item '''
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            self.when_del_book(row)

    def do_list_merge(self):
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            id = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            self.duokan.merge(id)
            self.when_information('merge finished')

    def do_list_crop(self):
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            id = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            self.duokan.crop(id)
            self.when_information('crop finished')

    def do_list_rename(self):
        ''' rename a item from id to title '''
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            id    = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            title = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_TITLE).text())
            self.duokan.rename(id, title)
            self.when_information('rename finished')

    def do_list_mark_download(self, row, col):
        row = self.ui.tableWidget_books.currentRow()
        if row != -1:
            id = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_ID).text())
            self.duokan.setDownload(id)

    def do_list_dclick(self, row, col):
        url = _fromQString(self.ui.tableWidget_books.item(row, MainWindow.COLUMN_LINK).text())
        self.duokan.openInNewTab(url)

    # self defined slots ###############################################################################################
    def do_message(self, text, title=''):
        QtGui.QMessageBox.information(self, title, text)

    def do_itemProgress(self, row, prog):
        self.setProgress(row, prog)