From e063fbfeb415fb122794dda34d8ad2ea6f78cada Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 8 Oct 2007 02:21:34 +0000 Subject: [PATCH] Add open ebook button and config dialog to lrfviewer. --- src/libprs500/gui2/lrf_renderer/config.ui | 107 ++++++++++++++++++++++ src/libprs500/gui2/lrf_renderer/main.py | 95 +++++++++++++++---- src/libprs500/gui2/lrf_renderer/main.ui | 30 ++++++ 3 files changed, 216 insertions(+), 16 deletions(-) create mode 100644 src/libprs500/gui2/lrf_renderer/config.ui diff --git a/src/libprs500/gui2/lrf_renderer/config.ui b/src/libprs500/gui2/lrf_renderer/config.ui new file mode 100644 index 0000000000..f8e20bf915 --- /dev/null +++ b/src/libprs500/gui2/lrf_renderer/config.ui @@ -0,0 +1,107 @@ + + ViewerConfig + + + + 0 + 0 + 281 + 214 + + + + Configure Viewer + + + :/images/config.svg + + + + + + Use white background + + + + + + + Hyphenate + + + true + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok + + + + + + + Qt::WindowModal + + + QFrame::Box + + + <b>Changes will only take affect after a restart. + + + Qt::RichText + + + Qt::AlignCenter + + + true + + + + + + + + + + + buttonBox + accepted() + ViewerConfig + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ViewerConfig + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/libprs500/gui2/lrf_renderer/main.py b/src/libprs500/gui2/lrf_renderer/main.py index c5fcce2a81..7e2645ad92 100644 --- a/src/libprs500/gui2/lrf_renderer/main.py +++ b/src/libprs500/gui2/lrf_renderer/main.py @@ -12,12 +12,14 @@ ## You should have received a copy of the GNU General Public License along ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +from libprs500.gui2 import choose_files '''''' -import sys, logging, os, traceback, time +import sys, logging, os, traceback, time, cPickle, copy -from PyQt4.QtGui import QApplication, QKeySequence, QPainter -from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread +from PyQt4.QtGui import QApplication, QKeySequence, QPainter, QDialog +from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread, \ + QSettings, QVariant from libprs500 import __appname__, __version__, __author__, setup_cli_handlers, islinux from libprs500.ebooks.lrf.parser import LRFDocument @@ -25,6 +27,7 @@ from libprs500.ebooks.lrf.parser import LRFDocument from libprs500.gui2 import ORG_NAME, APP_UID, error_dialog from libprs500.gui2.dialogs.conversion_error import ConversionErrorDialog from libprs500.gui2.lrf_renderer.main_ui import Ui_MainWindow +from libprs500.gui2.lrf_renderer.config_ui import Ui_ViewerConfig from libprs500.gui2.main_window import MainWindow from libprs500.gui2.lrf_renderer.document import Document @@ -56,9 +59,18 @@ class RenderWorker(QThread): self.aborted = True self.lrf.keep_parsing = False +class Config(QDialog, Ui_ViewerConfig): + + def __init__(self, parent, opts): + QDialog.__init__(self, parent) + Ui_ViewerConfig.__init__(self) + self.setupUi(self) + self.white_background.setChecked(opts.white_background) + self.hyphenate.setChecked(opts.hyphenate) + class Main(MainWindow, Ui_MainWindow): - def __init__(self, stream, logger, opts, parent=None): + def __init__(self, logger, opts, parent=None): MainWindow.__init__(self, parent) Ui_MainWindow.__init__(self) self.setupUi(self) @@ -66,19 +78,13 @@ class Main(MainWindow, Ui_MainWindow): self.setWindowTitle(__appname__ + ' - LRF Viewer') self.logger = logger - self.file_name = os.path.basename(stream.name) if hasattr(stream, 'name') else '' self.opts = opts self.document = None - self.renderer = RenderWorker(self, stream, logger, opts) - QObject.connect(self.renderer, SIGNAL('finished()'), self.parsed, Qt.QueuedConnection) self.document = Document(self.logger, self.opts) QObject.connect(self.document, SIGNAL('chapter_rendered(int)'), self.chapter_rendered) QObject.connect(self.document, SIGNAL('page_changed(PyQt_PyObject)'), self.page_changed) - self.search.help_text = 'Search' - self.search.clear_to_help() QObject.connect(self.search, SIGNAL('search(PyQt_PyObject, PyQt_PyObject)'), self.find) - self.last_search = None self.action_next_page.setShortcuts(QKeySequence.MoveToNextPage) self.action_previous_page.setShortcuts(QKeySequence.MoveToPreviousPage) @@ -89,6 +95,8 @@ class Main(MainWindow, Ui_MainWindow): QObject.connect(self.action_back, SIGNAL('triggered(bool)'), self.back) QObject.connect(self.action_forward, SIGNAL('triggered(bool)'), self.forward) QObject.connect(self.action_next_match, SIGNAL('triggered(bool)'), self.next_match) + QObject.connect(self.action_open_ebook, SIGNAL('triggered(bool)'), self.open_ebook) + QObject.connect(self.action_configure, SIGNAL('triggered(bool)'), self.configure) QObject.connect(self.spin_box, SIGNAL('valueChanged(int)'), self.go_to_page) QObject.connect(self.slider, SIGNAL('valueChanged(int)'), self.go_to_page) @@ -96,6 +104,8 @@ class Main(MainWindow, Ui_MainWindow): self.previous_button.setDefaultAction(self.action_previous_page) self.back_button.setDefaultAction(self.action_back) self.forward_button.setDefaultAction(self.action_forward) + self.open_button.setDefaultAction(self.action_open_ebook) + self.configure_button.setDefaultAction(self.action_configure) self.graphics_view.setRenderHint(QPainter.Antialiasing, True) self.graphics_view.setRenderHint(QPainter.TextAntialiasing, True) @@ -104,13 +114,50 @@ class Main(MainWindow, Ui_MainWindow): self.closed = False + def configure(self, triggered): + opts = cPickle.loads(str(QSettings().value('ebook viewer options', QVariant(cPickle.dumps(self.opts))).toString())) + d = Config(self, opts) + d.exec_() + if d.result() == QDialog.Accepted: + opts.white_background = bool(d.white_background.isChecked()) + opts.hyphenate = bool(d.hyphenate.isChecked()) + QSettings().setValue('ebook viewer options', QVariant(cPickle.dumps(opts))) + + def set_ebook(self, stream): + self.progress_bar.setMinimum(0) + self.progress_bar.setMaximum(0) + self.progress_bar.setValue(0) + + if stream is not None: + self.file_name = os.path.basename(stream.name) if hasattr(stream, 'name') else '' + self.progress_label.setText('Parsing '+ self.file_name) + self.renderer = RenderWorker(self, stream, self.logger, self.opts) + QObject.connect(self.renderer, SIGNAL('finished()'), self.parsed, Qt.QueuedConnection) + self.search.help_text = 'Search' + self.search.clear_to_help() + self.last_search = None + else: + self.stack.setCurrentIndex(0) + self.renderer = None + + def open_ebook(self, triggered): + files = choose_files(self, 'open ebook dialog', 'Choose ebook', + [('Ebooks', ['lrf'])], all_files=False, + select_only_single_file=True) + if files: + file = files[0] + self.set_ebook(open(file, 'rb')) + self.render() + + def page_changed(self, num): self.slider.setValue(num) self.spin_box.setValue(num) def render(self): - self.stack.setCurrentIndex(1) - self.renderer.start() + if self.renderer is not None: + self.stack.setCurrentIndex(1) + self.renderer.start() def find(self, search, refinement): self.last_search = search @@ -186,7 +233,7 @@ class Main(MainWindow, Ui_MainWindow): self.document.back() def closeEvent(self, event): - if self.renderer.isRunning(): + if self.renderer is not None and self.renderer.isRunning(): self.renderer.abort() self.renderer.wait() self.emit(SIGNAL('viewer_closed(PyQt_PyObject)'), self) @@ -204,7 +251,9 @@ def file_renderer(stream, opts, parent=None, logger=None): call('xdg-mime default libprs500-lrfviewer.desktop application/lrf', shell=True) except: pass - return Main(stream, logger, opts, parent=parent) + m = Main(logger, opts, parent=parent) + m.set_ebook(stream) + return m def option_parser(): @@ -223,10 +272,22 @@ def option_parser(): help='Profile the LRF renderer') return parser +def normalize_settings(parser, opts): + settings = QSettings() + saved_opts = cPickle.loads(str(settings.value('ebook viewer options', QVariant(cPickle.dumps(opts))).toString())) + for opt in parser.option_list: + if not opt.dest: + continue + if getattr(opts, opt.dest) == opt.default: + continue + setattr(saved_opts, opt.dest, getattr(opts, opt.dest)) + return saved_opts + + def main(args=sys.argv, logger=None): parser = option_parser() opts, args = parser.parse_args(args) - if len(args) != 2: + if hasattr(opts, 'help'): parser.print_help() return 1 pid = os.fork() if islinux else -1 @@ -234,7 +295,9 @@ def main(args=sys.argv, logger=None): app = QApplication(args) QCoreApplication.setOrganizationName(ORG_NAME) QCoreApplication.setApplicationName(APP_UID) - main = file_renderer(open(args[1], 'rb'), opts, logger=logger) + opts = normalize_settings(parser, opts) + stream = open(args[1], 'rb') if len(args) > 1 else None + main = file_renderer(stream, opts, logger=logger) sys.excepthook = main.unhandled_exception main.show() main.render() diff --git a/src/libprs500/gui2/lrf_renderer/main.ui b/src/libprs500/gui2/lrf_renderer/main.ui index a88949ee61..d86ee71165 100644 --- a/src/libprs500/gui2/lrf_renderer/main.ui +++ b/src/libprs500/gui2/lrf_renderer/main.ui @@ -102,6 +102,20 @@ + + + + ... + + + + + + + ... + + + @@ -255,6 +269,22 @@ Next match + + + :/images/document_open.svg + + + Open ebook + + + + + :/images/config.svg + + + Configure + +