File: SVGImage_Render.py

package info (click to toggle)
wxpython4.0 4.2.3%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 221,752 kB
  • sloc: cpp: 962,555; python: 230,573; ansic: 170,731; makefile: 51,756; sh: 9,342; perl: 1,564; javascript: 584; php: 326; xml: 200
file content (135 lines) | stat: -rw-r--r-- 4,146 bytes parent folder | download
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:])