1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
import sys
import os
import glob
import wx
from wx.svg import SVGimage
#----------------------------------------------------------------------
class SVGRenderPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, style=wx.FULL_REPAINT_ON_RESIZE)
self._renderer = None
self._img = None
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
def SetRenderer(self, renderer):
self._renderer = renderer
self.Refresh()
def SetSVGFile(self, svg_filename):
self._img = SVGimage.CreateFromFile(svg_filename)
self.Refresh()
def OnPaint(self, event):
dc = wx.BufferedPaintDC(self)
dc.Clear()
iw, ih = (self._img.width, self._img.height) if self._img else (100,100)
dcdim = min(self.Size.width, self.Size.height)
imgdim = min(iw, ih)
scale = dcdim / imgdim
width = int(iw * scale)
height = int(ih * scale)
dc.SetBrush(wx.Brush('white'))
dc.DrawRectangle(0,0, width, height)
if self._renderer and self._img:
ctx = self._renderer.CreateContext(dc)
self._img.RenderToGC(ctx, scale)
#----------------------------------------------------------------------
ADD_NEW = '[Double-click to Add New File]'
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
self.listbox = wx.ListBox(self, style=wx.LB_SINGLE, size=(250, -1))
self.listbox.Append(ADD_NEW)
self.listbox.Append(glob.glob(os.path.join('data', '*.svg')))
self.renderPanel = SVGRenderPanel(self)
rightSizer = wx.BoxSizer(wx.VERTICAL)
rightSizer.Add(self.renderPanel, wx.SizerFlags(1).Expand())
self.Sizer = wx.BoxSizer(wx.HORIZONTAL)
self.Sizer.Add(self.listbox, wx.SizerFlags(1).Border(wx.ALL, 10).Expand())
self.Sizer.Add(rightSizer, wx.SizerFlags(2).Border(wx.RIGHT|wx.BOTTOM|wx.TOP, 10).Expand())
self.Bind(wx.EVT_LISTBOX, self.OnSelectItem)
self.Bind(wx.EVT_LISTBOX_DCLICK, self.OnDClickItem)
self.listbox.SetSelection(1)
# TODO: Add ability for the user to select the renderer
if 'wxMSW' in wx.PlatformInfo:
renderer = wx.GraphicsRenderer.GetDirect2DRenderer()
# renderer = wx.GraphicsRenderer.GetCairoRenderer()
else:
renderer = wx.GraphicsRenderer.GetDefaultRenderer()
self.renderPanel.SetRenderer(renderer)
# Load the first SVG in the list into the static bitmaps
self.renderPanel.SetSVGFile(self.listbox.GetString(1))
def OnSelectItem(self, evt):
filename = self.listbox.GetStringSelection()
if filename != ADD_NEW:
self.renderPanel.SetSVGFile(filename)
def OnDClickItem(self, evt):
if self.listbox.GetSelection() == 0:
with wx.FileDialog(self, "Select SVG file", "data",
wildcard="SVG files (*.svg)|*.svg",
style=wx.FD_OPEN) as dlg:
if dlg.ShowModal() == wx.ID_OK:
self.listbox.Insert(dlg.GetPath(), 1)
self.listbox.SetSelection(1)
self.renderPanel.SetSVGFile(self.listbox.GetString(1))
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>SVGImage</center></h2>
The wx.svg.SVGimage class provides the ability to load, parse and render
Scalable Vector Graphics (SVG) files. The advantage of SVG files is that
they can be used to create bitmaps of any size without loss of quality.
<p>
This sample demonstrates rendering an SVG image directly on to a
wx.GraphicsContext using the GC's drawing capabilities.
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|