From b5d0c13836806cc9cff64ccbc5599b36e6135b83 Mon Sep 17 00:00:00 2001
From: mescalinum <mescalinum@users.sourceforge.net>
Date: Sat, 26 Sep 2009 21:51:30 +0000
Subject: add unimplemented features (copy & resize pattern)

svn path=/trunk/externals/ffext/; revision=12467
---
 composer/PdClasses.cpp | 39 ++++++++++++++++++++++++++++++++++-----
 composer/Track.cpp     | 18 +++++++++++++++++-
 composer/Track.hpp     |  2 ++
 3 files changed, 53 insertions(+), 6 deletions(-)

(limited to 'composer')

diff --git a/composer/PdClasses.cpp b/composer/PdClasses.cpp
index 75f05a0..7ea37a0 100644
--- a/composer/PdClasses.cpp
+++ b/composer/PdClasses.cpp
@@ -334,6 +334,12 @@ int track_proxy_addpattern(t_track_proxy *x, t_symbol *name, t_floatarg rows, t_
     result_argc = 0;
     t_int r = (t_int) rows;
     t_int c = (t_int) cols;
+    Pattern *pattern = x->track->getPattern(name->s_name);
+    if(pattern)
+    {
+        pd_error(x, "addpattern: pattern already exist: %s", name->s_name);
+        return -3;
+    }
     x->track->addPattern(r, c, string(name->s_name));
     return 0;
 }
@@ -347,8 +353,8 @@ int track_proxy_removepattern(t_track_proxy *x, t_symbol *pat)
         pd_error(x, "removepattern: no such pattern: %s", pat->s_name);
         return -2;
     }
-    pd_error(x, "removepattern: not implemented yet");
-    return -9;
+    x->track->removePattern(pat->s_name);
+    return 0;
 }
 
 int track_proxy_resizepattern(t_track_proxy *x, t_symbol *pat, t_floatarg rows, t_floatarg cols)
@@ -362,6 +368,11 @@ int track_proxy_resizepattern(t_track_proxy *x, t_symbol *pat, t_floatarg rows,
         pd_error(x, "resizepattern: no such pattern: %s", pat->s_name);
         return -2;
     }
+    if(rows < 1 || cols < 1)
+    {
+        pd_error(x, "resizepattern: rows and columns must be positive");
+        return -6;
+    }
     pattern->resize(r, c);
     return 0;
 }
@@ -372,9 +383,15 @@ int track_proxy_renamepattern(t_track_proxy *x, t_symbol *oldName, t_symbol *new
     Pattern *pattern = x->track->getPattern(oldName->s_name);
     if(!pattern)
     {
-        pd_error(x, "resizepattern: no such pattern: %s", oldName->s_name);
+        pd_error(x, "renamepattern: no such pattern: %s", oldName->s_name);
         return -2;
     }
+    pattern = x->track->getPattern(newName->s_name);
+    if(pattern)
+    {
+        pd_error(x, "renamepattern: destination pattern already exist: %s", newName->s_name);
+        return -3;
+    }
     x->track->renamePattern(oldName->s_name, newName->s_name);
     return 0;
 }
@@ -382,8 +399,20 @@ int track_proxy_renamepattern(t_track_proxy *x, t_symbol *oldName, t_symbol *new
 int track_proxy_copypattern(t_track_proxy *x, t_symbol *src, t_symbol *dst)
 {
     result_argc = 0;
-    pd_error(x, "copypattern: not implemented yet");
-    return -9;
+    Pattern *pattern = x->track->getPattern(src->s_name);
+    if(!pattern)
+    {
+        pd_error(x, "copypattern: no such pattern: %s", src->s_name);
+        return -2;
+    }
+    pattern = x->track->getPattern(dst->s_name);
+    if(pattern)
+    {
+        pd_error(x, "copypattern: destination pattern already exist: %s", dst->s_name);
+        return -3;
+    }
+    x->track->copyPattern(src->s_name, dst->s_name);
+    return 0;
 }
 
 void composer_setup()
diff --git a/composer/Track.cpp b/composer/Track.cpp
index ae02ed5..d0ed4de 100644
--- a/composer/Track.cpp
+++ b/composer/Track.cpp
@@ -53,7 +53,23 @@ void Track::renamePattern(const string &oldName, const string &newName)
 {
     Pattern *pattern = getPattern(oldName);
     if(!pattern) return;
-    pattern->setName(newName);
     patterns[newName] = patterns[oldName];
+    patterns[newName]->setName(newName);
     patterns.erase(oldName);
 }
+
+void Track::copyPattern(const string &src, const string &dst)
+{
+    Pattern *pattern = getPattern(src);
+    if(!pattern) return;
+    patterns[dst] = new Pattern(*patterns[src]);
+    patterns[dst]->setName(dst);
+}
+
+void Track::removePattern(const string &p)
+{
+    Pattern *pattern = getPattern(p);
+    if(!pattern) return;
+    patterns.erase(p);
+}
+
diff --git a/composer/Track.hpp b/composer/Track.hpp
index a4e7fbc..35113e0 100644
--- a/composer/Track.hpp
+++ b/composer/Track.hpp
@@ -27,6 +27,8 @@ public:
 	void addPattern(int rows, int cols, string name);
     Pattern *getPattern(const string &p);
     void renamePattern(const string &oldName, const string &newName);
+    void copyPattern(const string &src, const string &dst);
+    void removePattern(const string &p);
 	inline unsigned int getPatternCount() {return patterns.size();}
     inline map<string,Pattern *>::iterator patternsBegin() {return patterns.begin();}
     inline map<string,Pattern *>::iterator patternsEnd() {return patterns.end();}
-- 
cgit v1.2.1