%PDF- %PDF-
Direktori : /usr/lib/python3/dist-packages/gi/overrides/ |
Current File : //usr/lib/python3/dist-packages/gi/overrides/Dee.py |
from gi.overrides import override from gi.importer import modules Dee = modules['Dee']._introspection_module from gi.repository import GLib __all__ = [] class RowWrapper: def __init__ (self, model, itr): self.model = model self.itr = itr self.__initialized = True def __getitem__ (self, column): return self.model.get_value(self.itr, column) def __setitem__ (self, column, val): self.model.set_value (self.itr, column, val) def __getattr__ (self, name): col_index = self.model.get_column_index (name) if col_index < 0: raise AttributeError("object has no attribute '%s'" % name) return self.model.get_value (self.itr, col_index) def __setattr__ (self, name, value): if not "_RowWrapper__initialized" in self.__dict__: self.__dict__[name] = value return col_index = self.model.get_column_index (name) if col_index < 0: raise AttributeError("object has no attribute '%s'" % name) self.model.set_value (self.itr, col_index, value) def __iter__ (self): for column in range(self.model.get_n_columns()): yield self.model.get_value (self.itr, column) def __len__ (self): return self.model.get_n_columns() def __str__ (self): return "(%s)" % ", ".join(map(str,self)) def __eq__ (self, other): if not isinstance (other, RowWrapper): return False if self.model != other.model: return False return self.itr == other.itr class Model(Dee.Model): def __init__(self): Dee.Model.__init__(self) def set_schema (self, *args): self.set_schema_full (tuple(args)) def set_column_names (self, *args): self.set_column_names_full (tuple(args)) def _build_row (self, args, kwargs): schema = self.get_schema() result = [None] * len(schema) if len(args) > 0: for i, arg in enumerate(args): if isinstance(arg, GLib.Variant): result[i] = arg else: result[i] = GLib.Variant(schema[i], arg) # check if result.count(None) > 0: raise RuntimeError("Not all columns were set") else: names = self.get_column_names() dicts = [None] * len(schema) if len(names) == 0: raise RuntimeError("Column names were not set") for col_name, arg in kwargs.items(): if names.count(col_name) > 0: col_index = names.index(col_name) variant = arg if isinstance(arg, GLib.Variant) else GLib.Variant(schema[col_index], arg) result[col_index] = variant else: col_schema, col_index = self.get_field_schema(col_name) if col_schema: variant = arg if isinstance(arg, GLib.Variant) else GLib.Variant(col_schema, arg) colon_index = col_name.find("::") field_name = col_name if colon_index < 0 else col_name[colon_index+2:] if dicts[col_index] is None: dicts[col_index] = {} dicts[col_index][field_name] = variant else: raise RuntimeError("Unknown column name: %s" % col_name) # finish vardict creation for index, d in enumerate(dicts): if d: result[index] = GLib.Variant(schema[index], d) # handle empty dicts (no "xrange" in python3) for i in range(len(schema)): if result[i] is None and schema[i] == "a{sv}": result[i] = GLib.Variant(schema[i], {}) # checks num_unset = result.count(None) if num_unset > 0: col_name = names[result.index(None)] raise RuntimeError("Column '%s' was not set" % col_name) return result def prepend (self, *args, **kwargs): return self.prepend_row (self._build_row(args, kwargs)) def append (self, *args, **kwargs): return self.append_row (self._build_row(args, kwargs)) def insert (self, pos, *args, **kwargs): return self.insert_row (pos, self._build_row(args, kwargs)) def insert_before (self, iter, *args, **kwargs): return self.insert_row_before (iter, self._build_row(args, kwargs)) def insert_row_sorted (self, row_spec, sort_func, data): return self.insert_row_sorted_with_sizes (row_spec, sort_func, data) def insert_sorted (self, sort_func, *args, **kwargs): return self.insert_row_sorted (self._build_row(args, kwargs), sort_func, None) def find_row_sorted (self, row_spec, sort_func, data): return self.find_row_sorted_with_sizes (row_spec, sort_func, data) def find_sorted (self, sort_func, *args, **kwargs): return self.find_row_sorted (self._build_row(args, kwargs), sort_func, None) def get_schema (self): return Dee.Model.get_schema(self) def get_value (self, itr, column): return Dee.Model.get_value (self, itr, column).unpack() def set_value (self, itr, column, value): var = GLib.Variant (self.get_column_schema(column), value) if isinstance (itr, int): itr = self.get_iter_at_row(itr) Dee.Model.set_value (self, itr, column, var) def __getitem__ (self, itr): if isinstance (itr, int): itr = self.get_iter_at_row(itr) return RowWrapper(self, itr) def __setitem__ (self, itr, row): max_col = self.get_n_columns () for column, value in enumerate (row): if column >= max_col: raise IndexError("Too many columns in row assignment: %s" % column) self.set_value (itr, column, value) def get_row (self, itr): return self[itr] def __iter__ (self): itr = self.get_first_iter () last = self.get_last_iter () while itr != last: yield self.get_row(itr) itr = self.next(itr) raise StopIteration def __len__ (self): return self.get_n_rows() class ModelIter(Dee.ModelIter): def __init__(self): Dee.ModelIter.__init__(self) def __eq__ (self, other): if not isinstance (other, ModelIter): return False return repr(self) == repr(other) Model = override(Model) __all__.append('Model') ModelIter = override(ModelIter) __all__.append('ModelIter')