def __init__(self): gtk.VBox.__init__(self, False, 2) self.set_border_width(4) self.store = gtk.ListStore(str, int, str) self.view = gtk.TreeView(self.store) self.view.set_rules_hint(True) self.view.set_reorderable(True) idx = 0 lbls = (_('Column title'), _('Column size'), _('Function/cfield')) for lbl in lbls[:-1]: rend = gtk.CellRendererText() rend.set_property('editable', True) rend.connect('edited', self.__on_rend_edited, idx) col = gtk.TreeViewColumn(lbl, rend, text=idx) self.view.append_column(col) idx += 1 # Last column model = gtk.ListStore(str) cfields = AuditManager().get_configuration('global.cfields').keys() cfields.sort() for field in cfields: model.append(['%' + field + '%']) rend = gtk.CellRendererCombo() rend.set_property('model', model) rend.set_property('text-column', 0) rend.set_property('editable', True) rend.connect('edited', self.__on_rend_edited, idx) self.view.props.has_tooltip = True self.view.connect('query-tooltip', self.__on_query_tooltip) col = gtk.TreeViewColumn(lbls[-1], rend, text=idx) self.view.append_column(col) sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) sw.add(self.view) bb = gtk.HButtonBox() bb.set_layout(gtk.BUTTONBOX_END) btn = gtk.Button(stock=gtk.STOCK_ADD) btn.connect('clicked', self.__on_add_row) bb.pack_start(btn) btn = gtk.Button(stock=gtk.STOCK_REMOVE) btn.connect('clicked', self.__on_remove_row) bb.pack_start(btn) self.pack_start(sw) self.pack_end(bb, False, False) # Let's populate columns_str = Prefs()['gui.maintab.sniffview.columns'].value for column_str in columns_str.split(','): try: label, pixel_size, eval_str = column_str.split('|', 2) pixel_size = int(pixel_size) self.store.append([label, pixel_size, eval_str]) except: pass self.widgets = []
def __create_view(self): sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) # We have to create two seperate objects if we want to have more # performance while sniffing. We'll use the tree_store only for # reflowing without a model filter. self.tree_store = gtk.TreeStore(object) self.list_store = gtk.ListStore(object) self.active_model = self.list_store self.tree = gtk.TreeView(self.active_model) self.active_filter = None self.model_filter = self.list_store.filter_new() self.model_filter.set_visible_func(self.__filter_func) idx = 0 rend = GridRenderer() rend.set_property('ellipsize', pango.ELLIPSIZE_END) columns_str = Prefs()['gui.maintab.sniffview.columns'].value for column_str in columns_str.split(','): try: label, pixel_size, eval_str = column_str.split('|', 2) pixel_size = int(pixel_size) if eval_str[-1] != '%' or eval_str[0] != '%': continue eval_str = eval_str[1:-1] col = gtk.TreeViewColumn(label, rend) col.set_min_width(pixel_size) col.set_fixed_width(pixel_size) col.set_resizable(True) if eval_str == 'number': col.set_cell_data_func(rend, self.__cell_data_number) else: func = getattr(MetaPacket, eval_str, None) or \ getattr(MetaPacket, 'get_' + eval_str, None) if not func: col.set_cell_data_func(rend, self.__cell_data_cfield, eval_str) else: col.set_cell_data_func(rend, self.__cell_data_func, func) self.tree.insert_column(col, idx) idx += 1 except Exception: pass # Set the fixed height mode property to True to speeds up self.tree.set_fixed_height_mode(True) sw.add(self.tree) self.pack_start(sw)