94ab7fa3f895858ddde70366b92c1024cb333e61
[swftools.git] / wx / gui / options / viewer.py
1 #!/usr/bin/env python
2 # -*- coding: UTF-8 -*-
3 #
4 # gpdf2swf.py
5 # graphical user interface for pdf2swf
6 #
7 # Part of the swftools package.
8
9 # Copyright (c) 2008,2009 Matthias Kramm <kramm@quiss.org> 
10 #
11 # This program is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
15 #
16 # This program is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 # GNU General Public License for more details.
20 #
21 # You should have received a copy of the GNU General Public License
22 # along with this program; if not, write to the Free Software
23 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
24
25 import os
26 import wx
27 import operator
28 import imp
29 from lib.wordwrap import wordwrap
30 from gui.boldstatictext import BoldStaticText
31 import viewers
32 import gui.fields
33
34 class Viewers:
35     def __init__(self):
36         self.viewers = []
37         self.modules = []
38         self.list_viewers()
39         self.import_viewers()
40
41     def list_viewers(self):
42         for file in os.listdir('viewers'):
43             if (file.startswith('.') or file.startswith('_')
44                 or file.endswith(".pyc") or not file.endswith('.py')):
45                 continue
46             self.viewers.append(os.path.splitext(file)[0])
47
48     def import_viewers(self):
49         for file in self.viewers:
50             _temp = imp.load_source("viewers.%s" % file, os.path.join(os.getcwdu(), "viewers/%s.py" % file))
51             self.modules.append(_temp)
52
53
54
55 class ViewerBook(wx.Listbook):
56     def __init__(self, parent):
57         wx.Listbook.__init__(self, parent, wx.ID_ANY, style=
58                             wx.LB_DEFAULT
59                             )
60
61         self.__mod = []
62         self.__viewers = viewers = Viewers()
63
64         # make an image list
65         il = wx.ImageList(102, 102)
66         self.AssignImageList(il)
67
68         # Sort viewers by attribute order.
69         # The attribute order must be an int from 0..n
70         viewers.modules.sort(key=operator.attrgetter('order'))
71
72         # Make a bunch of panels for the list book
73         for idx, mod in enumerate(viewers.modules):
74             bmp = mod.preview.GetBitmap()
75             il.Add(bmp)
76
77             win = self.makePanel(mod)
78             self.AddPage(win, mod, imageId=idx)
79
80
81     def makePanel(self, mod):
82         p = wx.Panel(self)
83         sizer = wx.BoxSizer(wx.VERTICAL)
84
85         nameCtrl = BoldStaticText(p, label=mod.name)
86         sizer.Add(nameCtrl, 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 10)
87
88         t = wordwrap(mod.desc, 400, wx.ClientDC(p))
89         descCtrl = wx.StaticText(p, label=t)
90         sizer.Add(descCtrl, 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 10)
91
92         #swf_options = []
93
94         # Avoid showing an empty StaticBox
95         if (len(mod.swf_options) == 1
96                and isinstance(mod.swf_options[0], gui.fields.Hidden)
97            ):
98             hidden = True
99         else:
100             hidden = False
101
102         if mod.swf_options and not hidden:
103             box = wx.StaticBox(p, label=u"SWF")
104             bsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
105
106             flex = wx.FlexGridSizer(rows=len(mod.swf_options), cols=2, hgap=0, vgap=0)
107             flex.AddGrowableCol(1)
108
109             for option in mod.swf_options:
110                 #swf_options.append(option)
111                 label, ctrl = option.draw(p)
112                 if label and ctrl:
113                     flex.Add(label, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 4)
114                     flex.Add(ctrl, 0, wx.EXPAND|wx.ALL, 4)
115
116             bsizer.Add(flex, 0, wx.EXPAND)
117             sizer.Add(bsizer, 0, wx.EXPAND)
118
119         #vie_options = []
120         if mod.viewer_options:
121             box = wx.StaticBox(p, label=u"Viewer")
122             bsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
123
124             flex = wx.FlexGridSizer(rows=len(mod.viewer_options),
125                                     cols=2, hgap=0, vgap=0)
126             flex.AddGrowableCol(1)
127
128             for option in mod.viewer_options:
129                 #vie_options.append(option)
130                 label, ctrl = option.draw(p)
131                 if label and ctrl:
132                     flex.Add(label, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 4)
133                     flex.Add(ctrl, 0, wx.EXPAND|wx.ALL, 4)
134
135             bsizer.Add(flex, 0, wx.EXPAND)
136             sizer.Add(bsizer, 0, wx.EXPAND)
137
138         p.SetSizer(sizer)
139         return p
140
141     def AddPage(self, win, mod, select=False, imageId=-1):
142         wx.Listbook.AddPage(self, win, mod.name, select, imageId)
143         self.__mod.append(mod)
144
145     def __get_options(self):
146         page = self.GetSelection()
147         return self.__mod[page]
148
149     options = property(__get_options)
150
151     def pickle(self):
152         data = {}
153         data['selected_viewer'] = self.GetSelection()
154
155         for viewer, module in zip(self.__viewers.viewers, self.__viewers.modules):
156             data[viewer] = {}
157             for opt in module.swf_options:
158                 data[viewer][opt.name] = opt.value
159             for opt in module.viewer_options:
160                 data[viewer][opt.name] = opt.value
161
162         return data
163
164     def unpickle(self, data):
165         if not data:
166             return
167
168         selected_viewer = data.pop('selected_viewer')
169         self.SetSelection(selected_viewer)
170
171         _fields = {}
172         for viewer, module in zip(self.__viewers.viewers, self.__viewers.modules):
173             _fields[viewer] = {}
174
175             all_opts = module.swf_options + module.viewer_options
176             for field in all_opts:
177                 _fields[viewer][field.name] = field
178
179         for modname, opts in data.items():
180             for k, v in opts.items():
181                 _fields[modname][k].SetValue(v)
182