Example #1
0
class Model:
    def __init__(self):
        self.listImages = Observable()

    def observe(self, slot1, slot2, slot3):
        self.listImages.observe(slot1, slot2, slot3)

    def add_imgs(self, path_imgs):
        """ stores the images in the list """
        try:
            for img in path_imgs:
                if img in self.listImages.previews:
                    print('image {} is already in the list'.format(img))
                    path_imgs.remove(img)
            self.listImages.previews = path_imgs
            if self.listImages.current_img == None:
                self.upload_img(self.listImages.previews[0])
        except:
            return

    def delete_AllImgs(self):
        """ delete all the images"""
        self.listImages.remove_all_imgs()

    def delete_SelectedImgs(self, items):
        """ delete selected images"""
        path_imgs_del = [i.toolTip() for i in items]
        if collections.Counter(path_imgs_del) == collections.Counter(
                self.listImages.previews):
            print('deleted all imgs')
            return self.delete_AllImgs()
        current_img = self.listImages.currentImage
        if current_img in path_imgs_del:  # if the current img is deleted, upload the next img
            img_up = self.search_up_img(
                path_imgs_del[path_imgs_del.index(current_img):])
            self.upload_img(img_up)
        self.listImages.remove_imgs(path_imgs_del, items)

    def search_up_img(self, next_partial_imgs_del):
        """ search the next (not deleted) image in list to show it """
        for img in next_partial_imgs_del:
            next = self.get_next_img(
                img
            )  # if img is the last of the list the next returned is the first
            if next not in next_partial_imgs_del:
                return next

    def upload_img(self, path_img):
        """ stores the image to show with its exif data """
        if type(path_img) != str:
            path_img = path_img.toolTip()
        exif = self.extract_exif_data(path_img)
        self.listImages.upload_img(path_img, exif)

    def upload_previous_img(self):
        """ stores the previous image to shown """
        current_img = self.listImages.currentImage
        if current_img != None:
            prev_img = self.get_prev_img(current_img)
            self.upload_img(prev_img)
        else:
            pass

    def get_prev_img(self, current_img):
        """ returns the previous image of the current one """
        list = self.listImages.previews
        indx_prev = (list.index(current_img) - 1) % len(list)
        prev_img = list[indx_prev]
        return prev_img

    def upload_next_img(self):
        """ stores the next image in the list """
        current_img = self.listImages.currentImage
        if current_img != None:
            next_img = self.get_next_img(current_img)
            self.upload_img(next_img)
        else:
            pass

    def get_next_img(self, current_img):
        """ returns the next image of the current one """
        list = self.listImages.previews
        indx_next = (list.index(current_img) + 1) % len(list)
        next_img = list[indx_next]
        return next_img

    def extract_exif_data(self, path_img):
        """ extract the exif data from the image"""
        try:
            img = PIL.Image.open(path_img)
            self.exif = {
                PIL.ExifTags.TAGS[k]: v
                for k, v in img._getexif().items() if k in PIL.ExifTags.TAGS
            }
            if 'GPSInfo' in self.exif.keys():
                latitude = str(
                    self.getCoordinate(self.exif['GPSInfo'][2],
                                       self.exif['GPSInfo'][1]))
                longitude = str(
                    self.getCoordinate(self.exif['GPSInfo'][4],
                                       self.exif['GPSInfo'][3]))
                self.exif[
                    'GPSInfo'] = "https://www.google.com/maps/search/?api=1&query=" + str(
                        latitude) + "," + str(longitude)
            return self.exif
        except:
            return None

    def getCoordinate(self, value, cardinal_point):
        """ return latitude or longitude coordinate """
        d, m, s = value

        if cardinal_point in ['S', 'W']:
            d = -d
            m = -m
            s = -s

        return d + m / 60.0 + s / 3600.0