It appears to me that Qt seems to like UI widgets that are attached to
it to be pointers as it'll sometimes handle freeing said pointer, which is
bad when its a statically allocated member of a class.
So this patch tries to make most of the UI objects associated with
MussaWindow pointers (I had to convert some elements of the
SequenceBrowserWidget as MussaWindow was storing references to them.)
newMenu->addAction(saveBrowserPixmapAction);
newMenu = menuBar()->addMenu(tr("&Edit"));
newMenu->addAction(saveBrowserPixmapAction);
newMenu = menuBar()->addMenu(tr("&Edit"));
- newMenu->addAction(&browser.getCopySelectedSequenceAsFastaAction());
+ newMenu->addAction(browser.getCopySelectedSequenceAsFastaAction());
}
void MussaAlignedWindow::setupAlignmentMenus()
}
void MussaAlignedWindow::setupAlignmentMenus()
analysis(analysis_),
default_dir(QDir::home().absolutePath().toStdString(), fs::native),
motif_editor(0),
analysis(analysis_),
default_dir(QDir::home().absolutePath().toStdString(), fs::native),
motif_editor(0),
- setup_analysis_dialog(this),
- browser(this),
- mussaViewTB("Path Views"),
- zoom(),
- threshold(),
+ setup_analysis_dialog(new MussaSetupDialog(this)),
+ subanalysis_window(new SubanalysisWindow),
+ browser(new SequenceBrowserWidget(this)),
+ mussaViewTB(new QToolBar("Path Views")),
+ zoom(new ZoomWidget),
+ threshold(new ThresholdWidget),
progress_dialog(0),
aboutAction(0),
closeAction(0),
progress_dialog(0),
aboutAction(0),
closeAction(0),
// a segfault when using WhatsThis feature with
// opengl widget.
//scene->setWhatsThis(tr("Mussa in OpenGL!"));
// a segfault when using WhatsThis feature with
// opengl widget.
//scene->setWhatsThis(tr("Mussa in OpenGL!"));
- setCentralWidget(&browser);
+ setCentralWidget(browser);
// well updatePosition isn't quite right as we really just need
// to call update()
// well updatePosition isn't quite right as we really just need
// to call update()
- connect(this, SIGNAL(changedAnnotations()), &browser, SLOT(update()));
+ connect(this, SIGNAL(changedAnnotations()), browser, SLOT(update()));
- //mussaViewTB.addAction(toggleMotifsAction);
- mussaViewTB.addWidget(&zoom);
+ //mussaViewTB->addAction(toggleMotifsAction);
+ mussaViewTB->addWidget(zoom);
- connect(&zoom, SIGNAL(valueChanged(double)),
- &browser, SLOT(setZoom(double)));
+ connect(zoom, SIGNAL(valueChanged(double)),
+ browser, SLOT(setZoom(double)));
// threshold range is set in updateAnalysis
//scene->setClipPlane(20);
// FIXME: for when we get the paths drawn at the appropriate depth
// threshold range is set in updateAnalysis
//scene->setClipPlane(20);
// FIXME: for when we get the paths drawn at the appropriate depth
- //connect(&threshold, SIGNAL(thresholdChanged(int)),
+ //connect(threshold, SIGNAL(thresholdChanged(int)),
// this, SLOT(setClipPlane(int)));
// this, SLOT(setClipPlane(int)));
- connect(&threshold, SIGNAL(thresholdChanged(int)),
+ connect(threshold, SIGNAL(thresholdChanged(int)),
this, SLOT(setSoftThreshold(int)));
this, SLOT(setSoftThreshold(int)));
- mussaViewTB.addWidget(&threshold);
+ mussaViewTB->addWidget(threshold);
- addToolBar(&mussaViewTB);
+ addToolBar(mussaViewTB);
statusBar()->showMessage("Welcome to mussa", 2000);
connect(analysis, SIGNAL(progress(const std::string&, int, int)),
statusBar()->showMessage("Welcome to mussa", 2000);
connect(analysis, SIGNAL(progress(const std::string&, int, int)),
//Save pixel map action
saveBrowserPixmapAction = new QAction(tr("Save to image..."), this);
connect(saveBrowserPixmapAction, (SIGNAL(triggered())),
//Save pixel map action
saveBrowserPixmapAction = new QAction(tr("Save to image..."), this);
connect(saveBrowserPixmapAction, (SIGNAL(triggered())),
- &browser, SLOT(promptSaveBrowserPixmap()));
+ browser, SLOT(promptSaveBrowserPixmap()));
saveBrowserPixmapAction->setIcon(QIcon(":/icons/image2.png"));
viewMussaAlignmentAction = new QAction(tr("View sequence alignment"), this);
saveBrowserPixmapAction->setIcon(QIcon(":/icons/image2.png"));
viewMussaAlignmentAction = new QAction(tr("View sequence alignment"), this);
newMenu = menuBar()->addMenu(tr("&Edit"));
newMenu->addAction(editMotifsAction);
newMenu = menuBar()->addMenu(tr("&Edit"));
newMenu->addAction(editMotifsAction);
- newMenu->addAction(&browser.getCopySelectedSequenceAsFastaAction());
+ newMenu->addAction(browser->getCopySelectedSequenceAsFastaAction());
newMenu->addAction(createSubAnalysisAction);
newMenu = menuBar()->addMenu(tr("&View"));
newMenu->addAction(createSubAnalysisAction);
newMenu = menuBar()->addMenu(tr("&View"));
newMenu->addAction(aboutAction);
// add some extra features to the context menu
newMenu->addAction(aboutAction);
// add some extra features to the context menu
- QMenu& popupMenu = browser.getPopupMenu();
- popupMenu.addAction(viewMussaAlignmentAction);
- popupMenu.addAction(createSubAnalysisAction);
+ QMenu *popupMenu = browser->getPopupMenu();
+ if (popupMenu) {
+ popupMenu->addAction(viewMussaAlignmentAction);
+ popupMenu->addAction(createSubAnalysisAction);
+ }
}
void MussaWindow::setupAssistant()
}
void MussaWindow::setupAssistant()
void MussaWindow::clear()
{
aligned_windows.clear();
void MussaWindow::clear()
{
aligned_windows.clear();
}
void MussaWindow::createNewAnalysis()
}
void MussaWindow::createNewAnalysis()
// but this should work for the moment.
if (not isClearingAnalysisSafe()) return;
// but this should work for the moment.
if (not isClearingAnalysisSafe()) return;
- if (setup_analysis_dialog.exec()) {
+ if (setup_analysis_dialog->exec()) {
- m = setup_analysis_dialog.getMussa();
+ m = setup_analysis_dialog->getMussa();
setAnalysis(m);
}
} catch(mussa_error e) {
setAnalysis(m);
}
} catch(mussa_error e) {
void MussaWindow::createSubAnalysis()
{
list<SequenceLocation> result;
void MussaWindow::createSubAnalysis()
{
list<SequenceLocation> result;
- SequenceLocationModel& model = subanalysis_window.getModel();
- browser.copySelectedTracksAsSeqLocation(result);
+ SequenceLocationModel& model = subanalysis_window->getModel();
+ browser->copySelectedTracksAsSeqLocation(result);
for(list<SequenceLocation>::iterator result_itor = result.begin();
result_itor != result.end();
++result_itor)
for(list<SequenceLocation>::iterator result_itor = result.begin();
result_itor != result.end();
++result_itor)
model.push_back(*result_itor);
}
model.push_back(*result_itor);
}
- if (not subanalysis_window.isVisible()) {
- subanalysis_window.show();
+ if (not subanalysis_window->isVisible()) {
+ subanalysis_window->show();
void MussaWindow::showMussaToolbar()
{
void MussaWindow::showMussaToolbar()
{
- if (mussaViewTB.isVisible())
- mussaViewTB.hide();
+ if (mussaViewTB->isVisible())
+ mussaViewTB->hide();
}
void MussaWindow::toggleMotifs()
}
void MussaWindow::toggleMotifs()
void MussaWindow::viewMussaAlignment()
{
void MussaWindow::viewMussaAlignment()
{
- const set<int>& selected_paths = browser.selectedPaths();
+ const set<int>& selected_paths = browser->selectedPaths();
if (selected_paths.size() == 0 ) {
QMessageBox::warning(this,
QObject::tr("mussa"),
if (selected_paths.size() == 0 ) {
QMessageBox::warning(this,
QObject::tr("mussa"),
void MussaWindow::updateAnalysis()
{
void MussaWindow::updateAnalysis()
{
- threshold.setRange(analysis->get_threshold(),analysis->get_window());
-
const Mussa::vector_sequence_type& seqs = analysis->sequences();
const Mussa::vector_sequence_type& seqs = analysis->sequences();
- browser.setSequences(seqs, analysis->colorMapper());
+ browser->setSequences(seqs, analysis->colorMapper());
+ assert(browser->sequences().size() == analysis->size());
+
+ // setRange eventually emits something that causes updateLinks to be called
+ // but it's possible for us to not have had a chance to set out sequences
+ // yet.
+ threshold->setRange(analysis->get_threshold(),analysis->get_window());
- browser.zoomOut();
- zoom.setValue(browser.zoom());
+ browser->zoomOut();
+ zoom->setValue(browser->zoom());
}
void MussaWindow::updateAnnotations()
}
void MussaWindow::updateAnnotations()
// motifs were changed in the sequences by
// Mussa::update_sequences_motifs
emit changedAnnotations();
// motifs were changed in the sequences by
// Mussa::update_sequences_motifs
emit changedAnnotations();
}
void MussaWindow::updateLinks()
{
}
void MussaWindow::updateLinks()
{
+ if(browser->sequences().size() == 0) {
+ // we don't have any sequences load so we have no business setting links
+ return;
+ }
+
+ browser->clear_links();
bool reversed = false;
const NwayPaths& nway = analysis->paths();
bool reversed = false;
const NwayPaths& nway = analysis->paths();
normalized_path.push_back(x);
rc_flags.push_back(reversed);
}
normalized_path.push_back(x);
rc_flags.push_back(reversed);
}
- browser.link(normalized_path, rc_flags, path_itor->window_size);
+ browser->link(normalized_path, rc_flags, path_itor->window_size);
boost::filesystem::path default_dir;
std::list<boost::shared_ptr<MussaAlignedWindow> > aligned_windows;
MotifEditor *motif_editor;
boost::filesystem::path default_dir;
std::list<boost::shared_ptr<MussaAlignedWindow> > aligned_windows;
MotifEditor *motif_editor;
- MussaSetupDialog setup_analysis_dialog;
- SubanalysisWindow subanalysis_window;
+ MussaSetupDialog *setup_analysis_dialog;
+ boost::shared_ptr<SubanalysisWindow> subanalysis_window;
// display our wonderful mussa output
// display our wonderful mussa output
- SequenceBrowserWidget browser;
- QToolBar mussaViewTB;
- ZoomWidget zoom;
- ThresholdWidget threshold;
+ SequenceBrowserWidget *browser;
+ QToolBar *mussaViewTB;
+ ZoomWidget *zoom;
+ ThresholdWidget *threshold;
QProgressDialog *progress_dialog;
QAction *aboutAction;
QProgressDialog *progress_dialog;
QAction *aboutAction;
SequenceBrowser::SequenceBrowser(QWidget *parent)
: QGLWidget(parent),
rubberBand(0),
SequenceBrowser::SequenceBrowser(QWidget *parent)
: QGLWidget(parent),
rubberBand(0),
- popupMenu(this),
- copySelectedSequenceAsFastaAction(tr("&Copy as Fasta"), this)
+ popupMenu(new QMenu(this)),
+ copySelectedSequenceAsFastaAction(new QAction(tr("&Copy as Fasta"), this))
- connect(©SelectedSequenceAsFastaAction, SIGNAL(triggered()),
+ connect(copySelectedSequenceAsFastaAction, SIGNAL(triggered()),
this, SLOT(copySelectedSequenceAsFasta()));
this, SLOT(copySelectedSequenceAsFasta()));
- copySelectedSequenceAsFastaAction.setShortcut(Qt::CTRL | Qt::Key_C);
- popupMenu.addAction(©SelectedSequenceAsFastaAction);
+ copySelectedSequenceAsFastaAction->setShortcut(Qt::CTRL | Qt::Key_C);
+ popupMenu->addAction(copySelectedSequenceAsFastaAction);
-QMenu &SequenceBrowser::getPopupMenu()
+QMenu *SequenceBrowser::getPopupMenu()
-QAction &SequenceBrowser::getCopySelectedSequenceAsFastaAction()
+QAction *SequenceBrowser::getCopySelectedSequenceAsFastaAction()
{
return copySelectedSequenceAsFastaAction;
}
{
return copySelectedSequenceAsFastaAction;
}
void SequenceBrowser::displayContextMenu(const QPoint& point)
{
void SequenceBrowser::displayContextMenu(const QPoint& point)
{
- popupMenu.popup(point);
+ popupMenu->popup(point);
}
void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
}
void SequenceBrowser::push_sequence(boost::shared_ptr<Sequence> s)
void push_sequence(boost::shared_ptr<GlSequence>);
//! return the popup menu for the glcanvas (reference stored internally)
void push_sequence(boost::shared_ptr<GlSequence>);
//! return the popup menu for the glcanvas (reference stored internally)
//! return our copy actioy (reference stored internally)
//! return our copy actioy (reference stored internally)
- QAction &getCopySelectedSequenceAsFastaAction();
+ QAction *getCopySelectedSequenceAsFastaAction();
public slots:
void copySelectedSequenceAsFasta();
public slots:
void copySelectedSequenceAsFasta();
void stopSelecting(QMouseEvent *);
/* \@} */
void stopSelecting(QMouseEvent *);
/* \@} */
- QMenu popupMenu;
- QAction copySelectedSequenceAsFastaAction;
+ QMenu *popupMenu;
+ QAction *copySelectedSequenceAsFastaAction;
-QMenu &SequenceBrowserWidget::getPopupMenu()
+QMenu *SequenceBrowserWidget::getPopupMenu()
{
return scrollable_browser.browser().getPopupMenu();
}
{
return scrollable_browser.browser().getPopupMenu();
}
-QAction &SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
+QAction *SequenceBrowserWidget::getCopySelectedSequenceAsFastaAction()
{
return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction();
}
{
return scrollable_browser.browser().getCopySelectedSequenceAsFastaAction();
}
SequenceBrowserWidget(QWidget *parent=0);
//! return the popup menu for the glcanvas (reference stored internally)
SequenceBrowserWidget(QWidget *parent=0);
//! return the popup menu for the glcanvas (reference stored internally)
//! return our copy actioy (reference stored internally)
//! return our copy actioy (reference stored internally)
- QAction &getCopySelectedSequenceAsFastaAction();
+ QAction *getCopySelectedSequenceAsFastaAction();
//! copy selected track regions into a list of SequenceLocations
void copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& );
//! copy selected track regions into a list of SequenceLocations
void copySelectedTracksAsSeqLocation(std::list<SequenceLocation>& );