async def handler(agent, chat, message, follower, **scope): follower_state = await scope["db_client"].get_follower_state( follower_id=follower.id) if follower_state is None: follower_state = await scope["db_client"].create_follower_state( follower=follower) data = json.loads(follower_state.data) dialog = Dialog(state=follower_state.state) dialog.handle(text=message.text, data=data) await scope["db_client"].update_follower_state( follower_state=follower_state, state=dialog.state, data=dialog.data, ) keyboard = None if dialog.ANSWERS[dialog.state]: keyboard = TelegramKeyboard( buttons=([answer] for answer in dialog.ANSWERS[dialog.state]), resize=True, one_time=True, ) await agent.a_send_message(chat=chat, text=dialog.answer, keyboard=keyboard)
def __edit_prefs(self, *args): kmap = { 'hide-read':'bool', 'update-interval':'int', 'max-articles':'int', 'use-notify':'bool', 'on-the-fly':'bool', 'enable-debug':'bool', 'auto-update':'bool', 'live-search':'bool', 'auto-hide-search':'bool', 'show-status':'bool', } hmap = { 'hide-read':_('Hide Read Items'), 'update-interval':_('Update interval (in minutes)'), 'max-articles':_('Maximum number of articles to keep (excluding starred)'), 'auto-update':_('Allow the engine to download new articles automatically.'), 'on-the-fly':_('Start downloading articles for new feeds on-the-fly'), 'use-notify':_('Show notification on updates'), 'enable-debug':_('Enable detailed logs'), 'live-search':_('Return search results as you type'), 'auto-hide-search':_('Hide Search form on results'), 'show-status':_('Show the bottom status bar'), } data = [] for k,v in kmap.iteritems(): data.append({ 'type':v, 'name':k, 'header':hmap.get(k),#FIXME: can this be gotten from gsettings? }) d = Dialog(self, _('Edit preferences'), data, self.settings) r = d.run() d.destroy()
def __init__(self, title, items, **kwds): self.title = title self.items = items self._items = [MenuItem(*item) for item in items] Dialog.__init__(self, **kwds) h = self.font.get_linesize() self.height = h * len(self._items) + h
def edit_word(self, widget): # get selected row store, iter_list = self.list.get_selection().get_selected() pk = store[iter_list][0] record = Word.retrieve_by_id(pk) # show dialog and get button clicked code dialog = Dialog(self, record.word, record.translation) response = dialog.run() dialog.destroy() if response != Gtk.ResponseType.OK: return # get entered word & translation word = dialog.word.strip() translation = dialog.translation.strip() if word == '' or translation == '': return # update database field according to given column Word.update_by_id(pk, word, translation) # update edited list row store[iter_list][1] = word store[iter_list][2] = translation
def body(self, master): if not self.Fieldvars: logger.debug( "Creating username and password tk StringVars Fieldvars. Initial username is: %s", self.Initial_username) # Notice: you should specify the variables' master; otherwise, if you instantiate # multiple tk.Tk() instances during e.g. testing, these will # mess up the variable logic (apparently...) self.Fieldvars = OrderedDict(username=[ tk.StringVar(self.parent, value=self.Initial_username), 'Username', dict() ], password=[ tk.StringVar(self.parent), 'Password', dict(show="*") ]) # Call to super: Dialog.body(self, master) logger.debug( "login prompt created, self.Fieldvars is: %s, with values: %s", self.Fieldvars, "; ".join(u"{}: {}".format(k, bool(v[0].get())) for k, v in self.Fieldvars.items())) logger.debug( "self.EntryWidgets have values: %s", "; ".join(u"{}: {}".format(k, bool(v.get())) for k, v in self.EntryWidgets.items()))
def add_word(self, widget): # show dialog and get button clicked code dialog = Dialog(self) response = dialog.run() dialog.destroy() if response != Gtk.ResponseType.OK: return # get entered word & translation word = dialog.word.strip() translation = dialog.translation.strip() if word == '' or translation == '': return # insert new word entered in database record = Word(word=word, translation=translation, date=datetime.now()) pk = Word.insert(record) record = Word.retrieve_by_id(pk) # add inserted word to list view store = self.list.get_model() store.append([ record.id, record.word, record.translation, record.date.strftime("%Y-%m-%d %H:%M:%S") ])
def __init__(self, title, items, scrolling=False, scroll_items=30, scroll_page=5, handler=None, **kwds): self.handler = handler self.title = _(title, doNotTranslate=kwds.get('doNotTranslate', False)) self.items = items self._items = [ MenuItem(*item, doNotTranslate=kwds.get('doNotTranslate', False)) for item in items ] self.scrolling = scrolling and len(self._items) > scroll_items self.scroll_items = scroll_items self.scroll_page = scroll_page if __builtins__.get("mcenf_tab_to_next"): self._selected_item_index = 0 self._hilited = self._items[self._selected_item_index] Dialog.__init__(self, **kwds) self.root = self.get_root() self.calc_size()
def set_update_translation(self, v): if v: self._items = [ MenuItem(*item, doNotTranslate=self.doNotTranslate) for item in self.items ] Dialog.set_update_translation(self, v)
def __init__(self, title, responses, default=None, ok_action=None): self.response = responses[0] self.ok_action = ok_action title = Label(title) self.w_type = ChoiceButton(responses) col = Column([title, self.w_type, Row([Button("OK", action=ok_action or self.dismiss_ok), Button("Cancel", action=ok_action or self.dismiss)], margin=0)], margin=0, spacing=2) Dialog.__init__(self, client=col)
def __init__(self, parent, title=None, fieldvars=None, username='', msg=None): self.Initial_username = username # super's __init__ calls body, which depends on this. Dialog.__init__(self, parent, title, fieldvars, msg=msg)
def __init__(self, type_string, types=map_types_item, ok_action=None): self.type_string = type_string self.ok_action = ok_action title = Label("Choose default data") self.t, widget, self.v = types[type_string] self.n = u"" w_name = TextFieldWrapped(ref=AttrRef(self, 'n')) self.w_value = self.get_widget(widget) col = Column([Column([title,]), Label(_("Item Type: %s")%type_string, doNotTranslate=True), Row([Label("Name"), w_name], margin=0), Row([Label("Value"), self.w_value], margin=0), Row([Button("OK", action=ok_action or self.dismiss_ok), Button("Cancel", action=self.dismiss)], margin=0)], margin=0, spacing=2) Dialog.__init__(self, client=col)
def __add_feed(self, *args): data = [ {'type':'str','name':'url', 'header':_('Link') }, ] d = Dialog(self, _('Add a feed'), data) r = d.run() item = d.response item['type'] = 'feed' d.destroy() if r == Gtk.ResponseType.OK: self.__create(item)
def __add_category(self, *args): args = [ {'type':'str','name':'name', 'header':_('Name') }, ] d = Dialog(self, _('Add a category'), args) r = d.run() item = d.response item['type'] = 'category' d.destroy() if r == Gtk.ResponseType.OK: self.__create(item)
def key_down(self, event): """Handles key presses to select and activate menu items or dismiss it. :param event: object: The event to be processed.""" key = self.root.getKey(event) last_index = len(self._items) - 1 # Just define a dummy method when scrolling is not necessary. def _x(*args, **kwargs): """...""" pass def page_up_down(*args, **kwargs): """Triggers scroll alignment to see the selected item on page up/down event.""" self.scroll = min(self._selected_item_index, last_index - self.scroll_items + 1) view_meth = _x if key == "Up": if self._selected_item_index == 0: self._selected_item_index = last_index self.scroll = last_index - self.scroll_items + 1 else: self._selected_item_index -= 1 view_meth = self.scroll_up elif key == "Down": if self._selected_item_index == last_index: self._selected_item_index = 0 self.scroll = 0 else: self._selected_item_index += 1 view_meth = self.scroll_down elif key == "Page up": self._selected_item_index = max( 0, self._selected_item_index - self.scroll_items) view_meth = page_up_down elif key == "Page down": self._selected_item_index = min( last_index, self._selected_item_index + self.scroll_items) view_meth = page_up_down elif key in ("Return", "Enter", "Space"): self.dismiss(self._selected_item_index) elif key == "Escape": self.dismiss(False) else: Dialog.key_down(self, event) self._hilited = self._items[self._selected_item_index] # Ensure the selected item is visible by scrollign accordingly if self._hilited not in self._items[self.scroll:self.scroll + self.scroll_items]: view_meth()
def __init__(self, title, items, scrolling=False, scroll_items=30, scroll_page=5, handler=None, **kwds): self.handler = handler self.title = _(title, doNotTranslate=kwds.get('doNotTranslate', False)) self.items = items self._items = [MenuItem(*item, doNotTranslate=kwds.get('doNotTranslate', False)) for item in items] self.scrolling = scrolling and len(self._items) > scroll_items self.scroll_items = scroll_items self.scroll_page = scroll_page Dialog.__init__(self, **kwds) self.root = self.get_root() self.calc_size()
def __init__(self, title, items, scrolling=False, scroll_items=30, scroll_page=5, **kwds): self.title = _(title) self.items = items self._items = [MenuItem(*item) for item in items] self.scrolling = scrolling and len(self._items) > scroll_items self.scroll_items = scroll_items self.scroll_page = scroll_page Dialog.__init__(self, **kwds) h = self.font.get_linesize() if self.scrolling: self.height = h * self.scroll_items + h else: self.height = h * len(self._items) + h
def present(self, client, pos): client = client or self.root self.topleft = client.local_to_global(pos) focus = self.handler or get_focus() font = self.font h = font.get_linesize() items = self._items margin = self.margin if self.scrolling: height = h * self.scroll_items + h else: height = h * len(items) + h w1 = w2 = 0 for item in items: item.enabled = self.command_is_enabled(item, focus) w1 = max(w1, font.size(item.text)[0]) w2 = max(w2, font.size(item.keyname)[0]) width = w1 + 2 * margin self._key_margin = width if w2 > 0: width += w2 + margin if self.scrolling: width += self.scroll_button_size self.size = (width, height) self._hilited = None self.rect.clamp_ip(self.root.rect) return Dialog.present(self, centered=False)
def take_screenshot(self): try: os.mkdir(os.path.join(directories.getCacheDir(), "screenshots")) except OSError: pass screenshot_name = os.path.join(directories.getCacheDir(), "screenshots", time.strftime("%Y-%m-%d (%I-%M-%S-%p)")+".png") pygame.image.save(pygame.display.get_surface(), screenshot_name) self.diag = Dialog() lbl = Label(_("Screenshot taken and saved as '%s'")%screenshot_name, doNotTranslate=True) folderBtn = Button("Open Folder", action=self.open_screenshots_folder) btn = Button("Ok", action=self.screenshot_notify) buttonsRow = Row((btn,folderBtn)) col = Column((lbl,buttonsRow)) self.diag.add(col) self.diag.shrink_wrap() self.diag.present()
def mouse_down(self, event): if event.button == 1: if self.scrolling: p = event.local if self.scroll_up_rect().collidepoint(p): self.scroll_up() return elif self.scroll_down_rect().collidepoint(p): self.scroll_down() return if event.button == 4: self.scroll_up() if event.button == 5: self.scroll_down() Dialog.mouse_down(self, event)
def present(self, client, pos): client = client or get_root() self.topleft = client.local_to_global(pos) focus = get_focus() font = self.font h = font.get_linesize() items = self._items margin = self.margin if self.scrolling: height = h * self.scroll_items + h else: height = h * len(items) + h w1 = w2 = 0 for item in items: item.enabled = self.command_is_enabled(item, focus) w1 = max(w1, font.size(item.text)[0]) w2 = max(w2, font.size(item.keyname)[0]) width = w1 + 2 * margin self._key_margin = width if w2 > 0: width += w2 + margin if self.scrolling: width += self.scroll_button_size self.size = (width, height) self._hilited = None root = get_root() self.rect.clamp_ip(root.rect) return Dialog.present(self, centered=False)
def __edit_item(self, *args): item = self.tree.current_item #FIXME: not good!! print item if item['type'] == 'category': args = [{'type':'str','name':'name', 'header':_('Name'), 'value':item['name'] },] d = Dialog(self, _('Edit this category'), args) elif item['type'] == 'feed': args = [{'type':'str','name':'url', 'header':_('Link'), 'value':item['url'] },] d = Dialog(self, _('Edit this feed'), args) r = d.run() o = d.response for k,v in o.iteritems(): item[k] = v d.destroy() if r == Gtk.ResponseType.OK: self.__edit(item)
def body(self, master): if not self.Fieldvars: logger.debug("Creating username and password tk StringVars Fieldvars. Initial username is: %s", self.Initial_username) # Notice: you should specify the variables' master; otherwise, if you instantiate # multiple tk.Tk() instances during e.g. testing, these will # mess up the variable logic (apparently...) self.Fieldvars = OrderedDict( username = [tk.StringVar(self.parent, value=self.Initial_username), 'Username', dict()], password = [tk.StringVar(self.parent), 'Password', dict(show="*")] ) # Call to super: Dialog.body(self, master) logger.debug("login prompt created, self.Fieldvars is: %s, with values: %s", self.Fieldvars, "; ".join(u"{}: {}".format(k, bool(v[0].get())) for k, v in self.Fieldvars.items())) logger.debug("self.EntryWidgets have values: %s", "; ".join(u"{}: {}".format(k, bool(v.get())) for k, v in self.EntryWidgets.items()))
def createnewsubentry(self, event=None): """ Invoked when the button with same text is pressed. Implemented using a the very generic dialog box. This takes a "fieldvars" argument. This is an ordered dict of: key : [ Variable, description, kwargs ] The kwargs dict is passed on to the constructor and can be used to e.g. change states of input widgets. The default Dialog class will make a two-column grid, where the left column in each row is a label with the description and the right column is the input/control widget. The input widgets will adapt to the variable type: Checkboxes will be used for tk.BooleanVars. The dialog will additionally try to adapt the layout. For example, for booleanvars displayed by checkboxes, the grid can fit two variables side-by-side, one in each column. The results of the user input after clicking 'ok' can be read in two ways, either a) Using the tk.Variables in the fieldvars dict (requires you to use tk Variables) b) Using the values in dialog.result, which are updated when the user presses 'ok'. Note that dialog.result is a dict of key: value pairs, where the value is obtained by invoking tkVar.get(). The key is the same as that of the fieldvars input. """ idx = self.Experiment.getNewSubentryIdx() props = dict(self.Experiment.Props) props['subentry_idx'] = idx props['subentry_titledesc'] = "" props['subentry_date'] = "{:%Y%m%d}".format(datetime.now()) props['makefolder'] = True props['makewikientry'] = True #items are: variable, description, entry widget, kwargs for widget entries = ( ('expid', "Experiment ID"), ('subentry_idx', "Subentry index"), ('subentry_titledesc', "Subentry title desc"), ('makefolder', "Make local folder"), ('makewikientry', "Make wiki entry"), ('subentry_date', "Subentry date") ) fieldvars = OrderedDict( (key, [props[key], desc, dict()] ) for key, desc in entries ) for items in fieldvars.values(): if isinstance(items[0], bool): items[0] = tk.BooleanVar(value=items[0]) else: items[0] = tk.StringVar(value=items[0]) fieldvars['expid'][2]['state'] = 'disabled' # This is the third element, the dict. dia = Dialog(self, "Create new subentry", fieldvars) logger.debug("Dialog result: %s", dia.result) if dia.result: # will be None if the 'ok' button was not pressed. dia.result.pop('expid') self.Experiment.addNewSubentry(**dia.result) # I'm not sure how much clean-up should be done? Do I need to e.g. destroy the dialog completely when I'm done? self.Parent.updatewidgets() # will also invoke self.updatewidgets()
def __init__(self, title, items, scrolling=False, scroll_items=30, scroll_page=5, handler=None, **kwds): self.handler = handler self.title = _(title) self.items = items self._items = [MenuItem(*item) for item in items] self.scrolling = scrolling and len(self._items) > scroll_items self.scroll_items = scroll_items self.scroll_page = scroll_page Dialog.__init__(self, **kwds) self.root = self.get_root() self.calc_size()
def take_screenshot(self): try: os.mkdir(os.path.join(directories.getCacheDir(), "screenshots")) except OSError: pass screenshot_name = os.path.join(directories.getCacheDir(), "screenshots", time.strftime("%Y-%m-%d (%I-%M-%S-%p)") + ".png") pygame.image.save(pygame.display.get_surface(), screenshot_name) self.diag = Dialog() lbl = Label(_("Screenshot taken and saved as '%s'") % screenshot_name, doNotTranslate=True) folderBtn = Button("Open Folder", action=self.open_screenshots_folder) btn = Button("Ok", action=self.screenshot_notify) buttonsRow = Row((btn, folderBtn)) col = Column((lbl, buttonsRow)) self.diag.add(col) self.diag.shrink_wrap() self.diag.present()
def present(self, client, pos): client = client or get_root() self.topleft = client.local_to_global(pos) focus = get_focus() font = self.font h = font.get_linesize() items = self._items margin = self.margin height = h * len(items) + h w1 = w2 = 0 for item in items: item.enabled = self.command_is_enabled(item, focus) w1 = max(w1, font.size(item.text)[0]) w2 = max(w2, font.size(item.keyname)[0]) width = w1 + 2 * margin self._key_margin = width if w2 > 0: width += w2 + margin self.size = (width, height) self._hilited = None return Dialog.present(self, centered = False)
dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus() def cancel(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 40, 12) cmbPath = Combobox(1, 36) bOk = Button(2, "Ok") bCancel = Button(3, "Cancel") cmbPath.setPopupCallback(path) cmbPath.setPopupWidth(60) bOk.setCallback(ok) bCancel.setCallback(cancel) dialog.addComponent(Label("Enter file path (TAB for autocomplete) and press 'Ok' button:", 38), 1, 2) dialog.addComponent(cmbPath, 2, 5) dialog.addComponent(bOk, 19, 10) dialog.addComponent(bCancel, 27, 10) dialog.center() dialog.draw() dialog.focus()
def ok(button): info = Dialog("", 40, 6) bInfoOk = Button(1, "Ok") label = Label("", 38) info.addComponent(label, 1, 2) info.addComponent(bInfoOk, 31, 4) info.center() label.setText("Entered: " + "".join(cmbPath.text)) def infoOk(button): info.destroy() dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus()
dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus() def cancel(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 50, 12) for i in xrange(0, len(checkbox)): checkbox[i] = Checkbox(i, "Option " + str(i + 1), 48) checkbox[i].setCallback(check) bOk = Button(4, "Ok") bCancel = Button(5, "Cancel") bOk.setCallback(ok) bCancel.setCallback(cancel) dialog.addComponent(Label("Select single option and press 'Ok' button:", 48), 1, 2) for i in xrange(0, len(checkbox)): dialog.addComponent(checkbox[i], 1, i + 4) dialog.addComponent(bOk, 29, 10) dialog.addComponent(bCancel, 37, 10) dialog.center() checkbox[0].check()
class RootWidget(Widget): # surface Pygame display surface # is_gl True if OpenGL surface redraw_every_frame = False bonus_draw_time = False _is_gl_container = True def __init__(self, surface): global root_widget Widget.__init__(self, surface.get_rect()) self.surface = surface root_widget = self widget.root_widget = self self.is_gl = surface.get_flags() & OPENGL != 0 self.idle_handlers = [] self.editor = None self.selectTool = None self.movementMath = [-1, 1, 1, -1, 1, -1] self.movementNum = [0, 0, 2, 2, 1, 1] self.cameraMath = [-1., 1., -1., 1.] self.cameraNum = [0, 0, 1, 1] self.notMove = False self.nudge = None self.testTime = None self.testTimeBack = 0.4 self.nudgeDirection = None self.sessionStolen = False self.sprint = False self.filesToChange = [] def get_nudge_block(self): return self.selectTool.panel.nudgeBlocksButton def take_screenshot(self): try: os.mkdir(os.path.join(directories.getCacheDir(), "screenshots")) except OSError: pass screenshot_name = os.path.join(directories.getCacheDir(), "screenshots", time.strftime("%Y-%m-%d (%I-%M-%S-%p)")+".png") pygame.image.save(pygame.display.get_surface(), screenshot_name) self.diag = Dialog() lbl = Label(_("Screenshot taken and saved as '%s'")%screenshot_name, doNotTranslate=True) folderBtn = Button("Open Folder", action=self.open_screenshots_folder) btn = Button("Ok", action=self.screenshot_notify) buttonsRow = Row((btn,folderBtn)) col = Column((lbl,buttonsRow)) self.diag.add(col) self.diag.shrink_wrap() self.diag.present() def open_screenshots_folder(self): from mcplatform import platform_open platform_open(os.path.join(directories.getCacheDir(), "screenshots")) self.screenshot_notify() def screenshot_notify(self): self.diag.dismiss() @staticmethod def set_timer(ms): pygame.time.set_timer(USEREVENT, ms) def run(self): self.run_modal(None) captured_widget = None def capture_mouse(self, widget): #put the mouse in "virtual mode" and pass mouse moved events to the #specified widget if widget: pygame.mouse.set_visible(False) pygame.event.set_grab(True) self.captured_widget = widget else: pygame.mouse.set_visible(True) pygame.event.set_grab(False) self.captured_widget = None frames = 0 hover_widget = None def fix_sticky_ctrl(self): self.ctrlClicked = -1 def run_modal(self, modal_widget): if self.editor is None: self.editor = self.mcedit.editor self.selectTool = self.editor.toolbar.tools[0] old_captured_widget = None if self.captured_widget: old_captured_widget = self.captured_widget self.capture_mouse(None) global last_mouse_event, last_mouse_event_handler global top_widget, clicked_widget is_modal = modal_widget is not None modal_widget = modal_widget or self from OpenGL import GL try: old_top_widget = top_widget top_widget = modal_widget was_modal = modal_widget.is_modal modal_widget.is_modal = True modal_widget.modal_result = None if not modal_widget.focus_switch: modal_widget.tab_to_first() if clicked_widget: clicked_widget = modal_widget num_clicks = 0 last_click_time = start_time last_click_button = False self.bonus_draw_time = False while modal_widget.modal_result is None: try: if not self.mcedit.version_checked: if not self.mcedit.version_lock.locked(): self.mcedit.version_checked = True self.mcedit.check_for_version() self.hover_widget = self.find_widget(pygame.mouse.get_pos()) if not self.bonus_draw_time: self.bonus_draw_time = True if self.is_gl: self.gl_clear() self.gl_draw_all(self, (0, 0)) GL.glFlush() else: self.draw_all(self.surface) pygame.display.flip() self.frames += 1 #events = [pygame.event.wait()] events = [pygame.event.poll()] events.extend(pygame.event.get()) for event in events: #if event.type: #log.debug("%s", event) type = event.type if type == QUIT: self.quit() elif type == MOUSEBUTTONDOWN: self.bonus_draw_time = False t = datetime.now() if t - last_click_time <= double_click_time and event.button == last_click_button: num_clicks += 1 else: num_clicks = 1 last_click_button = event.button last_click_time = t event.dict['num_clicks'] = num_clicks add_modifiers(event) mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget #if event.button == 1: clicked_widget = mouse_widget last_mouse_event_handler = mouse_widget last_mouse_event = event mouse_widget.notify_attention_loss() mouse_widget.handle_mouse('mouse_down', event) elif type == MOUSEMOTION: self.bonus_draw_time = False add_modifiers(event) modal_widget.dispatch_key('mouse_delta', event) last_mouse_event = event mouse_widget = self.update_tooltip(event.pos) if clicked_widget: last_mouse_event_handler = clicked_widget clicked_widget.handle_mouse('mouse_drag', event) else: if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget last_mouse_event_handler = mouse_widget mouse_widget.handle_mouse('mouse_move', event) elif type == MOUSEBUTTONUP: add_modifiers(event) self.bonus_draw_time = False mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if clicked_widget: last_mouse_event_handler = clicked_widget event.dict['clicked_widget'] = clicked_widget else: last_mouse_event_handler = mouse_widget event.dict['clicked_widget'] = None last_mouse_event = event clicked_widget = None last_mouse_event_handler.handle_mouse('mouse_up', event) elif type == KEYDOWN: key = event.key set_modifier(key, True) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.takeAScreenshot.get(): self.take_screenshot() self.send_key(modal_widget, 'key_down', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == KEYUP: key = event.key set_modifier(key, False) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.showBlockInfo.get() and self.editor.toolbar.tools[0].infoKey == 1: self.editor.toolbar.tools[0].infoKey = 0 self.editor.mainViewport.showCommands() if self.nudgeDirection is not None: keyname = self.getKey(movement=True, keyname=pygame.key.name(key)) for i, key in enumerate(self.editor.movements): if keyname == key and i == self.nudgeDirection: self.nudgeDirection = None self.testTime = None self.testTimeBack = 0.4 self.send_key(modal_widget, 'key_up', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == MUSIC_END_EVENT: self.music_end() elif type == USEREVENT: make_scheduled_calls() if not is_modal: if self.redraw_every_frame: self.bonus_draw_time = False else: self.bonus_draw_time = True if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local add_modifiers(event) last_mouse_event_handler.setup_cursor(event) self.begin_frame() elif type == VIDEORESIZE: #add_modifiers(event) self.bonus_draw_time = False self.size = (event.w, event.h) #self.dispatch_key('reshape', event) elif type == ACTIVEEVENT: add_modifiers(event) self.dispatch_key('activeevent', event) elif type == NOEVENT: add_modifiers(event) self.call_idle_handlers(event) if not self.sessionStolen: try: if self.editor.level is not None and hasattr(self.editor.level, "checkSessionLock"): self.editor.level.checkSessionLock() except Exception, e: log.warn(u"Error reading chunk: %s", e) if not config.session.override.get(): self.sessionStolen = True else: self.editor.level.acquireSessionLock() if self.editor.level is not None: self.editor.cameraInputs = [0., 0., 0., 0., 0., 0.] self.editor.cameraPanKeys = [0., 0., 0., 0.] allKeys = pygame.key.get_pressed() allKeysWithData = enumerate(allKeys) def useKeys((i, keys)): if not keys: return keyName = self.getKey(movement=True, keyname=pygame.key.name(i)) if keyName == self.editor.sprintKey: self.sprint = True if self.editor.level: for j, key in enumerate(self.editor.movements): if keyName == key and not allKeys[pygame.K_LCTRL] and not allKeys[pygame.K_RCTRL] and not allKeys[pygame.K_RMETA] and not allKeys[pygame.K_LMETA]: self.changeMovementKeys(j, keyName) for k, key in enumerate(self.editor.cameraPan): if keyName == key and not allKeys[pygame.K_LCTRL] and not allKeys[pygame.K_RCTRL] and not allKeys[pygame.K_RMETA] and not allKeys[pygame.K_LMETA]: self.changeCameraKeys(k) map(useKeys, allKeysWithData) for edit in self.filesToChange: newTime = os.path.getmtime(edit.filename) if newTime > edit.timeChanged: edit.timeChanged = newTime edit.makeChanges() except Cancel: pass
def test_dialog(state, data, text, expected): dialog = Dialog(state=state) dialog.handle(text=text, data=data) assert dialog.state is expected
class RootWidget(Widget): # surface Pygame display surface # is_gl True if OpenGL surface redraw_every_frame = False bonus_draw_time = False _is_gl_container = True def __init__(self, surface): global root_widget Widget.__init__(self, surface.get_rect()) self.surface = surface root_widget = self widget.root_widget = self self.is_gl = surface.get_flags() & OPENGL != 0 self.idle_handlers = [] self.editor = None self.selectTool = None self.movementMath = [-1, 1, 1, -1, 1, -1] self.movementNum = [0, 0, 2, 2, 1, 1] self.cameraMath = [-1., 1., -1., 1.] self.cameraNum = [0, 0, 1, 1] self.notMove = False self.nudge = None self.testTime = None self.testTimeBack = 0.4 self.nudgeDirection = None self.sessionStolen = False self.sprint = False self.filesToChange = [] def get_nudge_block(self): return self.selectTool.panel.nudgeBlocksButton def take_screenshot(self): try: os.mkdir(os.path.join(directories.getCacheDir(), "screenshots")) except OSError: pass screenshot_name = os.path.join( directories.getCacheDir(), "screenshots", time.strftime("%Y-%m-%d (%I-%M-%S-%p)") + ".png") pygame.image.save(pygame.display.get_surface(), screenshot_name) self.diag = Dialog() lbl = Label(_("Screenshot taken and saved as '%s'") % screenshot_name, doNotTranslate=True) folderBtn = Button("Open Folder", action=self.open_screenshots_folder) btn = Button("Ok", action=self.screenshot_notify) buttonsRow = Row((btn, folderBtn)) col = Column((lbl, buttonsRow)) self.diag.add(col) self.diag.shrink_wrap() self.diag.present() def open_screenshots_folder(self): from mcplatform import platform_open platform_open(os.path.join(directories.getCacheDir(), "screenshots")) self.screenshot_notify() def screenshot_notify(self): self.diag.dismiss() @staticmethod def set_timer(ms): pygame.time.set_timer(USEREVENT, ms) def run(self): self.run_modal(None) captured_widget = None def capture_mouse(self, widget): # put the mouse in "virtual mode" and pass mouse moved events to the # specified widget if widget: pygame.mouse.set_visible(False) pygame.event.set_grab(True) self.captured_widget = widget else: pygame.mouse.set_visible(True) pygame.event.set_grab(False) self.captured_widget = None frames = 0 hover_widget = None def fix_sticky_ctrl(self): self.ctrlClicked = -1 def run_modal(self, modal_widget): if self.editor is None: self.editor = self.mcedit.editor self.selectTool = self.editor.toolbar.tools[0] old_captured_widget = None if self.captured_widget: old_captured_widget = self.captured_widget self.capture_mouse(None) global last_mouse_event, last_mouse_event_handler global top_widget, clicked_widget is_modal = modal_widget is not None modal_widget = modal_widget or self #from OpenGL import GL try: old_top_widget = top_widget top_widget = modal_widget was_modal = modal_widget.is_modal modal_widget.is_modal = True modal_widget.modal_result = None if not modal_widget.focus_switch: modal_widget.tab_to_first() if clicked_widget: clicked_widget = modal_widget num_clicks = 0 last_click_time = start_time last_click_button = False self.bonus_draw_time = False while modal_widget.modal_result is None: try: if not self.mcedit.version_checked: if not self.mcedit.version_lock.locked(): self.mcedit.version_checked = True self.mcedit.check_for_version() self.hover_widget = self.find_widget( pygame.mouse.get_pos()) if not self.bonus_draw_time: self.bonus_draw_time = True if self.is_gl: self.gl_clear() self.gl_draw_all(self, (0, 0)) GL.glFlush() else: self.draw_all(self.surface) pygame.display.flip() self.frames += 1 events = pygame.event.get() if not events: self.call_idle_handlers() for event in events: type = event.type if type == QUIT: self.quit() elif type == MOUSEBUTTONDOWN: self.bonus_draw_time = False t = datetime.now() if t - last_click_time <= double_click_time and event.button == last_click_button: num_clicks += 1 else: num_clicks = 1 last_click_button = event.button last_click_time = t event.dict['num_clicks'] = num_clicks add_modifiers(event) mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget clicked_widget = mouse_widget last_mouse_event_handler = mouse_widget last_mouse_event = event mouse_widget.notify_attention_loss() mouse_widget.handle_mouse('mouse_down', event) elif type == MOUSEMOTION: self.bonus_draw_time = False add_modifiers(event) modal_widget.dispatch_key('mouse_delta', event) last_mouse_event = event mouse_widget = self.update_tooltip(event.pos) if clicked_widget: last_mouse_event_handler = clicked_widget clicked_widget.handle_mouse( 'mouse_drag', event) else: if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget last_mouse_event_handler = mouse_widget mouse_widget.handle_mouse('mouse_move', event) elif type == MOUSEBUTTONUP: add_modifiers(event) self.bonus_draw_time = False mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if clicked_widget: last_mouse_event_handler = clicked_widget event.dict['clicked_widget'] = clicked_widget else: last_mouse_event_handler = mouse_widget event.dict['clicked_widget'] = None last_mouse_event = event clicked_widget = None last_mouse_event_handler.handle_mouse( 'mouse_up', event) elif type == KEYDOWN: key_down = event.key set_modifier(key_down, True) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.takeAScreenshot.get(): self.take_screenshot() self.send_key(modal_widget, 'key_down', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == KEYUP: key_up = event.key set_modifier(key_up, False) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.showBlockInfo.get( ) and self.editor.toolbar.tools[0].infoKey == 1: self.editor.toolbar.tools[0].infoKey = 0 self.editor.mainViewport.showCommands() if self.nudgeDirection is not None: keyname = self.getKey(movement=True, keyname=key.name(key_up)) for i, move_key in enumerate( self.editor.movements): if keyname == move_key and i == self.nudgeDirection: self.nudgeDirection = None self.testTime = None self.testTimeBack = 0.4 self.send_key(modal_widget, 'key_up', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == MUSIC_END_EVENT: self.music_end() elif type == USEREVENT: make_scheduled_calls() if not is_modal: if self.redraw_every_frame: self.bonus_draw_time = False else: self.bonus_draw_time = True if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict[ 'local'] = last_mouse_event.local add_modifiers(event) last_mouse_event_handler.setup_cursor( event) self.begin_frame() elif type == VIDEORESIZE: self.bonus_draw_time = False self.size = (event.w, event.h) elif type == VIDEOEXPOSE: if self.mcedit.displayContext.win and self.mcedit.displayContext.win.get_state( ) == 1: x, y = config.settings.windowX.get( ), config.settings.windowY.get() pos = self.mcedit.displayContext.win.get_position( ) if pos[0] != x: config.settings.windowX.set(pos[0]) if pos[1] != y: config.settings.windowY.set(pos[1]) elif type == ACTIVEEVENT: add_modifiers(event) self.dispatch_key('activeevent', event) if not self.sessionStolen: try: if self.editor.level is not None and hasattr( self.editor.level, "checkSessionLock"): self.editor.level.checkSessionLock() except Exception as e: log.warn(u"Error reading chunk (?): %s", e) if not config.session.override.get(): self.sessionStolen = True else: self.editor.level.acquireSessionLock() if self.editor.level is not None: self.editor.cameraInputs = [0., 0., 0., 0., 0., 0.] self.editor.cameraPanKeys = [0., 0., 0., 0.] def useKeys(i): keyName = self.getKey(movement=True, keyname=key.name(i)) if keyName == self.editor.sprintKey: self.sprint = True if allKeys[K_LCTRL] or allKeys[K_RCTRL] or allKeys[ K_RMETA] or allKeys[K_LMETA]: return if keyName in self.editor.movements: self.changeMovementKeys( self.editor.movements.index(keyName), keyName) if keyName in self.editor.cameraPan: self.changeCameraKeys( self.editor.cameraPan.index(keyName)) allKeys = key.get_pressed() for x in enumerate(allKeys): if x[1]: useKeys(x[0]) for edit in self.filesToChange: newTime = os.path.getmtime(edit.filename) if newTime > edit.timeChanged: edit.timeChanged = newTime edit.makeChanges() except Cancel: pass finally: modal_widget.is_modal = was_modal top_widget = old_top_widget if old_captured_widget: self.capture_mouse(old_captured_widget) clicked_widget = None @staticmethod def getKey(evt=None, movement=False, keyname=None): if keyname is None: keyname = key.name(evt.key) keyname = keyname.replace("right ", "").replace("left ", "").replace( "Meta", "Ctrl").replace("Enter", "Return").replace("Delete", "Del") try: keyname = keyname.replace(keyname[0], keyname[0].upper(), 1) except: pass if movement: return keyname newKeyname = "" if evt.shift and keyname != "Shift": newKeyname += "Shift-" if (evt.ctrl or evt.cmd) and keyname != "Ctrl": newKeyname += "Ctrl-" if evt.alt and keyname != "Alt": newKeyname += "Alt-" keyname = newKeyname + keyname if newKeyname: return keyname if sys.platform == 'linux2': test_key = getattr(evt, 'scancode', None) tool_keys = [10, 11, 12, 13, 14, 15, 16, 17, 18] else: test_key = keyname tool_keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] if test_key in tool_keys: keyname = str(tool_keys.index(test_key) + 1) elif test_key == 19: keyname = '0' return keyname def changeMovementKeys(self, keyNum, keyname): if self.editor.level is not None and not self.notMove: self.editor.cameraInputs[ self.movementNum[keyNum]] += self.movementMath[keyNum] elif self.notMove and self.nudge is not None and ( self.testTime is None or datetime.now() - self.testTime >= timedelta(seconds=self.testTimeBack)): if self.testTimeBack > 0.1: self.testTimeBack -= 0.1 self.bonus_draw_time = False self.testTime = datetime.now() if keyname == self.editor.movements[4]: self.nudge.nudge(Vector(0, 1, 0)) if keyname == self.editor.movements[5]: self.nudge.nudge(Vector(0, -1, 0)) Z = self.editor.mainViewport.cameraVector absZ = map(abs, Z) if absZ[0] < absZ[2]: forward = (0, 0, (-1 if Z[2] < 0 else 1)) else: forward = ((-1 if Z[0] < 0 else 1), 0, 0) back = map(int.__neg__, forward) left = forward[2], forward[1], -forward[0] right = map(int.__neg__, left) if keyname == self.editor.movements[2]: self.nudge.nudge(Vector(*forward)) if keyname == self.editor.movements[3]: self.nudge.nudge(Vector(*back)) if keyname == self.editor.movements[0]: self.nudge.nudge(Vector(*left)) if keyname == self.editor.movements[1]: self.nudge.nudge(Vector(*right)) for i, move_key in enumerate(self.editor.movements): if move_key == keyname: self.nudgeDirection = i def changeCameraKeys(self, keyNum): if self.editor.level is not None and not self.notMove: self.editor.cameraPanKeys[ self.cameraNum[keyNum]] = self.cameraMath[keyNum] def RemoveEditFiles(self): self.filesToChange = [] def call_idle_handlers(self): def call(ref): widget = ref() if widget: widget.idleevent() else: print "Idle ref died!" return bool(widget) self.idle_handlers = filter(call, self.idle_handlers) def add_idle_handler(self, widget): from weakref import ref self.idle_handlers.append(ref(widget)) def remove_idle_handler(self, widget): from weakref import ref self.idle_handlers.remove(ref(widget)) @staticmethod def send_key(widget, name, event): widget.dispatch_key(name, event) def begin_frame(self): pass def get_root(self): return self labelClass = lambda s, t: wrapped_label(t, 45) def show_tooltip(self, widget, pos): if hasattr(self, 'currentTooltip'): if self.currentTooltip is not None: self.remove(self.currentTooltip) self.currentTooltip = None def TextTooltip(text, name): tooltipBacking = Panel(name=name) tooltipBacking.bg_color = (0.0, 0.0, 0.0, 0.8) tooltipBacking.add(self.labelClass(text)) tooltipBacking.shrink_wrap() return tooltipBacking def showTip(tip): tip.topleft = pos tip.top += 20 if (tip.bottom > self.bottom) or hasattr(widget, 'tooltipsUp'): tip.bottomleft = pos tip.top -= 4 if tip.right > self.right: tip.right = pos[0] self.add(tip) self.currentTooltip = tip if widget.tooltip is not None: tip = widget.tooltip showTip(tip) else: ttext = widget.tooltipText if ttext is not None: tip = TextTooltip(ttext, 'Panel.%s' % (repr(widget))) showTip(tip) def update_tooltip(self, pos=None): if pos is None: pos = pygame.mouse.get_pos() if self.captured_widget: mouse_widget = self.captured_widget pos = mouse_widget.center else: mouse_widget = self.find_widget(pos) self.show_tooltip(mouse_widget, pos) return mouse_widget def has_focus(self): return True def quit(self): if self.confirm_quit(): self.capture_mouse(None) sys.exit(0) @staticmethod def confirm_quit(): return True @staticmethod def get_mouse_for(widget): last = last_mouse_event event = Event(0, last.dict) event.dict['local'] = widget.global_to_local(event.pos) add_modifiers(event) return event def gl_clear(self): #from OpenGL import GL bg = self.bg_color if bg: r = bg[0] / 255.0 g = bg[1] / 255.0 b = bg[2] / 255.0 GL.glClearColor(r, g, b, 0.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) @staticmethod def music_end(): import music music.music_end()
bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus() def cancel(button): dialogs.stop() if __name__ == '__main__': try: items = [{"label": "Option {}".format(i), "value": "Value {}".format(i)} for i in xrange(1,35)] dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 52, 8) dropdown = Dropdown(1, items, 12) bOk = Button(2, "Ok") bCancel = Button(3, "Cancel") dropdown.setPopupWidth(10) bOk.setCallback(ok) bCancel.setCallback(cancel) dialog.addComponent(Label("Select option and press 'Ok' button:", 38), 1, 2) dialog.addComponent(dropdown, 38, 2) dialog.addComponent(bOk, 31, 6) dialog.addComponent(bCancel, 39, 6) dialog.center() dialog.draw() dialog.focus()
def __init__(self, parent, title = None, fieldvars = None, username='', msg=None): self.Initial_username = username # super's __init__ calls body, which depends on this. Dialog.__init__(self, parent, title, fieldvars, msg=msg)
def ok(button): info = Dialog("", 40, 6) bInfoOk = Button(1, "Ok") label = Label("", 38) info.addComponent(label, 1, 2) info.addComponent(bInfoOk, 31, 4) info.center() selected = [] for i in xrange(0, len(checkbox)): if checkbox[i].checked: selected.append(i + 1) label.setText("Selected: " + str(selected)) def infoOk(button): info.destroy() dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus()
def set_update_ui(self, v): if v: self._items = [MenuItem(*item, doNotTranslate=self.doNotTranslate) for item in self.items] Dialog.set_update_ui(self, v)
class RootWidget(Widget): # surface Pygame display surface # is_gl True if OpenGL surface redraw_every_frame = False bonus_draw_time = False _is_gl_container = True def __init__(self, surface): global root_widget Widget.__init__(self, surface.get_rect()) self.surface = surface root_widget = self widget.root_widget = self self.is_gl = surface.get_flags() & OPENGL != 0 self.idle_handlers = [] self.editor = None self.selectTool = None self.movementMath = [-1, 1, 1, -1, 1, -1] self.movementNum = [0, 0, 2, 2, 1, 1] self.cameraMath = [-1., 1., -1., 1.] self.cameraNum = [0, 0, 1, 1] self.notMove = False self.nudge = None self.testTime = None self.testTimeBack = 0.4 self.nudgeDirection = None self.sessionStolen = False self.sprint = False self.filesToChange = [] def get_modifiers(self): """Returns the 'modifiers' global object.""" return modifiers def get_nudge_block(self): return self.selectTool.panel.nudgeBlocksButton def take_screenshot(self): try: os.mkdir(os.path.join(directories.getCacheDir(), "screenshots")) except OSError: pass screenshot_name = os.path.join(directories.getCacheDir(), "screenshots", time.strftime("%Y-%m-%d (%I-%M-%S-%p)") + ".png") pygame.image.save(pygame.display.get_surface(), screenshot_name) self.diag = Dialog() lbl = Label(_("Screenshot taken and saved as '%s'") % screenshot_name, doNotTranslate=True) folderBtn = Button("Open Folder", action=self.open_screenshots_folder) btn = Button("Ok", action=self.screenshot_notify) buttonsRow = Row((btn, folderBtn)) col = Column((lbl, buttonsRow)) self.diag.add(col) self.diag.shrink_wrap() self.diag.present() def open_screenshots_folder(self): from mcplatform import platform_open platform_open(os.path.join(directories.getCacheDir(), "screenshots")) self.screenshot_notify() def screenshot_notify(self): self.diag.dismiss() @staticmethod def set_timer(ms): pygame.time.set_timer(USEREVENT, ms) def run(self): self.run_modal(None) captured_widget = None def capture_mouse(self, widget): # put the mouse in "virtual mode" and pass mouse moved events to the # specified widget if widget: pygame.mouse.set_visible(False) pygame.event.set_grab(True) self.captured_widget = widget else: pygame.mouse.set_visible(True) pygame.event.set_grab(False) self.captured_widget = None frames = 0 hover_widget = None def fix_sticky_ctrl(self): self.ctrlClicked = -1 def run_modal(self, modal_widget): if self.editor is None: self.editor = self.mcedit.editor self.selectTool = self.editor.toolbar.tools[0] old_captured_widget = None if self.captured_widget: old_captured_widget = self.captured_widget self.capture_mouse(None) global last_mouse_event, last_mouse_event_handler global top_widget, clicked_widget is_modal = modal_widget is not None modal_widget = modal_widget or self #from OpenGL import GL try: old_top_widget = top_widget top_widget = modal_widget was_modal = modal_widget.is_modal modal_widget.is_modal = True modal_widget.modal_result = None if not modal_widget.focus_switch: modal_widget.tab_to_first() if clicked_widget: clicked_widget = modal_widget num_clicks = 0 last_click_time = start_time last_click_button = False self.bonus_draw_time = False while modal_widget.modal_result is None: try: if not self.mcedit.version_checked: if not self.mcedit.version_lock.locked(): self.mcedit.version_checked = True self.mcedit.check_for_version() self.hover_widget = self.find_widget(pygame.mouse.get_pos()) if not self.bonus_draw_time: self.bonus_draw_time = True if self.is_gl: self.gl_clear() self.gl_draw_all(self, (0, 0)) GL.glFlush() else: self.draw_all(self.surface) pygame.display.flip() self.frames += 1 events = pygame.event.get() if not events: self.call_idle_handlers() for event in events: type = event.type if type == QUIT: self.quit() elif type == MOUSEBUTTONDOWN: self.bonus_draw_time = False t = datetime.now() if t - last_click_time <= double_click_time and event.button == last_click_button: num_clicks += 1 else: num_clicks = 1 last_click_button = event.button last_click_time = t event.dict['num_clicks'] = num_clicks add_modifiers(event) mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget clicked_widget = mouse_widget last_mouse_event_handler = mouse_widget last_mouse_event = event mouse_widget.notify_attention_loss() mouse_widget.handle_mouse('mouse_down', event) elif type == MOUSEMOTION: self.bonus_draw_time = False add_modifiers(event) modal_widget.dispatch_key('mouse_delta', event) last_mouse_event = event mouse_widget = self.update_tooltip(event.pos) if clicked_widget: last_mouse_event_handler = clicked_widget clicked_widget.handle_mouse('mouse_drag', event) else: if not mouse_widget.is_inside(modal_widget): mouse_widget = modal_widget last_mouse_event_handler = mouse_widget mouse_widget.handle_mouse('mouse_move', event) elif type == MOUSEBUTTONUP: add_modifiers(event) self.bonus_draw_time = False mouse_widget = self.find_widget(event.pos) if self.captured_widget: mouse_widget = self.captured_widget if clicked_widget: last_mouse_event_handler = clicked_widget event.dict['clicked_widget'] = clicked_widget else: last_mouse_event_handler = mouse_widget event.dict['clicked_widget'] = None last_mouse_event = event clicked_widget = None last_mouse_event_handler.handle_mouse('mouse_up', event) elif type == KEYDOWN: key_down = event.key set_modifier(key_down, True) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.takeAScreenshot.get(): self.take_screenshot() self.send_key(modal_widget, 'key_down', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == KEYUP: key_up = event.key set_modifier(key_up, False) add_modifiers(event) self.bonus_draw_time = False keyname = self.getKey(event) if keyname == config.keys.showBlockInfo.get() and self.editor.toolbar.tools[0].infoKey == 1: self.editor.toolbar.tools[0].infoKey = 0 self.editor.mainViewport.showCommands() if self.nudgeDirection is not None: keyname = self.getKey(movement=True, keyname=key.name(key_up)) for i, move_key in enumerate(self.editor.movements): if keyname == move_key and i == self.nudgeDirection: self.nudgeDirection = None self.testTime = None self.testTimeBack = 0.4 self.send_key(modal_widget, 'key_up', event) if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local last_mouse_event_handler.setup_cursor(event) elif type == MUSIC_END_EVENT: self.music_end() elif type == USEREVENT: make_scheduled_calls() if not is_modal: if self.redraw_every_frame: self.bonus_draw_time = False else: self.bonus_draw_time = True if last_mouse_event_handler: event.dict['pos'] = last_mouse_event.pos event.dict['local'] = last_mouse_event.local add_modifiers(event) last_mouse_event_handler.setup_cursor(event) self.begin_frame() elif type == VIDEORESIZE: self.bonus_draw_time = False self.size = (event.w, event.h) elif type == VIDEOEXPOSE: if self.mcedit.displayContext.win and self.mcedit.displayContext.win.get_state() == 1: x, y = config.settings.windowX.get(), config.settings.windowY.get() pos = self.mcedit.displayContext.win.get_position() if pos[0] != x: config.settings.windowX.set(pos[0]) if pos[1] != y: config.settings.windowY.set(pos[1]) elif type == ACTIVEEVENT: add_modifiers(event) self.dispatch_key('activeevent', event) if not self.sessionStolen: try: if self.editor.level is not None and hasattr(self.editor.level, "checkSessionLock"): self.editor.level.checkSessionLock() except Exception as e: log.warn(u"Error reading chunk (?): %s", e) traceback.print_exc() if not config.session.override.get(): self.sessionStolen = True else: self.editor.level.acquireSessionLock() if self.editor.level is not None: self.editor.cameraInputs = [0., 0., 0., 0., 0., 0.] self.editor.cameraPanKeys = [0., 0., 0., 0.] def useKeys(i): keyName = self.getKey(movement=True, keyname=key.name(i)) if keyName == self.editor.sprintKey: self.sprint = True if allKeys[K_LCTRL] or allKeys[K_RCTRL] or allKeys[K_RMETA] or allKeys[K_LMETA]: return if keyName in self.editor.movements: self.changeMovementKeys(self.editor.movements.index(keyName), keyName) if keyName in self.editor.cameraPan: self.changeCameraKeys(self.editor.cameraPan.index(keyName)) allKeys = key.get_pressed() for x in enumerate(allKeys): if x[1]: useKeys(x[0]) for edit in self.filesToChange: newTime = os.path.getmtime(edit.filename) if newTime > edit.timeChanged: edit.timeChanged = newTime edit.makeChanges() except Cancel: pass finally: modal_widget.is_modal = was_modal top_widget = old_top_widget if old_captured_widget: self.capture_mouse(old_captured_widget) clicked_widget = None @staticmethod def getKey(evt=None, movement=False, keyname=None): if keyname is None: keyname = key.name(evt.key) keyname = keyname.replace("right ", "").replace("left ", "").replace("Meta", "Ctrl").replace("Enter", "Return").replace("Delete", "Del") try: keyname = keyname.replace(keyname[0], keyname[0].upper(), 1) except: pass if movement: return keyname newKeyname = "" if evt.shift and keyname != "Shift": newKeyname += "Shift-" if (evt.ctrl or evt.cmd) and keyname != "Ctrl": newKeyname += "Ctrl-" if evt.alt and keyname != "Alt": newKeyname += "Alt-" keyname = newKeyname + keyname if newKeyname: return keyname if sys.platform == 'linux2': test_key = getattr(evt, 'scancode', None) tool_keys = [10, 11, 12, 13, 14, 15, 16, 17, 18] else: test_key = keyname tool_keys = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] if test_key in tool_keys: keyname = str(tool_keys.index(test_key) + 1) elif test_key == 19: keyname = '0' return keyname def changeMovementKeys(self, keyNum, keyname): if self.editor.level is not None and not self.notMove: self.editor.cameraInputs[self.movementNum[keyNum]] += self.movementMath[keyNum] elif self.notMove and self.nudge is not None and (self.testTime is None or datetime.now() - self.testTime >= timedelta(seconds=self.testTimeBack)): if self.testTimeBack > 0.1: self.testTimeBack -= 0.1 self.bonus_draw_time = False self.testTime = datetime.now() if keyname == self.editor.movements[4]: self.nudge.nudge(Vector(0, 1, 0)) if keyname == self.editor.movements[5]: self.nudge.nudge(Vector(0, -1, 0)) Z = self.editor.mainViewport.cameraVector absZ = map(abs, Z) if absZ[0] < absZ[2]: forward = (0, 0, (-1 if Z[2] < 0 else 1)) else: forward = ((-1 if Z[0] < 0 else 1), 0, 0) back = map(int.__neg__, forward) left = forward[2], forward[1], -forward[0] right = map(int.__neg__, left) if keyname == self.editor.movements[2]: self.nudge.nudge(Vector(*forward)) if keyname == self.editor.movements[3]: self.nudge.nudge(Vector(*back)) if keyname == self.editor.movements[0]: self.nudge.nudge(Vector(*left)) if keyname == self.editor.movements[1]: self.nudge.nudge(Vector(*right)) for i, move_key in enumerate(self.editor.movements): if move_key == keyname: self.nudgeDirection = i def changeCameraKeys(self, keyNum): if self.editor.level is not None and not self.notMove: self.editor.cameraPanKeys[self.cameraNum[keyNum]] = self.cameraMath[keyNum] def RemoveEditFiles(self): self.filesToChange = [] def call_idle_handlers(self): def call(ref): widget = ref() if widget: widget.idleevent() else: print "Idle ref died!" return bool(widget) self.idle_handlers = filter(call, self.idle_handlers) def add_idle_handler(self, widget): from weakref import ref self.idle_handlers.append(ref(widget)) def remove_idle_handler(self, widget): from weakref import ref self.idle_handlers.remove(ref(widget)) @staticmethod def send_key(widget, name, event): widget.dispatch_key(name, event) def begin_frame(self): pass def get_root(self): return self labelClass = lambda s, t: wrapped_label(t, 45) def show_tooltip(self, widget, pos): if hasattr(self, 'currentTooltip'): if self.currentTooltip is not None: self.remove(self.currentTooltip) self.currentTooltip = None def TextTooltip(text, name): tooltipBacking = Panel(name=name) tooltipBacking.bg_color = (0.0, 0.0, 0.0, 0.8) tooltipBacking.add(self.labelClass(text)) tooltipBacking.shrink_wrap() return tooltipBacking def showTip(tip): tip.topleft = pos tip.top += 20 if (tip.bottom > self.bottom) or hasattr(widget, 'tooltipsUp'): tip.bottomleft = pos tip.top -= 4 if tip.right > self.right: tip.right = pos[0] self.add(tip) self.currentTooltip = tip if widget.tooltip is not None: tip = widget.tooltip showTip(tip) else: ttext = widget.tooltipText if ttext is not None: tip = TextTooltip(ttext, 'Panel.%s' % (repr(widget))) showTip(tip) def update_tooltip(self, pos=None): if pos is None: pos = pygame.mouse.get_pos() if self.captured_widget: mouse_widget = self.captured_widget pos = mouse_widget.center else: mouse_widget = self.find_widget(pos) self.show_tooltip(mouse_widget, pos) return mouse_widget def has_focus(self): return True def quit(self): if self.confirm_quit(): self.capture_mouse(None) sys.exit(0) @staticmethod def confirm_quit(): return True @staticmethod def get_mouse_for(widget): last = last_mouse_event event = Event(0, last.dict) event.dict['local'] = widget.global_to_local(event.pos) add_modifiers(event) return event def gl_clear(self): #from OpenGL import GL bg = self.bg_color if bg: r = bg[0] / 255.0 g = bg[1] / 255.0 b = bg[2] / 255.0 GL.glClearColor(r, g, b, 0.0) GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) @staticmethod def music_end(): import music music.music_end()
def ok(button): info = Dialog("", 40, 6) bInfoOk = Button(1, "Ok") label = Label("", 38) info.addComponent(label, 1, 2) info.addComponent(bInfoOk, 31, 4) info.center() value = dropdown.getValue() label.setText("Selected: " + value['label'] + " (" + value['value'] + ")") def infoOk(button): info.destroy() dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus()
dialog2.erase() dialog1.draw() dialog1.focus() def finish(button): dialogs.stop() def cancel(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog1 = Dialog("Dialog 1", 60, 8) bNext1 = Button(1, "Next") bCancel1 = Button(2, "Cancel") bNext1.setCallback(next) bCancel1.setCallback(cancel) dialog1.addComponent(bNext1, 37, 6) dialog1.addComponent(bCancel1, 47, 6) dialog1.center() dialog2 = Dialog("Dialog 2", 60, 8) bFinish2 = Button(1, "Finish") bBack2 = Button(2, "Back") bCancel2 = Button(3, "Cancel") bFinish2.setCallback(finish) bBack2.setCallback(back) bCancel2.setCallback(cancel)
bOk.setCallback(ok) dialog.unfocus() alert.draw() alert.focus() def cancel(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 60, 10) bShowAlert = Button(1, "Alert") bCancel = Button(2, "Cancel") bShowAlert.setCallback(showAlert) bCancel.setCallback(cancel) dialog.addComponent(Label("Press 'Alert' button to show alert dialog.", 58), 1, 2) dialog.addComponent(bShowAlert, 36, 8) dialog.addComponent(bCancel, 47, 8) dialog.center() dialog.draw() dialog.focus() dialogs.start() dialogs.closeScreen()
dialog.focus() bInfoOk.setCallback(infoOk) dialog.unfocus() info.draw() info.focus() def cancel(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 60, 12) txtInput = Textfield(1, 58) bOk = Button(2, "Ok") bCancel = Button(3, "Cancel") bOk.setCallback(ok) bCancel.setCallback(cancel) dialog.addComponent(Label("Enter text and press 'Ok' button:", 58), 1, 2) dialog.addComponent(txtInput, 1, 4) dialog.addComponent(bOk, 39, 10) dialog.addComponent(bCancel, 47, 10) dialog.center() txtInput.setText("default text") dialog.draw() dialog.focus()
def showAlert(button): alert = Dialog("Alert", 40, 6, dialogs.ALERT_DIALOG_DECO) bOk = Button(1, "Ok", dialogs.ALERT_BUTTON_DECO) alert.addComponent(Label("Press 'Ok' button to close alert dialog.", 38), 1, 2) alert.addComponent(bOk, 31, 4) alert.center() def ok(button): alert.destroy() dialog.focus() bOk.setCallback(ok) dialog.unfocus() alert.draw() alert.focus()
def __init__(self, title, items, **kwds): self.title = title self.items = items self._items = [MenuItem(*item) for item in items] Dialog.__init__(self, **kwds)
def main(): if sys.version_info[0] < 3: # Py2-vs-Py3: # redirecting output to a file can cause unicode problems # read: https://stackoverflow.com/questions/5530708/ # To fix it either run the scripts as: PYTHONIOENCODING=utf-8 python TrezorSymmetricFileEncryption.py # or add the following line of code. # Only shows up in python2 TrezorSymmetricFileEncryption.py >> log scenarios # Exception: 'ascii' codec can't encode characters in position 10-13: ordinal not in range(128) sys.stdout = codecs.getwriter('utf-8')(sys.stdout) app = QApplication(sys.argv) if app is None: # just to get rid f the linter warning on above line print("Critical error: Qt cannot be initialized.") sets = settings.Settings() # initialize settings # parse command line args = settings.Args(sets) args.parseArgs(sys.argv[1:]) trezor = trezor_app_generic.setupTrezor(sets.TArg, sets.mlogger) # trezor.clear_session() ## not needed trezor.prefillReadpinfromstdin(sets.RArg) trezor.prefillReadpassphrasefromstdin(sets.AArg) if sets.PArg is None: trezor.prefillPassphrase(u'') else: trezor.prefillPassphrase(sets.PArg) # if everything is specified in the command line then do not call the GUI if ((sets.PArg is None) or (len(sets.inputFiles) <= 0)) and (not sets.TArg): dialog = Dialog(trezor, sets) sets.mlogger.setQtextbrowser(dialog.textBrowser) sets.mlogger.setQtextheader(dialog.descrHeader()) sets.mlogger.setQtextcontent(dialog.descrContent()) sets.mlogger.setQtexttrailer(dialog.descrTrailer()) else: sets.mlogger.log( "Everything was specified or --terminal was set, " "hence the GUI will not be called.", logging.INFO, u"Arguments") sets.mlogger.log("Trezor label: %s" % trezor.features.label, logging.INFO, "Trezor IO") sets.mlogger.log( "For each operation click 'Confirm' on Trezor " "to give permission.", logging.INFO, "Trezor IO") fileMap = FileMap(trezor, sets) if ((sets.PArg is None) or (len(sets.inputFiles) <= 0)) and (not sets.TArg): # something was not specified, so we call the GUI # or user wants GUI, so we call the GUI dialog.setFileMap(fileMap) dialog.setVersion(basics.VERSION_STR) showGui(trezor, dialog, sets) else: useTerminal(fileMap, sets) # cleanup sets.mlogger.log("Cleaning up before shutting down.", logging.DEBUG, "Info") trezor.close()
label.setText("To get started, you will need the Python interpreter or a Python IDE.\n" "Python programs are simply a collection of text files. If you want something more sophisticated than notepad for editing, you will need a Python IDE (recommended). A Python IDE will make programming Python easier.\n\n" "From http://pythonprogramminglanguage.com web page.") button.setVisible(False) dialog.draw() dialog.focus() def ok(button): dialogs.stop() if __name__ == '__main__': try: dialogs.initScreen() dialogs.setTitle("DEMO") dialog = Dialog("Dialog", 60, 14) bMore = Button(1, "More") bOk = Button(2, "Ok") label = Label("Python is a computer programming language that lets you work more quickly than other programming languages." "Experienced programmers in any other language can pick up Python very quickly, and beginners find the clean syntax and indentation structure easy to learn.\n\n" "From http://pythonprogramminglanguage.com web page.", 58) bMore.setCallback(more) bOk.setCallback(ok) dialog.addComponent(label, 1, 2) dialog.addComponent(bMore, 41, 12) dialog.addComponent(bOk, 51, 12) dialog.center() dialog.draw() dialog.focus()
def set_update_translation(self, v): if v: self._items = [MenuItem(*item) for item in self.items] Dialog.set_update_translation(self, v)
# "action": func, "sub": "Third_level" } } } }) Dialog({ 'add_service': { 'title': "Adding Web Service dialog", 'questions': { 1: { 'ask': "Input Service name and press Enter", 'condition': "Second_level" }, 2: { 'ask': "Input Service URL and press Enter" }, 3: { 'ask': "Input Service description and press Enter" } } } }) Dialog({ 'add_person': { 'title': "Adding Person dialog", 'questions': { 1: { 'ask': "Input First Name and press Enter", 'condition': "Second_level"