geary/src/engine/util/util-object.vala
Michael Gratton e4cbff8bfa De-cruftify Geary.Collection utility functions
Remove functions that have as-convenient methods in up-tp-date Gee,
rename ::get_first to ::first so it reads better and add API docs,
replace ::to_array_list with ::copy, since that's what's actually
needed.
2019-11-19 19:22:38 +11:00

61 lines
2.1 KiB
Vala

/* Copyright 2016 Software Freedom Conservancy Inc.
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
namespace Geary.ObjectUtils {
/**
* Creates a set of property bindings from source to dest with the given binding flags.
*/
public Gee.List<Binding>? mirror_properties(Object source, Object dest, BindingFlags
flags = GLib.BindingFlags.DEFAULT | GLib.BindingFlags.SYNC_CREATE) {
// Make sets of both object's properties.
Gee.HashSet<ParamSpec> source_properties =
iterate_array(source.get_class().list_properties()).to_hash_set();
Gee.HashSet<ParamSpec> dest_properties =
iterate_array(dest.get_class().list_properties()).to_hash_set();
// Remove properties from source_properties that are not in both sets.
source_properties.retain_all(dest_properties);
// Create all bindings.
Gee.List<Binding> bindings = new Gee.ArrayList<Binding>();
foreach(ParamSpec ps in source_properties) {
if ((ps.flags & ParamFlags.WRITABLE) != 0)
bindings.add(source.bind_property(ps.name, dest, ps.name, flags));
}
return bindings.size > 0 ? bindings : null;
}
/**
* Removes a property mirror created by mirror_properties
*/
public void unmirror_properties(Gee.List<Binding> bindings) {
foreach(Binding b in bindings)
b.unref();
bindings.clear();
}
/** Convenience method for getting an enum value's nick name. */
public string to_enum_nick<E>(GLib.Type type, E value) {
GLib.EnumClass enum_type = (GLib.EnumClass) type.class_ref();
return enum_type.get_value((int) value).value_nick;
}
/** Convenience method for getting an enum value's from its nick name. */
public E from_enum_nick<E>(GLib.Type type, string nick) throws EngineError {
GLib.EnumClass enum_type = (GLib.EnumClass) type.class_ref();
unowned GLib.EnumValue? e_value = enum_type.get_value_by_nick(nick);
if (e_value == null) {
throw new EngineError.BAD_PARAMETERS(
"Unknown %s enum value: %s", typeof(E).name(), nick
);
}
return (E) e_value.value;
}
}