Changeset 3208

Show
Ignore:
Timestamp:
07/24/08 11:31:10 (5 years ago)
Author:
nopper
Message:

Flags support in PropertyGrid?

Location:
branch/PacketManipulator
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branch/PacketManipulator/Backend/__init__.py

    r3205 r3208  
    5959    return proto_inst.__class__.__name__ 
    6060 
    61 def get_field_name(proto_inst, field, trim_underscore=True): 
    62     # TODO: we should ask for a name attribute in field object 
    63      
    64     ret = None 
    65  
    66     for f in proto_inst._ordered_fields: 
    67         if proto_inst._fields[f] is field: 
    68             ret = f 
    69             break 
    70  
    71     if ret and trim_underscore: 
    72         return ret.replace("_", "") 
    73     return ret 
     61def get_field_name(field, trim_underscore=True): 
     62    return field.name 
    7463 
    7564def get_field_desc(field): 
  • branch/PacketManipulator/Tabs/MainTab.py

    r3188 r3208  
    101101        self.hexview = HexView() 
    102102 
     103        self.hexview.show_payload(self.protocol.get_raw()) 
     104 
    103105    def __pack_widgets(self): 
    104106        self.vpaned.pack1(self.proto_hierarchy) 
  • branch/PacketManipulator/widgets/PropertyGrid.py

    r3199 r3208  
    2626# Protocol stuff 
    2727import Backend 
     28from umpa.protocols import _ as base 
    2829 
    2930# For the icons 
     
    4748 
    4849    def get_value(self): 
    49         return self.field.value 
     50        return self.field.get() 
    5051 
    5152    def set_value(self, value): 
    52         self.field.value = value 
     53        self.field.set(value) 
    5354     
    5455    def render(self, window, widget, bounds, state): 
     
    6162 
    6263    def create_widgets(self): 
     64        # Manage the None type 
     65        if not self.value: 
     66            self.value = 0 
     67 
    6368        self.calc_bounds() 
    6469        self.adj = gtk.Adjustment(self.value, self.min, self.max, 1, 2) 
     
    7479     
    7580    def calc_bounds(self): 
    76         import sys 
    77          
    78         if isinstance(self.value, int): 
     81        # Unsigned int / Int? :( 
     82        if self.field.bits: 
     83            self.min = 0 
     84            self.max = (2 ** self.field.bits) - 1 # (2 ^ n) - 1 
     85            self.digits = 0 
     86        elif isinstance(self.value, int): 
    7987            self.min = -sys.maxint - 1 
    8088            self.max = sys.maxint 
    81             self.digits = 0 
    82         elif isinstance(self.value, float): 
    83             # FIXME: i dunno here 
    84             self.min = -sys.maxint - 1 
    85             self.max = sys.maxint 
    86             self.digits = 2 
    87         else: 
    88             self.min = 0 
    89             self.max = 10 
    9089            self.digits = 0 
    9190     
     
    9594        else: 
    9695            self.value = self.spin.get_value() 
     96 
     97class BitField(base.Field): 
     98    bits = 1 
     99    auto = False 
     100 
     101    def __init__(self, flag, name, value): 
     102        self.flag = flag 
     103        super(BitField, self).__init__(name, value, 1) 
     104 
     105    def set_value(self, val): 
     106        # Set to parent 
     107 
     108        self.set(val) 
     109 
     110    value = property(base.Field.get, set_value) 
    97111 
    98112class BitEditor(Editor): 
     
    182196            self.emit('finish-edit', self.box.get_child()) 
    183197            self.box.unparent() 
     198            self.box.hide() 
     199            self.box.destroy() 
    184200 
    185201    def do_size_allocate(self, alloc): 
     
    342358        self.tree = gtk.TreeView(self.store) 
    343359 
    344         self.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) 
     360        self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 
    345361        self.set_shadow_type(gtk.SHADOW_ETCHED_IN) 
    346362 
     
    360376        col.set_resizable(True) 
    361377        col.set_expand(True) 
    362         col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 
     378        #col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 
    363379        col.set_fixed_width(180) 
    364380        col.set_attributes(crt) 
     
    372388 
    373389        col.pack_start(crt, True) 
    374         col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 
     390        #col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 
    375391        col.set_resizable(False) 
    376392        col.set_expand(True) 
     
    391407    def __on_selection_changed(self, selection): 
    392408        model, iter = selection.get_selected() 
     409 
     410        if not iter: 
     411            return 
     412 
    393413        proto = model.get_value(iter, 0) 
    394414 
     
    412432        obj = model.get_value(iter, 1) 
    413433         
    414         if obj != None: 
     434        if isinstance(obj, base.Flags): 
     435            cell.set_property('cell-background-gdk', 
     436                              self.style.mid[gtk.STATE_NORMAL]) 
     437        elif isinstance(obj, base.Field): 
     438            cell.field = obj 
    415439            cell.set_property('editable', True) 
     440 
    416441            #FIXME: stringify? 
    417442            cell.set_property('markup', '<tt>%s</tt>' % obj.get()) 
    418443 
    419             #if isinstance(obj.value, bool): 
    420             #    cell.editor = BitEditor(obj) 
    421             #elif isinstance(obj.value, str): 
    422             #    cell.editor = StrEditor(obj) 
    423             #elif isinstance(obj.value, int) or \ 
    424             #     isinstance(obj.value, float): 
    425             #    cell.editor = IntEditor(obj) 
     444            if getattr(obj.__class__, 'bits', None) == 1: 
     445                cell.editor = BitEditor 
     446            elif isinstance(obj, base.IntField): 
     447                cell.editor = IntEditor 
     448            else: 
     449                cell.field = None 
    426450             
    427451            cell.set_property('cell-background-gdk', None) 
     
    440464            proto = model.get_value(model.iter_parent(iter), 0) 
    441465             
    442             if obj: 
    443                 color = None 
     466            if isinstance(obj, base.Field): 
     467 
     468                if isinstance(obj, base.Flags): 
     469                    color = self.style.mid[gtk.STATE_NORMAL] 
     470                else: 
     471                    color = None 
    444472                 
    445                 # FIXME: how to know if the field is autogenerated? :( 
    446                 #if obj.readonly: 
    447                 #    markup = '<i>%s</i>' % Backend.get_field_name(proto, obj) 
    448                 #else: 
    449                 markup = '<b>%s</b>' % Backend.get_field_name(proto, obj) 
     473                if getattr(obj, 'auto', False) or \ 
     474                   getattr(obj.__class__, 'auto', False): 
     475                    markup = '<i>%s</i>' % Backend.get_field_name(obj) 
     476                else: 
     477                    markup = '<b>%s</b>' % Backend.get_field_name(obj) 
    450478        else: 
    451479            markup = '<b>%s</b>' % Backend.get_proto_name(obj) 
     
    460488        icon, color = None, self.style.mid[gtk.STATE_NORMAL] 
    461489         
    462         if obj: 
    463             color = None 
    464             if hasattr(obj, "readonly") and obj.readonly: 
     490        if isinstance(obj, base.Field): 
     491 
     492            if isinstance(obj, base.Flags): 
     493                color = self.style.mid[gtk.STATE_NORMAL] 
     494            else: 
     495                color = None 
     496 
     497            if getattr(obj, 'auto', False) or \ 
     498               getattr(obj.__class__, 'auto', False): 
    465499                icon = self.icon_locked 
    466500         
     
    477511        @param proto_inst a Protocol object instance 
    478512        """ 
    479  
    480         # TODO: implement me 
    481          
    482         print "Populating", proto_inst 
    483          
    484513        root_iter = self.store.append(None, [proto_inst, None]) 
    485514 
    486515        # We have to use the get_fields method 
    487516        for field in proto_inst.get_fields(): 
    488             self.store.append(root_iter, [None, field]) 
     517            flag_iter = self.store.append(root_iter, [None, field]) 
     518 
     519            if isinstance(field, base.Flags): 
     520                print field.get() 
     521 
     522                for flag in Backend.get_flag_keys(field): 
     523                    self.store.append(flag_iter, 
     524                        [None, BitField(field, flag, field.get(flag)[0])] 
     525                    ) 
    489526 
    490527gobject.type_register(PropertyGridTree) 
     
    502539        self.tree = PropertyGridTree() 
    503540 
    504         self.frame = gtk.Frame("Description") 
     541        self.expander = gtk.Expander("Description") 
     542 
    505543        self.desc_label = gtk.Label() 
    506544        self.desc_label.set_alignment(0, 0.5) 
    507545        self.desc_label.set_single_line_mode(False) 
    508         self.frame.add(self.desc_label) 
     546        self.desc_label.set_line_wrap(True) 
     547        self.desc_label.modify_bg(gtk.STATE_NORMAL, self.style.base[gtk.STATE_SELECTED]) 
     548        #self.desc_label.set_ellipsize(pango.ELLIPSIZE_END) 
     549        self.expander.add(self.desc_label) 
    509550         
    510551        self.pack_start(self.tree) 
    511         self.pack_start(self.frame, False, False) 
     552        self.pack_start(self.expander, False, False) 
    512553 
    513554        self.clear = self.tree.clear 
     
    518559 
    519560    def __on_update_desc(self, tree, desc): 
     561        if not desc: 
     562            desc = "" 
     563 
    520564        self.desc_label.set_text("<tt>%s</tt>" % desc) 
    521565        self.desc_label.set_use_markup(True)