Allow MussaAlignedWindows to create subanalyses
[mussa.git] / qui / MussaAlignedWindow.cpp
index 65e3d7bf27df26328a92692ab7efbb2ecc1055e8..4c917c45da40a8d653d72aba3c3d00b3695e7638 100644 (file)
@@ -14,9 +14,11 @@ using namespace std;
 
 MussaAlignedWindow::MussaAlignedWindow(MussaRef m, 
                                        const set<int>& sel_paths,
+                                       SubanalysisWindowRef window, 
                                        QWidget *parent)
   : QMainWindow(parent),
     analysis(m),
+    subanalysis_window(window),
     pick_align_menu(tr("Choose Alignment")),
     view_align_menu(tr("View Alignment")),
     zoom(0),
@@ -50,6 +52,11 @@ MussaAlignedWindow::MussaAlignedWindow(MussaRef m,
 
 void MussaAlignedWindow::setupActions()
 {
+  // more cut-n-paste from MussaWindow
+  createSubAnalysisAction = new QAction(tr("Add to Subanalysis"), this);
+  connect(createSubAnalysisAction, SIGNAL(triggered()), 
+          this, SLOT(createSubAnalysis()));
+            
   //Save pixel map action
   saveBrowserPixmapAction = new QAction(tr("Save to image..."), this);
   connect(saveBrowserPixmapAction, (SIGNAL(triggered())),
@@ -64,6 +71,13 @@ void MussaAlignedWindow::setupMenus()
 
   newMenu = menuBar()->addMenu(tr("&Edit"));
   newMenu->addAction(browser.getCopySelectedSequenceAsFastaAction());
+  newMenu->addAction(createSubAnalysisAction);
+  
+  // add some extra features to the context menu
+  QMenu *popupMenu = browser.getPopupMenu();
+  if (popupMenu) {
+    popupMenu->addAction(createSubAnalysisAction);
+  }  
 }
 
 void MussaAlignedWindow::setupAlignmentMenus()
@@ -137,6 +151,25 @@ void MussaAlignedWindow::setSelectedPaths(MussaRef m, const set<int>& sel_paths)
   }
 }
 
+// FIXME: this is a cut-n-paste from MussaWindow, perhaps they should be refactored to
+// some shared place
+void MussaAlignedWindow::createSubAnalysis()
+{
+  list<SequenceLocation> result;
+  SequenceLocationModel& model = subanalysis_window->getModel();
+  browser.copySelectedTracksAsSeqLocation(result);
+  for(list<SequenceLocation>::iterator result_itor = result.begin();
+      result_itor != result.end();
+      ++result_itor)
+  {
+    model.push_back(*result_itor);
+  }
+
+  if (not subanalysis_window->isVisible()) {
+    subanalysis_window->show();
+  }
+}
+
 void MussaAlignedWindow::setAlignment(int alignment_index)
 {
   if (selected_paths.size() > 0) {