Exemple #1
0
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);
}
Exemple #5
0
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()));
}