[PD-cvs] SF.net SVN: pure-data:[10667] trunk/externals/iem/iemguts/src/canvasselect. c

zmoelnig at users.sourceforge.net zmoelnig at users.sourceforge.net
Wed Jan 28 18:16:28 CET 2009


Revision: 10667
          http://pure-data.svn.sourceforge.net/pure-data/?rev=10667&view=rev
Author:   zmoelnig
Date:     2009-01-28 17:16:28 +0000 (Wed, 28 Jan 2009)

Log Message:
-----------
an object to de/select objects on the parent; 
it also adds messages to the canvas to do so

Added Paths:
-----------
    trunk/externals/iem/iemguts/src/canvasselect.c

Added: trunk/externals/iem/iemguts/src/canvasselect.c
===================================================================
--- trunk/externals/iem/iemguts/src/canvasselect.c	                        (rev 0)
+++ trunk/externals/iem/iemguts/src/canvasselect.c	2009-01-28 17:16:28 UTC (rev 10667)
@@ -0,0 +1,227 @@
+
+/******************************************************
+ *
+ * canvasselect - implementation file
+ *
+ * copyleft (c) IOhannes m zm\xF6lnig
+ *
+ *   2007:forum::f\xFCr::uml\xE4ute:2007
+ *
+ *   institute of electronic music and acoustics (iem)
+ *
+ ******************************************************
+ *
+ * license: GNU General Public License v.2
+ *
+ ******************************************************/
+
+
+/* 
+ * this object allows to select other objects on the canvas
+ * it also allows to query the selection of the canvas
+ * 
+ * it also adds a "select" message to the canvas
+ */
+
+#include "m_pd.h"
+
+#include "g_canvas.h"
+
+/* ------------------------- canvasselect ---------------------------- */
+
+static t_class *canvasselect_class;
+
+typedef struct _canvasselect
+{
+  t_object  x_obj;
+
+  t_canvas*x_canvas;
+} t_canvasselect;
+
+static void canvasselect_bang(t_canvasselect *x)
+{
+  /* get the selection of the canvas */
+
+  
+
+}
+
+
+static int canvasselect_doselect(t_glist*glist, int index)
+{
+  t_gobj*obj=NULL;
+  int i=index;
+  if(NULL==glist) {
+    return -1;
+  }
+  if(i<0) {
+    return -1;
+  }
+
+  obj=glist->gl_list;
+
+  while(i-- && obj) {
+    obj=obj->g_next;
+  }
+
+  if(obj)
+    glist_select(glist, obj);
+  else {
+    return -1;
+  }
+
+  return index;
+}
+
+static void canvasselect_select(t_canvasselect*x, t_floatarg f)
+{
+  t_glist*glist=x->x_canvas;
+  int i=f;
+  if(canvasselect_doselect(x->x_canvas, i)<0) {
+    pd_error(x, "invalid selection %d", i);
+  }
+}
+
+static void canvasselect_selectall(t_canvasselect*x)
+{
+  t_glist*glist=x->x_canvas;
+  if(glist)glist_selectall(glist);
+}
+
+static void canvasselect_select_cb(t_canvasselect*x, t_symbol*s, int argc, t_atom*argv)
+{
+  if(argc) {
+    while(argc--){
+      canvasselect_select(x, atom_getint(argv++));
+    }
+  } else {
+    canvasselect_selectall(x);
+  }
+}
+
+
+
+static int canvasselect_dodeselect(t_glist*glist, int index)
+{
+  t_gobj*obj=NULL;
+  int i=index;
+  if(NULL==glist) {
+    return -1;
+  }
+  if(i<0) {
+    return -1;
+  }
+
+  obj=glist->gl_list;
+
+  while(i-- && obj) {
+    obj=obj->g_next;
+  }
+
+  if(obj) {
+    if(glist_isselected(glist, obj)) {
+      glist_deselect(glist, obj);
+    }  else  return index;
+  } else {
+    return -1;
+  }
+
+  return index;
+}
+
+static void canvasselect_deselect(t_canvasselect*x, t_floatarg f)
+{
+  t_glist*glist=x->x_canvas;
+  int i=f;
+  if(canvasselect_dodeselect(x->x_canvas, i)<0) {
+    pd_error(x, "invalid deselection %d", i);
+  }
+}
+
+static void canvasselect_deselectall(t_canvasselect*x)
+{
+  if(NULL==x->x_canvas) {
+    return;
+  }
+
+  glist_noselect((t_glist*)x->x_canvas);
+}
+
+
+static void canvasselect_deselect_cb(t_canvasselect*x, t_symbol*s, int argc, t_atom*argv)
+{
+  if(argc) {
+    while(argc--){
+      canvasselect_deselect(x, atom_getint(argv++));
+    }
+  } else {
+    canvasselect_deselectall(x);
+  }
+}
+
+static void *canvasselect_new(t_floatarg f)
+{
+  t_canvasselect *x = (t_canvasselect *)pd_new(canvasselect_class);
+  t_glist *glist=(t_glist *)canvas_getcurrent();
+  t_canvas *canvas=(t_canvas*)glist_getcanvas(glist);
+  int depth=(int)f;
+  
+  if(depth<0)depth=0;
+
+  while(depth && canvas) {
+    canvas=canvas->gl_owner;
+    depth--;
+  }
+
+  x->x_canvas = canvas;
+
+  return (x);
+}
+
+static void canvasselect_free(t_canvasselect*x)
+{
+
+}
+
+static void canvas_select_cb(t_canvas*x, t_float f)
+{
+  canvasselect_doselect(x, f);
+}
+static void canvas_selectall_cb(t_canvas*x)
+{
+  t_glist*glist=x;
+  if(glist)glist_selectall(glist);
+}
+
+static void canvas_deselect_cb(t_canvas*x, t_float f)
+{
+  canvasselect_dodeselect(x, f);
+}
+static void canvas_deselectall_cb(t_canvas*x)
+{
+  t_glist*glist=x;
+  if(glist)glist_noselect(glist);
+}
+static void register_methods(void)
+{
+  if(NULL==canvas_class)return;
+  /* check whether we already have this function: zgetfn(canvasclass, gensym("select")) */
+  if(NULL==zgetfn(&canvas_class, gensym("select"))) class_addmethod(canvas_class, (t_method)canvas_select_cb, gensym("select"), A_FLOAT, 0);
+  if(NULL==zgetfn(&canvas_class, gensym("selectall"))) class_addmethod(canvas_class, (t_method)canvas_selectall_cb, gensym("selectall"), 0);
+  if(NULL==zgetfn(&canvas_class, gensym("deselect"))) class_addmethod(canvas_class, (t_method)canvas_deselect_cb, gensym("deselect"), A_FLOAT, 0);
+  if(NULL==zgetfn(&canvas_class, gensym("deselectall"))) class_addmethod(canvas_class, (t_method)canvas_deselectall_cb, gensym("deselectall"), 0);
+}
+
+
+void canvasselect_setup(void)
+{
+  canvasselect_class = class_new(gensym("canvasselect"), 
+                                 (t_newmethod)canvasselect_new, (t_method)canvasselect_free, 
+                                 sizeof(t_canvasselect), 0,
+                                 A_DEFFLOAT, 0);
+  class_addbang(canvasselect_class, (t_method)canvasselect_bang);
+  class_addmethod(canvasselect_class, (t_method)canvasselect_select_cb, gensym("select"), A_GIMME, 0);
+  class_addmethod(canvasselect_class, (t_method)canvasselect_deselect_cb, gensym("deselect"), A_GIMME, 0);
+
+  register_methods();
+}


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Pd-cvs mailing list