#include <vector>
#include <sstream>
-#include <QVBoxLayout>
+#include <QStatusBar>
+#include <QString>
+#include <QMenuBar>
#include "qui/MussaAlignedWindow.hpp"
#include "alg/sequence.hpp"
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);
}
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;
}
}
+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();
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;