def group_add(self, name):
        if name in self._subgroups:
            raise KeyError(name)

        tbl = PropertyTable(self._parent, name, self.prop_value_changed)
        tbl.show()
        frm = elementary.Layout(self._parent)

        frm.file_set(self._parent.theme, "subgroup")
        frm.edje_get().part_text_set("title.label", name)
        frm.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        frm.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        frm.content_set("content", tbl)
        frm.show()
        self._box.pack_end(frm)

        grp = dict()
        grp["table"] = tbl
        grp["frame"] = frm
        self._subgroups[name] = grp
Exemple #2
0
    def group_add(self, name):
        if name in self._subgroups:
            raise KeyError(name)

        tbl = PropertyTable(self._parent, name, self.prop_value_changed)
        tbl.show()
        frm = elementary.Layout(self._parent)

        frm.file_set(self._parent.themeext, "subgroup")
        frm.edje_get().part_text_set("title.label", name)
        frm.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        frm.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        frm.content_set("content", tbl)
        frm.show()
        self._box.pack_end(frm)

        grp = dict()
        grp["table"] = tbl
        grp["frame"] = frm
        self._subgroups[name] = grp
class EditjeDetails(elementary.Layout):
    def __init__(self, parent, operation_stack_cb,
                 group="editje/collapsable/default"):
        if not operation_stack_cb:
            raise TypeError("You must set a callback for operation stacking on"
                            " EditjeDetails objects.")

        elementary.Layout.__init__(self, parent)
        self.file_set(parent.theme, group)
        self._edje = self.edje_get()

        self._parent = parent
        self._operation_stack_cb = operation_stack_cb

        self._proptable = PropertyTable(
            parent, "main", self.prop_value_changed)
        self._proptable.show()
        self.e = parent.e

        self._min_sizes_init(group)

        self._box = elementary.Box(parent)
        self._box.pack_end(self._proptable)
        self._box.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self._box.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        self._box.show()
        self.content_set("cl.content", self._box)
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self.size_hint_align_set(evas.EVAS_HINT_FILL, evas.EVAS_HINT_FILL)
        self.size_hint_min_set(*self._min_size_collapsed)

        self._subgroups = dict()

        self._open_load()

    def _min_sizes_init(self, group):
        self._m_save = self._edje.size_min_calc()
        self._min_size_collapsed = self._m_save
        self._edje.signal_emit("cl,extra,activate", "")
        edje.message_signal_process()
        self._m_save_extra = self._edje.size_min_calc()
        self._edje.signal_emit("cl,extra,deactivate", "")
        self._min_size = self._min_size_collapsed

    def min_size_expanded_toggle(self, value):
        if value:
            self._min_size_collapsed = self._m_save_extra
        else:
            self._min_size_collapsed = self._m_save

    def _size_hint_changed_cb(self, obj):
        self._min_size = self._edje.size_min_calc()
        if self._open:
            self.size_hint_min_set(*self._min_size)

    def content_set(self, part, obj):
        obj.on_changed_size_hints_add(self._size_hint_changed_cb)
        elementary.Layout.content_set(self, part, obj)
        self._min_size = self._edje.size_min_calc()

    def group_add(self, name):
        if name in self._subgroups:
            raise KeyError(name)

        tbl = PropertyTable(self._parent, name, self.prop_value_changed)
        tbl.show()
        frm = elementary.Layout(self._parent)

        frm.file_set(self._parent.theme, "subgroup")
        frm.edje_get().part_text_set("title.label", name)
        frm.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        frm.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        frm.content_set("content", tbl)
        frm.show()
        self._box.pack_end(frm)

        grp = dict()
        grp["table"] = tbl
        grp["frame"] = frm
        self._subgroups[name] = grp

    def group_title_set(self, name, title):
        if not name in self._subgroups:
            raise KeyError(name)

        self._subgroups[name]["frame"].edje_get().part_text_set("title.label",
                                                                title)

    def group_show(self, name):
        if not name in self._subgroups:
            raise KeyError(name)
        grp = self._subgroups[name]["frame"]
        self._box.pack_end(grp)
        grp.show()

    def group_hide(self, name):
        if not name in self._subgroups:
            raise KeyError(name)
        grp = self._subgroups[name]["frame"]
        self._box.unpack(grp)
        grp.hide()

    def main_hide(self):
        self._box.unpack(self._proptable)
        self._proptable.hide()

    def main_show(self):
        self._box.pack_end(self._proptable)
        self._proptable.show()

    def prop_value_changed(self, prop, value, group):
        pass

    def __getitem__(self, key):
        if key == "main":
            return self._proptable
        elif key in self._subgroups:
            return self._subgroups[key]["table"]
        raise KeyError(key)

    # Title
    def _title_set(self, value):
        self._edje.part_text_set("cl.header.title", value)

    def _title_get(self):
        return self.part_text_get("cl.header.title")

    title = property(_title_get, _title_set)

    #  Open / Close
    def _open_load(self):
        self._edje.signal_callback_add("cl,opened", "editje/collapsable",
                                 self._opened_cb)
        self._edje.signal_callback_add("cl,closed", "editje/collapsable",
                                 self._closed_cb)

        self._open = False
        self._open_disable = True
        self.open = False

    def _open_set(self, value):
        if self._open_disable:
            return
        self.open_set(value)

    def open_set(self, value):
        if value:
            self._edje.signal_emit("cl,open", "")
        else:
            self._edje.signal_emit("cl,close", "")

    def _opened_cb(self, obj, emission, source):
        self._open = True
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
        self.size_hint_min_set(*self._min_size)
        self._edje.calc_force()
        self._proptable.disabled_set(False)

    def _closed_cb(self, obj, emission, source):
        self._open = False
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self.size_hint_min_set(*self._min_size_collapsed)
        self._edje.calc_force()
        self._proptable.disabled_set(True)

    def _open_get(self):
        return self._open

    open = property(_open_get, _open_set)

    def _open_disable_set(self, value):
        if value:
            self.edje_get().signal_emit("cl,disable", "")
        else:
            self.edje_get().signal_emit("cl,enable", "")
        self._open_disable = value

    def _open_disable_get(self, value):
        return self._open_disable

    open_disable = property(_open_disable_get, _open_disable_set)

    # most general form, specialise if needed
    def _context_recall(self, **kargs):
        self.e.part.name = kargs["part"]
        self.e.part.state.name = kargs["state"]

    # most general form, specialise if needed
    def _prop_old_values_get(self, prop_attrs, is_external):
        old_values = []
        obj = self._prop_object_get()

        for i, p in enumerate(prop_attrs):
            old_values.append(getattr(obj, p))

        return old_values

    def _prop_change_do(self, op_name, prop_groups, prop_names, prop_values,
                        prop_attrs, is_external, filters):

        def set_property(part_name, state_name, anim_name, frame, sig_name,
                         prop_attrs, prop_names, prop_values, is_external,
                         filter_, reverse=False):

            if reverse:
                efunc = lambda l: izip(xrange(len(l) - 1, -1, -1), reversed(l))
            else:
                efunc = enumerate

            self._context_recall(
                part=part_name, state=state_name, animation=anim_name,
                time=frame, signal=sig_name)

            for i, p in efunc(prop_attrs):
                if is_external[i]:
                    if not self.e.part.state.external_param_set(prop_attrs[i],
                            prop_values[i]):
                        return i
                else:
                    obj = self._prop_object_get()
                    setattr(obj, prop_attrs[i], prop_values[i])

                if filter_[i]:
                    label_value = filter_[i](prop_values[i])
                else:
                    label_value = prop_values[i]
                if self[prop_groups[i]][prop_names[i]].value != label_value:
                    self[prop_groups[i]][prop_names[i]].value = label_value
            return True

        if not self._prop_object_get:
            raise NotImplementedError(
                "One must implement self._prop_object_get for"
                " EditjeDetails children classes.")

        l = len(prop_groups)
        for arg in (prop_names, prop_values, prop_attrs,
                    is_external, filters):
            if len(arg) != l:
                raise TypeError("Cardinality of property fields differ.")

        part_name = self.e.part.name
        state_name = self.e.part.state.name

        # animations' only
        anim_name = self.e.animation.name
        frame = self.e.animation.state

        # signals' only
        sig_name = self.e.signal.name

        old_values = []
        for i, p in enumerate(prop_attrs):
            if not p:
                prop_attrs[i] = prop_names[i]

        old_values = self._prop_old_values_get(prop_attrs, is_external)

        is_valid = set_property(part_name, state_name, anim_name, frame,
                                sig_name, prop_attrs, prop_names, prop_values,
                                is_external, filters)

        if is_valid is not True:
            self["external"][prop_attrs[is_valid]].value = old_values[is_valid]
            return

        op = Operation(op_name)
        op.redo_callback_add(
            set_property, part_name, state_name, anim_name, frame, sig_name,
            prop_attrs, prop_names, prop_values, is_external, filters)
        op.undo_callback_add(
            set_property, part_name, state_name, anim_name, frame, sig_name,
            prop_attrs, prop_names, old_values, is_external, filters, True)
        self._operation_stack_cb(op)

        return op
Exemple #4
0
class EditjeDetails(elementary.Layout):
    def __init__(self,
                 parent,
                 operation_stack_cb,
                 group="editje/collapsable/default"):
        if not operation_stack_cb:
            raise TypeError("You must set a callback for operation stacking on"
                            " EditjeDetails objects.")

        elementary.Layout.__init__(self, parent)
        self.file_set(parent.themeext, group)
        self._edje = self.edje_get()

        self._parent = parent
        self._operation_stack_cb = operation_stack_cb

        self._proptable = PropertyTable(parent, "main",
                                        self.prop_value_changed)
        self._proptable.show()
        self.e = parent.e

        self._min_sizes_init(group)

        self._box = elementary.Box(parent)
        self._box.pack_end(self._proptable)
        self._box.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self._box.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        self._box.show()
        self.content_set("cl.content", self._box)
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self.size_hint_align_set(evas.EVAS_HINT_FILL, evas.EVAS_HINT_FILL)
        self.size_hint_min_set(*self._min_size_collapsed)

        self._subgroups = dict()

        self._open_load()

    def _min_sizes_init(self, group):
        self._m_save = self._edje.size_min_calc()
        self._min_size_collapsed = self._m_save
        self._edje.signal_emit("cl,extra,activate", "")
        edje.message_signal_process()
        self._m_save_extra = self._edje.size_min_calc()
        self._edje.signal_emit("cl,extra,deactivate", "")
        self._min_size = self._min_size_collapsed

    def min_size_expanded_toggle(self, value):
        if value:
            self._min_size_collapsed = self._m_save_extra
        else:
            self._min_size_collapsed = self._m_save

    def _size_hint_changed_cb(self, obj):
        self._min_size = self._edje.size_min_calc()
        if self._open:
            self.size_hint_min_set(*self._min_size)

    def content_set(self, part, obj):
        obj.on_changed_size_hints_add(self._size_hint_changed_cb)
        elementary.Layout.content_set(self, part, obj)
        self._min_size = self._edje.size_min_calc()

    def group_add(self, name):
        if name in self._subgroups:
            raise KeyError(name)

        tbl = PropertyTable(self._parent, name, self.prop_value_changed)
        tbl.show()
        frm = elementary.Layout(self._parent)

        frm.file_set(self._parent.themeext, "subgroup")
        frm.edje_get().part_text_set("title.label", name)
        frm.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        frm.size_hint_align_set(evas.EVAS_HINT_FILL, 0.0)
        frm.content_set("content", tbl)
        frm.show()
        self._box.pack_end(frm)

        grp = dict()
        grp["table"] = tbl
        grp["frame"] = frm
        self._subgroups[name] = grp

    def group_title_set(self, name, title):
        if not name in self._subgroups:
            raise KeyError(name)

        self._subgroups[name]["frame"].edje_get().part_text_set(
            "title.label", title)

    def group_show(self, name):
        if not name in self._subgroups:
            raise KeyError(name)
        grp = self._subgroups[name]["frame"]
        self._box.pack_end(grp)
        grp.show()

    def group_hide(self, name):
        if not name in self._subgroups:
            raise KeyError(name)
        grp = self._subgroups[name]["frame"]
        self._box.unpack(grp)
        grp.hide()

    def main_hide(self):
        self._box.unpack(self._proptable)
        self._proptable.hide()

    def main_show(self):
        self._box.pack_end(self._proptable)
        self._proptable.show()

    def prop_value_changed(self, prop, value, group):
        pass

    def __getitem__(self, key):
        if key == "main":
            return self._proptable
        elif key in self._subgroups:
            return self._subgroups[key]["table"]
        raise KeyError(key)

    # Title
    def _title_set(self, value):
        self._edje.part_text_set("cl.header.title", value)

    def _title_get(self):
        return self.part_text_get("cl.header.title")

    title = property(_title_get, _title_set)

    #  Open / Close
    def _open_load(self):
        self._edje.signal_callback_add("cl,opened", "editje/collapsable",
                                       self._opened_cb)
        self._edje.signal_callback_add("cl,closed", "editje/collapsable",
                                       self._closed_cb)

        self._open = False
        self._open_disable = True
        self.open = False

    def _open_set(self, value):
        if self._open_disable:
            return
        self.open_set(value)

    def open_set(self, value):
        if value:
            self._edje.signal_emit("cl,open", "")
        else:
            self._edje.signal_emit("cl,close", "")

    def _opened_cb(self, obj, emission, source):
        self._open = True
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, evas.EVAS_HINT_EXPAND)
        self.size_hint_min_set(*self._min_size)
        self._edje.calc_force()
        self._proptable.disabled_set(False)

    def _closed_cb(self, obj, emission, source):
        self._open = False
        self.size_hint_weight_set(evas.EVAS_HINT_EXPAND, 0.0)
        self.size_hint_min_set(*self._min_size_collapsed)
        self._edje.calc_force()
        self._proptable.disabled_set(True)

    def _open_get(self):
        return self._open

    open = property(_open_get, _open_set)

    def _open_disable_set(self, value):
        if value:
            self.edje_get().signal_emit("cl,disable", "")
        else:
            self.edje_get().signal_emit("cl,enable", "")
        self._open_disable = value

    def _open_disable_get(self, value):
        return self._open_disable

    open_disable = property(_open_disable_get, _open_disable_set)

    # most general form, specialise if needed
    def _context_recall(self, **kargs):
        self.e.part.name = kargs["part"]
        self.e.part.state.name = kargs["state"]

    # most general form, specialise if needed
    def _prop_old_values_get(self, prop_attrs, is_external):
        old_values = []
        obj = self._prop_object_get()

        for i, p in enumerate(prop_attrs):
            old_values.append(getattr(obj, p))

        return old_values

    def _prop_change_do(self, op_name, prop_groups, prop_names, prop_values,
                        prop_attrs, is_external, filters):
        def set_property(part_name,
                         state_name,
                         anim_name,
                         frame,
                         sig_name,
                         prop_attrs,
                         prop_names,
                         prop_values,
                         is_external,
                         filter_,
                         reverse=False):

            if reverse:
                efunc = lambda l: izip(xrange(len(l) - 1, -1, -1), reversed(l))
            else:
                efunc = enumerate

            self._context_recall(part=part_name,
                                 state=state_name,
                                 animation=anim_name,
                                 time=frame,
                                 signal=sig_name)

            for i, p in efunc(prop_attrs):
                if is_external[i]:
                    if not self.e.part.state.external_param_set(
                            prop_attrs[i], prop_values[i]):
                        return i
                else:
                    obj = self._prop_object_get()
                    setattr(obj, prop_attrs[i], prop_values[i])

                if filter_[i]:
                    label_value = filter_[i](prop_values[i])
                else:
                    label_value = prop_values[i]
                if self[prop_groups[i]][prop_names[i]].value != label_value:
                    self[prop_groups[i]][prop_names[i]].value = label_value
            return True

        if not self._prop_object_get:
            raise NotImplementedError(
                "One must implement self._prop_object_get for"
                " EditjeDetails children classes.")

        l = len(prop_groups)
        for arg in (prop_names, prop_values, prop_attrs, is_external, filters):
            if len(arg) != l:
                raise TypeError("Cardinality of property fields differ.")

        part_name = self.e.part.name
        state_name = self.e.part.state.name

        # animations' only
        anim_name = self.e.animation.name
        frame = self.e.animation.state

        # signals' only
        sig_name = self.e.signal.name

        old_values = []
        for i, p in enumerate(prop_attrs):
            if not p:
                prop_attrs[i] = prop_names[i]

        old_values = self._prop_old_values_get(prop_attrs, is_external)

        is_valid = set_property(part_name, state_name, anim_name, frame,
                                sig_name, prop_attrs, prop_names, prop_values,
                                is_external, filters)

        if is_valid is not True:
            self["external"][prop_attrs[is_valid]].value = old_values[is_valid]
            return

        op = Operation(op_name)
        op.redo_callback_add(set_property, part_name, state_name, anim_name,
                             frame, sig_name, prop_attrs, prop_names,
                             prop_values, is_external, filters)
        op.undo_callback_add(set_property, part_name, state_name, anim_name,
                             frame, sig_name, prop_attrs, prop_names,
                             old_values, is_external, filters, True)
        self._operation_stack_cb(op)

        return op