Add exporting to PDF and printing
This commit is contained in:
parent
ec5101e23d
commit
cb3d15d2dd
@ -145,7 +145,7 @@ class ConfigureDialog(QtWidgets.QDialog):
|
|||||||
value = self.settings.value('font')
|
value = self.settings.value('font')
|
||||||
self.editor_values['font'] = value
|
self.editor_values['font'] = value
|
||||||
self.editor_font_combobox.setCurrentFont(QtGui.QFont(value))
|
self.editor_font_combobox.setCurrentFont(QtGui.QFont(value))
|
||||||
if self.settings.value.contains('size'):
|
if self.settings.contains('size'):
|
||||||
value = self.settings.value('size')
|
value = self.settings.value('size')
|
||||||
self.editor_values['size'] = int(value)
|
self.editor_values['size'] = int(value)
|
||||||
self.editor_size.setValue(int(value))
|
self.editor_size.setValue(int(value))
|
||||||
|
@ -127,7 +127,7 @@ class ChordProLexer(Qsci.QsciLexerCustom):
|
|||||||
def styleText(self, start, end):
|
def styleText(self, start, end):
|
||||||
"""Style the text"""
|
"""Style the text"""
|
||||||
|
|
||||||
keywords = ['chorus'] + \
|
keywords = ['verse', 'chorus', 'bridge'] + \
|
||||||
[d for t in KNOWN_DIRECTIVES for d in t] + \
|
[d for t in KNOWN_DIRECTIVES for d in t] + \
|
||||||
['start_of_' + vt for vt in KNOWN_VERSE_TYPES] + \
|
['start_of_' + vt for vt in KNOWN_VERSE_TYPES] + \
|
||||||
['end_of_' + vt for vt in KNOWN_VERSE_TYPES]
|
['end_of_' + vt for vt in KNOWN_VERSE_TYPES]
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets, Qsci
|
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets, Qsci, QtPrintSupport
|
||||||
|
|
||||||
from chordpro import Song
|
from chordpro import Song
|
||||||
from chordpro.renderers.html import render
|
from chordpro.renderers.html import render
|
||||||
from ukatali.configuredialog import ConfigureDialog
|
from ukatali.configuredialog import ConfigureDialog
|
||||||
from ukatali.lexer import ChordProLexer
|
from ukatali.lexer import ChordProLexer
|
||||||
|
|
||||||
|
CHORDPRO_FILTERS = 'ChordPro files (*.txt *.cho *.chordpro *.chopro);;All files (*)'
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(QtWidgets.QMainWindow):
|
class MainWindow(QtWidgets.QMainWindow):
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
@ -173,8 +175,11 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||||||
self.open_action.triggered.connect(self.on_open_clicked)
|
self.open_action.triggered.connect(self.on_open_clicked)
|
||||||
self.save_action.triggered.connect(self.on_save_clicked)
|
self.save_action.triggered.connect(self.on_save_clicked)
|
||||||
self.save_as_action.triggered.connect(self.on_save_as_clicked)
|
self.save_as_action.triggered.connect(self.on_save_as_clicked)
|
||||||
|
self.export_action.triggered.connect(self.on_export_clicked)
|
||||||
|
self.print_action.triggered.connect(self.on_print_clicked)
|
||||||
self.configure_action.triggered.connect(self.on_configure_clicked)
|
self.configure_action.triggered.connect(self.on_configure_clicked)
|
||||||
self.file_editor.textChanged.connect(self.on_text_changed)
|
self.file_editor.textChanged.connect(self.on_text_changed)
|
||||||
|
self.preview_view.page().pdfPrintingFinished.connect(self.on_pdf_finished)
|
||||||
|
|
||||||
def retranslate_ui(self):
|
def retranslate_ui(self):
|
||||||
_translate = QtCore.QCoreApplication.translate
|
_translate = QtCore.QCoreApplication.translate
|
||||||
@ -232,8 +237,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||||||
last_directory = QtCore.QSettings().value('files/last-directory')
|
last_directory = QtCore.QSettings().value('files/last-directory')
|
||||||
else:
|
else:
|
||||||
last_directory = ''
|
last_directory = ''
|
||||||
filename = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', last_directory,
|
filename = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', last_directory, filter=CHORDPRO_FILTERS)
|
||||||
filter='All files *')
|
|
||||||
if isinstance(filename, tuple):
|
if isinstance(filename, tuple):
|
||||||
filename = filename[0]
|
filename = filename[0]
|
||||||
if not filename:
|
if not filename:
|
||||||
@ -259,8 +263,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||||||
last_directory = QtCore.QSettings().value('files/last-directory')
|
last_directory = QtCore.QSettings().value('files/last-directory')
|
||||||
else:
|
else:
|
||||||
last_directory = ''
|
last_directory = ''
|
||||||
filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', last_directory,
|
filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', last_directory, filter=CHORDPRO_FILTERS)
|
||||||
filter='All files *')
|
|
||||||
if isinstance(filename, tuple):
|
if isinstance(filename, tuple):
|
||||||
filename = filename[0]
|
filename = filename[0]
|
||||||
if not filename:
|
if not filename:
|
||||||
@ -281,14 +284,63 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||||||
settings = QtCore.QSettings()
|
settings = QtCore.QSettings()
|
||||||
settings.beginGroup('render')
|
settings.beginGroup('render')
|
||||||
for key in settings.allKeys():
|
for key in settings.allKeys():
|
||||||
options[key] = settings.value(key)
|
value = settings.value(key)
|
||||||
|
if value:
|
||||||
|
options[key] = value
|
||||||
|
settings.endGroup()
|
||||||
return options
|
return options
|
||||||
|
|
||||||
def on_text_changed(self):
|
def _render_song(self, extra_styles=None):
|
||||||
"""Update the preview when the text changes"""
|
"""Render the current song and return the HTML"""
|
||||||
options = self._get_render_options()
|
options = self._get_render_options()
|
||||||
text = self.file_editor.text()
|
text = self.file_editor.text()
|
||||||
song = Song()
|
song = Song()
|
||||||
song.parse(text)
|
song.parse(text)
|
||||||
html = render(song, options)
|
return render(song, options, extra_styles)
|
||||||
|
|
||||||
|
def on_text_changed(self):
|
||||||
|
"""Update the preview when the text changes"""
|
||||||
|
html = self._render_song()
|
||||||
self.preview_view.setHtml(html)
|
self.preview_view.setHtml(html)
|
||||||
|
|
||||||
|
def on_export_clicked(self):
|
||||||
|
"""Export the current song to PDF"""
|
||||||
|
if self.filename:
|
||||||
|
last_directory = str(Path(self.filename).with_suffix('.pdf'))
|
||||||
|
elif QtCore.QSettings().value('files/last-directory'):
|
||||||
|
last_directory = QtCore.QSettings().value('files/last-directory')
|
||||||
|
else:
|
||||||
|
last_directory = ''
|
||||||
|
filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Export to PDF', last_directory,
|
||||||
|
filter='PDF files (.pdf)*')
|
||||||
|
if isinstance(filename, tuple):
|
||||||
|
filename = filename[0]
|
||||||
|
if not filename:
|
||||||
|
return
|
||||||
|
filename = Path(filename)
|
||||||
|
QtCore.QSettings().setValue('files/last-directory', str(filename.parent))
|
||||||
|
self.preview_view.page().printToPdf(str(filename), QtGui.QPageLayout(QtGui.QPageSize(QtGui.QPageSize.Letter),
|
||||||
|
QtGui.QPageLayout.Portrait,
|
||||||
|
QtCore.QMarginsF()))
|
||||||
|
|
||||||
|
def on_pdf_finished(self, filename, is_success):
|
||||||
|
"""A slot to notify the user when the PDF is done"""
|
||||||
|
if is_success:
|
||||||
|
QtWidgets.QMessageBox.information(self, 'Export to PDF Successful',
|
||||||
|
'Successfully exported to "{}"'.format(Path(filename).name))
|
||||||
|
else:
|
||||||
|
QtWidgets.QMessageBox.critical(self, 'Error Exporting to PDF', 'There was an error while exporting to PDF')
|
||||||
|
|
||||||
|
def on_print_clicked(self):
|
||||||
|
"""Print the current song"""
|
||||||
|
|
||||||
|
def _on_print_finished(is_success):
|
||||||
|
print(is_success)
|
||||||
|
|
||||||
|
# print(QtPrintSupport.QPrinterInfo.defaultPrinterName())
|
||||||
|
# default_printer = QtPrintSupport.QPrinterInfo.defaultPrinter()
|
||||||
|
# print(default_printer)
|
||||||
|
# printer = QtPrintSupport.QPrinter()
|
||||||
|
print_dialog = QtPrintSupport.QPrintDialog(QtPrintSupport.QPrinter(), self)
|
||||||
|
if print_dialog.exec() == QtWidgets.QDialog.Accepted:
|
||||||
|
self.preview_view.page().print(print_dialog.printer(), _on_print_finished)
|
||||||
|
Loading…
Reference in New Issue
Block a user