Example #1
0
 def build(self, back_btn=True):
     menu_args = self.menu_args
     frm = Frame(frameSize=(-1.5, 1.5, -.9, .9),
                 frameColor=(.95, .95, .7, .85))
     txt = _(
         'Please, visit our site after exiting!\n\nIt helps us! Thank you!')
     txt = Text(txt,
                pos=(0, .64),
                scale=.08,
                wordwrap=32,
                fg=menu_args.text_active,
                font=menu_args.font)
     menu_data = [('visit our site after exiting',
                   _('visit our site after exiting'),
                   lambda: self.on_end(True)),
                  ("don't visit our site after exiting",
                   _("don't visit our site after exiting"),
                   lambda: self.on_end(False))]
     btn_args = self.menu_args.btn_args
     btn_args['frameSize'] = (-12, 12, -.8, 1.2)
     btn_visit = Btn(text=menu_data[0][1],
                     pos=(0, 1, 0),
                     command=menu_data[0][2],
                     text_scale=.9,
                     **btn_args)
     btn_dont_visit = Btn(text=menu_data[1][1],
                          pos=(0, 1, -.5),
                          command=menu_data[1][2],
                          text_scale=.7,
                          **btn_args)
     widgets = [frm, txt, btn_visit, btn_dont_visit]
     self.add_widgets(widgets)
     PageGui.build(self, False)
Example #2
0
    def build(self, back_btn=True):
        frm = Frame(
            frameSize=(-1.5, 1.5, -.9, .9), frameColor=(.95, .95, .7, .85))
        question_txt = _(
            "What do you want to do?\n\nNote: use '%s' for pausing the game.")
        question_txt = question_txt % self.keys.pause
        menu_args = self.menu_args
        txt = Text(
            question_txt, pos=(0, .64), scale=.08, wordwrap=32,
            fg=menu_args.text_active, font=menu_args.font)
        on_back = lambda: self.on_end(True)
        on_end = lambda: self.on_end(False)
        menu_data = [
            ('back to the game', _('back to the game'), on_back),
            ('back to the main menu', _('back to the main menu'), on_end)]
        btn_args = menu_args.btn_args
        btn_visit = Btn(
            text=menu_data[0][1], pos=(0, 1, 0), command=menu_data[0][2],
            text_scale=.8, **btn_args)
        btn_dont_visit = Btn(
            text=menu_data[1][1], pos=(0, 1, -.5), command=menu_data[1][2],
            text_scale=.8, **btn_args)
        self.add_widgets([frm, txt, btn_visit, btn_dont_visit])
        PageGui.build(self, False)

        if self.eng.lib.version().startswith('1.10'):
            self.eng.show_cursor()
        else:
            self.eng.hide_cursor()
            self.eng.show_standard_cursor()
Example #3
0
 def __init__(self, menu_args):
     GameObject.__init__(self)
     self.eng.log('created match message form')
     self.chat = None
     self.msg_frm = DirectFrame(
         frameSize=(-.02, 2.5, 0, 1.22),
         frameColor=(.2, .2, .2, .5),
         pos=(.04, 1, -1.69), parent=base.a2dTopLeft)
     t_a = menu_args.text_args
     t_a['scale'] = .05
     t_a['fg'] = menu_args.text_normal
     self.dst_txt = OnscreenText(
         text='', pos=(0, 1.16), parent=self.msg_frm, align=TextNode.A_left,
         **t_a)
     self.ent = Entry(
         scale=.04, pos=(0, 1, .03), entryFont=menu_args.font, width=62,
         frameColor=menu_args.btn_color, parent=self.msg_frm,
         initialText=_('write here your message'),
         command=self.on_typed_msg, focusInCommand=self.on_focus,
         focusInExtraArgs=['in'], focusOutCommand=self.on_focus,
         focusOutExtraArgs=['out'], text_fg=menu_args.text_active)
     self.ent['state'] = DISABLED
     self.txt_frm = DirectScrolledFrame(
         frameSize=(-.02, 2.46, -.02, 1.02),
         canvasSize=(-.02, 2.42, -.02, 1.02),
         scrollBarWidth=.036,
         verticalScroll_relief=FLAT,
         verticalScroll_frameColor=(.2, .2, .2, .4),
         verticalScroll_thumb_relief=FLAT,
         verticalScroll_thumb_frameColor=(.8, .8, .8, .6),
         verticalScroll_incButton_relief=FLAT,
         verticalScroll_incButton_frameColor=(.8, .8, .8, .6),
         verticalScroll_decButton_relief=FLAT,
         verticalScroll_decButton_frameColor=(.8, .8, .8, .6),
         horizontalScroll_relief=FLAT,
         frameColor=(1, 1, 1, .0),
         pos=(.02, 1, .11), parent=self.msg_frm)
     t_a['scale'] = .046
     self.msg_txt = OnscreenText(
         text='', pos=(0, .24), parent=self.txt_frm.getCanvas(),
         align=TextNode.A_left, wordwrap=52, **t_a)
     lab_args = menu_args.label_args
     lab_args['scale'] = .046
     lab_args['text_fg'] = menu_args.text_normal
     self.lab_frm = Btn(
         frameSize=(-.02, 2.5, -.01, .05),
         frameColor=(1, 1, 1, 0),
         pos=(0, 1, 1.15), parent=self.msg_frm)
     self.lab_frm.bind(ENTER, self.on_enter)
     self.lab_frm.bind(EXIT, self.on_exit)
     self.tooltip = DirectLabel(
         text='', pos=(2.4, 1, -.06),
         parent=self.lab_frm, text_wordwrap=50, text_bg=(.2, .2, .2, .8),
         text_align=TextNode.A_right, **lab_args)
     self.tooltip.set_bin('gui-popup', 10)
     self.tooltip.hide()
Example #4
0
 def __add_btn(self, text, pos_z):
     btn = Btn(pos=(.26, 1, pos_z),
               text=text,
               command=self.start_rec,
               **self.menu_args.btn_args)
     btn['extraArgs'] = [btn]
     self.ibuttons += [btn]
     return btn
Example #5
0
 def __init__(self, menu_args):
     MatchFrm.__init__(self, menu_args)
     btn_args = self.menu_args.btn_args
     btn_args['scale'] = .06
     Btn(text=_('Start'),
         pos=(1.2, 1, .03),
         command=self.on_start,
         parent=self.match_frm,
         **btn_args)
Example #6
0
 def build(self):
     menu_args = self.menu_args
     t_a = menu_args.text_args.copy()
     # del t_a['scale']
     jid_lab = Text(_('Your jabber id:'), pos=(-.25, .8),
                            align='right', **t_a)
     pwd_lab = Text(_('Your jabber password:'******'right', **t_a)
     init_txt = self.props.opt_file['settings']['xmpp']['usr'] if \
         self.props.opt_file['settings']['xmpp']['usr'] else \
         _('your jabber id')
     self.jid_ent = Entry(
         scale=.08, pos=(-.15, 1, .8), entryFont=menu_args.font, width=12,
         frameColor=menu_args.btn_color, initialText=init_txt,
         text_fg=menu_args.text_active, on_tab=self.on_tab,
         on_click=self.on_click)
     self.pwd_ent = Entry(
         scale=.08, pos=(-.15, 1, .6), entryFont=menu_args.font, width=12,
         frameColor=menu_args.btn_color, obscured=True,
         text_fg=menu_args.text_active, command=self.start)
     start_btn = Btn(
         text=_('Log-in'), pos=(-.2, 1, .4), command=self.start,
         **self.props.gameprops.menu_args.btn_args)
     self.store_cb = CheckBtn(
         pos=(-.2, 1, .1), text=_('store the password'),
         indicatorValue=False, indicator_frameColor=menu_args.text_active,
         **menu_args.checkbtn_args)
     t_a['scale'] = .06
     store_lab = Text(
         _('(only if your computer is not shared with other people)'),
         pos=(-.2, -.02), wordwrap=64, **t_a)
     notes_texts = [
         _('If you are a supporter, please write us (%s) your '
           'jabber id so we can highlight your account as a supporter '
           'one.'),
         _('Yorg sends your XMPP presence to other Yorg users, so they '
           "can see your XMPP presence status. If you don't want this, "
           "please don't use your personal account and create a new one "
           'for Yorg.'),
         _('When you add a Yorg friend, you are adding it to your '
           "account's roster too."),
         _("Yorg's XMPP code is still experimental: if you have "
           'important data in your XMPP account, please create a new '
           'account for playing Yorg with.')]
     notes_texts = [str(i + 1) + '. ' + elm for i, elm in enumerate(notes_texts)]
     notes_texts[0] = notes_texts[0] % '*****@*****.**'
     notes_txt = '\n'.join(notes_texts)
     notes_lab = Text(
         notes_txt, pos=(-1.64, -.16), align='left', wordwrap=42,
         **t_a)
     widgets = [self.jid_ent, self.pwd_ent, start_btn, jid_lab, pwd_lab,
                self.store_cb, store_lab, notes_lab]
     self.add_widgets(widgets)
     self.eng.attach_obs(self.on_frame)
     ThanksPageGui.build(self)
Example #7
0
 def set_news(self):
     menu_args = self.props.gameprops.menu_args
     feeds = parse(self.props.feed_url)
     if not feeds['entries']: return
     self.__feed_type = \
         'rss' if 'published' in feeds['entries'][0] else 'atom'
     self.__date_field = \
         'published' if self.__feed_type == 'rss' else 'updated'
     publ = lambda entry: self.__conv(entry[self.__date_field])
     rss = sorted(feeds['entries'], key=publ)
     conv_time = lambda ent: datetime.strftime(self.__conv(ent), '%b %d')
     rss = [(conv_time(ent[self.__date_field]), ent['title'])
            for ent in rss]
     rss.reverse()
     rss = rss[:5]
     rss = [(_rss[0], self.__ellipsis_str(_rss[1])) for _rss in rss]
     frm = Frame(frameSize=(0, 1.0, 0, .75),
                 frameColor=(.2, .2, .2, .5),
                 pos=(.05, 1, .1),
                 parent=base.a2dBottomLeft)
     texts = [
         Text(_('Last news:'),
              pos=(.55, .75),
              scale=.055,
              wordwrap=32,
              parent='bottomleft',
              fg=menu_args.text_normal,
              font=menu_args.font,
              tra_src='Last news:',
              tra_tra=_('Last news:'))
     ]
     rss = [map(self.__to_unicode, rss_str) for rss_str in rss]
     texts += [
         Text(': '.join(rss[i]),
              pos=(.1, .65 - i * .1),
              scale=.055,
              wordwrap=32,
              parent='bottomleft',
              align='left',
              fg=menu_args.text_normal,
              font=menu_args.font) for i in range(min(5, len(rss)))
     ]
     btn_args = self.props.gameprops.menu_args.btn_args.copy()
     btn_args['scale'] = .055
     show_btn = Btn(text=_('show'),
                    pos=(.55, 1, .15),
                    command=self.eng.open_browser,
                    extraArgs=[self.props.site_url],
                    parent=base.a2dBottomLeft,
                    tra_src='show',
                    tra_tra=_('show'),
                    **btn_args)
     self.add_widgets([frm] + texts + [show_btn])
Example #8
0
class UserFrmMe(GameObject, Subject):
    def __init__(self,
                 name,
                 name_full,
                 is_supporter,
                 is_online,
                 pos,
                 parent,
                 menu_args,
                 msg_btn_x=.58):
        Subject.__init__(self)
        GameObject.__init__(self)
        self.name_full = name_full
        self.menu_args = menu_args
        self.frm = Btn(frameSize=(-.01, .79, .05, -.03),
                       frameColor=(1, 1, 1, 0),
                       pos=pos,
                       parent=parent)
        name = name.split('@')[0] + '\1smaller\1@' + name.split('@')[1] + '\2'
        self.lab = UserLabel(name, self.frm, menu_args, is_supporter,
                             is_online, name_full)
        self.frm.bind(ENTER, self.on_enter)
        self.frm.bind(EXIT, self.on_exit)

    def on_enter(self, pos):
        self.lab.on_enter(pos)

    def on_exit(self, pos):
        self.lab.on_exit(pos)

    def destroy(self):
        self.lab.destroy()
        self.frm.destroy()
        Subject.destroy(self)
        GameObject.destroy(self)
Example #9
0
 def build(self):
     menu_data = [
         (_('Single race'), self.on_single_race),
         (_('New season'), self.on_start),
         (_('Continue season'), lambda: self.notify('on_continue'))]
     widgets = [
         Btn(
             text=menu[0], pos=(-.2, 1, .4-i*.28), command=menu[1],
             **self.props.gameprops.menu_args.btn_args)
         for i, menu in enumerate(menu_data)]
     self.add_widgets(widgets)
     self._set_widgets()
     if not self.props.has_save:
         widgets[-1].disable()
     ThanksPageGui.build(self)
Example #10
0
 def build(self):
     menu_args = self.menu_args
     dev_str = [
         _('Code') + ': Flavio Calva',
         _('Art') + ': Luca Quartero',
         _('Audio') + ': Jay Bachelor',
         _('Translations') + ': Wuzzy, GunChleoc, Leandro Vergara, xin'
     ]
     dev_str = '\n\n'.join(dev_str)
     txt = Text(dev_str, pos=(-.2, .72), wordwrap=20, **menu_args.text_args)
     btn = Btn(text=_('Supporters'),
               pos=(-.2, 1, -.4),
               command=lambda: self.notify('on_push_page', 'supporters'),
               **menu_args.btn_args)
     self.add_widgets([txt, btn])
     ThanksPageGui.build(self)
Example #11
0
 def build(self):
     sp_cb = lambda: self.notify('on_push_page', 'singleplayer',
                                 [self.props])
     supp_cb = lambda: self.eng.open_browser(self.props.support_url)
     cred_cb = lambda: self.notify('on_push_page', 'credits')
     menu_data = [('Single Player', _('Single Player'), sp_cb),
                  ('Options', _('Options'), self.on_options),
                  ('Support us', _('Support us'), supp_cb),
                  ('Credits', _('Credits'), cred_cb),
                  ('Not up-to-date', self.get_label(), self.on_loginout),
                  ('Quit', _('Quit'), lambda: self.notify('on_exit'))]
     widgets = [
         Btn(text='',
             pos=(0, 1, .64 - i * .23),
             command=menu[2],
             tra_src=menu_data[i][0],
             tra_tra=menu_data[i][1],
             **self.props.gameprops.menu_args.btn_args)
         for i, menu in enumerate(menu_data)
     ]
     logo_img = Img(self.props.title_img,
                    scale=(.64, 1, .64 * (380.0 / 772)),
                    parent=base.a2dTopLeft,
                    pos=(.65, 1, -.32))
     widgets += [logo_img]
     lab_args = self.props.gameprops.menu_args.label_args
     lab_args['scale'] = .12
     lab_args['text_fg'] = self.props.gameprops.menu_args.text_err
     wip_lab = Label(text='',
                     pos=(.05, 1, -.76),
                     parent=base.a2dTopLeft,
                     text_wordwrap=10,
                     text_align=TextNode.A_left,
                     tra_src='Note: the game is work-in-progress',
                     tra_tra=_('Note: the game is work-in-progress'),
                     **lab_args)
     self.widgets += [wip_lab]
     self.add_widgets(widgets)
     self.set_news()
     MainPageGui.build(self)
     if not self.ver_check.is_uptodate():
         self.widgets[5]['state'] = DISABLED
Example #12
0
class MatchMsgFrm(GameObject):
    def __init__(self, menu_args):
        GameObject.__init__(self)
        self.eng.log('created match message form')
        self.chat = None
        self.msg_frm = DirectFrame(frameSize=(-.02, 2.5, 0, 1.22),
                                   frameColor=(.2, .2, .2, .5),
                                   pos=(.04, 1, -1.69),
                                   parent=base.a2dTopLeft)
        t_a = menu_args.text_args
        t_a['scale'] = .05
        t_a['fg'] = menu_args.text_normal
        self.dst_txt = OnscreenText(text='',
                                    pos=(0, 1.16),
                                    parent=self.msg_frm,
                                    align=TextNode.A_left,
                                    **t_a)
        self.ent = Entry(scale=.04,
                         pos=(0, 1, .03),
                         entryFont=menu_args.font,
                         width=62,
                         frameColor=menu_args.btn_color,
                         parent=self.msg_frm,
                         initialText=_('write here your message'),
                         command=self.on_typed_msg,
                         focusInCommand=self.on_focus,
                         focusInExtraArgs=['in'],
                         focusOutCommand=self.on_focus,
                         focusOutExtraArgs=['out'],
                         text_fg=menu_args.text_active)
        self.ent['state'] = DISABLED
        self.txt_frm = DirectScrolledFrame(
            frameSize=(-.02, 2.46, -.02, 1.02),
            canvasSize=(-.02, 2.42, -.02, 1.02),
            scrollBarWidth=.036,
            verticalScroll_relief=FLAT,
            verticalScroll_frameColor=(.2, .2, .2, .4),
            verticalScroll_thumb_relief=FLAT,
            verticalScroll_thumb_frameColor=(.8, .8, .8, .6),
            verticalScroll_incButton_relief=FLAT,
            verticalScroll_incButton_frameColor=(.8, .8, .8, .6),
            verticalScroll_decButton_relief=FLAT,
            verticalScroll_decButton_frameColor=(.8, .8, .8, .6),
            horizontalScroll_relief=FLAT,
            frameColor=(1, 1, 1, .0),
            pos=(.02, 1, .11),
            parent=self.msg_frm)
        t_a['scale'] = .046
        self.msg_txt = OnscreenText(text='',
                                    pos=(0, .24),
                                    parent=self.txt_frm.getCanvas(),
                                    align=TextNode.A_left,
                                    wordwrap=52,
                                    **t_a)
        lab_args = menu_args.label_args
        lab_args['scale'] = .046
        lab_args['text_fg'] = menu_args.text_normal
        self.lab_frm = Btn(frameSize=(-.02, 2.5, -.01, .05),
                           frameColor=(1, 1, 1, 0),
                           pos=(0, 1, 1.15),
                           parent=self.msg_frm)
        self.lab_frm.bind(ENTER, self.on_enter)
        self.lab_frm.bind(EXIT, self.on_exit)
        self.tooltip = DirectLabel(text='',
                                   pos=(2.4, 1, -.06),
                                   parent=self.lab_frm,
                                   text_wordwrap=50,
                                   text_bg=(.2, .2, .2, .8),
                                   text_align=TextNode.A_right,
                                   **lab_args)
        self.tooltip.set_bin('gui-popup', 10)
        self.tooltip.hide()

    def on_enter(self, pos):
        self.tooltip.show()

    def on_exit(self, pos):
        self.tooltip.hide()

    def add_msg_txt(self, msg):
        self.msg_txt['text'] += ('\n' if self.msg_txt['text'] else '') + msg
        txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \
            self.msg_txt.textNode.getLowerRight3d()[2]
        self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28)

    def set_title(self, title):
        ttitle = self.trunc(title, 160)
        fix_name = lambda name: name if '@' not in name else name.split('@')[
            0] + '\1smaller\1@' + name.split('@')[1] + '\2'
        if title:
            if ',' in ttitle:
                is_muc = True
                ttitle = ttitle
                names = ttitle.split(',')
                names = [name.strip() for name in names]
                names = [fix_name(name) for name in names]
                ttitle = ', '.join(names)
            else:
                ttitle = fix_name(ttitle)
        self.dst_txt['text'] = ttitle
        self.tooltip['text'] = title

    @staticmethod
    def trunc(name, lgt):
        if len(name) > lgt: return name[:lgt] + '...'
        return name

    def on_typed_msg(self, val):
        #self.add_msg_txt('\1italic\1' + _('you') + '\2: ' + val)
        self.ent.set('')
        self.eng.xmpp.client.send_message(
            mfrom=self.eng.xmpp.client.boundjid.full,
            mto=self.chat.dst,
            mtype='groupchat',
            mbody=val)
        self.ent['focus'] = 1

    def on_groupchat_msg(self, msg):
        src = str(JID(msg['mucnick']))
        src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2'
        self.eng.log('received groupchat message from %s in the chat %s' %
                     (msg['mucnick'], JID(msg['from']).bare))
        str_msg = '\1italic\1' + src + '\2: ' + str(msg['body'])
        if not self.chat:
            self.chat = MUC(str(JID(msg['from']).bare))
        self.chat.messages += [str_msg]
        if self.dst_txt['text'] == '':
            self.set_chat(self.chat)
        elif self.chat.dst == str(JID(msg['from']).bare):
            self.add_msg_txt(str_msg)

    def on_presence_available_room(self, msg):
        room = str(JID(msg['muc']['room']).bare)
        nick = str(msg['muc']['nick'])
        self.eng.log('user %s has logged in the chat %s' % (nick, room))
        self.chat.users += [nick]
        self.set_title(self.chat.title)

    def on_presence_unavailable_room(self, msg):
        room = str(JID(msg['muc']['room']).bare)
        nick = str(msg['muc']['nick'])
        self.eng.log('user %s has left the chat %s' % (nick, room))
        self.chat.users.remove(nick)
        self.set_title(self.chat.title)

    def add_groupchat(self, room, usr):
        self.set_title(usr)
        if not self.chat:
            self.chat = MUC(room)
        self.set_chat(self.chat)

    def set_chat(self, chat):
        self.set_title(chat.title)
        self.msg_txt['text'] = '\n'.join(chat.messages)
        txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \
            self.msg_txt.textNode.getLowerRight3d()[2]
        self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28)
        self.ent['state'] = NORMAL

    def on_focus(self, val):
        if val == 'in' and self.ent.get() == _('write here your message'):
            self.ent.set('')
        self.notify('on_match_msg_focus', val)

    def destroy(self):
        self.eng.log('message form destroyed')
        self.msg_frm.destroy()
        GameObject.destroy(self)
Example #13
0
 def __init__(self, menu_args):
     GameObject.__init__(self)
     self.eng.log('created message form')
     self.chats = []
     self.curr_chat = None
     self.curr_match_room = None
     self.msg_frm = DirectFrame(frameSize=(-.02, .8, 0, .45),
                                frameColor=(.2, .2, .2, .5),
                                pos=(-.82, 1, .02),
                                parent=base.a2dBottomRight)
     self.presences_sent = []
     self.menu_args = menu_args
     t_a = menu_args.text_args
     t_a['scale'] = .05
     t_a['fg'] = menu_args.text_normal
     self.dst_txt = OnscreenText(text='',
                                 pos=(0, .4),
                                 parent=self.msg_frm,
                                 align=TextNode.A_left,
                                 **t_a)
     self.arrow_btn = ImgBtn(parent=self.msg_frm,
                             scale=.024,
                             pos=(.7, 1, .42),
                             frameColor=(1, 1, 1, 1),
                             frameTexture='assets/images/gui/arrow.txo',
                             command=self.on_arrow,
                             **menu_args.imgbtn_args)
     self.arrow_btn.disable()
     self.close_btn = ImgBtn(parent=self.msg_frm,
                             scale=.024,
                             pos=(.76, 1, .42),
                             frameColor=(1, 1, 1, 1),
                             frameTexture='assets/images/gui/close.txo',
                             command=self.on_close,
                             **menu_args.imgbtn_args)
     self.close_btn.disable()
     self.ent = Entry(scale=.04,
                      pos=(0, 1, .03),
                      entryFont=menu_args.font,
                      width=19.5,
                      frameColor=menu_args.btn_color,
                      parent=self.msg_frm,
                      initialText=_('write here your message'),
                      command=self.on_typed_msg,
                      focusInCommand=self.on_focus,
                      focusInExtraArgs=['in'],
                      focusOutCommand=self.on_focus,
                      focusOutExtraArgs=['out'],
                      text_fg=menu_args.text_active)
     self.ent['state'] = DISABLED
     self.txt_frm = DirectScrolledFrame(
         frameSize=(-.02, .76, -.02, .28),
         canvasSize=(-.02, .72, -.02, .28),
         scrollBarWidth=.036,
         verticalScroll_relief=FLAT,
         verticalScroll_frameColor=(.2, .2, .2, .4),
         verticalScroll_thumb_relief=FLAT,
         verticalScroll_thumb_frameColor=(.8, .8, .8, .6),
         verticalScroll_incButton_relief=FLAT,
         verticalScroll_incButton_frameColor=(.8, .8, .8, .6),
         verticalScroll_decButton_relief=FLAT,
         verticalScroll_decButton_frameColor=(.8, .8, .8, .6),
         horizontalScroll_relief=FLAT,
         frameColor=(1, 1, 1, 0),
         pos=(.02, 1, .11),
         parent=self.msg_frm)
     t_a['scale'] = .046
     self.msg_txt = OnscreenText(text='',
                                 pos=(0, .24),
                                 parent=self.txt_frm.getCanvas(),
                                 align=TextNode.A_left,
                                 wordwrap=14,
                                 **t_a)
     lab_args = menu_args.label_args
     lab_args['scale'] = .046
     lab_args['text_fg'] = menu_args.text_normal
     self.lab_frm = Btn(frameSize=(-.02, .64, -.01, .05),
                        frameColor=(1, 1, 1, 0),
                        pos=(0, 1, .4),
                        parent=self.msg_frm)
     self.lab_frm.bind(ENTER, self.on_enter)
     self.lab_frm.bind(EXIT, self.on_exit)
     self.tooltip = DirectLabel(text='',
                                pos=(.78, 1, -.06),
                                parent=self.lab_frm,
                                text_wordwrap=16,
                                text_bg=(.2, .2, .2, .8),
                                text_align=TextNode.A_right,
                                **lab_args)
     self.tooltip.set_bin('gui-popup', 10)
     self.tooltip.hide()
Example #14
0
class MessageFrm(GameObject):
    def __init__(self, menu_args):
        GameObject.__init__(self)
        self.eng.log('created message form')
        self.chats = []
        self.curr_chat = None
        self.curr_match_room = None
        self.msg_frm = DirectFrame(frameSize=(-.02, .8, 0, .45),
                                   frameColor=(.2, .2, .2, .5),
                                   pos=(-.82, 1, .02),
                                   parent=base.a2dBottomRight)
        self.presences_sent = []
        self.menu_args = menu_args
        t_a = menu_args.text_args
        t_a['scale'] = .05
        t_a['fg'] = menu_args.text_normal
        self.dst_txt = OnscreenText(text='',
                                    pos=(0, .4),
                                    parent=self.msg_frm,
                                    align=TextNode.A_left,
                                    **t_a)
        self.arrow_btn = ImgBtn(parent=self.msg_frm,
                                scale=.024,
                                pos=(.7, 1, .42),
                                frameColor=(1, 1, 1, 1),
                                frameTexture='assets/images/gui/arrow.txo',
                                command=self.on_arrow,
                                **menu_args.imgbtn_args)
        self.arrow_btn.disable()
        self.close_btn = ImgBtn(parent=self.msg_frm,
                                scale=.024,
                                pos=(.76, 1, .42),
                                frameColor=(1, 1, 1, 1),
                                frameTexture='assets/images/gui/close.txo',
                                command=self.on_close,
                                **menu_args.imgbtn_args)
        self.close_btn.disable()
        self.ent = Entry(scale=.04,
                         pos=(0, 1, .03),
                         entryFont=menu_args.font,
                         width=19.5,
                         frameColor=menu_args.btn_color,
                         parent=self.msg_frm,
                         initialText=_('write here your message'),
                         command=self.on_typed_msg,
                         focusInCommand=self.on_focus,
                         focusInExtraArgs=['in'],
                         focusOutCommand=self.on_focus,
                         focusOutExtraArgs=['out'],
                         text_fg=menu_args.text_active)
        self.ent['state'] = DISABLED
        self.txt_frm = DirectScrolledFrame(
            frameSize=(-.02, .76, -.02, .28),
            canvasSize=(-.02, .72, -.02, .28),
            scrollBarWidth=.036,
            verticalScroll_relief=FLAT,
            verticalScroll_frameColor=(.2, .2, .2, .4),
            verticalScroll_thumb_relief=FLAT,
            verticalScroll_thumb_frameColor=(.8, .8, .8, .6),
            verticalScroll_incButton_relief=FLAT,
            verticalScroll_incButton_frameColor=(.8, .8, .8, .6),
            verticalScroll_decButton_relief=FLAT,
            verticalScroll_decButton_frameColor=(.8, .8, .8, .6),
            horizontalScroll_relief=FLAT,
            frameColor=(1, 1, 1, 0),
            pos=(.02, 1, .11),
            parent=self.msg_frm)
        t_a['scale'] = .046
        self.msg_txt = OnscreenText(text='',
                                    pos=(0, .24),
                                    parent=self.txt_frm.getCanvas(),
                                    align=TextNode.A_left,
                                    wordwrap=14,
                                    **t_a)
        lab_args = menu_args.label_args
        lab_args['scale'] = .046
        lab_args['text_fg'] = menu_args.text_normal
        self.lab_frm = Btn(frameSize=(-.02, .64, -.01, .05),
                           frameColor=(1, 1, 1, 0),
                           pos=(0, 1, .4),
                           parent=self.msg_frm)
        self.lab_frm.bind(ENTER, self.on_enter)
        self.lab_frm.bind(EXIT, self.on_exit)
        self.tooltip = DirectLabel(text='',
                                   pos=(.78, 1, -.06),
                                   parent=self.lab_frm,
                                   text_wordwrap=16,
                                   text_bg=(.2, .2, .2, .8),
                                   text_align=TextNode.A_right,
                                   **lab_args)
        self.tooltip.set_bin('gui-popup', 10)
        self.tooltip.hide()

    def on_enter(self, pos):
        self.tooltip.show()

    def on_exit(self, pos):
        self.tooltip.hide()

    def show(self):
        self.msg_frm.show()

    def hide(self):
        self.msg_frm.hide()

    def add_msg_txt(self, msg):
        self.msg_txt['text'] += ('\n' if self.msg_txt['text'] else '') + msg
        txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \
            self.msg_txt.textNode.getLowerRight3d()[2]
        self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28)

    def set_title(self, title):
        ttitle = self.trunc(title, 32)
        fix_name = lambda name: name if '@' not in name else name.split('@')[
            0] + '\1smaller\1@' + name.split('@')[1] + '\2'
        if title:
            if ',' in ttitle:
                is_muc = True
                ttitle = ttitle
                names = ttitle.split(',')
                names = [name.strip() for name in names]
                names = [fix_name(name) for name in names]
                ttitle = ', '.join(names)
            else:
                ttitle = fix_name(ttitle)
        self.dst_txt['text'] = ttitle
        self.tooltip['text'] = title

    @staticmethod
    def trunc(name, lgt):
        if len(name) > lgt: return name[:lgt] + '...'
        return name

    def set_chat(self, chat):
        self.curr_chat = chat
        self.set_title(chat.title)
        self.msg_txt['text'] = '\n'.join(chat.messages)
        txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \
            self.msg_txt.textNode.getLowerRight3d()[2]
        self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28)
        if not self.chats:
            self.close_btn.disable()
            self.ent['state'] = DISABLED
        elif len(self.chats) == 1:
            self.close_btn.enable()
            self.ent['state'] = NORMAL
            self.arrow_btn.disable()
        else:
            self.close_btn.enable()
            self.ent['state'] = NORMAL
            self.arrow_btn.enable()
        if all(_chat.read for _chat in self.chats):
            self.arrow_btn['frameTexture'] = 'assets/images/gui/arrow.txo'
        else:
            self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo'

    def on_arrow(self):
        chat_idx = self.chats.index(self.curr_chat)
        next_idx = (chat_idx + 1) % len(self.chats)
        chat = self.chats[next_idx]
        self.set_title(chat.title)
        chat.read = True
        self.set_chat(chat)

    @property
    def open_chats(self):
        return [chat for chat in self.chats if not chat.closed]

    def on_close(self):
        if self.curr_chat not in self.open_chats: return
        curr_idx = self.open_chats.index(self.curr_chat)
        #self.chats.remove(self.curr_chat)
        self.curr_chat.closed = True
        if self.open_chats:
            self.set_chat(self.open_chats[curr_idx - 1])
        else:
            self.set_chat(Chat(''))
            self.notify('on_close_all_chats')

    def on_typed_msg(self, val):
        self.add_msg_txt('\1italic\1' + _('you') + '\2: ' + val)
        self.ent.set('')
        if self.curr_chat.dst not in self.presences_sent and \
                not str(self.curr_chat.dst).startswith('yorg'):
            self.eng.xmpp.client.send_presence(
                pfrom=self.eng.xmpp.client.boundjid.full,
                pto=self.curr_chat.dst)
            self.presences_sent += [self.curr_chat.dst]
        if str(self.curr_chat.dst).startswith('yorg'):
            self.eng.xmpp.client.send_message(
                mfrom=self.eng.xmpp.client.boundjid.full,
                mto=self.curr_chat.dst,
                mtype='groupchat',
                mbody=val)
        else:
            self.eng.xmpp.client.send_message(
                mfrom=self.eng.xmpp.client.boundjid.full,
                mto=self.curr_chat.dst,
                msubject='chat',
                mbody=val)
        msg = '\1italic\1' + _('you') + '\2: ' + val
        self.curr_chat.messages += [msg]
        self.ent['focus'] = 1

    def on_msg(self, msg):
        src = str(JID(msg['from']).bare)
        src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2'
        str_msg = '\1italic\1' + src + '\2: ' + str(msg['body'])
        chat = self.__find_chat(msg['from'])
        if not chat:
            chat = Chat(msg['from'])
            self.chats += [chat]
        chat.messages += [str_msg]
        if self.dst_txt['text'] == '':
            self.set_chat(chat)
        elif JID(self.curr_chat.dst).bare == JID(msg['from']).bare:
            self.add_msg_txt(str_msg)
        else:
            chat.read = False
            chat.closed = False
            self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo'

    def on_groupchat_msg(self, msg):
        if str(JID(msg['from']).bare) == self.curr_match_room:
            if self.match_msg_frm:  # we're still in the room page
                self.match_msg_frm.on_groupchat_msg(msg)
        src = str(JID(msg['mucnick']))
        src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2'
        self.eng.log('received groupchat message from %s in the chat %s' %
                     (msg['mucnick'], JID(msg['from']).bare))
        str_msg = '\1italic\1' + src + '\2: ' + str(msg['body'])
        chat = self.curr_chat
        if not chat:
            chat = MUC(str(JID(msg['from']).bare))
            self.chats += [chat]
        chat.messages += [str_msg]
        if self.dst_txt['text'] == '':
            self.set_chat(chat)
        elif self.curr_chat.dst == str(JID(msg['from']).bare):
            self.add_msg_txt(str_msg)
        else:
            chat.read = False
            chat.closed = False
            self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo'

    def on_presence_available_room(self, msg):
        if str(JID(msg['from']).bare) == self.curr_match_room:
            self.match_msg_frm.on_presence_available_room(msg)
        room = str(JID(msg['muc']['room']).bare)
        nick = str(msg['muc']['nick'])
        self.eng.log('user %s has logged in the chat %s' % (nick, room))
        chat = self.__find_chat(room)
        chat.users += [nick]
        if str(JID(msg['from']).bare) != self.curr_match_room:
            if self.curr_chat.dst == room:
                self.set_title(chat.title)

    def on_presence_unavailable_room(self, msg):
        if self.match_msg_frm and str(JID(
                msg['from']).bare) == self.curr_match_room:
            self.match_msg_frm.on_presence_unavailable_room(msg)
            return
        room = str(JID(msg['muc']['room']).bare)
        nick = str(msg['muc']['nick'])
        self.eng.log('user %s has left the chat %s' % (nick, room))
        chat = self.__find_chat(room)
        if nick == self.eng.xmpp.client.boundjid.bare:
            self.on_close()
        else:
            chat.users.remove(nick)
            if self.curr_chat.dst == room:
                self.set_title(chat.title)

    def __find_chat(self, dst):
        chats = [chat for chat in self.chats if chat.dst == dst]
        if chats: return chats[0]

    def add_chat(self, usr):
        self.set_title(JID(usr).bare)
        chat = self.__find_chat(usr)
        if not chat:
            chat = Chat(usr)
            self.chats += [chat]
        self.set_chat(chat)
        self.ent['focus'] = 1

    def add_groupchat(self, room, usr):
        self.set_title(usr)
        chat = self.__find_chat(room)
        if not chat:
            chat = MUC(room)
            self.chats += [chat]
        chat.users += [usr]
        self.set_chat(chat)
        self.add_match_chat(room, usr)

    def remove_groupchat(self):
        self.match_msg_frm.detach(self.on_match_msg_focus)
        self.match_msg_frm = self.match_msg_frm.destroy()

    def on_focus(self, val):
        if val and self.ent.get() == _('write here your message'):
            self.ent.set('')
        self.notify('on_msg_focus', val)

    def on_match_msg_focus(self, val):
        self.notify('on_msg_focus', val)

    def on_room_back(self):
        self.curr_match_room = None
        self.match_msg_frm.destroy()

    def add_match_chat(self, room, usr):
        if self.curr_match_room: return
        self.curr_match_room = room
        self.match_msg_frm = MatchMsgFrm(self.menu_args)
        self.match_msg_frm.attach(self.on_match_msg_focus)
        self.match_msg_frm.add_groupchat(room, usr)
Example #15
0
    def build(self):
        menu_args = self.menu_args
        widgets = [self.__add_lab('Language', _('Language'), .85)]
        langs = [lan[0] for lan in self.eng.languages]
        self.lang_opt = OptionMenu(text='',
                                   items=langs,
                                   pos=(.29, 1, .85),
                                   initialitem=self.props.lang,
                                   command=self.__change_lang,
                                   **menu_args.option_args)
        widgets += [self.__add_lab('Volume', _('Volume'), .65)]
        self.vol_slider = Slider(
            pos=(.32, 0, .68),
            scale=.49,
            value=self.props.volume,
            frameColor=menu_args.btn_color,
            thumb_frameColor=menu_args.text_active,
            command=lambda: self.eng.set_volume(self.vol_slider['value']))
        widgets += [self.__add_lab('Fullscreen', _('Fullscreen'), .45)]
        self.fullscreen_cb = CheckBtn(
            pos=(-.08, 1, .47),
            text='',
            indicatorValue=self.props.fullscreen,
            indicator_frameColor=menu_args.text_active,
            command=lambda val: self.eng.toggle_fullscreen(),
            **menu_args.checkbtn_args)
        widgets += [self.__add_lab('Resolution', _('Resolution'), .25)]
        res2vec = lambda res: LVector2i(*[int(val) for val in res.split('x')])
        self.res_opt = OptionMenu(
            text='',
            items=[
                'x'.join([str(el_res) for el_res in res])
                for res in self.eng.resolutions
            ],
            pos=(.29, 1, .25),
            initialitem='x'.join(
                str(res) for res in self.eng.closest_resolution),
            command=lambda res: self.eng.set_resolution(res2vec(res)),
            **menu_args.option_args)
        widgets += [self.__add_lab('Antialiasing', _('Antialiasing'), .05)]
        widgets += [
            self.__add_lab('(from the next execution)',
                           _('(from the next execution)'), .05, 0,
                           TextNode.ALeft, .06)
        ]
        self.aa_cb = CheckBtn(pos=(-.08, 1, .08),
                              text='',
                              indicatorValue=self.props.antialiasing,
                              indicator_frameColor=menu_args.text_active,
                              **menu_args.checkbtn_args)
        widgets += [self.__add_lab('Shaders', _('Shaders'), -.15)]
        self.shaders_cb = CheckBtn(pos=(-.08, 1, -.12),
                                   text='',
                                   indicatorValue=self.props.shaders,
                                   indicator_frameColor=menu_args.text_active,
                                   **menu_args.checkbtn_args)
        widgets += [self.__add_lab('Cars number', _('Cars number'), -.35)]
        widgets += [self.__add_lab('Camera', _('Camera'), -.55)]
        self.cars_opt = OptionMenu(text='',
                                   items=[str(i) for i in range(1, 9)],
                                   pos=(.29, 1, -.35),
                                   initialitem=self.props.cars_num - 1,
                                   **menu_args.option_args)
        self.cameras = [_('Top'), _('Rear')]
        self.camera_codes = ['top', 'rear']

        self.cam_opt = OptionMenu(
            text='',
            items=self.cameras,
            pos=(.29, 1, -.55),
            initialitem=self.cameras[self.camera_codes.index(
                self.props.camera)],
            **menu_args.option_args)
        input_btn = Btn(text='',
                        pos=(-.2, 1, -.75),
                        command=self.on_input_btn,
                        tra_src='Configure input',
                        tra_tra=_('Configure input'),
                        **menu_args.btn_args)
        widgets += [
            self.lang_opt, self.vol_slider, self.fullscreen_cb, self.res_opt,
            self.aa_cb, input_btn, self.shaders_cb, self.cars_opt, self.cam_opt
        ]
        self.add_widgets(widgets)
        idx = self.eng.lang_mgr.lang_codes.index(self.props.lang)
        self.__change_lang(self.eng.languages[idx][0])
        ThanksPageGui.build(self)
Example #16
0
 def build(self):
     sp_cb = lambda: self.notify('on_push_page', 'singleplayer',
                                 [self.props])
     supp_cb = lambda: self.eng.open_browser(self.props.support_url)
     cred_cb = lambda: self.notify('on_push_page', 'credits')
     menu_data = [('Single Player', _('Single Player'), sp_cb),
                  ('Options', _('Options'), self.on_options),
                  ('Support us', _('Support us'), supp_cb),
                  ('Credits', _('Credits'), cred_cb),
                  ('Not up-to-date', self.get_label(), self.on_loginout),
                  ('Quit', _('Quit'), lambda: self.notify('on_exit'))]
     widgets = [
         Btn(text='',
             pos=(0, 1, .64 - i * .23),
             command=menu[2],
             tra_src=menu_data[i][0],
             tra_tra=menu_data[i][1],
             **self.props.gameprops.menu_args.btn_args)
         for i, menu in enumerate(menu_data)
     ]
     logo_img = Img(self.props.title_img,
                    scale=(.64, 1, .64 * (380.0 / 772)),
                    parent=base.a2dTopLeft,
                    pos=(.65, 1, -.32))
     widgets += [logo_img]
     lab_args = self.props.gameprops.menu_args.label_args
     lab_args['scale'] = .12
     lab_args['text_fg'] = self.props.gameprops.menu_args.text_err
     wip_lab = Label(text='',
                     pos=(.05, 1, -.76),
                     parent=base.a2dTopLeft,
                     text_wordwrap=10,
                     text_align=TextNode.A_left,
                     tra_src='Note: the game is work-in-progress',
                     tra_tra=_('Note: the game is work-in-progress'),
                     **lab_args)
     self.widgets += [wip_lab]
     self.add_widgets(widgets)
     self.set_news()
     MainPageGui.build(self)
     if not self.ver_check.is_uptodate():
         self.widgets[5]['state'] = DISABLED
     try:
         sock = socket(AF_INET, SOCK_DGRAM)
         sock.connect(('ya2.it', 8080))
         local_addr = sock.getsockname()[0]
         igdc = IGDClient(local_addr, edebug=True)
         prots = ['TCP', 'UDP']
         try:
             map(lambda prot: igdc.DeletePortMapping(9099, prot), prots)
         except (TypeError, ExpatError, UPNPError) as e:
             print e
             import traceback
             traceback.print_exc()
         map(lambda prot: igdc.AddPortMapping(local_addr, 9099, prot, 9099),
             prots)
         self.eng.upnp = True
     except (TypeError, timeout, ExpatError, gaierror) as e:
         print e
         import traceback
         traceback.print_exc()
         self.eng.upnp = False