Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Properties Reorder #180

Merged
merged 11 commits into from
Jun 22, 2020
27 changes: 21 additions & 6 deletions odmlui/treemodel/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,13 @@ def insert(self, position, obj):
func = lambda: super(ModificationNotifier, self).insert(position, obj)
self.__fire_change("insert", obj, func)

def _reorder(self, childlist, value, new_index):
func = lambda: super(ModificationNotifier, self)._reorder(childlist, new_index)
if hasattr(self, "pseudo_values"):
func = lambda: reorder_value(self.parent, value, new_index)
return self.__fire_change("reorder", (childlist, value, new_index), func)
def _reorder(self, obj_list, new_index):
if not hasattr(self.parent, "pseudo_values"):
func = lambda: reorder(self, obj_list, new_index)
return self.__fire_change("reorder", (self, new_index), func)
else:
func = lambda: reorder_value(self, self.parent, new_index)
return self.__fire_change("reorder", (self, new_index), func)


def remove_value(prop, pseudo):
Expand All @@ -259,7 +261,7 @@ def remove_value(prop, pseudo):
prop.values = cp_val


def reorder_value(prop, value, new_index):
def reorder_value(value, prop, new_index):
"""
Reorder a property value and its corresponding pseudo_value.
:param prop: odml Property augmented to fit odml-ui.
Expand All @@ -276,6 +278,19 @@ def reorder_value(prop, value, new_index):
prop.values = new_v_list


def reorder(obj, obj_list, new_index):
"""
Reorder a property or section.
:param obj: odml Property or Section.
:param obj_list: list with parent's properties/sections.
:param new_index: new position of the element.
"""

parent = obj.parent
old_index = obj_list.index(obj)
parent.remove(obj_list[old_index])
parent.insert(new_index if new_index < old_index else (new_index-1), obj)

# create a separate global Event listeners for each class
# and provide ModificationNotifier Capabilities
name = "event"
Expand Down
26 changes: 19 additions & 7 deletions odmlui/treemodel/tree_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -231,15 +231,27 @@ def event_reorder(self, context):
a rows_reordered call
"""
if context.pre_change and not hasattr(context, "neworder"):
(child_list, value, new_index) = context.val
old_index = child_list.index(getattr(value, "value"))
if not hasattr(context.val[0].parent, 'properties') and \
not hasattr(context.val[0].parent, 'author'):
(value, new_index) = context.val
child_list = value.parent.values
old_index = child_list.index(getattr(value, "value"))
elif hasattr(context.val[0].parent, 'author'):
(sec, new_index) = context.val
child_list = sec.parent.sections
old_index = child_list.index(sec)
else:
(prop, new_index) = context.val
child_list = prop.parent.properties
old_index = child_list.index(prop)
res = list(range(len(child_list)))
res.insert(new_index, old_index)
del res[old_index if new_index > old_index else (old_index+1)]
context.new_order = res
if context.post_change:
iter = self.get_node_iter(context.obj.parent)
path = self.get_path(iter)
if not path and context.obj.parent is not self._section:
return # not our deal
self.rows_reordered(path, iter, context.new_order)
if context.obj.parent is not self._section:
iter = self.get_node_iter(context.obj.parent)
path = self.get_path(iter)
if not path:
return # not our deal
self.rows_reordered(path, iter, context.new_order)
2 changes: 1 addition & 1 deletion odmlui/treemodel/value_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def get_display(self, max_length=-1):
return "(%d bytes)" % len(self._value)

def reorder(self, new_index):
return self._reorder(self.parent.values, self, new_index)
return self._reorder(self.parent.values, new_index)

def clone(self):
obj = BaseObject.clone(self)
Expand Down