Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
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()