Re: Autocompletion
- From: Ricardo Fernández Pascual <ric users sourceforge net>
- To: Jon Trowbridge <trow ximian com>
- Cc: gnome-hackers <gnome-hackers gnome org>, gtk-devel <gtk-devel-list gnome org>
- Subject: Re: Autocompletion
- Date: 14 Oct 2002 14:26:16 +0200
El dom, 13-10-2002 a las 23:07, Jon Trowbridge escribió:
> On Sat, 2002-10-05 at 20:12, Jody Goldberg wrote:
> [...]
> The proposed code seems to mostly satisfy these three requirements,
> which is one reason for the delay in my response... I didn't see
> anything horrifying that motivated me to act quickly. :)
>
Great! :-)
> Below are some comments, questions and random assertions that came to
> mind when I read over the egg-autocompletion*.[ch] for the first time.
>
> -JT
>
>
> On EggAutocompletionSource
> --------------------------
>
> I'm a bit confused about the semantics of the eas_set_basic_key and
> eas_foreach methods. Presumably set_basic_key means "start computing
> completions for this string", but the foreach method also takes a
> basic_key string as an argument.
>
> Q: Does this mean that multiple queries are allowed simultaneously? i.e.
> is something like
>
> EggAutocompletionSource *my_source = blah_blah_blah;
>
> eas_set_basic_key (my_source, "foo");
> eas_set_basic_key (my_source, "bar");
>
> ... time for completions to generate ...
>
> eas_foreach (my_source, "foo", gather_foo_completions, foofoo);
> eas_foreach (my_source, "bar", gather_bar_completions, barbar);
>
> supposed to be valid? IMO the API suggests that it is allowed,
> but I suspect that it actually isn't... and requiring such behavior
> would complicate implementations.
>
> subQ: If multiple simultaneous searches are allowed, shouldn't
> the data_changed signal allow per-basic_key notification.
The key arg in the foreach method could be removed. Initially I thought
about allowing several queries (from different galeon windows...) but
then I realized that it was too hard and didn't really add any benefit.
I should have removed that arg then, but I left there just in case...
>
> Q: Shouldn't we also support a method of cancelling the current query?
> This could be important for 'slow' completion generators that involve
> (for example) queries across the network.
Setting a different key? We could add another method but I don't see why
could you want to stop the current search until you have a different
key.
>
> Q: Also, maybe there should be a way for a source to send up
> notification that the current list of matches is complete? There
> should be some way for users to know that the drop-down of matches
> they are looking at is fully populated and isn't still waiting for
> more results from some slow server across the network.
Agreed.
>
>
> On EggAutocompletionMatch
> -------------------------
>
> The EggAutocompletion object acts as an aggregator of
> EggAutocompletionSources, and exposes the results of a query as
> EggAutocompletionMatch structs. The EggAutocompletion is responsible
> for
> memory-managing the EggAutocompletionMatches.
>
> However, the EggAutocompletionMatches are built up by the
> EggAutocompletion.
> The EggAutocompletionSource-implementers just pass up three pieces of
> data:
>
> (1) An 'item' string
> (2) A 'title' string
> (3) A numerical score.
>
> This scheme makes it impossible (or at least unwieldy) for an
> EggAutocompletionSource to pass any extra data about the match. IMHO it
> would
> make more sense for the EggAutocompletionSourceForeachFunc to be
> typedefed
> as
>
> typedef void (* EggA..ForeachFunc) (EggAutocompletionSource *source,
> EggAutocompletionMatch *match,
> gpointer user_data);
>
> EggAutocompletionMatches should be extensible by struct-nesting and
> (maybe) should be reference-counted to avoid memory-management
> hassles. Allowing nesting would allow more complex entry widgets
> build on the stock completion framework while still getting access to
> extra meta-data that they generate at completion-time.
>
> So the definition of EggAutocompletionMatch would move to
> egg-autocompletion-source.h and would probably look something like this:
>
> struct _EggAutocompletionMatch {
> int refs;
> void (*destroy) (struct _EggAutocompletionMatch *);
>
> gchar *match;
> gchar *title;
> gint32 score;
>
> guint offset; /* This seems like an implementation detail of
> EggAutocompletion that we are needlessly exposing,
> but I didn't really look at the code carefully
> enough to understand exactly what it was doing... */
> };
>
> with associated functions:
>
> EggAu..Match *egg_autocompletion_match_ref (EggAutocompletionMatch *);
> void egg_autocompletion_match_unref (EggAutocompletionMatch *);
>
I have totally hidden the EggAutocompletionMatch as an implementation
detail in more recent version (in my harddrive), as havoc suggested. I
think it should be kept internal. I agree about adding the user_data to
it.
>
> Sorting and Scores
> ------------------
>
> Complex sorting schemes might be difficult to implement using just a
> numerical score. The two main issues I see are:
>
> (1) If we have special sorting requirements and start spitting out
> solutions before the entire query is complete, how do we handle
> scoring? It is important that any 'views' on the EggAutocompletion
> not assume that scores are constant -- in some cases we would
> definitely need to re-score every match whenever new solutions are
> found (or lazily, before every eas_foreach call when there have
> been changes.)
The matches are sorted after every "changed" signal. The views should
not assume that the order is kept after the EggAutocompletion emits that
signal.
>
> (2) How do we compare scores between matches that come from multiple
> EggAutocompletionSources? Or more specifically: are such
> comparisons necessarily meaningful? I can think of some cases where
> weirdness could definitely ensue.
Don't know. I guess that it depends of the app. In galeon the score is
more or less a measure of how "old" is the match (but often visited
pages seem newer). This works well for history and bookmarks.
But I have no idea about how to score an address in evolution....
I don't think that you could expect to compare matches from completion
sources that are totally unrelated.
> One approach might be to allow users to register a sort function with
> an EggAutocompletion: the sort function would then be used in lieu of
> (or somehow in conjunction with) the match's score.
Good idea.
--
Ricardo Fernández Pascual
ric users sourceforge net
Murcia. España.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]