D2 GUI Libs

Jacob Carlborg doob at me.com
Mon Dec 14 11:29:42 PST 2009


On 12/13/09 20:44, Eldar Insafutdinov wrote:
> Nick Sabalausky Wrote:
>
>> "Nick Sabalausky"<a at a.a>  wrote in message
>> news:hg394f$mr1$1 at digitalmars.com...
>>> "Eldar Insafutdinov"<e.insafutdinov at gmail.com>  wrote in message
>>> news:hg2p87$2ttj$1 at digitalmars.com...
>>>>
>>>> 1) You may know the concept of signals and slots in Qt. Consider the
>>>> following snippet:
>>>>
>>>> class Test : QObject
>>>> {
>>>>     mixin Signal!("signal_1(string)");
>>>>
>>>>     mixin Slot!("slot_1(string str)");
>>>>     void slot_1(string str)
>>>>     {
>>>>         writefln("slot_1 invoked with ~ " str);
>>>>     }
>>>>
>>>>     mixin Q_OBJECT;
>>>> }
>>>>
>>>> In Qt objects, that inherit from QObject are capable of having signals
>>>> and slots and participate in connections. In the current scheme mixins of
>>>> Signal and Slot template mix some static information into the class. The
>>>> class is then scanned when Q_OBJECT template is mixed in and the proper
>>>> meta-information is generated to register signals and slots in the Qt
>>>> type system.
>>>> As you see, this declaration is a bit ugly. In particular defining a slot
>>>> requires to duplicate its signature in a mixin. What would really be
>>>> awesome is a mechanism allowing something like:
>>>>
>>>>     @Slot
>>>>     void slot_1(string str)
>>>>     {
>>>>         writefln("slot_1 invoked with " ~ str);
>>>>     }
>>>> I.e we need annotations. But I am not sure how this will work. One of the
>>>> possible solutions will be that @Slot expands into mixin Slot!(symbol,
>>>> AnnotationArg1, ...).
>>>>
>>>
>>
>> Oops, slight typo:
>>
>>> Try string mixins, something like this:
>>>
>>> 1. Rename Slot to _Slot.
>>>
>>> 2. Do this:
>>>
>>
>> // Fixed:
>> template Slot(string decl, string body)
>> {
>>      const string Slot = "
>>          mixin _Slot!("~decl.stringof~");
>>          void slot_1(string str)
>>          {
>>              "~body.stringof~"
>>          }
>>      ";
>> }
>>
>>>
>>> class Test : QObject
>>> {
>>>     mixin Signal!("signal_1(string)");
>>>
>>>     mixin( Slot!("slot_1(string str)", q{
>>>         writefln("slot_1 invoked with ~ " str);
>>>     }) );
>>>
>>>    mixin Q_OBJECT;
>>> }
>>>
>>>
>>
>>
>
> Thank you for suggestion, but while reducing redundancy it became even uglier! I'll better stay with the current syntax.

To make it look a little better you can do like this:

template Slot (ReturnType, alias method, ARGS...)
{
// code
}

template Slot (alias method)
{
	mixin Slot!(ReturnType!(method), method, ParameterTypeTuple!(method));
}

If the method is overloaded, use the first version, otherwise use the 
second. Use them like this:

class Test : QObject
{	
     mixin Slot!(slot_1);
     void slot_1(string str)
     {
         writefln("slot_1 invoked with ~ " str);
     }

     mixin Q_OBJECT;
}



More information about the Digitalmars-d mailing list