diff --git a/calibre-plugin/common_utils.py b/calibre-plugin/common_utils.py index ba7e376..73ac823 100644 --- a/calibre-plugin/common_utils.py +++ b/calibre-plugin/common_utils.py @@ -8,12 +8,19 @@ __copyright__ = '2011, Grant Drake ' __docformat__ = 'restructuredtext en' import os -from PyQt4 import QtGui -from PyQt4.Qt import (Qt, QIcon, QPixmap, QLabel, QDialog, QHBoxLayout, - QTableWidgetItem, QFont, QLineEdit, QComboBox, - QVBoxLayout, QDialogButtonBox, QStyledItemDelegate, QDateTime, - QTextEdit, - QListWidget, QAbstractItemView) +try: + from PyQt5 import QtWidgets as QtGui + from PyQt5.Qt import (Qt, QIcon, QPixmap, QLabel, QDialog, QHBoxLayout, + QTableWidgetItem, QFont, QLineEdit, QComboBox, + QVBoxLayout, QDialogButtonBox, QStyledItemDelegate, QDateTime, + QTextEdit, QListWidget, QAbstractItemView) +except ImportError as e: + from PyQt4 import QtGui + from PyQt4.Qt import (Qt, QIcon, QPixmap, QLabel, QDialog, QHBoxLayout, + QTableWidgetItem, QFont, QLineEdit, QComboBox, + QVBoxLayout, QDialogButtonBox, QStyledItemDelegate, QDateTime, + QTextEdit, QListWidget, QAbstractItemView) + from calibre.constants import iswindows from calibre.gui2 import gprefs, error_dialog, UNDEFINED_QDATETIME, info_dialog from calibre.gui2.actions import menu_action_unique_name diff --git a/calibre-plugin/config.py b/calibre-plugin/config.py index 8a2dd92..ffe651d 100644 --- a/calibre-plugin/config.py +++ b/calibre-plugin/config.py @@ -4,7 +4,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) __license__ = 'GPL v3' -__copyright__ = '2012, Jim Miller' +__copyright__ = '2014, Jim Miller' __docformat__ = 'restructuredtext en' import logging @@ -13,10 +13,16 @@ logger = logging.getLogger(__name__) import traceback, copy, threading from collections import OrderedDict -from PyQt4.Qt import (QDialog, QWidget, QVBoxLayout, QHBoxLayout, QLabel, - QLineEdit, QFont, QWidget, QTextEdit, QComboBox, - QCheckBox, QPushButton, QTabWidget, QVariant, QScrollArea, - QDialogButtonBox, QGroupBox ) +try: + from PyQt5.Qt import (QDialog, QWidget, QVBoxLayout, QHBoxLayout, QLabel, + QLineEdit, QFont, QWidget, QTextEdit, QComboBox, + QCheckBox, QPushButton, QTabWidget, QScrollArea, + QDialogButtonBox, QGroupBox ) +except ImportError as e: + from PyQt4.Qt import (QDialog, QWidget, QVBoxLayout, QHBoxLayout, QLabel, + QLineEdit, QFont, QWidget, QTextEdit, QComboBox, + QCheckBox, QPushButton, QTabWidget, QScrollArea, + QDialogButtonBox, QGroupBox ) from calibre.gui2.ui import get_gui from calibre.gui2 import dynamic, info_dialog @@ -60,7 +66,7 @@ from calibre_plugins.fanfictiondownloader_plugin.fanficdownloader.adapters \ from calibre_plugins.fanfictiondownloader_plugin.common_utils \ import ( KeyboardConfigDialog, PrefsViewerDialog ) -from calibre.gui2.complete import MultiCompleteLineEdit +from calibre.gui2.complete2 import EditWithComplete #MultiCompleteLineEdit class RejectURLList: def __init__(self,prefs): @@ -220,6 +226,7 @@ class ConfigWidget(QWidget): prefs['checkforurlchange'] = self.basic_tab.checkforurlchange.isChecked() prefs['injectseries'] = self.basic_tab.injectseries.isChecked() prefs['smarten_punctuation'] = self.basic_tab.smarten_punctuation.isChecked() + prefs['reject_always'] = self.basic_tab.reject_always.isChecked() if self.readinglist_tab: # lists @@ -482,6 +489,11 @@ class BasicTab(QWidget): self.reject_reasons.clicked.connect(self.show_reject_reasons) self.l.addWidget(self.reject_reasons) + self.reject_always = QCheckBox(_('Reject Silently?'),self) + self.reject_always.setToolTip(_("Always URLs on the Reject List without stopping and asking.")) + self.reject_always.setChecked(prefs['reject_always']) + self.l.addWidget(self.reject_always) + topl.addWidget(defs_gb) horz = QHBoxLayout() @@ -649,7 +661,7 @@ class ReadingListTab(QWidget): label = QLabel(_('"Send to Device" Reading Lists')) label.setToolTip(_("When enabled, new/updated stories will be automatically added to these lists.")) horz.addWidget(label) - self.send_lists_box = MultiCompleteLineEdit(self) + self.send_lists_box = EditWithComplete(self) self.send_lists_box.setToolTip(_("When enabled, new/updated stories will be automatically added to these lists.")) self.send_lists_box.update_items_cache(reading_lists) self.send_lists_box.setText(prefs['send_lists']) @@ -665,7 +677,7 @@ class ReadingListTab(QWidget): label = QLabel(_('"To Read" Reading Lists')) label.setToolTip(_("When enabled, new/updated stories will be automatically added to these lists.")) horz.addWidget(label) - self.read_lists_box = MultiCompleteLineEdit(self) + self.read_lists_box = EditWithComplete(self) self.read_lists_box.setToolTip(_("When enabled, new/updated stories will be automatically added to these lists.")) self.read_lists_box.update_items_cache(reading_lists) self.read_lists_box.setText(prefs['read_lists']) @@ -727,17 +739,17 @@ class GenerateCoverTab(QWidget): horz.addWidget(label) dropdown = QComboBox(self) dropdown.setToolTip(s) - dropdown.addItem('',QVariant('none')) + dropdown.addItem('','none') for setting in gc_settings: - dropdown.addItem(setting,QVariant(setting)) + dropdown.addItem(setting,setting) if site == _("Default"): self.gc_dropdowns["Default"] = dropdown if 'Default' in prefs['gc_site_settings']: - dropdown.setCurrentIndex(dropdown.findData(QVariant(prefs['gc_site_settings']['Default']))) + dropdown.setCurrentIndex(dropdown.findData(prefs['gc_site_settings']['Default'])) else: self.gc_dropdowns[site] = dropdown if site in prefs['gc_site_settings']: - dropdown.setCurrentIndex(dropdown.findData(QVariant(prefs['gc_site_settings'][site]))) + dropdown.setCurrentIndex(dropdown.findData(prefs['gc_site_settings'][site])) horz.addWidget(dropdown) self.sl.addLayout(horz) @@ -966,12 +978,12 @@ class CustomColumnsTab(QWidget): label.setToolTip(_("Update this %s column(%s) with...")%(key,column['datatype'])) horz.addWidget(label) dropdown = QComboBox(self) - dropdown.addItem('',QVariant('none')) + dropdown.addItem('','none') for md in permitted_values[column['datatype']]: - dropdown.addItem(titleLabels[md],QVariant(md)) + dropdown.addItem(titleLabels[md],md) self.custcol_dropdowns[key] = dropdown if key in prefs['custom_cols']: - dropdown.setCurrentIndex(dropdown.findData(QVariant(prefs['custom_cols'][key]))) + dropdown.setCurrentIndex(dropdown.findData(prefs['custom_cols'][key])) if column['datatype'] == 'enumeration': dropdown.setToolTip(_("Metadata values valid for this type of column.")+"\n"+_("Values that aren't valid for this enumeration column will be ignored.")) else: @@ -1007,11 +1019,11 @@ class CustomColumnsTab(QWidget): horz.addWidget(label) self.errorcol = QComboBox(self) self.errorcol.setToolTip(tooltip) - self.errorcol.addItem('',QVariant('none')) + self.errorcol.addItem('','none') for key, column in custom_columns.iteritems(): if column['datatype'] in ('text','comments'): - self.errorcol.addItem(column['name'],QVariant(key)) - self.errorcol.setCurrentIndex(self.errorcol.findData(QVariant(prefs['errorcol']))) + self.errorcol.addItem(column['name'],key) + self.errorcol.setCurrentIndex(self.errorcol.findData(prefs['errorcol'])) horz.addWidget(self.errorcol) self.l.addLayout(horz) diff --git a/calibre-plugin/dialogs.py b/calibre-plugin/dialogs.py index ef7b097..aa05999 100644 --- a/calibre-plugin/dialogs.py +++ b/calibre-plugin/dialogs.py @@ -19,12 +19,36 @@ logger = logging.getLogger(__name__) import urllib import email -from PyQt4 import QtGui -from PyQt4.Qt import (QDialog, QTableWidget, QVBoxLayout, QHBoxLayout, QGridLayout, - QPushButton, QString, QLabel, QCheckBox, QIcon, QLineEdit, - QComboBox, QVariant, QProgressDialog, QTimer, QDialogButtonBox, - QPixmap, Qt, QAbstractItemView, SIGNAL, QTextEdit, pyqtSignal, - QGroupBox, QFrame) +try: + from PyQt5 import QtWidgets as QtGui + from PyQt5.Qt import (QDialog, QTableWidget, QVBoxLayout, QHBoxLayout, QGridLayout, + QPushButton, QLabel, QCheckBox, QIcon, QLineEdit, + QComboBox, QProgressDialog, QTimer, QDialogButtonBox, + QPixmap, Qt, QAbstractItemView, QTextEdit, pyqtSignal, + QGroupBox, QFrame) +except ImportError as e: + from PyQt4 import QtGui + from PyQt4.Qt import (QDialog, QTableWidget, QVBoxLayout, QHBoxLayout, QGridLayout, + QPushButton, QLabel, QCheckBox, QIcon, QLineEdit, + QComboBox, QProgressDialog, QTimer, QDialogButtonBox, + QPixmap, Qt, QAbstractItemView, QTextEdit, pyqtSignal, + QGroupBox, QFrame) + +try: + from calibre.gui2 import QVariant + del QVariant +except ImportError: + is_qt4 = False + convert_qvariant = lambda x: x +else: + is_qt4 = True + def convert_qvariant(x): + vt = x.type() + if vt == x.String: + return unicode(x.toString()) + if vt == x.List: + return [convert_qvariant(i) for i in x.toList()] + return x.toPyObject() from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.complete2 import EditWithComplete @@ -559,7 +583,7 @@ class LoopProgressDialog(QProgressDialog): status_prefix=_("Fetched metadata for")): QProgressDialog.__init__(self, init_label, - QString(), 0, len(book_list), gui) + _('Cancel'), 0, len(book_list), gui) self.setWindowTitle(win_title) self.setMinimumWidth(500) self.book_list = book_list @@ -829,11 +853,11 @@ class StoryListTableWidget(QTableWidget): icon = get_icon(book['icon']) status_cell = IconWidgetItem(None,icon,val) - status_cell.setData(Qt.UserRole, QVariant(val)) + status_cell.setData(Qt.UserRole, val) self.setItem(row, 0, status_cell) title_cell = ReadOnlyTableWidgetItem(book['title']) - title_cell.setData(Qt.UserRole, QVariant(row)) + title_cell.setData(Qt.UserRole, row) self.setItem(row, 1, title_cell) self.setItem(row, 2, AuthorTableWidgetItem(", ".join(book['author']), ", ".join(book['author_sort']))) @@ -848,7 +872,7 @@ class StoryListTableWidget(QTableWidget): books = [] #print("=========================\nbooks:%s"%self.books) for row in range(self.rowCount()): - rnum = self.item(row, 1).data(Qt.UserRole).toPyObject() + rnum = convert_qvariant(self.item(row, 1).data(Qt.UserRole)) book = self.books[rnum] books.append(book) return books @@ -914,7 +938,7 @@ class RejectListTableWidget(QTableWidget): def populate_table_row(self, row, rej): url_cell = ReadOnlyTableWidgetItem(rej.url) - url_cell.setData(Qt.UserRole, QVariant(rej.book_id)) + url_cell.setData(Qt.UserRole, rej.book_id) self.setItem(row, 0, url_cell) self.setItem(row, 1, ReadOnlyTableWidgetItem(rej.title)) self.setItem(row, 2, ReadOnlyTableWidgetItem(rej.auth)) @@ -1037,7 +1061,7 @@ class RejectListDialog(SizePersistedDialog): rejectrows = [] for row in range(self.rejects_table.rowCount()): url = unicode(self.rejects_table.item(row, 0).text()).strip() - book_id = self.rejects_table.item(row, 0).data(Qt.UserRole).toPyObject() + book_id =convert_qvariant(self.rejects_table.item(row, 0).data(Qt.UserRole)) title = unicode(self.rejects_table.item(row, 1).text()).strip() auth = unicode(self.rejects_table.item(row, 2).text()).strip() note = unicode(self.rejects_table.cellWidget(row, 3).currentText()).strip() @@ -1047,7 +1071,7 @@ class RejectListDialog(SizePersistedDialog): def get_reject_list_ids(self): rejectrows = [] for row in range(self.rejects_table.rowCount()): - book_id = self.rejects_table.item(row, 0).data(Qt.UserRole).toPyObject() + book_id = convert_qvariant(self.rejects_table.item(row, 0).data(Qt.UserRole)) if book_id: rejectrows.append(book_id) return rejectrows diff --git a/calibre-plugin/ffdl_plugin.py b/calibre-plugin/ffdl_plugin.py index d101232..a5759ae 100644 --- a/calibre-plugin/ffdl_plugin.py +++ b/calibre-plugin/ffdl_plugin.py @@ -4,7 +4,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) __license__ = 'GPL v3' -__copyright__ = '2012, Jim Miller' +__copyright__ = '2014, Jim Miller' __docformat__ = 'restructuredtext en' import logging @@ -19,10 +19,12 @@ import urllib import email import traceback -from PyQt4.Qt import (QApplication, QMenu, QToolButton, QTimer) - -from PyQt4.Qt import QPixmap, Qt -from PyQt4.QtCore import QBuffer +try: + from PyQt5.Qt import (QApplication, QMenu, QTimer) + from PyQt5.QtCore import QBuffer +except ImportError as e: + from PyQt4.Qt import (QApplication, QMenu, QTimer) + from PyQt4.QtCore import QBuffer from calibre.constants import numeric_version as calibre_version @@ -764,7 +766,7 @@ class FanFictionDownLoaderPlugin(InterfaceAction): if not merge: # skip reject list when merging. if rejecturllist.check(url): rejnote = rejecturllist.get_full_note(url) - if question_dialog(self.gui, _('Reject URL?'),''' + if prefs['reject_always'] or question_dialog(self.gui, _('Reject URL?'),'''

%s

%s

"%s"

diff --git a/calibre-plugin/jobs.py b/calibre-plugin/jobs.py index ff657e8..ee8a5f2 100644 --- a/calibre-plugin/jobs.py +++ b/calibre-plugin/jobs.py @@ -4,7 +4,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) __license__ = 'GPL v3' -__copyright__ = '2012, Jim Miller' +__copyright__ = '2014, Jim Miller' __copyright__ = '2011, Grant Drake ' __docformat__ = 'restructuredtext en' diff --git a/calibre-plugin/prefs.py b/calibre-plugin/prefs.py index 3cfb397..90af87b 100644 --- a/calibre-plugin/prefs.py +++ b/calibre-plugin/prefs.py @@ -25,6 +25,7 @@ default_prefs['rejecturls'] = '' default_prefs['rejectreasons'] = '''Sucked Boring Dup from another site''' +default_prefs['reject_always'] = False default_prefs['updatemeta'] = True default_prefs['updatecover'] = False diff --git a/fanficdownloader/epubutils.py b/fanficdownloader/epubutils.py index 9b2ca39..6d2e6ff 100644 --- a/fanficdownloader/epubutils.py +++ b/fanficdownloader/epubutils.py @@ -4,7 +4,7 @@ from __future__ import (unicode_literals, division, absolute_import, print_function) __license__ = 'GPL v3' -__copyright__ = '2012, Jim Miller' +__copyright__ = '2014, Jim Miller' __docformat__ = 'restructuredtext en' import logging