Changeset 3208
- Timestamp:
- 07/24/08 11:31:10 (5 years ago)
- Location:
- branch/PacketManipulator
- Files:
-
- 3 modified
-
Backend/__init__.py (modified) (1 diff)
-
Tabs/MainTab.py (modified) (1 diff)
-
widgets/PropertyGrid.py (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branch/PacketManipulator/Backend/__init__.py
r3205 r3208 59 59 return proto_inst.__class__.__name__ 60 60 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 61 def get_field_name(field, trim_underscore=True): 62 return field.name 74 63 75 64 def get_field_desc(field): -
branch/PacketManipulator/Tabs/MainTab.py
r3188 r3208 101 101 self.hexview = HexView() 102 102 103 self.hexview.show_payload(self.protocol.get_raw()) 104 103 105 def __pack_widgets(self): 104 106 self.vpaned.pack1(self.proto_hierarchy) -
branch/PacketManipulator/widgets/PropertyGrid.py
r3199 r3208 26 26 # Protocol stuff 27 27 import Backend 28 from umpa.protocols import _ as base 28 29 29 30 # For the icons … … 47 48 48 49 def get_value(self): 49 return self.field. value50 return self.field.get() 50 51 51 52 def set_value(self, value): 52 self.field. value = value53 self.field.set(value) 53 54 54 55 def render(self, window, widget, bounds, state): … … 61 62 62 63 def create_widgets(self): 64 # Manage the None type 65 if not self.value: 66 self.value = 0 67 63 68 self.calc_bounds() 64 69 self.adj = gtk.Adjustment(self.value, self.min, self.max, 1, 2) … … 74 79 75 80 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): 79 87 self.min = -sys.maxint - 1 80 88 self.max = sys.maxint 81 self.digits = 082 elif isinstance(self.value, float):83 # FIXME: i dunno here84 self.min = -sys.maxint - 185 self.max = sys.maxint86 self.digits = 287 else:88 self.min = 089 self.max = 1090 89 self.digits = 0 91 90 … … 95 94 else: 96 95 self.value = self.spin.get_value() 96 97 class 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) 97 111 98 112 class BitEditor(Editor): … … 182 196 self.emit('finish-edit', self.box.get_child()) 183 197 self.box.unparent() 198 self.box.hide() 199 self.box.destroy() 184 200 185 201 def do_size_allocate(self, alloc): … … 342 358 self.tree = gtk.TreeView(self.store) 343 359 344 self.set_policy(gtk.POLICY_ NEVER, gtk.POLICY_AUTOMATIC)360 self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) 345 361 self.set_shadow_type(gtk.SHADOW_ETCHED_IN) 346 362 … … 360 376 col.set_resizable(True) 361 377 col.set_expand(True) 362 col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)378 #col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 363 379 col.set_fixed_width(180) 364 380 col.set_attributes(crt) … … 372 388 373 389 col.pack_start(crt, True) 374 col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)390 #col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED) 375 391 col.set_resizable(False) 376 392 col.set_expand(True) … … 391 407 def __on_selection_changed(self, selection): 392 408 model, iter = selection.get_selected() 409 410 if not iter: 411 return 412 393 413 proto = model.get_value(iter, 0) 394 414 … … 412 432 obj = model.get_value(iter, 1) 413 433 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 415 439 cell.set_property('editable', True) 440 416 441 #FIXME: stringify? 417 442 cell.set_property('markup', '<tt>%s</tt>' % obj.get()) 418 443 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 426 450 427 451 cell.set_property('cell-background-gdk', None) … … 440 464 proto = model.get_value(model.iter_parent(iter), 0) 441 465 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 444 472 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) 450 478 else: 451 479 markup = '<b>%s</b>' % Backend.get_proto_name(obj) … … 460 488 icon, color = None, self.style.mid[gtk.STATE_NORMAL] 461 489 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): 465 499 icon = self.icon_locked 466 500 … … 477 511 @param proto_inst a Protocol object instance 478 512 """ 479 480 # TODO: implement me481 482 print "Populating", proto_inst483 484 513 root_iter = self.store.append(None, [proto_inst, None]) 485 514 486 515 # We have to use the get_fields method 487 516 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 ) 489 526 490 527 gobject.type_register(PropertyGridTree) … … 502 539 self.tree = PropertyGridTree() 503 540 504 self.frame = gtk.Frame("Description") 541 self.expander = gtk.Expander("Description") 542 505 543 self.desc_label = gtk.Label() 506 544 self.desc_label.set_alignment(0, 0.5) 507 545 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) 509 550 510 551 self.pack_start(self.tree) 511 self.pack_start(self. frame, False, False)552 self.pack_start(self.expander, False, False) 512 553 513 554 self.clear = self.tree.clear … … 518 559 519 560 def __on_update_desc(self, tree, desc): 561 if not desc: 562 desc = "" 563 520 564 self.desc_label.set_text("<tt>%s</tt>" % desc) 521 565 self.desc_label.set_use_markup(True)
