MaOverview::MaOverview(MaEditorWgt *ui) : QWidget(ui), editor(ui->getEditor()), ui(ui), sequenceArea(ui->getSequenceArea()), stepX(0), stepY(0) { connect(sequenceArea, SIGNAL(si_visibleRangeChanged()), this, SLOT(sl_visibleRangeChanged())); connect(sequenceArea, SIGNAL(si_selectionChanged(MaEditorSelection,MaEditorSelection)), SLOT(sl_selectionChanged())); connect(editor->getMaObject(), SIGNAL(si_alignmentChanged(MultipleAlignment,MaModificationInfo)), SLOT(sl_redraw())); connect(ui->getScrollController(), SIGNAL(si_visibleAreaChanged()), SLOT(sl_redraw())); connect(ui->getCollapseModel(), SIGNAL(si_toggled()), SLOT(sl_redraw())); }
void ZoomableAssemblyOverview::sl_zoomOut(const QPoint & pos) { if(!zoomable) return; // 1. count new length of the visible region qint64 newLen = visibleRange.length * ZOOM_MULT + 0.5; U2OpStatusImpl os; if(newLen > model->getModelLength(os)) { newLen = model->getModelLength(os); } // 2. count new start of the visible region qint64 newStart = 0; if(!pos.isNull()) { //Black magic. Zooms overview so that region under mouse pointer remains //under pointer after zoom newStart = calcXAssemblyCoord(pos.x()) - double(newLen)/width()*pos.x(); } else { //simply zoom to center newStart = visibleRange.startPos + (visibleRange.length-newLen)/2; } //3. if nothing changed -> do nothing if(newLen == visibleRange.length && newStart == visibleRange.startPos) { return; } //4. set new values and update widget checkedSetVisibleRange(newStart, newLen); sl_redraw(); }
void ZoomableAssemblyOverview::zoomToPixRange(int x_pix_start, int x_pix_end) { assert(x_pix_start <= x_pix_end); qint64 left_asm = calcXAssemblyCoord(x_pix_start); qint64 right_asm = calcXAssemblyCoord(x_pix_end); checkedSetVisibleRange(left_asm, right_asm-left_asm); sl_redraw(); }
void ZoomableAssemblyOverview::resizeEvent(QResizeEvent * e) { cachedSelection = calcCurrentSelection(); moveSelectionToPos(cachedSelection.center(), false); // force re-check visible range to avoid violating 1-pixel limit checkedSetVisibleRange(visibleRange, true); launchCoverageCalculation(); sl_redraw(); QWidget::resizeEvent(e); }
MSAOverview::MSAOverview(MSAEditorUI *_ui) : editor(_ui->getEditor()), ui(_ui), sequenceArea(_ui->getSequenceArea()) { connect(sequenceArea, SIGNAL(si_visibleRangeChanged()), this, SLOT(sl_visibleRangeChanged())); connect(sequenceArea, SIGNAL(si_selectionChanged(MSAEditorSelection,MSAEditorSelection)), SLOT(sl_selectionChanged())); connect(editor->getMSAObject(), SIGNAL(si_alignmentChanged(MAlignment,MAlignmentModInfo)), SLOT(sl_redraw())); }
void ZoomableAssemblyOverview::launchCoverageCalculation() { if(previousCoverageRegion != visibleRange || width() != previousCoverageLength) { CalcCoverageInfoTaskSettings settings; settings.model = model; settings.visibleRange = previousCoverageRegion = visibleRange; settings.regions = previousCoverageLength = width(); coverageTaskRunner.run(new CalcCoverageInfoTask(settings)); } redrawBackground = true; sl_redraw(); }
MaGraphOverview::MaGraphOverview(MaEditorWgt *ui) : MaOverview(ui), redrawGraph(true), isBlocked(false), lastDrawnVersion(-1), method(Strict), graphCalculationTask(NULL) { setFixedHeight(FIXED_HEIGHT); displaySettings = new MaGraphOverviewDisplaySettings(); Settings *s = AppContext::getSettings(); CHECK(s != NULL, ); if (s->contains(MSA_GRAPH_OVERVIEW_COLOR_KEY)) { displaySettings->color = s->getValue(MSA_GRAPH_OVERVIEW_COLOR_KEY).value<QColor>( ); } if (s->contains(MSA_GRAPH_OVERVIEW_TYPE_KEY)) { displaySettings->type = (MaGraphOverviewDisplaySettings::GraphType)s->getValue(MSA_GRAPH_OVERVIEW_TYPE_KEY).toInt(); } if (s->contains(MSA_GRAPH_OVERVIEW_ORIENTAION_KEY)) { displaySettings->orientation = (MaGraphOverviewDisplaySettings::OrientationMode)s->getValue(MSA_GRAPH_OVERVIEW_ORIENTAION_KEY).toInt(); } connect(&graphCalculationTaskRunner, SIGNAL(si_finished()), SLOT(sl_redraw())); connect(editor->getMaObject(), SIGNAL(si_alignmentChanged(MultipleAlignment,MaModificationInfo)), SLOT(sl_drawGraph())); connect(ui, SIGNAL(si_startMaChanging()), SLOT(sl_blockRendering())); connect(ui, SIGNAL(si_stopMaChanging(bool)), SLOT(sl_unblockRendering(bool))); sl_drawGraph(); }
void MaGraphOverview::sl_drawGraph() { if (!isVisible() || isBlocked) { return; } graphCalculationTaskRunner.cancel(); switch (method) { case Strict: graphCalculationTask = new MaConsensusOverviewCalculationTask(editor->getMaObject(), width(), FIXED_HEIGHT); break; case Gaps: graphCalculationTask = new MaGapOverviewCalculationTask(editor->getMaObject(), width(), FIXED_HEIGHT); break; case Clustal: graphCalculationTask = new MaClustalOverviewCalculationTask(editor->getMaObject(), width(), FIXED_HEIGHT); break; case Highlighting: MsaHighlightingScheme* hScheme = sequenceArea->getCurrentHighlightingScheme(); QString hSchemeId = hScheme->getFactory()->getId(); MsaColorScheme* cScheme = sequenceArea->getCurrentColorScheme(); QString cSchemeId = cScheme->getFactory()->getId(); graphCalculationTask = new MaHighlightingOverviewCalculationTask(editor, cSchemeId, hSchemeId, width(), FIXED_HEIGHT); break; } connect(graphCalculationTask, SIGNAL(si_calculationStarted()), SLOT(sl_startRendering())); connect(graphCalculationTask, SIGNAL(si_calculationStoped()), SLOT(sl_stopRendering())); graphCalculationTaskRunner.run( graphCalculationTask ); sl_redraw(); }
void ZoomableAssemblyOverview::sl_zoomIn(const QPoint & pos) { if(!zoomable) return; //1. count new length of the visible region qint64 newLen = visibleRange.length / ZOOM_MULT + 0.5; // if(newLen < browser->basesCanBeVisible()) { // newLen = browser->basesCanBeVisible(); // } qint64 oldLen = visibleRange.length; qint64 minLen = minimalOverviewedLen(); if(newLen < minLen) { newLen = minLen; } if(oldLen == newLen) { return; } //2. count new start position of the visible region qint64 newStart = 0; if(!pos.isNull()) { //Black magic. Zooms overview so that region under mouse pointer remains //under pointer after zoom newStart = calcXAssemblyCoord(pos.x()) - double(newLen)/width()*pos.x(); } else { //simply zoom to center newStart = visibleRange.startPos + (visibleRange.length-newLen)/2; } //3. if nothing changed -> do nothing if(newLen == visibleRange.length && newStart == visibleRange.startPos) { return; } //4. set new values and update widget checkedSetVisibleRange(newStart,newLen); sl_redraw(); }
void ZoomableAssemblyOverview::mouseMoveEvent(QMouseEvent * me) { //selection scribbling if((me->buttons() & Qt::LeftButton) && selectionScribbling) { if(!ui->getReadsArea()->isScrolling()) { ui->getReadsArea()->setScrolling(true); } moveSelectionToPos(me->pos() - selectionDiff); } //background scribbling (Ctrl-Click) else if((me->buttons() & Qt::MidButton) && visibleRangeScribbling){ int pixelDiff = visibleRangeLastPos.x() - me->pos().x(); qint64 asmDiff = calcXAssemblyCoord(pixelDiff); checkedMoveVisibleRange(asmDiff); visibleRangeLastPos = me->pos(); } if(zoomToRegionSelector.scribbling) { sl_redraw(); } QWidget::mouseMoveEvent(me); }
void ZoomableAssemblyOverview::sl_restoreGlobalOverview() { checkedSetVisibleRange(model->getGlobalRegion()); sl_redraw(); }
void ZoomableAssemblyOverview::sl_visibleAreaChanged() { cachedSelection = calcCurrentSelection(); moveSelectionToPos(cachedSelection.center(), false); sl_redraw(); }
void ZoomableAssemblyOverview::connectSlots() { connect(&coverageTaskRunner, SIGNAL(si_finished()), SLOT(sl_redraw())); connect(&coverageTaskRunner, SIGNAL(si_finished()), SIGNAL(si_coverageReady())); connect(browser, SIGNAL(si_zoomOperationPerformed()), SLOT(sl_visibleAreaChanged())); connect(browser, SIGNAL(si_offsetsChanged()), SLOT(sl_redraw())); }