예제 #1
0
class YoutubeDisplayLayout(BoxLayout):
    def __init__(self,
                 title='',
                 duration='',
                 thumbnail='',
                 source_videos=None,
                 source_audios=None,
                 **kwargs):
        super(YoutubeDisplayLayout, self).__init__(**kwargs)
        info_box = BoxLayout(orientation='vertical')
        self.source_videos = source_videos
        self.source_audios = source_audios
        self.title = TextInput(
            text=title
        )  # text input canvas clear when its removed, make an error
        self.duration = Label(text=str(duration))
        info_box.add_widget(self.title)
        info_box.add_widget(self.duration)
        self.thumbnail = AsyncImage(source=thumbnail, size_hint=(.2, 1))
        self.add_widget(self.thumbnail)
        self.add_widget(info_box)
        self.register_event_type('on_click')
        with self.canvas.before:
            self.color = Color(rgba=(0, 0, 0, 0))
            self.rect = Rectangle(size=self.size, pos=self.pos)
        self.bind(pos=self.updateRect, size=self.updateRect)

    def select(self):
        self.unselectAll
        self.color.rgba = (1, 0, 0, .2)

    def unselect(self):
        self.color.rgba = (0, 0, 0, 0)

    def unselectAll(self):
        for child in self.parent.children:
            print child
            child.unselect()

    def updateRect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size

    def on_click(self):
        pass

    def on_touch_down(self, touch):
        if self.thumbnail.collide_point(*touch.pos):
            self.dispatch('on_click')
            return True
        return super(YoutubeDisplayLayout, self).on_touch_down(touch)

    def getTitle(self):
        return self.title.text

    def changeInfo(self, title, duration, thumbnail):
        self.title.text = u'Tên Video : ' + title
        self.duration.text = u'Độ Dài Video : ' + duration
        self.thumbnail.source = thumbnail
예제 #2
0
class Item(GridLayout):
    def __init__(self, name, description, image_link, inventory: UserInventory,
                 username, **kwargs):
        super(Item, self).__init__(**kwargs)
        try:
            os.makedirs('imgcache')
        except FileExistsError:
            Logger.warning("Image Cache Exists.")
        self.size_hint_y = None
        self.height = 50
        self.cols = 3
        self.inventory = inventory
        self.name = Label(text=name)
        self.name.bind(on_touch_down=self.on_item_pressed)
        self.add_widget(self.name)
        self.description = Label(text=description)
        self.image_link = image_link
        try:
            r = requests.get(image_link, timeout=(5, 20))
        except requests.exceptions.MissingSchema:
            return
        r.raise_for_status()
        if r.ok:
            picname = os.path.basename(urllib.parse.urlparse(image_link).path)
            if picname is None:
                picname = "temp.jpg"
            f = open("imgcache/" + picname, mode="wb")
            f.write(r.content)
            f.close()
        self.image = AsyncImage(source="imgcache/" + picname,
                                pos_hint={'left': 1})
        self.image.bind(on_touch_down=self.open_image)
        self.owner_username = username
        delete_btn = Button(text="X", size_hint=[None, 1], width=60)
        delete_btn.bind(on_press=lambda x: self.delete_item())
        self.add_widget(delete_btn)
        self.popup = None
        self.description.text_size = [
            self.description.size[0] * 3, self.description.size[1]
        ]

    def clear_cache(self, instance):
        try:
            shutil.rmtree('imgcache/')
            os.makedirs(
                'imgcache'
            )  #this is the exact same code used for the music cache
        except FileNotFoundError:  #i disgust myself too.
            os.makedirs('imgcache')
        except PermissionError:
            Logger.warning(
                "Cannot clear inventory cache due to permission error.")
        except Exception as e:
            Logger.warning(traceback.format_exc())

    def on_item_pressed(self, inst, touch):
        if self.name.collide_point(*touch.pos):
            self.open_popup()

    def get_name(self):
        return self.name.text

    def get_description(self):
        return self.description.text

    def get_image_link(self):
        return self.image

    def get_popup(self):
        return self.popup

    def set_name(self, name):
        self.name = name

    def set_description(self, description):
        self.description = description

    def set_image_link(self, image_link):
        self.image = image_link

    def open_image(self, inst, touch):
        if self.image.collide_point(*touch.pos):
            webbrowser.open(self.image_link)

    def delete_item(self):
        if self.inventory is not None:
            self.inventory.delete_item(self.name.text)

    def build_item_window(self):
        if self.popup is None:
            main_grid = GridLayout(cols=2)
            main_grid.add_widget(self.image)
            main_grid.add_widget(self.description)
            self.popup = Popup(title=self.name.text + " created by " +
                               self.owner_username,
                               content=main_grid,
                               size_hint=(.5, .3),
                               pos_hint={
                                   'left': .1,
                                   'top': 1
                               },
                               background_color=[0, 0, 0, 0])
        return self.popup

    def open_popup(self):
        try:
            popup = self.build_item_window()
            popup.bind(on_dismiss=self.clear_cache)
            popup.open()
        except AttributeError:
            Logger.warning(traceback.format_exc())
            return

    # Encoded by: name#description#image_link#owner_name
    def encode(self):
        return self.name.text + '#' + self.description.text + '#' + self.image_link + '#' + self.owner_username
예제 #3
0
class Item(GridLayout):
    def __init__(self, name, description, image_link, inventory: UserInventory,
                 username, **kwargs):
        super(Item, self).__init__(**kwargs)
        try:
            os.makedirs('imgcache')
        except FileExistsError:
            print("Image Cache Exists.")
        self.size_hint_y = None
        self.height = 50
        self.cols = 3
        self.inventory = inventory
        self.name = Label(text=name)
        self.name.bind(on_touch_down=self.on_item_pressed)
        self.add_widget(self.name)
        self.description = Label(text=description)
        self.image_link = image_link
        r = requests.get(image_link, timeout=(5, 20))
        r.raise_for_status()
        if r.ok:
            picname = urllib.request.urlopen(
                urllib.request.Request(image_link,
                                       method='HEAD',
                                       headers={'User-Agent': 'Mozilla/5.0'
                                                })).info().get_filename()
            if picname is None:
                picname = "temp.jpg"
            f = open("imgcache/" + picname, mode="wb")
            f.write(r.content)
            f.close()
        self.image = AsyncImage(source="imgcache/" + picname,
                                pos_hint={'left': 1})
        self.image.bind(on_touch_down=self.open_image)
        self.owner_username = username
        delete_btn = Button(text="X", size_hint=[None, 1], width=60)
        delete_btn.bind(on_press=lambda x: self.delete_item())
        self.add_widget(delete_btn)
        self.popup = None
        self.description.text_size = [
            self.description.size[0] * 3, self.description.size[1]
        ]

    def on_item_pressed(self, inst, touch):
        if self.name.collide_point(*touch.pos):
            self.open_popup()

    def get_name(self):
        return self.name.text

    def get_description(self):
        return self.description.text

    def get_image_link(self):
        return self.image

    def get_popup(self):
        return self.popup

    def set_name(self, name):
        self.name = name

    def set_description(self, description):
        self.description = description

    def set_image_link(self, image_link):
        self.image = image_link

    def open_image(self, inst, touch):
        if self.image.collide_point(*touch.pos):
            webbrowser.open(self.image.source)

    def delete_item(self):
        if self.inventory is not None:
            self.inventory.delete_item(self.name.text)

    def build_item_window(self):
        if self.popup is None:
            main_grid = GridLayout(cols=2)
            main_grid.add_widget(self.image)
            main_grid.add_widget(self.description)
            self.popup = Popup(title=self.name.text + " created by " +
                               self.owner_username,
                               content=main_grid,
                               size_hint=(.5, .3),
                               pos_hint={
                                   'left': .1,
                                   'top': 1
                               },
                               background_color=[0, 0, 0, 0])
        return self.popup

    def open_popup(self):
        popup = self.build_item_window()
        popup.open()

    # Encoded by: name#description#image_link#owner_name
    def encode(self):
        return self.name.text + '#' + self.description.text + '#' + self.image_link + '#' + self.owner_username