Ejemplo n.º 1
0
class SettingsScreen(Widget):
    def __init__(self,size,*args):
        super(SettingsScreen,self).__init__(size=size,*args)
        button_height = self.height*.10
        button_size = [button_height*6,button_height]
        self.option_1 = Label(text=('debug:on' if Global.debugMode
                                    else 'debug:off'),
                              size=button_size,
                              font_size=button_size[1],
                              pos=[0,self.height*.60])
        self.option_2 = Label(text='back',
                              size=button_size,
                              font_size=button_size[1],
                              pos=[0,self.height*.30])
        self.option_1.center_x = self.center_x
        self.option_2.center_x = self.center_x
        self.add_widget(self.option_1)
        self.add_widget(self.option_2)
        
    def on_touch_down(self,touch,*args):
        super(SettingsScreen,self).on_touch_down(touch,*args)
        if self.option_1.collide_point(*touch.pos):
            if not Global.debugMode:
                self.option_1.text = 'debug:on'
                Global.debugMode = True
            else:
                self.option_1.text = 'debug:off'
                Global.debugMode = False
        elif self.option_2.collide_point(*touch.pos):
            self.parent.add_widget(MainMenu(size=self.size))
            self.parent.remove_widget(self)
Ejemplo n.º 2
0
class MainMenu(Widget):
    def __init__(self,size,*args):
        super(MainMenu,self).__init__(size=size,*args)
        
        button_height = self.height*.10
        button_size = [button_height*5,button_height]
        self.option_1 = Label(text='play game',
                              size=button_size,
                              font_size=button_size[1],
                              pos=[0,self.height*.60])
        self.option_2 = Label(text='settings',
                              size=button_size,
                              font_size=button_size[1],
                              pos=[0,self.height*.30])
        self.option_1.center_x = self.center_x
        self.option_2.center_x = self.center_x
        self.add_widget(self.option_1)
        self.add_widget(self.option_2)
        
    def on_touch_down(self,touch,*args):
        super(MainMenu,self).on_touch_down(touch,*args)
        if self.option_1.collide_point(*touch.pos):
            self.parent.add_widget(GameArea(size=self.size))
            self.parent.remove_widget(self)
        elif self.option_2.collide_point(*touch.pos):
            self.parent.add_widget(SettingsScreen(size=self.size))
            self.parent.remove_widget(self)
Ejemplo n.º 3
0
class CommandMenu(BoxLayout):
    def __init__(self, node_):
        BoxLayout.__init__(self, orientation='vertical', size_hint=(0.25,1), pos_hint={'x': 0.75 if node_.pos_hint['x'] <= 0.5 else 0, 'y': 0})
        self.node = node_

        self.canvas.add(Color(0.745098, 0.745098, 0.745098))
        self.bg_rect = Rectangle(pos=self.pos, size=self.size)
        self.canvas.add(self.bg_rect)
        self.canvas.add(Color(0,0,0))
        def temp_labeller_redraw(a, b):
            self.bg_rect.pos = self.pos
            self.bg_rect.size = self.size
        self.bind(pos=temp_labeller_redraw, size=temp_labeller_redraw)

        self.add_below = Label(size_hint=(1, None), height=0.36*self.height, text = "Node\nX: %(x).3f\nY: %(y).3f" % self.node.pos_hint, font_size=20) 
        def add_below_callback(thing, instance):
            if self.add_below.collide_point(*instance.pos):
               self.parent.dont_check = True
            return super(Label, self.add_below).on_touch_down(instance)
        self.add_below.bind(on_touch_down=add_below_callback)
        self.add_widget(self.add_below)

        self.scroller = ScrollView(size_hint=(1,1), do_scroll_y=True, do_scroll_x=False)
        self.add_widget(self.scroller)
        self.grid = GridLayout(cols=1, spacing=10, size_hint_y=None)
        self.scroller.add_widget(self.grid)
        self.grid.bind(minimum_height=self.grid.setter('height'))
        self.bind(pos=self.redraw, size=self.redraw)

        if len(self.node.command_list) == 0:
            self.grid.add_widget(SetCommandButton())
        else:
            for i in self.node.command_list:
                self.grid.add_widget(SetCommandButton(val=i))

    def redraw(self, _1, _2):
        self.add_below.height=0.36*self.height
        for i in self.grid.children:
            i.height = 0.2*self.height

    def store_list(self):
        self.node.command_list = []
        for i in reversed(self.grid.children):
            if i.command != "" and i.command != "(Set Command)":
                self.node.command_list.append(i.command)
Ejemplo n.º 4
0
class ModelEntry(SparseGridLayout):
    def __init__(self, model_id, is_active, model_manager: ModelManager,
                 open_callback, save_callback, delete_callback,
                 rename_callback):
        super().__init__(rows=1, cols=6, size_hint_y=None, height=40)
        self.model_id = model_id
        self.model_manager = model_manager
        self.open_callback = open_callback
        self.save_callback = save_callback
        self.delete_callback = delete_callback
        self.rename_callback = rename_callback

        background_color = (0.3, 0.3, 0.3, 1)
        if is_active:
            background_color = (0.3, 0.3, 0.6, 1)
        self.background = Label(padding_x=10)
        self.add_entry(self.background,
                       position=(0, 0),
                       shape=(1, 6),
                       padding_x=(0.01, 0.01),
                       padding_y=(0.05, 0.05),
                       color=background_color)

        self.model_label = Label(text=model_id,
                                 halign="left",
                                 valign="middle",
                                 padding_x=10)
        self.model_label.bind(size=self.model_label.setter('text_size'))
        self.model_label.on_touch_down = self.on_label_press
        self.add_entry(self.model_label,
                       position=(0, 0),
                       shape=(1, 3),
                       padding_x=(0.01, 0.01),
                       padding_y=(0.05, 0.05))

        if model_id in self.model_manager.unsaved_models:
            self.save_button = Button(text="Save")
            self.save_button.on_press = self.save_model
            self.add_entry(self.save_button,
                           position=(0, 3),
                           shape=(1, 1),
                           padding_x=(0.01, 0.01),
                           padding_y=(0.1, 0.1),
                           index=10)

        self.open_button = Button(text="Open")
        self.open_button.on_press = self.open_model
        self.add_entry(self.open_button,
                       position=(0, 4),
                       shape=(1, 1),
                       padding_x=(0.01, 0.01),
                       padding_y=(0.1, 0.1),
                       index=10)

        self.delete_button = Button(text="Delete")
        self.delete_button.on_press = self.delete_model
        self.add_entry(self.delete_button,
                       position=(0, 5),
                       shape=(1, 1),
                       padding_x=(0.01, 0.01),
                       padding_y=(0.1, 0.1),
                       index=10)

    def open_model(self):
        self.update_color(self.background, (0.3, 0.3, 0.6, 1))
        self.open_callback(self.model_id)

    def on_label_press(self, touch):
        if self.model_label.collide_point(*touch.pos):
            self.remove_entry(self.model_label)
            self.model_label = TextInput(text=self.model_id, multiline=False)
            self.model_label.bind(focus=self.rename_model)
            self.model_label.on_touch_down(touch)
            self.add_entry(self.model_label,
                           position=(0, 0),
                           shape=(1, 3),
                           padding_x=(0.01, 0.01),
                           padding_y=(0.05, 0.05))

    def rename_model(self, instance, value):
        if not value:
            new_id = self.model_label.text
            self.remove_entry(self.model_label)
            if new_id != self.model_id:
                self.model_manager.rename_model(self.model_id, new_id)
                self.rename_callback(self.model_id, new_id)
                self.model_id = new_id
            self.model_label = Label(text=self.model_id,
                                     halign="left",
                                     valign="middle",
                                     padding_x=10)
            self.model_label.bind(size=self.model_label.setter('text_size'))
            self.model_label.on_touch_down = self.on_label_press
            self.add_entry(self.model_label,
                           position=(0, 0),
                           shape=(1, 3),
                           padding_x=(0.01, 0.01),
                           padding_y=(0.05, 0.05))

    def save_model(self):
        self.model_manager.save_model(self.model_id)
        self.remove_widget(self.save_button)
        self.save_callback(self.model_id)

    def delete_model(self):
        self.model_manager.delete_model(self.model_id)
        self.parent.remove_widget(self)
        self.delete_callback(self.model_id)
        EventListener.trigger_event("refresh_training_models")
Ejemplo n.º 5
0
class ConvApp(App):
    try:  #подключение к API
        RATES = {
            'EUR':
            requests.get(
                'https://api.exchangeratesapi.io/latest').json()["rates"],
            'JPY':
            requests.get('https://api.exchangeratesapi.io/latest?base=JPY'
                         ).json()["rates"],
            'RUB':
            requests.get('https://api.exchangeratesapi.io/latest?base=RUB'
                         ).json()["rates"],
            'USD':
            requests.get('https://api.exchangeratesapi.io/latest?base=USD'
                         ).json()["rates"],
            'GBP':
            requests.get('https://api.exchangeratesapi.io/latest?base=GBP').
            json()["rates"]
        }
    except:  #при отсутствии доступа переход к фиксированным значениям
        text = 'Конвертация валют   (Нет доступа к API)'
        RATES = {
            'EUR': {
                'RUB': 77.0563,
                'JPY': 123.41,
                'USD': 1.1285,
                'GBP': 0.89173
            },
            'JPY': {
                'GBP': 0.0072257516,
                'RUB': 0.6243926748,
                'EUR': 0.0081030711,
                'USD': 0.0091443157
            },
            'RUB': {
                'GBP': 0.0115724477,
                'JPY': 1.6015562647,
                'EUR': 0.0129775242,
                'USD': 0.0146451361
            },
            'USD': {
                'GBP': 0.7901905184,
                'RUB': 68.2820558263,
                'JPY': 109.3575542756,
                'EUR': 0.8861320337
            },
            'GBP': {
                'RUB': 86.4121426889,
                'JPY': 138.3939084701,
                'EUR': 1.1214156751,
                'USD': 1.2655175894
            }
        }
    else:
        text = 'Конвертация валют   (Доступ к API)'

    def build(self):
        #обновление конфигураций при запуске приложения
        self.config.set('val', 'first', 'RUB')
        self.config.update_config('conv.ini')
        self.config.set('val', 'second', 'USD')
        self.config.update_config('conv.ini')

        self.sound = SoundLoader.load('sound.wav')  #звук нажатия кнопок

        flt = FloatLayout(size_hint=(1, 1))  #основной виджет экрана
        #виджеты располагаются в порядке сверху вниз
        self.top_btn = Button(disabled=True,
                              size_hint=(1, .07),
                              background_color=(.42, .68, .87, 1),
                              background_disabled_normal='',
                              pos_hint={'top': 1},
                              text=self.text,
                              font_size='14sp',
                              font_name='arial.ttf')
        flt.add_widget(self.top_btn)
        #значения переводимой валюты и итог
        bxl_btn = Button(size_hint=(1, .15),
                         pos_hint={'top': .90},
                         disabled=True,
                         background_color=(.42, .68, .87, 1),
                         background_disabled_normal='')
        bxl = GridLayout(size_hint=(1, .15),
                         pos_hint={'top': .90},
                         cols=2,
                         rows=2)
        x = Window.size[0] * 0.77
        y = Window.size[1] * 0.066
        self.lbl_1 = Label(text='0',
                           color=(.8, .8, .8, 1),
                           font_size='32sp',
                           font_name='MilanoFont.ttf',
                           size_hint=(.9, .5),
                           halign='left',
                           text_size=(x, y))
        self.zn_1 = Label(text='₽', font_size='32sp', size_hint=(.1, .5))
        self.lbl_2 = Label(text='0',
                           color=(.8, .8, .8, 1),
                           font_size='32sp',
                           font_name='MilanoFont.ttf',
                           size_hint=(.9, .5),
                           halign='left',
                           disabled=True,
                           text_size=(x, y))
        self.zn_2 = Label(text='$', font_size='32sp', size_hint=(.1, .5))
        bxl.add_widget(self.lbl_1)
        bxl.add_widget(self.zn_1)
        bxl.add_widget(self.lbl_2)
        bxl.add_widget(self.zn_2)
        flt.add_widget(bxl_btn)
        flt.add_widget(bxl)
        #левая выезжающая кнопка выбора валюты
        self.l_btn = AnButt(size_hint=(1.01, .15),
                            pos_hint={
                                'top': .75,
                                'center_x': -.25
                            },
                            on_press=self.anim_l)
        self.bx_l = BoxLayout(
            size_hint=(1, .15), pos_hint={
                'top': .75,
                'center_x': -.25
            })  #виджет, содержащий в себе отдельные кнопки валют
        self.lb_1 = Label(size_hint=(.2, 1),
                          text='€',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.lb_2 = Label(size_hint=(.2, 1),
                          text='$',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.lb_3 = Label(size_hint=(.2, 1),
                          text='¥',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.lb_4 = Label(size_hint=(.2, 1),
                          text='£',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.lb_5 = Label(size_hint=(.2, 1), text='₽', font_size='28sp')
        n = [self.lb_1, self.lb_2, self.lb_3, self.lb_4, self.lb_5]
        for i in n:
            self.bx_l.add_widget(i)
        flt.add_widget(self.l_btn)
        flt.add_widget(self.bx_l)
        #правая выезжающая кнопка выбора валюты
        self.r_btn = NaButt(size_hint=(1.01, .15),
                            pos_hint={
                                'top': .75,
                                'center_x': 1.25
                            },
                            on_press=self.anim_r)
        self.bx_r = BoxLayout(size_hint=(1, .15),
                              pos_hint={
                                  'top': .75,
                                  'center_x': 1.25
                              })
        self.rb_1 = Label(size_hint=(.2, 1), text='$', font_size='28sp')
        self.rb_2 = Label(size_hint=(.2, 1),
                          text='₽',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.rb_3 = Label(size_hint=(.2, 1),
                          text='¥',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.rb_4 = Label(size_hint=(.2, 1),
                          text='£',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        self.rb_5 = Label(size_hint=(.2, 1),
                          text='€',
                          color=(.9, .9, .9, 1),
                          font_size='28sp')
        n = [self.rb_1, self.rb_2, self.rb_3, self.rb_4, self.rb_5]
        for i in n:
            self.bx_r.add_widget(i)
        flt.add_widget(self.r_btn)
        flt.add_widget(self.bx_r)
        #кнопка 'OK'
        self.ok = Number(num='ok',
                         size_hint=(.2, .2),
                         pos_hint={
                             'center_x': 0.5,
                             'top': .67
                         },
                         on_press=self.ok_press)
        flt.add_widget(self.ok)
        #сетка калькулятора
        self.grl = GridLayout(size_hint=(1, .45),
                              pos_hint={'top': .47},
                              cols=3,
                              rows=4,
                              spacing=10,
                              padding=-5)
        self.grl.add_widget(
            Number(num=7, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=8, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=9, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=4, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=5, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=6, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=1, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=2, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=3, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num='p', size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num=0, size_hint=(.3, .4), on_press=self.numbers))
        self.grl.add_widget(
            Number(num='b', size_hint=(.3, .4), on_press=self.numbers))
        flt.add_widget(self.grl)

        return flt

    #создание файла конфигураций для определения конвертируемых валют
    def build_config(self, config):
        config.setdefaults('val', {'first': 'RUB', 'second': 'USD'})
        Window.bind(on_touch_down=self.touch_down)

    dct = {'₽': 'RUB', '€': 'EUR', '$': 'USD', '¥': 'JPY', '£': 'GBP'}

    #словарь нужен, так как для конфигураций нельзя использовать символы обозначения валют
    def touch_down(self, obj, t):
        #работа левой кнопки выбора валют
        if self.bx_l.collide_point(*t.pos):
            if self.lb_1.collide_point(*t.pos):
                self.lb_1.text, self.lb_5.text = self.lb_5.text, self.lb_1.text
            elif self.lb_2.collide_point(*t.pos):
                self.lb_2.text, self.lb_5.text = self.lb_5.text, self.lb_2.text
            elif self.lb_3.collide_point(*t.pos):
                self.lb_3.text, self.lb_5.text = self.lb_5.text, self.lb_3.text
            elif self.lb_4.collide_point(*t.pos):
                self.lb_4.text, self.lb_5.text = self.lb_5.text, self.lb_4.text
            #изменение конфигураций после выбора валюты
            self.zn_1.text = self.lb_5.text
            self.config.set('val', 'first', self.dct[self.lb_5.text])
            self.config.update_config('conv.ini')
        #работа правой кнопки выбора валют
        if self.bx_r.collide_point(*t.pos):
            if self.rb_2.collide_point(*t.pos):
                self.rb_1.text, self.rb_2.text = self.rb_2.text, self.rb_1.text
            elif self.rb_3.collide_point(*t.pos):
                self.rb_1.text, self.rb_3.text = self.rb_3.text, self.rb_1.text
            elif self.rb_4.collide_point(*t.pos):
                self.rb_1.text, self.rb_4.text = self.rb_4.text, self.rb_1.text
            elif self.rb_5.collide_point(*t.pos):
                self.rb_1.text, self.rb_5.text = self.rb_5.text, self.rb_1.text
            #изменение конфигураций после выбора валюты
            self.zn_2.text = self.rb_1.text
            self.config.set('val', 'second', self.dct[self.rb_1.text])
            self.config.update_config('conv.ini')

    #нажатие кнопки 'OK' и подсчёт значения
    m = 0  #счётчик для изменения статуса работы в верхней части экрана

    def ok_press(self, btn):
        self.sound.play()
        #значения для конвертации берутся из конфигураций
        vl_1 = self.config.get('val', 'first')
        vl_2 = self.config.get('val', 'second')
        try:
            sm = float(
                self.lbl_1.text)  #отлов исключений при некорректном вводе
        except:
            self.top_btn.text = 'Введите корректное число'
            self.m = 1
        else:
            if self.m:
                self.top_btn.text = self.text
                self.m = 0
            if vl_1 == vl_2:
                self.lbl_2.text = self.lbl_1.text
            else:
                if sm:
                    self.lbl_2.text = '%.2f' % (self.RATES[vl_1][vl_2] * sm)
                    self.lbl_2.color = (1, 1, 1, 1)
                else:
                    self.lbl_2.text = '0'
                    self.lbl_2.color = (.8, .8, .8, 1)

    #анимация левой кнопки валют
    k = 1

    def anim_l(self, btn):

        self.sound.play()

        if self.k % 2 == 1:
            #сдвиг правой кнопки для освобождения места
            an = Animation(pos_hint={'center_x': 1.76}, duration=.2)
            an.start(self.r_btn)
            an.start(self.bx_r)
            an = Animation(pos_hint={'center_x': .49},
                           duration=.2)  #сдвиг левой кнопки
            an.start(btn)
            an.start(self.bx_l)
            self.k += 1
        else:
            an = Animation(pos_hint={'center_x': 1.25}, duration=.2)
            an.start(self.r_btn)
            an.start(self.bx_r)
            an = Animation(pos_hint={'center_x': -.25}, duration=.2)
            an.start(btn)
            an.start(self.bx_l)
            self.k += 1

    #анимация правой кнопки валют
    n = 1

    def anim_r(self, btn):

        self.sound.play()

        if self.n % 2 == 1:
            an = Animation(pos_hint={'center_x': -.51}, duration=.2)
            an.start(self.l_btn)
            an.start(self.bx_l)
            an = Animation(pos_hint={'center_x': .51}, duration=.2)
            an.start(btn)
            an.start(self.bx_r)
            self.n += 1
        else:
            an = Animation(pos_hint={'center_x': -.25}, duration=.2)
            an.start(self.l_btn)
            an.start(self.bx_l)
            an = Animation(pos_hint={'center_x': 1.25}, duration=.2)
            an.start(btn)
            an.start(self.bx_r)
            self.n += 1

    #калькулятор
    def numbers(self, btn):
        self.sound.play()
        if btn.num == 'p':
            if self.lbl_1.text == '0':
                self.lbl_1.color = (1, 1, 1, 1)
            self.lbl_1.text += '.'
        elif btn.num == 'b':
            self.lbl_1.text = self.lbl_1.text[:-1]
            if self.lbl_1.text == '':
                self.lbl_1.text = '0'
                self.lbl_1.color = (.8, .8, .8, 1)
        else:
            if self.lbl_1.text == '0':
                self.lbl_1.color = (1, 1, 1, 1)
                self.lbl_1.text = ''
                self.lbl_1.text += str(btn.num)
            else:
                self.lbl_1.text += str(btn.num)
Ejemplo n.º 6
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
Ejemplo n.º 7
0
class AudioEntry(SparseGridLayout):

    def __init__(self, audio_id, audio_manager: AudioManager):
        super().__init__(rows=1, cols=6, size_hint_y=None, height=40)
        self.audio_id = audio_id
        self.audio_manager = audio_manager

        self.background = Label(padding_x=10)
        self.add_entry(self.background, position=(0, 0), shape=(1, 6), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1))

        self.audio_label = Label(text=audio_id, halign="left", valign="middle", padding_x=10)
        self.audio_label.bind(size=self.audio_label.setter('text_size'))
        self.audio_label.on_touch_down = self.on_label_press
        self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05),)

        if audio_id in self.audio_manager.unsaved_audio:
            self.save_button = Button(text="Save")
            self.save_button.on_press = self.save_clip
            self.add_entry(self.save_button, position=(0, 3), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10)

        self.play_button = Button(text="Play")
        self.play_button.on_press = self.play_audio
        self.add_entry(self.play_button, position=(0, 4), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10)

        self.delete_button = Button(text="Delete")
        self.delete_button.on_press = self.delete_clip
        self.add_entry(self.delete_button, position=(0, 5), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10)

    def on_label_press(self, touch):
        if self.audio_label.collide_point(*touch.pos):
            self.remove_entry(self.audio_label)
            self.audio_label = TextInput(text=self.audio_id, multiline=False)
            self.audio_label.bind(focus=self.update_audio_label)
            self.audio_label.on_touch_down(touch)
            self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1))

    def update_audio_label(self, instance, value):
        if not value:
            new_id = self.audio_label.text
            self.remove_entry(self.audio_label)
            if new_id != self.audio_id:
                self.audio_manager.rename_audio(self.audio_id, new_id)
                self.audio_id = new_id
            self.audio_label = Label(text=self.audio_id, halign="left", valign="middle", padding_x=10)
            self.audio_label.bind(size=self.audio_label.setter('text_size'))
            self.audio_label.on_touch_down = self.on_label_press
            self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1))

    def update_stop_to_play(self):
        self.play_button.text = "Play"
        self.play_button.on_press = self.play_audio

    def play_audio(self):
        self.audio_manager.play_audio(self.audio_id, on_complete=self.update_stop_to_play)
        self.play_button.text = "Stop"
        self.play_button.on_press = self.stop_audio

    def stop_audio(self):
        self.audio_manager.stop_audio()
        self.update_stop_to_play()

    def save_clip(self):
        self.audio_manager.save_audio(self.audio_id)
        self.remove_widget(self.save_button)

    def delete_clip(self):
        self.audio_manager.delete_audio(self.audio_id)
        self.parent.remove_widget(self)
        EventListener.trigger_event("update_audio_entries")
Ejemplo n.º 8
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