def do_save_as(self): if self.popup is not None: self.popup.teardown() def do_cancel_save_as(dialog): self.popup.teardown() self.popup = None def do_set_filename(dialog): form = dialog.get_values() filename = form['name'] if filename: name = os.path.join(self.theme_dir, filename) if os.path.isfile(name): self.popup_message("%s already exists" % filename) elif not filename.endswith('.json'): self.popup_message("%s must end in .json" % filename) else: self.name = filename self.file_label.label.text = 'File: %s' % self.name self.do_save() else: self.popup_message("Please select a file") self.popup = kytten.Dialog(kytten.Frame( kytten.HorizontalLayout( [kytten.Label("Filename"), kytten.Input(id='name')])), theme=gTheme, window=self.window, on_enter=do_set_filename, on_escape=do_cancel_save_as)
def mainDialog(self): def brushMenu(command): if command == 'Increase Brush Size' or command =='Decrease Brush Size': self.canvas.setBrushSize(command) elif command == 'Pencil': self.canvas.setPencil() elif command == 'Eraser': self.canvas.setEraser() # Set up a Dialog to choose test dialogs to show dialog = kytten.Dialog( kytten.Frame( kytten.HorizontalLayout([ kytten.Dropdown(['Save File', 'Open File'], on_select=self.on_select, text="File"), kytten.Dropdown(['Copy', 'Cut', 'Paste'], on_select=self.on_select, text="Edit"), kytten.Dropdown(['Pencil', 'Eraser', 'Increase Brush Size', 'Decrease Brush Size'], on_select=brushMenu, text="Brush"), ], padding=0, align=kytten.VALIGN_TOP) ), window=self.window, batch=self.canvas.batch, group=self.fg_group, anchor=kytten.ANCHOR_TOP_LEFT, on_mouse_release=self.on_mouse_release, theme=self.cobalt)
def do_change_texture(self): if self.popup is not None: self.popup.teardown() def do_cancel_change(dialog=None): self.popup.teardown() self.popup = None def do_change_texture(dialog=None): global gDirty gDirty = True form = self.popup.get_values() self.popup.teardown() self.popup = None texture = self.textures[form['texture']] self.theme[self.path][self.image] = \ FrameTextureGraphicElementTemplate( self.theme, texture, [0, 0, texture.width, texture.height], # stretch [0, 0, 0, 0]) # padding manager = self.manager manager.pop() manager.push( ImageEditState(self.theme_dir, self.theme, self.textures, self.path, self.image)) self.popup = kytten.Dialog(kytten.Frame( kytten.VerticalLayout([ kytten.HorizontalLayout([ kytten.Label('Texture'), kytten.Dropdown(id='texture', options=self.textures.keys(), selected=self.textures.keys()[0]) ]), kytten.HorizontalLayout([ kytten.Button("Change", on_click=do_change_texture), None, kytten.Button("Cancel", on_click=do_cancel_change) ]), ])), window=self.window, theme=gTheme, on_enter=do_change_texture, on_escape=do_cancel_change)
def do_add_new_field(self, fields_layout, on_input, on_delete): if self.popup is not None: self.popup.teardown() def do_cancel_add(dialog=None): self.popup.teardown() self.popup = None def do_add_field(dialog=None): global gDirty gDirty = True form = self.popup.get_values() self.popup.teardown() self.popup = None name = form['name'] if self.theme[self.path].has_key(name): self.popup_message("%s is already a field name!" % name) return try: value = safe_eval.safe_eval(form['value']) except kytten.safe_eval.Unsafe_Source_Error: value = form['value'] self.theme[self.path][name] = value fields_layout.add_row([ kytten.Label(name), kytten.Input(id=name, text=str(value), on_input=on_input), kytten.Button("Delete", id=name, on_click=on_delete) ]) if not self.delete_button.is_disabled(): self.delete_button.disable() self.dialog.set_needs_layout() self.popup = kytten.Dialog(kytten.Frame( kytten.VerticalLayout([ kytten.GridLayout([[ kytten.Label('Name'), kytten.Input(id='name', text='new_field') ], [ kytten.Label('Value'), kytten.Input(id='value', text='new_value') ]]), kytten.HorizontalLayout([ kytten.Button("Add", on_click=do_add_field), None, kytten.Button("Cancel", on_click=do_cancel_add) ]) ])), window=self.window, theme=gTheme, on_enter=do_add_field, on_escape=do_cancel_add)
def layerDialog(self): # Set up a Dialog to choose test dialogs to show def createLayer(): self.canvas.addLayer() dialog.teardown() self.layerDialog() def focusLayer(foo): def func(): self.canvas.setCurrentLayer(foo) return func def incLayer(foo): def func(): self.canvas.incrementLayer(foo) dialog.teardown() self.layerDialog() return func def decLayer(foo): def func(): self.canvas.decrementLayer(foo) dialog.teardown() self.layerDialog() return func def delLayer(foo): def func(): self.canvas.deleteLayer(foo) dialog.teardown() self.layerDialog() return func content = [item for sublist in [ [kytten.HorizontalLayout([ kytten.Button("S", on_click=focusLayer(layer.index)), kytten.Checkbox(layer.name, is_checked=layer.visible, on_click=layer.toggleVisibility), kytten.Button("^", on_click=incLayer(layer.index)), kytten.Button("v", on_click=decLayer(layer.index)) ]) ] for layer in self.canvas.layers] for item in sublist] content.append(kytten.Button("Create Layer", on_click=createLayer)) dialog = kytten.Dialog( kytten.Frame( kytten.VerticalLayout( content, padding=0, align=kytten.VALIGN_TOP) ), window=self.window, batch=self.canvas.batch, group=self.fg_group, anchor=kytten.ANCHOR_TOP_RIGHT, on_mouse_release=self.on_mouse_release, theme=self.cobalt)
def do_add_new_image(self): if self.popup is not None: self.popup.teardown() def do_cancel_add(dialog=None): self.popup.teardown() self.popup = None def do_add_image(dialog=None): global gDirty gDirty = True form = self.popup.get_values() self.popup.teardown() self.popup = None name = form['name'] if self.theme[self.path].has_key(name): self.popup_message("%s is already a field name!" % name) return if not name.startswith('image'): self.popup_message("Image names must begin with 'image'") texture = self.textures[form['texture']] self.theme[self.path][name] = FrameTextureGraphicElementTemplate( self.theme, texture, [0, 0, texture.width, texture.height], # stretch [0, 0, 0, 0]) # padding self.manager.push( ImageEditState(self.theme_dir, self.theme, self.textures, self.path, name)) self.popup = kytten.Dialog(kytten.Frame( kytten.VerticalLayout([ kytten.GridLayout([[ kytten.Label('Name'), kytten.Input(id='name', text='image') ], [ kytten.Label('Texture'), kytten.Dropdown( id='texture', options=self.textures.keys(), selected=self.textures.keys()[0]) ]]), kytten.HorizontalLayout([ kytten.Button("Add", on_click=do_add_image), None, kytten.Button("Cancel", on_click=do_cancel_add) ]) ])), window=self.window, theme=gTheme, on_enter=do_add_image, on_escape=do_cancel_add)
def do_add_new_component(self): if self.popup is not None: self.popup.teardown() def do_cancel_add(dialog=None): self.popup.teardown() self.popup = None def do_add_component(dialog=None): global gDirty gDirty = True form = self.popup.get_values() self.popup.teardown() self.popup = None name = form['name'] if self.theme[self.path].has_key(name): self.popup_message("%s is already a field name!" % name) return self.theme[self.path][name] = {} self.manager.push( _NodeEditState(self.theme_dir, self.theme, self.textures, self.path + [name])) self.popup = kytten.Dialog(kytten.Frame( kytten.VerticalLayout([ kytten.HorizontalLayout([ kytten.Label('Name'), kytten.Input(id='name', text='new_component') ]), kytten.HorizontalLayout([ kytten.Button("Add", on_click=do_add_component), None, kytten.Button("Cancel", on_click=do_cancel_add) ]) ])), window=self.window, theme=gTheme, on_enter=do_add_component, on_escape=do_cancel_add)
def _get_content(self): content = [kytten.Label("Theme: %s" % self.theme_dir)] if self.path: content += [kytten.Label("Path: %s" % '/'.join(self.path))] else: assert hasattr(self, 'name') self.file_label = kytten.Label("File: %s" % self.name) content += [self.file_label] content += [kytten.HorizontalLayout(self._get_buttons())] content += self._get_image_fields() content += self._get_custom_components() content += self._get_custom_fields() return content
def _get_content(self): def on_return(): self.manager.pop() def on_delete(): self.do_delete_image() def on_change_texture(): self.do_change_texture() content = [ kytten.VerticalLayout([ kytten.Document("""Theme: %s Path: %s Image: %s """ % (self.theme_dir, '/'.join(self.path), self.image), width=700), kytten.HorizontalLayout([ kytten.Button("Back", on_click=on_return), kytten.Button("Change Texture", on_click=on_change_texture), kytten.Button("Delete Image", on_click=on_delete) ]), ], align=kytten.HALIGN_LEFT) ] # Locate the base texture for the template self.template = self.theme[self.path][self.image] texture_id = self.template.texture.id our_texture = None our_filename = None for texture_name, texture in self.textures.iteritems(): if texture.id == texture_id: our_filename = texture_name our_texture = texture break assert our_texture is not None # Determine the region that we occupy x, y = self.template.texture.x, self.template.texture.y width, height = self.template.width, self.template.height self.region = (x, y, width, height) left, right, top, bottom = self.template.margins self.stretch = (left, bottom, width - right - left, height - top - bottom) self.padding = self.template.padding # Create the Resizable for the example's content example_resizable = Resizable(100, 100) def enable_example_resizable(is_checked): if is_checked: example_resizable.enable() else: example_resizable.disable() # Create the example example = kytten.Frame(example_resizable, path=self.path, image_name=self.image) # Create the ImageRegionPlacer for the editor region_placer = None def set_region(x, y, width, height): global gDirty gDirty = True if self.state == 'Region': # Try to keep stretch area the same but restrict it to # the current available region ox, oy, _, _ = self.region sx, sy, swidth, sheight = self.stretch sx += ox sy += oy if sx < x: swidth = max(0, swidth - x + sx) sx = x elif sx > x + width: swidth = 0 sx = x + width if sy < y: sheight = max(0, sheight - y + sy) sy = y elif sy > y + height: sheight = 0 sy = y + height if (sx - x) + swidth > width: swidth = max(0, width - (sx - x)) if (sy - y) + sheight > height: sheight = max(0, height - (sy - y)) self.region = (x, y, width, height) self.stretch = (sx - x, sy - y, swidth, sheight) elif self.state == 'Stretch': rx, ry, rwidth, rheight = self.region self.stretch = (x - rx, y - ry, width, height) else: # Padding rx, ry, rwidth, rheight = self.region left = x - rx bottom = y - ry top = ry + rheight - height - y right = rx + rwidth - width - x self.padding = (left, right, top, bottom) # Drop our old template and construct a new one x, y, width, height = self.region texture = self.theme._get_texture_region(our_filename, x, y, width, height) self.template = FrameTextureGraphicElementTemplate( self.theme, texture, self.stretch, self.padding) self.theme[self.path][self.image] = self.template example.delete() self.dialog.set_needs_layout() region_placer = ImageRegionPlacer(texture, x, y, width, height, on_resize=set_region) def set_placer_scale(scale): region_placer.set_scale(scale) # Create a drop-down to control what region we're setting def on_region_select(choice): self.state = choice if choice == 'Region': region_placer.set_region( *self.region, color=ImageRegionPlacer.IMAGE_REGION_COLOR) elif choice == 'Stretch': rx, ry, rwidth, rheight = self.region x, y, width, height = self.stretch region_placer.set_region( x + rx, y + ry, width, height, color=ImageRegionPlacer.IMAGE_STRETCH_COLOR, limits=self.region) else: # Padding rx, ry, rwidth, rheight = self.region left, right, top, bottom = self.padding region_placer.set_region( left + rx, bottom + ry, rwidth - left - right, rheight - top - bottom, color=ImageRegionPlacer.IMAGE_PADDING_COLOR, limits=self.region) region_control = kytten.Dropdown( options=['Region', 'Stretch', 'Padding'], selected=self.state, on_select=on_region_select) content += [ kytten.FoldingSection( 'Image Region', kytten.VerticalLayout([ region_control, region_placer, kytten.GridLayout([[ kytten.Label('Scale'), kytten.Slider(value=1.0, min_value=1.0, max_value=8.0, steps=7, width=400, on_set=set_placer_scale) ]], anchor=kytten.ANCHOR_LEFT) ], padding=10)), kytten.FoldingSection( 'Example', kytten.VerticalLayout([ ProxyDialog(example, self.theme), kytten.Checkbox("Show content sizer", on_click=enable_example_resizable, is_checked=True), ])), ] return content
def create_form_dialog(): dialog = None def on_enter(dialog): print("Form submitted!") for key, value in dialog.get_values().items(): print(" %s=%s" % (key, value)) on_escape(dialog) def on_submit(): on_enter(dialog) def on_cancel(): print("Form canceled.") on_escape(dialog) dialog = kytten.Dialog(kytten.Frame( kytten.Scrollable(kytten.VerticalLayout([ kytten.SectionHeader("Personnel Data", align=kytten.HALIGN_LEFT), kytten.Document( "Try tabbing through fields, " "if offscreen they'll be moved " "automatically", width=500), kytten.GridLayout([ [ kytten.Label("Name"), kytten.Input("name", "Lynx", max_length=20) ], [ kytten.Label("Job"), kytten.Input("job", "Cat", max_length=80) ], [kytten.Label("Hobby"), kytten.Input("hobby", "Programming")], [kytten.Label("Class"), kytten.Input("class", "Druid")], [ kytten.Label("Disabled"), kytten.Input("disabled", "Disabled input", disabled=True) ], [ kytten.Label("Sign"), kytten.Input("sign", "Free to good home") ], [kytten.Label("Blood Type"), kytten.Input("bloodtype", "Red")], [ kytten.Label("Favored Weapon"), kytten.Input("weapon", "Claws") ], ]), kytten.Checkbox("Full-Time", id="fulltime"), kytten.Checkbox("Married", id="married", disabled=True), kytten.SectionHeader("Actions", align=kytten.HALIGN_LEFT), kytten.HorizontalLayout([ kytten.Button("Submit", on_click=on_submit), kytten.Button("Disabled", disabled=True), None, kytten.Button("Cancel", on_click=on_cancel), ]), ], align=kytten.HALIGN_LEFT), height=200, width=360)), window=window, batch=batch, group=fg_group, anchor=kytten.ANCHOR_CENTER, theme=kytten.themes.felyne_light, on_enter=on_enter, on_escape=on_escape)