Mercurial > hg > svgui
comparison layer/Colour3DPlotLayer.cpp @ 916:94e4952a6774 osx-retina
Start trying to introduce LayerGeometryProvider as proxyable interface for View methods that the Layer wants to use
author | Chris Cannam |
---|---|
date | Tue, 17 Mar 2015 15:05:25 +0000 |
parents | 4a578a360011 |
children | 0aac065f09f9 |
comparison
equal
deleted
inserted
replaced
915:f6d9f28f37cb | 916:94e4952a6774 |
---|---|
504 { | 504 { |
505 return m_smooth; | 505 return m_smooth; |
506 } | 506 } |
507 | 507 |
508 void | 508 void |
509 Colour3DPlotLayer::setLayerDormant(const View *v, bool dormant) | 509 Colour3DPlotLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) |
510 { | 510 { |
511 if (dormant) { | 511 if (dormant) { |
512 | 512 |
513 #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT | 513 #ifdef DEBUG_COLOUR_3D_PLOT_LAYER_PAINT |
514 cerr << "Colour3DPlotLayer::setLayerDormant(" << dormant << ")" | 514 cerr << "Colour3DPlotLayer::setLayerDormant(" << dormant << ")" |
528 Layer::setLayerDormant(v, false); | 528 Layer::setLayerDormant(v, false); |
529 } | 529 } |
530 } | 530 } |
531 | 531 |
532 bool | 532 bool |
533 Colour3DPlotLayer::isLayerScrollable(const View *v) const | 533 Colour3DPlotLayer::isLayerScrollable(const LayerGeometryProvider *v) const |
534 { | 534 { |
535 if (m_normalizeVisibleArea) { | 535 if (m_normalizeVisibleArea) { |
536 return false; | 536 return false; |
537 } | 537 } |
538 if (shouldPaintDenseIn(v)) { | 538 if (shouldPaintDenseIn(v)) { |
587 emit layerParametersChanged(); | 587 emit layerParametersChanged(); |
588 return true; | 588 return true; |
589 } | 589 } |
590 | 590 |
591 bool | 591 bool |
592 Colour3DPlotLayer::getYScaleValue(const View *, int, | 592 Colour3DPlotLayer::getYScaleValue(const LayerGeometryProvider *, int, |
593 double &, QString &) const | 593 double &, QString &) const |
594 { | 594 { |
595 return false;//!!! | 595 return false;//!!! |
596 } | 596 } |
597 | 597 |
643 return new LinearRangeMapper(0, m_model->getHeight(), | 643 return new LinearRangeMapper(0, m_model->getHeight(), |
644 0, m_model->getHeight(), ""); | 644 0, m_model->getHeight(), ""); |
645 } | 645 } |
646 | 646 |
647 double | 647 double |
648 Colour3DPlotLayer::getYForBin(View *v, double bin) const | 648 Colour3DPlotLayer::getYForBin(LayerGeometryProvider *v, double bin) const |
649 { | 649 { |
650 double y = bin; | 650 double y = bin; |
651 if (!m_model) return y; | 651 if (!m_model) return y; |
652 double mn = 0, mx = m_model->getHeight(); | 652 double mn = 0, mx = m_model->getHeight(); |
653 getDisplayExtents(mn, mx); | 653 getDisplayExtents(mn, mx); |
654 double h = v->height(); | 654 double h = v->getPaintHeight(); |
655 if (m_binScale == LinearBinScale) { | 655 if (m_binScale == LinearBinScale) { |
656 y = h - (((bin - mn) * h) / (mx - mn)); | 656 y = h - (((bin - mn) * h) / (mx - mn)); |
657 } else { | 657 } else { |
658 double logmin = mn + 1, logmax = mx + 1; | 658 double logmin = mn + 1, logmax = mx + 1; |
659 LogRange::mapRange(logmin, logmax); | 659 LogRange::mapRange(logmin, logmax); |
661 } | 661 } |
662 return y; | 662 return y; |
663 } | 663 } |
664 | 664 |
665 int | 665 int |
666 Colour3DPlotLayer::getIYForBin(View *v, int bin) const | 666 Colour3DPlotLayer::getIYForBin(LayerGeometryProvider *v, int bin) const |
667 { | 667 { |
668 return int(round(getYForBin(v, bin))); | 668 return int(round(getYForBin(v, bin))); |
669 } | 669 } |
670 | 670 |
671 double | 671 double |
672 Colour3DPlotLayer::getBinForY(View *v, double y) const | 672 Colour3DPlotLayer::getBinForY(LayerGeometryProvider *v, double y) const |
673 { | 673 { |
674 double bin = y; | 674 double bin = y; |
675 if (!m_model) return bin; | 675 if (!m_model) return bin; |
676 double mn = 0, mx = m_model->getHeight(); | 676 double mn = 0, mx = m_model->getHeight(); |
677 getDisplayExtents(mn, mx); | 677 getDisplayExtents(mn, mx); |
678 double h = v->height(); | 678 double h = v->getPaintHeight(); |
679 if (m_binScale == LinearBinScale) { | 679 if (m_binScale == LinearBinScale) { |
680 bin = mn + ((h - y) * (mx - mn)) / h; | 680 bin = mn + ((h - y) * (mx - mn)) / h; |
681 } else { | 681 } else { |
682 double logmin = mn + 1, logmax = mx + 1; | 682 double logmin = mn + 1, logmax = mx + 1; |
683 LogRange::mapRange(logmin, logmax); | 683 LogRange::mapRange(logmin, logmax); |
685 } | 685 } |
686 return bin; | 686 return bin; |
687 } | 687 } |
688 | 688 |
689 int | 689 int |
690 Colour3DPlotLayer::getIBinForY(View *v, int y) const | 690 Colour3DPlotLayer::getIBinForY(LayerGeometryProvider *v, int y) const |
691 { | 691 { |
692 return int(floor(getBinForY(v, y))); | 692 return int(floor(getBinForY(v, y))); |
693 } | 693 } |
694 | 694 |
695 QString | 695 QString |
696 Colour3DPlotLayer::getFeatureDescription(View *v, QPoint &pos) const | 696 Colour3DPlotLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const |
697 { | 697 { |
698 if (!m_model) return ""; | 698 if (!m_model) return ""; |
699 | 699 |
700 int x = pos.x(); | 700 int x = pos.x(); |
701 int y = pos.y(); | 701 int y = pos.y(); |
722 symax = sh; | 722 symax = sh; |
723 } | 723 } |
724 if (symin < 0) symin = 0; | 724 if (symin < 0) symin = 0; |
725 if (symax > sh) symax = sh; | 725 if (symax > sh) symax = sh; |
726 | 726 |
727 // double binHeight = double(v->height()) / (symax - symin); | 727 // double binHeight = double(v->getPaintHeight()) / (symax - symin); |
728 // int sy = int((v->height() - y) / binHeight) + symin; | 728 // int sy = int((v->getPaintHeight() - y) / binHeight) + symin; |
729 | 729 |
730 int sy = getIBinForY(v, y); | 730 int sy = getIBinForY(v, y); |
731 | 731 |
732 if (sy < 0 || sy >= m_model->getHeight()) { | 732 if (sy < 0 || sy >= m_model->getHeight()) { |
733 return ""; | 733 return ""; |
760 int cw = 20; | 760 int cw = 20; |
761 return cw; | 761 return cw; |
762 } | 762 } |
763 | 763 |
764 int | 764 int |
765 Colour3DPlotLayer::getVerticalScaleWidth(View *, bool, QPainter &paint) const | 765 Colour3DPlotLayer::getVerticalScaleWidth(LayerGeometryProvider *, bool, QPainter &paint) const |
766 { | 766 { |
767 if (!m_model) return 0; | 767 if (!m_model) return 0; |
768 | 768 |
769 QString sampleText = QString("[%1]").arg(m_model->getHeight()); | 769 QString sampleText = QString("[%1]").arg(m_model->getHeight()); |
770 int tw = paint.fontMetrics().width(sampleText); | 770 int tw = paint.fontMetrics().width(sampleText); |
782 | 782 |
783 return tw + 13 + getColourScaleWidth(paint); | 783 return tw + 13 + getColourScaleWidth(paint); |
784 } | 784 } |
785 | 785 |
786 void | 786 void |
787 Colour3DPlotLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect rect) const | 787 Colour3DPlotLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect rect) const |
788 { | 788 { |
789 if (!m_model) return; | 789 if (!m_model) return; |
790 | 790 |
791 int h = rect.height(), w = rect.width(); | 791 int h = rect.height(), w = rect.width(); |
792 | 792 |
1244 | 1244 |
1245 delete[] peaks; | 1245 delete[] peaks; |
1246 } | 1246 } |
1247 | 1247 |
1248 bool | 1248 bool |
1249 Colour3DPlotLayer::shouldPaintDenseIn(const View *v) const | 1249 Colour3DPlotLayer::shouldPaintDenseIn(const LayerGeometryProvider *v) const |
1250 { | 1250 { |
1251 if (!m_model || !v || !(v->getViewManager())) { | 1251 if (!m_model || !v || !(v->getViewManager())) { |
1252 return false; | 1252 return false; |
1253 } | 1253 } |
1254 double srRatio = | 1254 double srRatio = |
1255 v->getViewManager()->getMainModelSampleRate() / m_model->getSampleRate(); | 1255 v->getViewManager()->getMainModelSampleRate() / m_model->getSampleRate(); |
1256 if (m_opaque || | 1256 if (m_opaque || |
1257 m_smooth || | 1257 m_smooth || |
1258 m_model->getHeight() >= v->height() || | 1258 m_model->getHeight() >= v->getPaintHeight() || |
1259 ((m_model->getResolution() * srRatio) / v->getZoomLevel()) < 2) { | 1259 ((m_model->getResolution() * srRatio) / v->getZoomLevel()) < 2) { |
1260 return true; | 1260 return true; |
1261 } | 1261 } |
1262 return false; | 1262 return false; |
1263 } | 1263 } |
1264 | 1264 |
1265 void | 1265 void |
1266 Colour3DPlotLayer::paint(View *v, QPainter &paint, QRect rect) const | 1266 Colour3DPlotLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const |
1267 { | 1267 { |
1268 /* | 1268 /* |
1269 if (m_model) { | 1269 if (m_model) { |
1270 SVDEBUG << "Colour3DPlotLayer::paint: model says shouldUseLogValueScale = " << m_model->shouldUseLogValueScale() << endl; | 1270 SVDEBUG << "Colour3DPlotLayer::paint: model says shouldUseLogValueScale = " << m_model->shouldUseLogValueScale() << endl; |
1271 } | 1271 } |
1276 #endif | 1276 #endif |
1277 | 1277 |
1278 int completion = 0; | 1278 int completion = 0; |
1279 if (!m_model || !m_model->isOK() || !m_model->isReady(&completion)) { | 1279 if (!m_model || !m_model->isOK() || !m_model->isReady(&completion)) { |
1280 if (completion > 0) { | 1280 if (completion > 0) { |
1281 paint.fillRect(0, 10, v->width() * completion / 100, | 1281 paint.fillRect(0, 10, v->getPaintWidth() * completion / 100, |
1282 10, QColor(120, 120, 120)); | 1282 10, QColor(120, 120, 120)); |
1283 } | 1283 } |
1284 return; | 1284 return; |
1285 } | 1285 } |
1286 | 1286 |
1287 if (m_normalizeVisibleArea && !m_normalizeColumns) rect = v->rect(); | 1287 if (m_normalizeVisibleArea && !m_normalizeColumns) rect = v->getPaintRect(); |
1288 | 1288 |
1289 sv_frame_t modelStart = m_model->getStartFrame(); | 1289 sv_frame_t modelStart = m_model->getStartFrame(); |
1290 sv_frame_t modelEnd = m_model->getEndFrame(); | 1290 sv_frame_t modelEnd = m_model->getEndFrame(); |
1291 int modelResolution = m_model->getResolution(); | 1291 int modelResolution = m_model->getResolution(); |
1292 | 1292 |
1300 // "small". This is "large"; see paintDense below for "small". | 1300 // "small". This is "large"; see paintDense below for "small". |
1301 | 1301 |
1302 int x0 = rect.left(); | 1302 int x0 = rect.left(); |
1303 int x1 = rect.right() + 1; | 1303 int x1 = rect.right() + 1; |
1304 | 1304 |
1305 int h = v->height(); | 1305 int h = v->getPaintHeight(); |
1306 | 1306 |
1307 double srRatio = | 1307 double srRatio = |
1308 v->getViewManager()->getMainModelSampleRate() / m_model->getSampleRate(); | 1308 v->getViewManager()->getMainModelSampleRate() / m_model->getSampleRate(); |
1309 | 1309 |
1310 int sx0 = int((double(v->getFrameForX(x0)) / srRatio - double(modelStart)) | 1310 int sx0 = int((double(v->getFrameForX(x0)) / srRatio - double(modelStart)) |
1422 } | 1422 } |
1423 } | 1423 } |
1424 } | 1424 } |
1425 | 1425 |
1426 void | 1426 void |
1427 Colour3DPlotLayer::paintDense(View *v, QPainter &paint, QRect rect) const | 1427 Colour3DPlotLayer::paintDense(LayerGeometryProvider *v, QPainter &paint, QRect rect) const |
1428 { | 1428 { |
1429 Profiler profiler("Colour3DPlotLayer::paintDense", true); | 1429 Profiler profiler("Colour3DPlotLayer::paintDense", true); |
1430 if (!m_cache) return; | 1430 if (!m_cache) return; |
1431 | 1431 |
1432 double modelStart = double(m_model->getStartFrame()); | 1432 double modelStart = double(m_model->getStartFrame()); |
1438 | 1438 |
1439 int x0 = rect.left(); | 1439 int x0 = rect.left(); |
1440 int x1 = rect.right() + 1; | 1440 int x1 = rect.right() + 1; |
1441 | 1441 |
1442 const int w = x1 - x0; // const so it can be used as array size below | 1442 const int w = x1 - x0; // const so it can be used as array size below |
1443 int h = v->height(); // we always paint full height | 1443 int h = v->getPaintHeight(); // we always paint full height |
1444 int sh = m_model->getHeight(); | 1444 int sh = m_model->getHeight(); |
1445 | 1445 |
1446 int symin = m_miny; | 1446 int symin = m_miny; |
1447 int symax = m_maxy; | 1447 int symax = m_maxy; |
1448 if (symax <= symin) { | 1448 if (symax <= symin) { |
1653 | 1653 |
1654 paint.drawImage(x0, 0, img); | 1654 paint.drawImage(x0, 0, img); |
1655 } | 1655 } |
1656 | 1656 |
1657 bool | 1657 bool |
1658 Colour3DPlotLayer::snapToFeatureFrame(View *v, sv_frame_t &frame, | 1658 Colour3DPlotLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, |
1659 int &resolution, | 1659 int &resolution, |
1660 SnapType snap) const | 1660 SnapType snap) const |
1661 { | 1661 { |
1662 if (!m_model) { | 1662 if (!m_model) { |
1663 return Layer::snapToFeatureFrame(v, frame, resolution, snap); | 1663 return Layer::snapToFeatureFrame(v, frame, resolution, snap); |