mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Add open ebook button and config dialog to lrfviewer.
This commit is contained in:
parent
f2d3870a5a
commit
e063fbfeb4
107
src/libprs500/gui2/lrf_renderer/config.ui
Normal file
107
src/libprs500/gui2/lrf_renderer/config.ui
Normal file
@ -0,0 +1,107 @@
|
||||
<ui version="4.0" >
|
||||
<class>ViewerConfig</class>
|
||||
<widget class="QDialog" name="ViewerConfig" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>281</width>
|
||||
<height>214</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Configure Viewer</string>
|
||||
</property>
|
||||
<property name="windowIcon" >
|
||||
<iconset resource="../images.qrc" >:/images/config.svg</iconset>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" colspan="2" >
|
||||
<widget class="QCheckBox" name="white_background" >
|
||||
<property name="text" >
|
||||
<string>Use white background</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QCheckBox" name="hyphenate" >
|
||||
<property name="text" >
|
||||
<string>Hyphenate</string>
|
||||
</property>
|
||||
<property name="checked" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1" >
|
||||
<widget class="QDialogButtonBox" name="buttonBox" >
|
||||
<property name="orientation" >
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons" >
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="windowModality" >
|
||||
<enum>Qt::WindowModal</enum>
|
||||
</property>
|
||||
<property name="frameShape" >
|
||||
<enum>QFrame::Box</enum>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string><b>Changes will only take affect after a restart.</string>
|
||||
</property>
|
||||
<property name="textFormat" >
|
||||
<enum>Qt::RichText</enum>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="wordWrap" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources>
|
||||
<include location="../images.qrc" />
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>ViewerConfig</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>ViewerConfig</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel" >
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel" >
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -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()
|
||||
|
@ -102,6 +102,20 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="open_button" >
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="configure_button" >
|
||||
<property name="text" >
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSlider" name="slider" >
|
||||
<property name="orientation" >
|
||||
@ -255,6 +269,22 @@
|
||||
<string>Next match</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_open_ebook" >
|
||||
<property name="icon" >
|
||||
<iconset resource="../images.qrc" >:/images/document_open.svg</iconset>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>Open ebook</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_configure" >
|
||||
<property name="icon" >
|
||||
<iconset resource="../images.qrc" >:/images/config.svg</iconset>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>Configure</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
|
Loading…
x
Reference in New Issue
Block a user