diff qt/qtd/MOC.d @ 319:894d40eb89b6 signals

new signals and slots syntax. have to use prefixes now: signal_fooed and slot_onFooed
author eldar_ins@eldar-laptop
date Fri, 25 Dec 2009 21:48:32 +0500
parents 55ee4603365d
children 5c6455c4889b
line wrap: on
line diff
--- a/qt/qtd/MOC.d	Thu Dec 24 05:19:40 2009 +0500
+++ b/qt/qtd/MOC.d	Fri Dec 25 21:48:32 2009 +0500
@@ -6,6 +6,8 @@
 
 import qt.Signal;
 import qt.qtd.MetaMarshall;
+import qt.qtd.Meta;
+
 public import qt.core.QString;
 
 public import std.traits;
@@ -83,12 +85,6 @@
     return cast(string)ret;
 }
 
-template Repeat(T, int I)
-{
-    static if (!I) alias TypeTuple!() Repeat;
-    else alias TypeTuple!(T, Repeat!(T, I - 1)) Repeat;
-}
-
 /**
    CTFE MOC port.
   */
@@ -409,7 +405,7 @@
         res ~= "
         if (_c == QMetaObject.Call.InvokeMetaMethod) {
             switch (_id) {";
-        foreach(i, bogus; Repeat!(void, methodCount)) {
+        foreach(i, _; Repeat!(void, methodCount)) {
             res ~= "
             case " ~ __toString(i) ~ ": " ~ MetaEntryName!(Methods[i].at) ~ "(" ~ metaCallArgs!(MetaEntryArgs!(Methods[i].at))() ~ "); break;";
         }
@@ -506,23 +502,11 @@
     return res;
 }
 
-string generateMetaInfo(string className, alias Signals, alias Slots)()
-{
-    string res = "";
-    auto signalList = genFuncDefs!(Signals, newSignal)();
-    auto slotList = genFuncDefs!(Slots, newSlot)();
-    res ~= generateCode(className, signalList, slotList);
-    res ~= generate_qt_metacall!(Signals, Slots);
-    res ~= generateMetaObjectConstruction!(Signals, Slots);
-    res ~= generateQMetaObject(className);
-    return res;
-}
-
 template Q_OBJECT_BIND()
 {
     mixin ("enum lastSignalIndex_" ~ typeof(this).stringof ~ " = " ~ toStringNow!(lastSignalIndex!(typeof(this))) ~ ";");
 }
-
+/*
 template Q_OBJECT()
 {
 //    pragma(msg, toStringNow!(lastSignalIndex!(typeof(this))));
@@ -533,3 +517,54 @@
     pragma(msg, generateMetaInfo!((typeof(this)).stringof, Signals, Slots)());
     mixin(generateMetaInfo!((typeof(this)).stringof, Signals, Slots)());
 }
+*/
+// ------------------------------------------------------------------------------------------
+
+string generateSignalEmitters(alias Funcs)()
+{
+    string res;
+    enum funcsCount = Funcs.at.length;
+    foreach(i, bogus; Repeat!(void, funcsCount))
+    {
+        res ~= SignalEmitter!(MetaEntryArgs!(Funcs.at[i].at))(SignalType.NewSignal, MetaEntryName!(Funcs.at[i].at), [], i);
+    }
+    return res;
+}
+
+string generateSlotAliases(alias Funcs)()
+{
+    string res;
+    enum funcsCount = Funcs.at.length;
+    foreach(i, bogus; Repeat!(void, funcsCount))
+    {
+        string name = MetaEntryName!(Funcs.at[i].at);
+        res ~= format_ctfe("    alias slot_${} ${};\n", name, name);
+    }
+    return res;
+}
+
+
+string generateMetaInfo(T, alias Signals, alias Slots)()
+{
+    string res = "";
+    auto signalList = genFuncDefs!(Signals, newSignal)();
+    auto slotList = genFuncDefs!(Slots, newSlot)();
+    res ~= generateSignalEmitters!(Signals)();
+    res ~= generateSlotAliases!(Slots)();
+    res ~= generateCode(T.stringof, signalList, slotList);
+    res ~= generate_qt_metacall!(Signals, Slots);
+    res ~= generateMetaObjectConstruction!(Signals, Slots);
+    res ~= generateQMetaObject(T.stringof);
+    return res;
+}
+
+template Q_OBJECT()
+{
+    alias findSignals!(typeof(this)) SignalFuncs;
+    alias toMetaEntries!(SignalFuncs) SignalMetaEntries;
+    alias findSlots!(typeof(this)) SlotFuncs;
+    alias toMetaEntries!(SlotFuncs) SlotMetaEntries;
+
+    mixin(generateMetaInfo!(typeof(this), SignalMetaEntries, SlotMetaEntries)());
+    pragma(msg, generateMetaInfo!(typeof(this), SignalMetaEntries, SlotMetaEntries)());
+}
\ No newline at end of file