1 """GNUmed patient picture widget."""
2
3
4 __version__ = "$Revision: 1.33 $"
5 __author__ = "R.Terry <rterry@gnumed.net>,\
6 I.Haywood <i.haywood@ugrad.unimelb.edu.au>,\
7 K.Hilbert <Karsten.Hilbert@gmx.net>"
8 __license__ = "GPL"
9
10
11 import sys, os, os.path, logging
12
13
14
15 import wx, wx.lib.imagebrowser
16
17
18
19 from Gnumed.pycommon import gmDispatcher, gmTools, gmI18N
20 from Gnumed.business import gmDocuments, gmPerson
21 from Gnumed.wxpython import gmGuiHelpers
22
23
24 _log = logging.getLogger('gm.ui')
25 _log.info(__version__)
26
27 ID_AcquirePhoto = wx.NewId()
28 ID_ImportPhoto = wx.NewId()
29
30
32 """A patient picture control ready for display.
33 with popup menu to import/export
34 remove or Acquire from a device
35 """
36 - def __init__(self, parent, id, width=50, height=54):
37
38
39 paths = gmTools.gmPaths(app_name = u'gnumed', wx = wx)
40 self.__fallback_pic_name = os.path.join(paths.system_app_data_dir, 'bitmaps', 'empty-face-in-bust.png')
41
42
43 img_data = wx.Image(self.__fallback_pic_name, wx.BITMAP_TYPE_ANY)
44 bmp_data = wx.BitmapFromImage(img_data)
45 del img_data
46
47 self.desired_width = width
48 self.desired_height = height
49 wx.StaticBitmap.__init__(
50 self,
51 parent,
52 id,
53 bmp_data,
54 wx.Point(0, 0),
55 wx.Size(self.desired_width, self.desired_height)
56 )
57
58 self.__pat = gmPerson.gmCurrentPatient()
59
60
61 self.__photo_menu = wx.Menu()
62 ID = wx.NewId()
63 self.__photo_menu.Append(ID, _('Refresh from database'))
64 wx.EVT_MENU(self, ID, self._on_refresh_from_backend)
65 self.__photo_menu.AppendSeparator()
66 self.__photo_menu.Append(ID_AcquirePhoto, _("Acquire from imaging device"))
67 self.__photo_menu.Append(ID_ImportPhoto, _("Import from file"))
68
69 self.__register_events()
70
71
72
74
75 wx.EVT_RIGHT_UP(self, self._on_RightClick_photo)
76
77 wx.EVT_MENU(self, ID_AcquirePhoto, self._on_AcquirePhoto)
78 wx.EVT_MENU(self, ID_ImportPhoto, self._on_ImportPhoto)
79
80
81 gmDispatcher.connect(receiver=self._on_post_patient_selection, signal = u'post_patient_selection')
82
84 if not self.__pat.connected:
85 gmDispatcher.send(signal='statustext', msg=_('No active patient.'))
86 return False
87 self.PopupMenu(self.__photo_menu, event.GetPosition())
88
91
93 """Import an existing photo."""
94
95
96 imp_dlg = wx.lib.imagebrowser.ImageDialog(parent = self, set_dir = os.path.expanduser('~'))
97 imp_dlg.Centre()
98 if imp_dlg.ShowModal() != wx.ID_OK:
99 return
100
101 self.__import_pic_into_db(fname = imp_dlg.GetFile())
102 self.__reload_photo()
103
105
106
107 from Gnumed.pycommon import gmScanBackend
108
109 try:
110 fnames = gmScanBackend.acquire_pages_into_files (
111 delay = 5,
112 tmpdir = os.path.expanduser(os.path.join('~', '.gnumed', 'tmp')),
113 calling_window = self
114 )
115 except OSError:
116 _log.exception('problem acquiring image from source')
117 gmGuiHelpers.gm_show_error (
118 aMessage = _(
119 'No image could be acquired from the source.\n\n'
120 'This may mean the scanner driver is not properly installed.\n\n'
121 'On Windows you must install the TWAIN Python module\n'
122 'while on Linux and MacOSX it is recommended to install\n'
123 'the XSane package.'
124 ),
125 aTitle = _('Acquiring photo')
126 )
127 return
128
129 if fnames is False:
130 gmGuiHelpers.gm_show_error (
131 aMessage = _('Patient photo could not be acquired from source.'),
132 aTitle = _('Acquiring photo')
133 )
134 return
135
136 if len(fnames) == 0:
137 return
138
139 self.__import_pic_into_db(fname=fnames[0])
140 self.__reload_photo()
141
142
143
161
163 """(Re)fetch patient picture from DB."""
164
165 doc_folder = self.__pat.get_document_folder()
166 photo = doc_folder.get_latest_mugshot()
167
168 if photo is None:
169 fname = None
170 self.SetToolTipString (_(
171 'Patient picture.\n'
172 '\n'
173 'Right-click for context menu.'
174 ))
175
176 else:
177 fname = photo.export_to_file()
178 self.SetToolTipString (_(
179 'Patient picture (%s).\n'
180 '\n'
181 'Right-click for context menu.'
182 ) % photo['date_generated'].strftime('%b %Y').decode(gmI18N.get_encoding()))
183
184 return self.__set_pic_from_file(fname)
185
187 if fname is None:
188 fname = self.__fallback_pic_name
189 try:
190 img_data = wx.Image(fname, wx.BITMAP_TYPE_ANY)
191 img_data.Rescale(self.desired_width, self.desired_height)
192 bmp_data = wx.BitmapFromImage(img_data)
193 except:
194 _log.exception('cannot set patient picture from [%s]', fname)
195 gmDispatcher.send(signal='statustext', msg=_('Cannot set patient picture from [%s].') % fname)
196 return False
197 del img_data
198 self.SetBitmap(bmp_data)
199 self.__pic_name = fname
200
201 return True
202
204 self.__reload_photo()
205
206
207
208
209 if __name__ == "__main__":
210 app = wx.PyWidgetTester(size = (200, 200))
211 app.SetWidget(cPatientPicture, -1)
212 app.MainLoop()
213
214