def __init__(self, model, *args, **kwds): self.model = model self.pictureId = 0 self.timer_next_image = None self.last_events_list = None icon_standard = wx.Icon( os.path.join(os.path.dirname(__file__), "assets", "icon.ico"), wx.BITMAP_TYPE_ICO, 16, 16 ) icon_unread = wx.Icon( os.path.join(os.path.dirname(__file__), "assets", "icon-unread.ico"), wx.BITMAP_TYPE_ICO, 16, 16 ) self.tbIcon = TwoStateBackgroundAppIcon(self, icon_standard, icon_unread, "Life History") # begin wxGlade: LifeHistoryMainFrame.__init__ kwds["style"] = ( wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SYSTEM_MENU | wx.RESIZE_BORDER | wx.CLIP_CHILDREN ) wx.Frame.__init__(self, *args, **kwds) self.panel_1 = wx.ScrolledWindow(self, -1, style=wx.TAB_TRAVERSAL) self.image = wx.StaticBitmap(self, -1, wx.NullBitmap) self.btnPrev = wx.Button(self, -1, "<") self.imageCounter = wx.StaticText(self, -1, "0/1") self.btnNext = wx.Button(self, -1, ">") self.imageDescription = wx.StaticText(self, -1, "") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.onPrevImage, self.btnPrev) self.Bind(wx.EVT_BUTTON, self.onNextImage, self.btnNext) # end wxGlade self.Bind(wx.EVT_CLOSE, self.onClose) self.timer_reload = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateEvents, self.timer_reload) self.timer_reload.Start(config.refreshRate * 1000)
class LifeHistoryMainFrame(wx.Frame): def __init__(self, model, *args, **kwds): self.model = model self.pictureId = 0 self.timer_next_image = None self.last_events_list = None icon_standard = wx.Icon( os.path.join(os.path.dirname(__file__), "assets", "icon.ico"), wx.BITMAP_TYPE_ICO, 16, 16 ) icon_unread = wx.Icon( os.path.join(os.path.dirname(__file__), "assets", "icon-unread.ico"), wx.BITMAP_TYPE_ICO, 16, 16 ) self.tbIcon = TwoStateBackgroundAppIcon(self, icon_standard, icon_unread, "Life History") # begin wxGlade: LifeHistoryMainFrame.__init__ kwds["style"] = ( wx.CAPTION | wx.CLOSE_BOX | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SYSTEM_MENU | wx.RESIZE_BORDER | wx.CLIP_CHILDREN ) wx.Frame.__init__(self, *args, **kwds) self.panel_1 = wx.ScrolledWindow(self, -1, style=wx.TAB_TRAVERSAL) self.image = wx.StaticBitmap(self, -1, wx.NullBitmap) self.btnPrev = wx.Button(self, -1, "<") self.imageCounter = wx.StaticText(self, -1, "0/1") self.btnNext = wx.Button(self, -1, ">") self.imageDescription = wx.StaticText(self, -1, "") self.__set_properties() self.__do_layout() self.Bind(wx.EVT_BUTTON, self.onPrevImage, self.btnPrev) self.Bind(wx.EVT_BUTTON, self.onNextImage, self.btnNext) # end wxGlade self.Bind(wx.EVT_CLOSE, self.onClose) self.timer_reload = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateEvents, self.timer_reload) self.timer_reload.Start(config.refreshRate * 1000) def onClose(self, evt): """ Destroy the taskbar icon and the frame """ self.Hide() def exit(self): """ called from the tray icon when the app should be closed (not hidden) """ self.tbIcon.RemoveIcon() self.tbIcon.Destroy() self.Destroy() def __set_properties(self): # begin wxGlade: LifeHistoryMainFrame.__set_properties self.SetTitle("Life History") self.SetSize((400, 534)) self.panel_1.SetScrollRate(10, 10) # end wxGlade def __do_layout(self): # begin wxGlade: LifeHistoryMainFrame.__do_layout sizer_5 = wx.BoxSizer(wx.VERTICAL) sizer_6 = wx.BoxSizer(wx.HORIZONTAL) sizer_7 = wx.BoxSizer(wx.HORIZONTAL) textEventHolder = wx.BoxSizer(wx.VERTICAL) self.panel_1.SetSizer(textEventHolder) sizer_5.Add(self.panel_1, 1, wx.EXPAND, 0) sizer_7.Add(self.image, 0, 0, 0) sizer_5.Add(sizer_7, 0, 0, 0) sizer_6.Add(self.btnPrev, 0, 0, 0) sizer_6.Add(self.imageCounter, 0, wx.ALL, 5) sizer_6.Add(self.btnNext, 0, 0, 0) sizer_6.Add(self.imageDescription, 0, wx.ALL, 5) sizer_5.Add(sizer_6, 0, 0, 0) self.SetSizer(sizer_5) self.Layout() self.Centre() # end wxGlade self.textEventHolder = textEventHolder self.updateEvents() def updateEvents(self, event=None): print "reading events..." events = self.model.getEventsForDate(datetime.date.today()) self.displayTextEvents(events["text"]) self.registerImageEvents(events["image"]) if self.last_events_list is not None and self.last_events_list != events: print "events list has changed" self.tbIcon.highlight() self.last_events_list = events def registerImageEvents(self, imageEvents): self.imageList = imageEvents if self.timer_next_image is not None: self.timer_next_image.Destroy() if len(self.imageList) > 0: self.displaySelectedImage() self.SetSizeHints(minW=400, maxW=400, minH=400) self.timer_next_image = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.onNextImage, self.timer_next_image) self.timer_next_image.Start(config.slideshowInterval * 1000) else: self.image.Hide() self.btnPrev.Hide() self.btnNext.Hide() self.imageCounter.Hide() self.SetSizeHints(minW=400, maxW=400, minH=200) self.SetSize((400, 300)) def displayTextEvents(self, events): while self.panel_1.GetSizer().Remove(0): pass self.panel_1.DestroyChildren() for event in events: yearLabel = wx.StaticText(self.panel_1, -1, str(event.startDate)) eventTextLabel = wx.StaticText(self.panel_1, -1, event.content) eventTextLabel.Wrap(self.GetSize().width - 120) sizer = wx.BoxSizer(wx.HORIZONTAL) sizer.Add(yearLabel, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) sizer.Add(eventTextLabel, 0, wx.ALL, 5) self.textEventHolder.Add(sizer, 0, 0, 11) self.textEventHolder.Layout() def displaySelectedImage(self): filename = self.imageList[self.pictureId].content self.imageCounter.SetLabel("%d / %d" % (self.pictureId + 1, len(self.imageList))) if os.path.exists(filename): image = wx.Image(filename, wx.BITMAP_TYPE_ANY) image = self.rotateByExif(filename, image) image = self.scaleImage(image) self.image.SetBitmap(wx.BitmapFromImage(image)) self.imageDescription.SetLabel(str(self.imageList[self.pictureId].startDate)) # TODO: center the bitmap else: # display a placeholder? self.imageDescription.SetLabel("(missing picture)") def rotateByExif(self, path, image): """rotates the image (if needed) using exif orientation data""" exif_data = ExifHelper.get_exif_data(path) if "Orientation" in exif_data: orientation = exif_data["Orientation"] if orientation == 6: return image.Rotate90() return image def scaleImage(self, img): W = img.GetWidth() H = img.GetHeight() if W > H: PhotoMaxSize = self.GetSize().width NewW = PhotoMaxSize NewH = PhotoMaxSize * H / W else: PhotoMaxSize = self.GetSize().width * 0.75 NewH = PhotoMaxSize NewW = PhotoMaxSize * W / H return img.Scale(NewW, NewH) def onPrevImage(self, event): # wxGlade: LifeHistoryMainFrame.<event_handler> self.pictureId = self.pictureId - 1 if self.pictureId > 0 else len(self.imageList) - 1 self.displaySelectedImage() def onNextImage(self, event): # wxGlade: LifeHistoryMainFrame.<event_handler> self.pictureId = self.pictureId + 1 if self.pictureId < len(self.imageList) - 1 else 0 self.displaySelectedImage()