Synonyms: connect/disconnect for events to get closer to PyQt5

This commit is contained in:
Matthias Koefferlein 2023-03-06 23:04:55 +01:00
parent 1b3e8e14c5
commit 9cfc284b8c
4 changed files with 97 additions and 2 deletions

View File

@ -627,7 +627,9 @@ PYASignal::make_class (PyObject *module)
static PyMethodDef signal_methods[] = {
{"add", (PyCFunction) &pya_signal_add, METH_VARARGS, "internal signal proxy object: += operator" },
{"connect", (PyCFunction) &pya_signal_add, METH_VARARGS, "synonym to 'add' or '+='" },
{"remove", (PyCFunction) &pya_signal_remove, METH_VARARGS, "internal signal proxy object: -= operator" },
{"disconnect", (PyCFunction) &pya_signal_remove, METH_VARARGS, "synonym to 'remove' or '-='" },
{"set", (PyCFunction) &pya_signal_set, METH_VARARGS, "internal signal proxy object: assignment" },
{"clear", (PyCFunction) &pya_signal_clear, METH_NOARGS, "internal signal proxy object: clears all receivers" },
{NULL, NULL},

View File

@ -811,7 +811,11 @@ SignalHandler::define_class (VALUE module, const char *name)
rb_define_method (klass, "set", (ruby_func) &SignalHandler::static_assign, 1);
rb_define_method (klass, "clear", (ruby_func) &SignalHandler::static_clear, 0);
rb_define_method (klass, "+", (ruby_func) &SignalHandler::static_add, 1);
rb_define_method (klass, "add", (ruby_func) &SignalHandler::static_add, 1);
rb_define_method (klass, "connect", (ruby_func) &SignalHandler::static_add, 1);
rb_define_method (klass, "-", (ruby_func) &SignalHandler::static_remove, 1);
rb_define_method (klass, "remove", (ruby_func) &SignalHandler::static_remove, 1);
rb_define_method (klass, "disconnect", (ruby_func) &SignalHandler::static_remove, 1);
}
void SignalHandler::call (const gsi::MethodBase *meth, gsi::SerialArgs &args, gsi::SerialArgs &ret) const

View File

@ -1400,10 +1400,55 @@ class BasicTest(unittest.TestCase):
def f4():
n[0] = n[0] + 2
n[0] = 0
e.e0(f4)
e.s1()
self.assertEqual( 4, n[0] )
self.assertEqual( 2, n[0] )
# remove event handler -> no events triggered anymore
n[0] = 0
e.e0 -= f4
e.s1()
self.assertEqual( 0, n[0] )
# adding again will re-activate it
e.e0 += f4
n[0] = 0
e.s1()
self.assertEqual( 2, n[0] )
# two events at once
def f5():
n[0] = n[0] + 10
n[0] = 0
e.e0 += f5
e.s1()
self.assertEqual( 12, n[0] )
# clearing events
e.e0.clear()
e.s1()
n[0] = 0
self.assertEqual( 0, n[0] )
# synonyms: add, connect
e.e0.add(f4)
e.e0.connect(f5)
n[0] = 0
e.s1()
self.assertEqual( 12, n[0] )
# synonyms: remove, disconnect
e.e0.disconnect(f4)
n[0] = 0
e.s1()
self.assertEqual( 10, n[0] )
n[0] = 0
e.e0.remove(f5)
e.s1()
self.assertEqual( 0, n[0] )
# another signal
e.s2()
self.assertEqual( 100, n[1] )
e.m = 1

View File

@ -1325,11 +1325,55 @@ class Basic_TestClass < TestBase
assert_equal( 2, n0 )
# using lambda
n0 = 0
p = lambda { n0 += 2 }
e.e0(&p)
e.s1
assert_equal( 4, n0 )
assert_equal( 2, n0 )
# remove event handler -> no events triggered anymore
n0 = 0
e.e0 -= p
e.s1
assert_equal( 0, n0 )
# adding again will re-activate it
e.e0 += p
n0 = 0
e.s1
assert_equal( 2, n0 )
# two events at once
pp = lambda { n0 += 10 }
n0 = 0
e.e0 += pp
e.s1
assert_equal( 12, n0 )
# clearing events
e.e0.clear
e.s1
n0 = 0
assert_equal( 0, n0 )
# synonyms: add, connect
e.e0.add(p)
e.e0.connect(pp)
n0 = 0
e.s1
assert_equal( 12, n0 )
# synonyms: remove, disconnect
e.e0.disconnect(p)
n0 = 0
e.s1
assert_equal( 10, n0 )
n0 = 0
e.e0.remove(pp)
e.s1
assert_equal( 0, n0 )
# another signal
e.s2
assert_equal( 100, n1 )
e.m = 1