Mussa aligned sequence view seems to work
[mussa.git] / qui / MussaAlignedWindow.cpp
index e54f099cef78a941739ab46d354ac687c066fda4..e3735bd2282245a0a6d7313a23cf7f33ea747bf5 100644 (file)
@@ -2,7 +2,9 @@
 #include <vector>
 #include <sstream>
 
-#include <QVBoxLayout>
+#include <QStatusBar>
+#include <QString>
+#include <QMenuBar>
 
 #include "qui/MussaAlignedWindow.hpp"
 #include "alg/sequence.hpp"
@@ -12,25 +14,25 @@ using namespace std;
 MussaAlignedWindow::MussaAlignedWindow(Mussa& m, 
                                        const set<int>& sel_paths, 
                                        QWidget *parent)
-  : QWidget(parent),
-    analysis(m)//,
-    //selected_paths(sel_paths)
-    
+  : QMainWindow(parent),
+    analysis(m),
+    pick_align_menu(tr("Choose Alignment")),
+    view_align_menu(tr("View Alignment"))
 {
   browser.setSequences(analysis.sequences(), analysis.colorMapper());
   setSelectedPaths(m, sel_paths);
   setAlignment(0);
   browser.zoomToSequence();
   computeMatchLines();
+  setupMenus();
 
-  QVBoxLayout *layout = new QVBoxLayout;
-  layout->addWidget(&browser);
-  layout->addWidget(&status);
-  setLayout(layout);
+  setCentralWidget(&browser);
+  menuBar()->addMenu(&pick_align_menu);
+  menuBar()->addMenu(&view_align_menu);
 
   ostringstream message;
   message << "Selected " << selected_paths.size() << " paths";
-  status.showMessage(message.str().c_str(), 5000);
+  statusBar()->showMessage(message.str().c_str(), 5000);
 }
 
 
@@ -44,13 +46,14 @@ void MussaAlignedWindow::setSelectedPaths(Mussa &m, const set<int>& sel_paths)
   size_t pathid=0;
 
   selected_paths.reserve(sel_paths.size());
+  view_paths.reserve(sel_paths.size());
   while (pathid != path_size and sel_i != sel_paths.end())
   {
     assert (*sel_i >= 0);
     size_t sel_pathid = (size_t)(*sel_i);
     if (pathid == sel_pathid) {
-      cout << "found one " << *path_i << endl;
       selected_paths.push_back(*path_i);
+      view_paths.push_back(true);
       ++pathid;
       ++path_i;
       ++sel_i;
@@ -63,13 +66,59 @@ void MussaAlignedWindow::setSelectedPaths(Mussa &m, const set<int>& sel_paths)
   }
 }
 
+void MussaAlignedWindow::setupMenus()
+{
+  pick_align_menu.clear();
+  view_align_menu.clear();
+  pick_actions.clear();
+  view_actions.clear();
+
+  for(vector<ExtendedConservedPath >::iterator pathz_i=selected_paths.begin(); 
+      pathz_i != selected_paths.end(); 
+      ++pathz_i)
+  {
+    ConservedPath::path_type normalized_path = pathz_i->normalizedIndexes();
+    ostringstream menu_text;
+    menu_text << pathz_i->window_size << ":";
+    ConservedPath::iterator element_i = normalized_path.begin();
+    menu_text << *element_i++;
+    for (;
+         element_i != normalized_path.end();
+         ++element_i)
+    {
+      menu_text << ", ";
+      menu_text << *element_i;
+    }
+    int index = pathz_i - selected_paths.begin();
+    IntAction *pick = new IntAction(QString(menu_text.str().c_str()), index, this);
+    connect(pick, SIGNAL(triggered(int)), this, SLOT(setAlignment(size_t)));
+    pick_actions.push_back(pick);
+    pick_align_menu.addAction(pick);
+    IntAction *view = new IntAction(QString(menu_text.str().c_str()), index, this);
+    connect(view, SIGNAL(triggered(int)), this, SLOT(toggleViewAlignment(size_t)));
+    view->setCheckable(true);
+    view->setChecked(true);
+    view_actions.push_back(view);
+    view_align_menu.addAction(view);
+  }
+}
+
 void MussaAlignedWindow::setAlignment(size_t alignment_index)
 {
   if (selected_paths.size() > 0) {
-    browser.centerOnPath(selected_paths[alignment_index].track_indexes);
+    browser.centerOnPath(selected_paths[alignment_index].normalizedIndexes());
   }
 }
 
+void MussaAlignedWindow::toggleViewAlignment(size_t alignment_index)
+{
+  view_paths[alignment_index]= not view_paths[alignment_index]; 
+  // perhaps it'd be better if we could erase specific sets
+  // of matches instead of erasing them all and recomputing them all
+  // but this is easier
+  computeMatchLines();
+}
+
 void MussaAlignedWindow::computeMatchLines()
 {
   const vector<Sequence>& raw_sequence = analysis.sequences();
@@ -85,12 +134,13 @@ void MussaAlignedWindow::computeMatchLines()
   vector<bool> matched;
   int align_counter;
 
+  browser.clear_links();
   align_counter = 0;
   for(vector<ExtendedConservedPath >::iterator pathz_i=selected_paths.begin(); 
       pathz_i != selected_paths.end(); 
       ++pathz_i)
   {
-    if (true /* show_aligns[align_counter] */)
+    if (view_paths[align_counter])
     {
       ExtendedConservedPath& a_path = *pathz_i;
       window_length = a_path.window_size;