aboutsummaryrefslogtreecommitdiff
path: root/externals/grill/flext/tutorial/attr3/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'externals/grill/flext/tutorial/attr3/main.cpp')
-rw-r--r--externals/grill/flext/tutorial/attr3/main.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/externals/grill/flext/tutorial/attr3/main.cpp b/externals/grill/flext/tutorial/attr3/main.cpp
new file mode 100644
index 00000000..835c2881
--- /dev/null
+++ b/externals/grill/flext/tutorial/attr3/main.cpp
@@ -0,0 +1,163 @@
+/*
+flext tutorial - attributes 3
+
+Copyright (c) 2002 Thomas Grill (xovo@gmx.net)
+For information on usage and redistribution, and for a DISCLAIMER OF ALL
+WARRANTIES, see the file, "license.txt," in this distribution.
+
+-------------------------------------------------------------------------
+
+This is tutorial example "advanced 3" with the usage of attributes.
+
+*/
+
+// IMPORTANT: enable attribute processing (specify before inclusion of flext headers!)
+// For clarity, this is done here, but you'd better specify it as a compiler definition
+// FLEXT_ATTRIBUTES must be 0 or 1,
+#define FLEXT_ATTRIBUTES 1
+
+// include flext header
+#include <flext.h>
+
+// check for appropriate flext version
+#if !defined(FLEXT_VERSION) || (FLEXT_VERSION < 401)
+#error You need at least flext version 0.4.1
+#endif
+
+class attr3:
+ public flext_base
+{
+ FLEXT_HEADER_S(attr3,flext_base,setup)
+
+public:
+ // constructor with no arguments
+ attr3(int argc,t_atom *argv):
+ i_step(1)
+ {
+ // --- initialize bounds and step size ---
+ int f1 = 0,f2 = 0;
+ switch(argc) {
+ default:
+ case 3:
+ i_step = GetInt(argv[2]);
+ case 2:
+ f2 = GetInt(argv[1]);
+ case 1:
+ f1 = GetInt(argv[0]);
+ case 0:
+ ;
+ }
+ if(argc < 2) f2 = f1;
+
+ m_bound(f1,f2);
+
+ i_count = i_down;
+
+ // --- define inlets and outlets ---
+ AddInAnything(); // default inlet
+ AddInList(); // inlet for bounds
+ AddInInt(); // inlet for step size
+
+ AddOutInt(); // outlet for integer count
+ AddOutBang(); // outlet for bang
+ }
+
+protected:
+
+ void m_reset() { i_count = i_down; }
+
+ void m_set(int argc,t_atom *argv)
+ {
+ i_count = argc?GetAInt(argv[0]):0;
+ }
+
+ void m_bang()
+ {
+ int f = i_count;
+ i_count += i_step;
+ if(i_down != i_up) {
+ if((i_step > 0) && (i_count > i_up)) {
+ i_count = i_down;
+ ToOutBang(1);
+ }
+ else if(i_count < i_down) {
+ i_count = i_up;
+ ToOutBang(1);
+ }
+ }
+ ToOutInt(0,f);
+ }
+
+ void m_bound(int f1,int f2)
+ {
+ i_down = f1 < f2?f1:f2;
+ i_up = f1 > f2?f1:f2;
+ }
+
+ void m_step(int s) { i_step = s; }
+
+ int i_count,i_down,i_up,i_step;
+
+ // setter method of bounds variables
+ void ms_bound(const AtomList &l)
+ {
+ if(l.Count() == 2 && CanbeInt(l[0]) && CanbeInt(l[1]))
+ // if it is a two element integer list use m_bound method
+ m_bound(GetAInt(l[0]),GetAInt(l[1]));
+ else
+ // else post a warning
+ post("%s - bound needs to integer parameters",thisName());
+ }
+
+ // getter method of bounds variables
+ void mg_bound(AtomList &l) const
+ {
+ l(2); // initialize two element list
+ SetInt(l[0],i_down); // set first element
+ SetInt(l[1],i_up); // set second element
+ }
+
+private:
+
+ static void setup(t_class *c)
+ {
+ // --- set up methods (class scope) ---
+
+ // register a bang method to the default inlet (0)
+ FLEXT_CADDBANG(c,0,m_bang);
+
+ // set up tagged methods for the default inlet (0)
+ FLEXT_CADDMETHOD_(c,0,"reset",m_reset);
+ FLEXT_CADDMETHOD_(c,0,"set",m_set);
+
+ // set up methods for inlets 1 and 2
+ // no message tag used
+ FLEXT_CADDMETHOD(c,1,m_bound); // variable arg type recognized automatically
+ FLEXT_CADDMETHOD(c,2,m_step); // single int arg also recognized automatically
+
+ // --- set up attributes (class scope) ---
+
+ FLEXT_CADDATTR_VAR1(c,"count",i_count);
+ FLEXT_CADDATTR_VAR1(c,"step",i_step);
+
+ FLEXT_CADDATTR_VAR(c,"bound",mg_bound,ms_bound);
+ }
+
+ // normal method callbacks for bang and reset
+ FLEXT_CALLBACK(m_bang)
+ FLEXT_CALLBACK(m_reset)
+
+ FLEXT_CALLBACK_V(m_set) // normal method wrapper for m_set
+ FLEXT_ATTRVAR_I(i_count) // wrapper function for integer variable i_count
+
+ FLEXT_CALLBACK_II(m_bound) // normal method wrapper for m_bound
+ FLEXT_CALLVAR_V(mg_bound,ms_bound) // getter and setter method of bounds
+
+ FLEXT_CALLBACK_I(m_step) // normal method wrapper for m_step
+ FLEXT_ATTRVAR_I(i_step) // wrapper function for integer variable i_step
+};
+
+// instantiate the class (constructor has a variable argument list)
+FLEXT_NEW_V("attr3",attr3)
+
+