[mcclim-devel] presentation-subtypep
Christophe Rhodes
csr21 at cantab.net
Tue Jan 9 14:32:14 UTC 2007
Robert Goldman <rpgoldman at real-time.com> writes:
> With Xof's help, I have butchered the definition of
> presentation-subtypep in McCLIM to hand AND types --- previously it only
> handled OR. Here is a draft new defun (apologies is wrapper gonks it)
> and, for those who prefer, I will attach (unless I forget again) a patch
> file:
I think that the attached is better, but it still is not perfect. (I
will commit it unless I hear screams of pain, though). It comes in
two parts (plus some tests):
* modifications to PRESENTATION-SUBTYPEP and STUPID-SUBTYPEP to handle
most cases of AND and OR presentation types. Some of the cases are
about as good as we can get; there's room for improvement in others.
There are a few surprises lurking in the definitions of presentation
types and their relationships: they don't correspond directly to CL
types, so some of the instincts about those are misleading; AND
types are somewhat special, in that the first parameter of an AND
type is magical.
* a modification to DEFAULT-TRANSLATOR to try to get the right
behaviour for complicated presentation types. It's not quite right,
but actually I think that to get it completely right involves
solving SATISFIABILITY, which isn't in my gameplan.
This seems to mostly work; the test file which is included in the
attached diff passes. A further test at the listener is
(present "abc" 'string)
(present "def" 'string)
(defun foop (x)
(char= (char x 0) #\a))
(with-input-context ('(and string (satisfies foop))) (obj otype ev opts)
(loop (read-char))
(t obj))
which makes only the "abc" string and not the "def" string mousable.
Unfortunately, (accept '(and string (satisfies foop))) doesn't work as
expected, as the accept method for AND establishes an inner
input-context for STRING, which means that the "def" string is
mousable (and causes an error if you click on it).
Would something like
(define-presentation-method accept
((type and) (stream input-editing-stream) (view textual-view) &key)
(let ((subtype (first types)))
(multiple-value-bind (ob ty)
(funcall-presentation-generic-function accept subtype stream view)
(unless (presentation-typep ob type)
(simple-parse-error "Object ~S is not of type ~S" ob type))
value)))
be acceptable (haha)? It seems to work for me, in that after I define
this (accept '(and string (satisfies foop))) makes only the strings
beginning with #\a mousable, but I don't know how to handle the
keyword arguments (or even if they've already been handled by stuff up
the stack).
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: presentation-types.diff
URL: <https://mailman.common-lisp.net/pipermail/mcclim-devel/attachments/20070109/72c52a78/attachment.ksh>
-------------- next part --------------
Cheers,
Christophe
More information about the mcclim-devel
mailing list