From d3d5561f6cc7ff407dbe5085898fa19b721a0e82 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 9 Mar 2003 16:51:04 +0000 Subject: [PATCH] Added some buttons and UI stuff. Non-functional. git-svn-id: https://rox.svn.sourceforge.net/svnroot/rox/trunk/MIME-Editor@2539 66de3db3-b00d-0410-b41b-f4738ad19bea --- editor.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++---------------- type.py | 23 ++++++++++++--- 2 files changed, 91 insertions(+), 29 deletions(-) diff --git a/editor.py b/editor.py index 1a138a3..693b657 100644 --- a/editor.py +++ b/editor.py @@ -5,6 +5,10 @@ import type edit_boxes = {} +ADD = 1 +DELETE = 2 +EDIT = 3 + class Editor(rox.Dialog): def __init__(self): rox.Dialog.__init__(self) @@ -13,9 +17,9 @@ class Editor(rox.Dialog): self.add_type = None - self.add_button(g.STOCK_ADD, 3) - self.add_button(g.STOCK_DELETE, 2) - self.add_button(g.STOCK_PROPERTIES, 1) + self.add_button(g.STOCK_ADD, ADD) + self.add_button(g.STOCK_DELETE, DELETE) + self.add_button(g.STOCK_PROPERTIES, EDIT) self.add_button(g.STOCK_CLOSE, g.RESPONSE_CANCEL) self.set_default_response(g.RESPONSE_CANCEL) @@ -46,11 +50,11 @@ class Editor(rox.Dialog): self.vbox.show_all() def response(self, resp): - if resp == 1: + if resp == EDIT: self.edit_selected(view.get_selection()) - elif resp == 2: + elif resp == DELETE: self.delete_type(view) - elif resp == 3: + elif resp == ADD: if self.add_type: self.add_type.present() else: @@ -64,8 +68,8 @@ class Editor(rox.Dialog): def changed(selection): model, iter = selection.get_selected() - self.set_response_sensitive(1, iter != None) - self.set_response_sensitive(2, iter != None) + self.set_response_sensitive(EDIT, iter != None) + self.set_response_sensitive(DELETE, iter != None) selection = view.get_selection() selection.connect('changed', changed) changed(selection) @@ -143,7 +147,7 @@ class EditBox(rox.Dialog): swin.set_shadow_type(g.SHADOW_IN) self.vbox.pack_start(swin, True, True, 0) - self.model = g.TreeStore(str) + self.model = g.TreeStore(str, object) view = g.TreeView(self.model) swin.add(view) @@ -157,32 +161,55 @@ class EditBox(rox.Dialog): self.vbox.show_all() view.expand_all() - self.add_button(g.STOCK_ADD, 1) + self.add_button(g.STOCK_ADD, ADD) + self.add_button(g.STOCK_DELETE, DELETE) + self.add_button(g.STOCK_PROPERTIES, EDIT) self.add_button(g.STOCK_CLOSE, g.RESPONSE_CANCEL) def response(w, resp): - if resp == 1: + if resp == ADD: self.add_field(view) + elif resp == DELETE: + self.delete_field(view) + elif resp == EDIT: + self.edit_field(view) else: self.destroy() self.connect('response', response) def changed(selection): - self.model, iter = selection.get_selected() - self.set_response_sensitive(1, iter != None) + model, iter = selection.get_selected() + on_field = False + if iter != None: + path = model.get_path(iter) + on_field = len(path) > 1 + self.set_response_sensitive(ADD, iter != None) + self.set_response_sensitive(EDIT, on_field) + self.set_response_sensitive(DELETE, on_field) selection = view.get_selection() selection.connect('changed', changed) changed(selection) + def activate(view, path, column): + iter = self.model.get_iter(path) + field = self.model.get_value(iter, 1) + if len(path) == 1: + self.add_new_field(field) + else: + field.edit() + view.connect('row-activated', activate) + + self.set_default_response(g.RESPONSE_CANCEL) + def update(self): t = type.get_type(self.mime_type) self.model.clear() - for aspect, getter in [('Name matching', t.get_globs), - ('Contents matching', t.get_magic), - ('XML namespace matching', t.get_xml), - ('Others', t.get_others), - ('Descriptions', t.get_comments)]: + for aspect, getter, klass in [('Name matching', t.get_globs, type.Glob), + ('Contents matching', t.get_magic, type.Magic), + ('XML namespace matching', t.get_xml, type.XML), + ('Others', t.get_others, type.Other), + ('Descriptions', t.get_comments, type.Comment)]: iter = self.model.append(None) - self.model.set(iter, 0, aspect) + self.model.set(iter, 0, aspect, 1, klass) fields = getter() fields.sort(lambda a, b: cmp(str(a), str(b))) last = None @@ -190,16 +217,36 @@ class EditBox(rox.Dialog): if field == last: continue last = field f = self.model.append(iter) - self.model.set(f, 0, str(field)) + self.model.set(f, 0, str(field), 1, field) field.add_subtree(self.model, f) + def add_new_field(self, type): + rox.alert("TODO: Add field of type '%s'" % type) + def add_field(self, view): model, iter = view.get_selection().get_selected() if not iter: rox.alert('You need to select a group, so I know what kind of thing to add') return path = model.get_path(iter) - rox.alert("Sorry, this program isn't finished!") + field = model.get_value(model.get_iter(path[:1]), 1) + self.add_new_field(field) + + def delete_field(self, view): + model, iter = view.get_selection().get_selected() + if not iter: + rox.alert("Nothing selected!") + field = model.get_value(iter, 1) + assert field + field.delete() + + def edit_field(self, view): + model, iter = view.get_selection().get_selected() + if not iter: + rox.alert("Nothing selected!") + field = model.get_value(iter, 1) + assert field + field.edit() class NewType(rox.Dialog): def __init__(self): @@ -232,10 +279,10 @@ class NewType(rox.Dialog): hbox.pack_start(entry, True, True, 0) entry.set_activates_default(True) - label = g.Label("Note: the 'text' group " - "should only be used for types that can be viewed in a normal text " - "editor. For example, HTML is text/html, but Word documents are " - "in the 'application' group.\nUnoffical types should start with 'x-'.") + label = g.Label("Note: the 'text' group should only be used for types that can be " + "viewed in a normal text editor. For example, HTML is text/html, " + "but Word documents are in the 'application' group.\n" + "Unoffical types should start with 'x-'.") label.set_line_wrap(True) vbox.pack_start(label, False, True, 0) diff --git a/type.py b/type.py index 0b9c14a..893c8ff 100644 --- a/type.py +++ b/type.py @@ -60,7 +60,7 @@ class MIME_Type: def get_globs(self): return map(Glob, self.globs) def get_magic(self): return map(Magic, self.magic) def get_xml(self): return map(XML, self.xml) - def get_others(self): return map(Others, self.others) + def get_others(self): return map(Other, self.others) class Field: "MIME_Type.get_* functions return a list of these." @@ -75,7 +75,16 @@ class Field: def __cmp__(self, b): return cmp(str(self), str(b)) - + + def edit(self): + rox.alert('Sorry, MIME-Editor does not support editing fields of this type') + + def delete(self): + rox.alert('TODO') + + def create(self): + rox.alert("Sorry, can't create fields of this type yet") + class Comment(Field): def __str__(self): lang, data = self.item @@ -101,7 +110,7 @@ class Magic(Field): if m.mask: text += ' masked with ' + m.mask iter = model.append(parent) - model.set(iter, 0, text) + model.set(iter, 0, text, 1, m) build(m, iter) build(self.item[1], parent) @@ -114,7 +123,7 @@ class XML(Field): def __str__(self): return "<%s> with namespace '%s'" % (self.item[1], self.item[0]) -class Others(Field): pass +class Other(Field): pass class FieldParser: def __init__(self, type, attrs): @@ -147,10 +156,16 @@ class Match: c = cmp(x, y) if c: return c return 0 + + if not self.parent: + return child_cmp() return cmp(self.type, b.type) or cmp(self.offset, b.offset) or \ cmp(self.value, b.value) or cmp(self.mask, b.mask) or \ child_cmp() + + def edit(self): + rox.alert("Editing of matches isn't currently supported") class MagicParser(FieldParser): def __init__(self, type, attrs): -- 2.11.4.GIT