Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!

Обработка сигналов (событий) от виджетовНа один «Listener» можно навесить только один обработчик? А если захочется парадигмы сигналов-слотов как в Qt «многие ко многим» и с передачей каких-либо аргументов? Придётся делать обработчик-прокси и пихать в него всю логику?
button.onClickListener, разве не было бы проще и лаконичнее что-то вроде button.clicked?objectName/object_name/..., а именование атрибутов в принципе. В Qt тоже используется objectName конвенция, но имена там обычно проще и менее громоздкие.isClicked. :)import dlangui.core.signals;
interface SomeInterface {
bool someMethod(string s, int n);
}
class Foo : SomeInterface {
override bool someMethod(string s, int n) {
writeln("someMethod called ", s, ", ", n);
return n > 10; // can return value
}
}
// Listener! can hold arbitrary number of connected slots
// declare using list of return value and parameter types
Listener!(bool, string, n) signal1;
Foo f = new Foo();
// when signal is defined as type list, you can use delegate
signal1 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
// or method reference
signal1 = &f.someMethod;
// declare using interface with single method
Listener!SomeInterface signal2;
// you still can use any delegate
signal2 = bool delegate(string s, int n) { writeln("inside delegate - ", s, n); return false; }
// but for class method which overrides interface method, you can use simple syntax
signal2 = f; // it will automatically take &f.someMethod
// call listener(s) either by opcall or explicit emit
signal1("text", 1);
signal1.emit("text", 2);
signal2.emit("text", 3);
// check if any slit is connected
if (signal1.assigned)
writeln("has listeners");
// Signal! can hold arbitrary number of connected slots
// declare using list of return value and parameter types
Signal!(bool, string, n) signal3;
// add listeners via connect call
signal3.connect(bool delegate(string, int) { return false; });
// or via ~= operator
signal3 ~= bool delegate(string, int) { return false; };
// declare using interface with single method
Signal!SomeInterface signal4;
// you can connect several slots to signal
signal4 ~= f;
signal4 ~= bool delegate(string, int) { return true; }
// calling of listeners of Signal! is similar to Listener!
// using opCall
bool res = signal4("blah", 5);
// call listeners using emit
bool res = signal4.emit("blah", 5);
// you can disconnect individual slots
// using disconnect()
signal4.disconnect(f);
// or -= operator
signal4 -= f;
" alt=«image»/>
DlangUI — кросплатформенный GUI для D (Часть 1)