Mercurial > projects > qtd
changeset 284:1f6923c8cba0
consistent emit syntax.
author | eldar |
---|---|
date | Fri, 16 Oct 2009 12:23:12 +0000 |
parents | b61a413fc2f5 |
children | 04e20937c681 |
files | examples/draganddrop/dropsite/droparea.d examples/opengl/hellogl/glwidget.d examples/opengl/hellogl/glwidget_d1.d generator/dgenerator.cpp qt/d1/qt/Signal.d qt/d2/qt/Signal.d |
diffstat | 6 files changed, 122 insertions(+), 86 deletions(-) [+] |
line wrap: on
line diff
--- a/examples/draganddrop/dropsite/droparea.d Fri Oct 16 05:32:23 2009 +0000 +++ b/examples/draganddrop/dropsite/droparea.d Fri Oct 16 12:23:12 2009 +0000 @@ -63,7 +63,7 @@ setText(tr("<drop content>")); setBackgroundRole(QPalette.Dark); - changed.emit(null); + changed(null); } mixin Signal!("changed", QMimeData); @@ -76,7 +76,7 @@ setBackgroundRole(QPalette.Highlight); event.acceptProposedAction(); - changed.emit(event.mimeData); + changed(event.mimeData); } void dragMoveEvent(QDragMoveEvent event)
--- a/examples/opengl/hellogl/glwidget.d Fri Oct 16 05:32:23 2009 +0000 +++ b/examples/opengl/hellogl/glwidget.d Fri Oct 16 12:23:12 2009 +0000 @@ -86,7 +86,7 @@ normalizeAngle(&angle); if (angle != xRot) { xRot = angle; - xRotationChanged.emit(angle); + xRotationChanged(angle); updateGL(); } } @@ -96,7 +96,7 @@ normalizeAngle(&angle); if (angle != yRot) { yRot = angle; - yRotationChanged.emit(angle); + yRotationChanged(angle); updateGL(); } } @@ -106,7 +106,7 @@ normalizeAngle(&angle); if (angle != zRot) { zRot = angle; - zRotationChanged.emit(angle); + zRotationChanged(angle); updateGL(); } }
--- a/examples/opengl/hellogl/glwidget_d1.d Fri Oct 16 05:32:23 2009 +0000 +++ b/examples/opengl/hellogl/glwidget_d1.d Fri Oct 16 12:23:12 2009 +0000 @@ -86,7 +86,7 @@ normalizeAngle(&angle); if (angle != xRot) { xRot = angle; - xRotationChanged.emit(angle); + xRotationChanged(angle); updateGL(); } } @@ -96,7 +96,7 @@ normalizeAngle(&angle); if (angle != yRot) { yRot = angle; - yRotationChanged.emit(angle); + yRotationChanged(angle); updateGL(); } } @@ -106,7 +106,7 @@ normalizeAngle(&angle); if (angle != zRot) { zRot = angle; - zRotationChanged.emit(angle); + zRotationChanged(angle); updateGL(); } }
--- a/generator/dgenerator.cpp Fri Oct 16 05:32:23 2009 +0000 +++ b/generator/dgenerator.cpp Fri Oct 16 12:23:12 2009 +0000 @@ -983,10 +983,10 @@ if (!(d_function->isEmptyFunction() || d_function->isNormal() || d_function->isSignal())) option = Option(option | SkipReturnType); writeFunctionAttributes(s, d_function, included_attributes, excluded_attributes, option); - +/* if(d_function->isSignal()) functionName += "_emit"; - +*/ s << functionName << "("; writeFunctionArguments(s, d_function, argument_count, option); s << ")"; @@ -1771,7 +1771,7 @@ s << endl; } // s << INDENT << "Stdout(\"" << d_class->name() << "\", \"" << signal->name() << "\").newline;" << endl; - s << INDENT << "d_object." << signal->name() << ".emit("; + s << INDENT << "d_object." << signal->name() << "_emit("; for (int j = 0; j<sz; ++j) { AbstractMetaArgument *argument = arguments.at(j); QString arg_name = argument->indexedName(); @@ -2817,7 +2817,7 @@ AbstractMetaArgumentList arguments = d_function->arguments(); int sz = arguments.count(); - s << INDENT << "mixin Signal!(\"" << d_function->name() << "\""; + s << INDENT << "mixin BindQtSignal!(\"" << d_function->name() << "\""; if (sz > 0) { for (int i=0; i<sz; ++i) {
--- a/qt/d1/qt/Signal.d Fri Oct 16 05:32:23 2009 +0000 +++ b/qt/d1/qt/Signal.d Fri Oct 16 12:23:12 2009 +0000 @@ -817,47 +817,6 @@ } } -//TODO: this could be avoided if named mixins didn't suck. -public struct SignalOps(int sigId, A...) -{ - private SignalHandler sh; - enum { signalId = sigId } - - void connect(R, B...)(R function(B) fn, ConnectionFlags flags = ConnectionFlags.None) - { - alias CheckSlot!(typeof(fn), A) check; - auto invoker = Dg(&sh.invokeSlot!(typeof(fn), Fn, A)); - sh.connect(signalId, Fn(fn), invoker, flags); - } - - void connect(R, B...)(R delegate(B) dg, ConnectionFlags flags = ConnectionFlags.None) - { - alias CheckSlot!(typeof(dg), A) check; - auto invoker = Dg(&sh.invokeSlot!(typeof(dg), Dg, A)); - sh.connect(signalId, Dg(dg), invoker, flags); - } - - void disconnect(R, B...)(R function(B) fn) - { - sh.disconnect(signalId, Fn(fn)); - } - - void disconnect(R, B...)(R delegate(B) dg) - { - sh.disconnect(signalId, Dg(dg)); - } - - void emit(A args) - { - sh.emit(signalId, args); - } - - debug size_t slotCount() - { - return sh.slotCount(signalId); - } -} - public template SignalHandlerOps() { static assert (is(typeof(this.signalHandler)), @@ -1096,6 +1055,30 @@ } +public string SignalEmitter(A...)(SignalType signalType, string name, int index) +{ + string fullArgs, args; + static if (A.length) + { + fullArgs = A[0].stringof ~ " a0"; + args = ", a0"; + foreach(i, _; A[1..$]) + { + fullArgs ~= ", " ~ A[i+1].stringof ~ " a" ~ __toString(i+1); + args ~= ", a" ~ __toString(i+1); + } + } + string attribute; + string sigName = name; + if (signalType == SignalType.BindQtSignal) + name ~= "_emit"; + else + attribute = "protected "; + string str = attribute ~ "void " ~ name ~ "(" ~ fullArgs ~ ")" ~ + "{ this.signalHandler.emit(" ~ __toString(index) ~ args ~ "); }"; + return str; +} + /** Examples: ---- @@ -1128,25 +1111,35 @@ } ---- */ -template Signal(string name, A...) + +enum SignalType { - mixin SignalImpl!(0, name, A); + BindQtSignal, + NewSignal } -template SignalImpl(int index, string name, A...) +template BindQtSignal(string name, A...) +{ + mixin SignalImpl!(0, name, SignalType.BindQtSignal, A); +} + +template Signal(string name, A...) +{ + mixin SignalImpl!(0, name, SignalType.NewSignal, A); +} + +template SignalImpl(int index, string name, SignalType signalType, A...) { static if (is(typeof(mixin(typeof(this).stringof ~ ".__signal" ~ ToString!(index))))) - mixin SignalImpl!(index + 1, name, A); + mixin SignalImpl!(index + 1, name, signalType, A); else { // mixed-in once static if (!is(typeof(this.signalHandler))) - { mixin SignalHandlerOps; - } + + mixin (SignalEmitter!(A)(signalType, name, index)); mixin("public alias Tuple!(\"" ~ name ~ "\", index, A) __signal" ~ ToString!(index) ~ ";"); - mixin("SignalOps!(" ~ ToString!(index) ~ ", A) " ~ name ~ "(){ return SignalOps!(" - ~ ToString!(index) ~ ", A)(signalHandler); }"); } }
--- a/qt/d2/qt/Signal.d Fri Oct 16 05:32:23 2009 +0000 +++ b/qt/d2/qt/Signal.d Fri Oct 16 12:23:12 2009 +0000 @@ -781,23 +781,6 @@ } } -//TODO: this could be avoided if named mixins didn't suck. -public struct SignalOps(int sigId, A...) -{ - private SignalHandler sh; - enum { signalId = sigId } - - void emit(A args) - { - sh.emit(signalId, args); - } - - debug size_t slotCount() - { - return sh.slotCount(signalId); - } -} - public template SignalHandlerOps() { static assert (is(typeof(this.signalHandler)), @@ -1023,6 +1006,56 @@ } } +string __toString(long v) +{ + if (v == 0) + return "0"; + + string ret; + + bool neg; + if (v < 0) + { + neg = true; + v = -v; + } + + while (v != 0) + { + ret = cast(char)(v % 10 + '0') ~ ret; + v = cast(long)(v / 10); + } + + if (neg) + ret = "-" ~ ret; + + return ret; +} + +public string SignalEmitter(A...)(SignalType signalType, string name, int index) +{ + string fullArgs, args; + static if (A.length) + { + fullArgs = A[0].stringof ~ " a0"; + args = ", a0"; + foreach(i, _; A[1..$]) + { + fullArgs ~= ", " ~ A[i+1].stringof ~ " a" ~ __toString(i+1); + args ~= ", a" ~ __toString(i+1); + } + } + string attribute; + string sigName = name; + if (signalType == SignalType.BindQtSignal) + name ~= "_emit"; + else + attribute = "protected "; + string str = attribute ~ "void " ~ name ~ "(" ~ fullArgs ~ ")" ~ + "{ this.signalHandler.emit(" ~ __toString(index) ~ args ~ "); }"; + return str; +} + /** ---------------- */ @@ -1058,25 +1091,35 @@ } ---- */ -template Signal(string name, A...) + +enum SignalType { - mixin SignalImpl!(0, name, A); + BindQtSignal, + NewSignal } -template SignalImpl(int index, string name, A...) +template BindQtSignal(string name, A...) +{ + mixin SignalImpl!(0, name, SignalType.BindQtSignal, A); +} + +template Signal(string name, A...) +{ + mixin SignalImpl!(0, name, SignalType.NewSignal, A); +} + +template SignalImpl(int index, string name, SignalType signalType, A...) { static if (is(typeof(mixin(typeof(this).stringof ~ ".__signal" ~ ToString!(index))))) - mixin SignalImpl!(index + 1, name, A); + mixin SignalImpl!(index + 1, name, signalType, A); else { // mixed-in once static if (!is(typeof(this.signalHandler))) - { mixin SignalHandlerOps; - } + + mixin (SignalEmitter!(A)(signalType, name, index)); mixin("public alias TypeTuple!(\"" ~ name ~ "\", index, A) __signal" ~ ToString!(index) ~ ";"); - mixin("SignalOps!(" ~ ToString!(index) ~ ", A) " ~ name ~ "(){ return SignalOps!(" - ~ ToString!(index) ~ ", A)(signalHandler); }"); } }