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
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
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