def create_document(self): self.document = Document(self.logger, self.opts) self.document.chapter_rendered.connect(self.chapter_rendered) self.document.page_changed.connect(self.page_changed)
def create_document(self): 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)
class Main(MainWindow, Ui_MainWindow): def create_document(self): self.document = Document(self.logger, self.opts) self.document.chapter_rendered.connect(self.chapter_rendered) self.document.page_changed.connect(self.page_changed) def __init__(self, logger, opts, parent=None): MainWindow.__init__(self, opts, parent) Ui_MainWindow.__init__(self) self.setupUi(self) self.setAttribute(Qt.WA_DeleteOnClose) self.setWindowTitle(__appname__ + _(' - LRF Viewer')) self.logger = logger self.opts = opts self.create_document() self.spin_box_action = self.spin_box = QSpinBox() self.tool_bar.addWidget(self.spin_box) self.tool_bar.addSeparator() self.slider_action = self.slider = QSlider(Qt.Horizontal) self.tool_bar.addWidget(self.slider) self.tool_bar.addSeparator() self.search = SearchBox2(self) self.search.initialize('lrf_viewer_search_history') self.search_action = self.tool_bar.addWidget(self.search) self.search.search.connect(self.find) self.action_next_page.setShortcuts([QKeySequence.MoveToNextPage, QKeySequence(Qt.Key_Space)]) self.action_previous_page.setShortcuts([QKeySequence.MoveToPreviousPage, QKeySequence(Qt.Key_Backspace)]) self.action_next_match.setShortcuts(QKeySequence.FindNext) self.addAction(self.action_next_match) self.action_next_page.triggered[(bool)].connect(self.next) self.action_previous_page.triggered[(bool)].connect(self.previous) self.action_back.triggered[(bool)].connect(self.back) self.action_forward.triggered[(bool)].connect(self.forward) self.action_next_match.triggered[(bool)].connect(self.next_match) self.action_open_ebook.triggered[(bool)].connect(self.open_ebook) self.action_configure.triggered[(bool)].connect(self.configure) self.spin_box.valueChanged[(int)].connect(self.go_to_page) self.slider.valueChanged[(int)].connect(self.go_to_page) self.graphics_view.setRenderHint(QPainter.Antialiasing, True) self.graphics_view.setRenderHint(QPainter.TextAntialiasing, True) self.graphics_view.setRenderHint(QPainter.SmoothPixmapTransform, True) self.closed = False def configure(self, triggered): opts = self.opts d = Config(self, opts) d.exec_() if d.result() == QDialog.Accepted: gprefs['lrf_viewer_white_background'] = opts.white_background = bool(d.white_background.isChecked()) gprefs['lrf_viewer_hyphenate'] = opts.hyphenate = bool(d.hyphenate.isChecked()) def set_ebook(self, stream): self.progress_bar.setMinimum(0) self.progress_bar.setMaximum(0) self.progress_bar.setValue(0) self.create_document() 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) self.renderer.finished.connect(self.parsed, type=Qt.QueuedConnection) self.search.clear() 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): if self.renderer is not None: self.stack.setCurrentIndex(1) self.renderer.start() def find(self, search): self.last_search = search try: self.document.search(search) except StopIteration: error_dialog(self, _('No matches found'), _('<b>No matches</b> for the search phrase <i>%s</i> were found.')%(search,)).exec_() self.search.search_done(True) def parsed(self): if not self.renderer.aborted and self.renderer.lrf is not None: width, height = self.renderer.lrf.device_info.width, \ self.renderer.lrf.device_info.height hdelta = self.tool_bar.height()+3 s = QScrollBar(self) scrollbar_adjust = min(s.width(), s.height()) self.graphics_view.resize_for(width+scrollbar_adjust, height+scrollbar_adjust) desktop = QCoreApplication.instance().desktop() screen_height = desktop.availableGeometry(self).height() - 25 height = min(screen_height, height+hdelta+scrollbar_adjust) self.resize(width+scrollbar_adjust, height) self.setWindowTitle(self.renderer.lrf.metadata.title + ' - ' + __appname__) self.document_title = self.renderer.lrf.metadata.title if self.opts.profile: import cProfile lrf = self.renderer.lrf cProfile.runctx('self.document.render(lrf)', globals(), locals(), lrf.metadata.title+'.stats') print('Stats written to', self.renderer.lrf.metadata.title+'.stats') else: start = time.time() self.document.render(self.renderer.lrf) print('Layout time:', time.time()-start, 'seconds') self.renderer.lrf = None self.graphics_view.setScene(self.document) self.graphics_view.show() self.spin_box.setRange(1, self.document.num_of_pages) self.slider.setRange(1, self.document.num_of_pages) self.spin_box.setSuffix(' of %d'%(self.document.num_of_pages,)) self.spin_box.updateGeometry() self.stack.setCurrentIndex(0) self.graphics_view.setFocus(Qt.OtherFocusReason) elif self.renderer.exception is not None: exception = self.renderer.exception print('Error rendering document', file=sys.stderr) print(exception, file=sys.stderr) print(self.renderer.formatted_traceback, file=sys.stderr) msg = u'<p><b>%s</b>: '%(exception.__class__.__name__,) + as_unicode(exception) + u'</p>' msg += u'<p>Failed to render document</p>' msg += u'<p>Detailed <b>traceback</b>:<pre>' msg += self.renderer.formatted_traceback + '</pre>' d = ConversionErrorDialog(self, 'Error while rendering file', msg) d.exec_() def chapter_rendered(self, num): if num > 0: self.progress_bar.setMinimum(0) self.progress_bar.setMaximum(num) self.progress_bar.setValue(0) self.progress_label.setText('Laying out '+ self.document_title) else: self.progress_bar.setValue(self.progress_bar.value()+1) QCoreApplication.processEvents() def next(self, triggered): self.document.next() def next_match(self, triggered): try: self.document.next_match() except StopIteration: pass def previous(self, triggered): self.document.previous() def go_to_page(self, num): self.document.show_page(num) def forward(self, triggered): self.document.forward() def back(self, triggered): self.document.back() def wheelEvent(self, ev): d = ev.angleDelta().y() if d > 0: self.document.previous() elif d < 0: self.document.next() def closeEvent(self, event): if self.renderer is not None and self.renderer.isRunning(): self.renderer.abort() self.renderer.wait() event.accept()