provide a user interface to edit motifs
[mussa.git] / qui / motif_editor / MotifEditor.cpp
diff --git a/qui/motif_editor/MotifEditor.cpp b/qui/motif_editor/MotifEditor.cpp
new file mode 100644 (file)
index 0000000..c1df29e
--- /dev/null
@@ -0,0 +1,68 @@
+#include "qui/motif_editor/MotifEditor.hpp"
+#include "alg/sequence.hpp"
+
+#include <set>
+#include <string>
+
+using namespace std;
+
+MotifEditor::MotifEditor(Mussa *m, QWidget *parent)
+  : QWidget(parent),
+    analysis(m),
+    applyButton("set motifs")
+{
+  assert (m != 0);
+  const set<string> &motif = analysis->motifs();
+  vector<string> motif_seq(motif.begin(), motif.end());
+
+  connect(&applyButton, SIGNAL(clicked()), this, SLOT(updateMotifs()));
+  layout.addWidget(&applyButton);
+
+  for(size_t i=0; i != 10; ++i)
+  {
+    MotifDetail *detail = new MotifDetail;
+    if (i < motif_seq.size()) {
+      detail->setMotif(motif_seq[i]);
+      detail->setColor(analysis->colorMapper().lookup("motif", motif_seq[i]));
+    }
+    motif_details.push_back(detail);
+    layout.addWidget(detail);
+  }
+  setLayout(&layout);
+}
+
+MotifEditor::MotifEditor(const MotifEditor& me)
+  : QWidget((QWidget*)me.parent()),
+    analysis(me.analysis),
+    applyButton(me.applyButton.text())
+{
+}
+
+void MotifEditor::updateMotifs()
+{
+  // This function is _sooo_ not thread safe
+  // erase motifs
+  Color motif_default = analysis->colorMapper().typeColor("motif");
+  analysis->colorMapper().erase("motif");
+  analysis->colorMapper().appendTypeColor("motif", motif_default);
+
+  // add our motifs back
+  vector<string> motifs;
+  vector<Color> colors;
+
+  for(std::vector<MotifDetail *>::iterator md_i =  motif_details.begin();
+      md_i != motif_details.end();
+      ++md_i)
+  {
+    if ((*md_i)->motif().size() > 0) {
+      motifs.push_back((*md_i)->motif());
+      colors.push_back((*md_i)->color());
+    }
+  }
+  analysis->add_motifs(motifs, colors);
+
+  emit changedMotifs();
+}
+
+//MotifEditor::
+