svg.py
91 lines
| 2.4 KiB
| text/x-python
|
PythonLexer
epatters
|
r2765 | """ Defines utility functions for working with SVG documents in Qt. | ||
""" | ||||
# System library imports. | ||||
Evan Patterson
|
r3304 | from IPython.external.qt import QtCore, QtGui, QtSvg | ||
epatters
|
r2765 | |||
Thomas Kluyver
|
r13353 | # Our own imports | ||
from IPython.utils.py3compat import unicode_type | ||||
epatters
|
r2765 | |||
def save_svg(string, parent=None): | ||||
""" Prompts the user to save an SVG document to disk. | ||||
Thomas Kluyver
|
r13587 | Parameters | ||
---------- | ||||
epatters
|
r3335 | string : basestring | ||
Evan Patterson
|
r3304 | A Python string containing a SVG document. | ||
epatters
|
r2765 | |||
parent : QWidget, optional | ||||
The parent to use for the file dialog. | ||||
Thomas Kluyver
|
r13587 | Returns | ||
------- | ||||
epatters
|
r2765 | The name of the file to which the document was saved, or None if the save | ||
was cancelled. | ||||
""" | ||||
Thomas Kluyver
|
r13353 | if isinstance(string, unicode_type): | ||
Martin Spacek
|
r3920 | string = string.encode('utf-8') | ||
epatters
|
r2765 | dialog = QtGui.QFileDialog(parent, 'Save SVG Document') | ||
dialog.setAcceptMode(QtGui.QFileDialog.AcceptSave) | ||||
dialog.setDefaultSuffix('svg') | ||||
dialog.setNameFilter('SVG document (*.svg)') | ||||
if dialog.exec_(): | ||||
filename = dialog.selectedFiles()[0] | ||||
Thomas Kluyver
|
r13353 | f = open(filename, 'wb') | ||
epatters
|
r2765 | try: | ||
Martin Spacek
|
r3920 | f.write(string) | ||
epatters
|
r2765 | finally: | ||
f.close() | ||||
return filename | ||||
return None | ||||
def svg_to_clipboard(string): | ||||
""" Copy a SVG document to the clipboard. | ||||
Thomas Kluyver
|
r13587 | Parameters | ||
---------- | ||||
epatters
|
r3335 | string : basestring | ||
Evan Patterson
|
r3304 | A Python string containing a SVG document. | ||
epatters
|
r2765 | """ | ||
Thomas Kluyver
|
r13353 | if isinstance(string, unicode_type): | ||
epatters
|
r3335 | string = string.encode('utf-8') | ||
epatters
|
r2765 | mime_data = QtCore.QMimeData() | ||
Evan Patterson
|
r3304 | mime_data.setData('image/svg+xml', string) | ||
epatters
|
r2765 | QtGui.QApplication.clipboard().setMimeData(mime_data) | ||
def svg_to_image(string, size=None): | ||||
""" Convert a SVG document to a QImage. | ||||
Thomas Kluyver
|
r13587 | Parameters | ||
---------- | ||||
epatters
|
r3335 | string : basestring | ||
Evan Patterson
|
r3304 | A Python string containing a SVG document. | ||
epatters
|
r2765 | |||
size : QSize, optional | ||||
The size of the image that is produced. If not specified, the SVG | ||||
document's default size is used. | ||||
Thomas Kluyver
|
r13587 | Raises | ||
------ | ||||
epatters
|
r2765 | ValueError | ||
If an invalid SVG string is provided. | ||||
Thomas Kluyver
|
r13587 | Returns | ||
------- | ||||
epatters
|
r2765 | A QImage of format QImage.Format_ARGB32. | ||
""" | ||||
Thomas Kluyver
|
r13353 | if isinstance(string, unicode_type): | ||
epatters
|
r3335 | string = string.encode('utf-8') | ||
Evan Patterson
|
r3304 | renderer = QtSvg.QSvgRenderer(QtCore.QByteArray(string)) | ||
epatters
|
r2765 | if not renderer.isValid(): | ||
raise ValueError('Invalid SVG data.') | ||||
if size is None: | ||||
size = renderer.defaultSize() | ||||
image = QtGui.QImage(size, QtGui.QImage.Format_ARGB32) | ||||
painter = QtGui.QPainter(image) | ||||
renderer.render(painter) | ||||
return image | ||||