comparison layer/FlexiNoteLayer.cpp @ 1216:dc2af6616c83

Merge from branch 3.0-integration
author Chris Cannam
date Fri, 13 Jan 2017 10:29:50 +0000
parents ee01a4062747
children c39f2d439d59
comparison
equal deleted inserted replaced
1048:e8102ff5573b 1216:dc2af6616c83
20 #include "base/RealTime.h" 20 #include "base/RealTime.h"
21 #include "base/Profiler.h" 21 #include "base/Profiler.h"
22 #include "base/Pitch.h" 22 #include "base/Pitch.h"
23 #include "base/LogRange.h" 23 #include "base/LogRange.h"
24 #include "base/RangeMapper.h" 24 #include "base/RangeMapper.h"
25
25 #include "ColourDatabase.h" 26 #include "ColourDatabase.h"
26 #include "view/View.h" 27 #include "LayerGeometryProvider.h"
27
28 #include "PianoScale.h" 28 #include "PianoScale.h"
29 #include "LinearNumericalScale.h" 29 #include "LinearNumericalScale.h"
30 #include "LogNumericalScale.h" 30 #include "LogNumericalScale.h"
31 #include "PaintAssistant.h"
31 32
32 #include "data/model/FlexiNoteModel.h" 33 #include "data/model/FlexiNoteModel.h"
34
35 #include "view/View.h"
33 36
34 #include "widgets/ItemEditDialog.h" 37 #include "widgets/ItemEditDialog.h"
35 #include "widgets/TextAbbrev.h" 38 #include "widgets/TextAbbrev.h"
36 39
37 #include <QPainter> 40 #include <QPainter>
202 m_verticalScale = scale; 205 m_verticalScale = scale;
203 emit layerParametersChanged(); 206 emit layerParametersChanged();
204 } 207 }
205 208
206 bool 209 bool
207 FlexiNoteLayer::isLayerScrollable(const View *v) const 210 FlexiNoteLayer::isLayerScrollable(const LayerGeometryProvider *v) const
208 { 211 {
209 QPoint discard; 212 QPoint discard;
210 return !v->shouldIlluminateLocalFeatures(this, discard); 213 return !v->shouldIlluminateLocalFeatures(this, discard);
211 } 214 }
212 215
403 406
404 return mapper; 407 return mapper;
405 } 408 }
406 409
407 FlexiNoteModel::PointList 410 FlexiNoteModel::PointList
408 FlexiNoteLayer::getLocalPoints(View *v, int x) const 411 FlexiNoteLayer::getLocalPoints(LayerGeometryProvider *v, int x) const
409 { 412 {
410 if (!m_model) return FlexiNoteModel::PointList(); 413 if (!m_model) return FlexiNoteModel::PointList();
411 414
412 sv_frame_t frame = v->getFrameForX(x); 415 sv_frame_t frame = v->getFrameForX(x);
413 416
446 449
447 return usePoints; 450 return usePoints;
448 } 451 }
449 452
450 bool 453 bool
451 FlexiNoteLayer::getPointToDrag(View *v, int x, int y, FlexiNoteModel::Point &p) const 454 FlexiNoteLayer::getPointToDrag(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &p) const
452 { 455 {
453 if (!m_model) return false; 456 if (!m_model) return false;
454 457
455 sv_frame_t frame = v->getFrameForX(x); 458 sv_frame_t frame = v->getFrameForX(x);
456 459
474 477
475 return true; 478 return true;
476 } 479 }
477 480
478 bool 481 bool
479 FlexiNoteLayer::getNoteToEdit(View *v, int x, int y, FlexiNoteModel::Point &p) const 482 FlexiNoteLayer::getNoteToEdit(LayerGeometryProvider *v, int x, int y, FlexiNoteModel::Point &p) const
480 { 483 {
481 // GF: find the note that is closest to the cursor 484 // GF: find the note that is closest to the cursor
482 if (!m_model) return false; 485 if (!m_model) return false;
483 486
484 sv_frame_t frame = v->getFrameForX(x); 487 sv_frame_t frame = v->getFrameForX(x);
503 506
504 return true; 507 return true;
505 } 508 }
506 509
507 QString 510 QString
508 FlexiNoteLayer::getFeatureDescription(View *v, QPoint &pos) const 511 FlexiNoteLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const
509 { 512 {
510 int x = pos.x(); 513 int x = pos.x();
511 514
512 if (!m_model || !m_model->getSampleRate()) return ""; 515 if (!m_model || !m_model->getSampleRate()) return "";
513 516
591 getYForValue(v, note.value)); 594 getYForValue(v, note.value));
592 return text; 595 return text;
593 } 596 }
594 597
595 bool 598 bool
596 FlexiNoteLayer::snapToFeatureFrame(View *v, sv_frame_t &frame, 599 FlexiNoteLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame,
597 int &resolution, 600 int &resolution,
598 SnapType snap) const 601 SnapType snap) const
599 { 602 {
600 if (!m_model) { 603 if (!m_model) {
601 return Layer::snapToFeatureFrame(v, frame, resolution, snap); 604 return Layer::snapToFeatureFrame(v, frame, resolution, snap);
671 frame = snapped; 674 frame = snapped;
672 return found; 675 return found;
673 } 676 }
674 677
675 void 678 void
676 FlexiNoteLayer::getScaleExtents(View *v, double &min, double &max, bool &log) const 679 FlexiNoteLayer::getScaleExtents(LayerGeometryProvider *v, double &min, double &max, bool &log) const
677 { 680 {
678 min = 0.0; 681 min = 0.0;
679 max = 0.0; 682 max = 0.0;
680 log = false; 683 log = false;
681 684
728 731
729 if (max == min) max = min + 1.0; 732 if (max == min) max = min + 1.0;
730 } 733 }
731 734
732 int 735 int
733 FlexiNoteLayer::getYForValue(View *v, double val) const 736 FlexiNoteLayer::getYForValue(LayerGeometryProvider *v, double val) const
734 { 737 {
735 double min = 0.0, max = 0.0; 738 double min = 0.0, max = 0.0;
736 bool logarithmic = false; 739 bool logarithmic = false;
737 int h = v->height(); 740 int h = v->getPaintHeight();
738 741
739 getScaleExtents(v, min, max, logarithmic); 742 getScaleExtents(v, min, max, logarithmic);
740 743
741 #ifdef DEBUG_NOTE_LAYER 744 #ifdef DEBUG_NOTE_LAYER
742 cerr << "FlexiNoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl; 745 cerr << "FlexiNoteLayer[" << this << "]::getYForValue(" << val << "): min = " << min << ", max = " << max << ", log = " << logarithmic << endl;
763 #endif 766 #endif
764 return y; 767 return y;
765 } 768 }
766 769
767 double 770 double
768 FlexiNoteLayer::getValueForY(View *v, int y) const 771 FlexiNoteLayer::getValueForY(LayerGeometryProvider *v, int y) const
769 { 772 {
770 double min = 0.0, max = 0.0; 773 double min = 0.0, max = 0.0;
771 bool logarithmic = false; 774 bool logarithmic = false;
772 int h = v->height(); 775 int h = v->getPaintHeight();
773 776
774 getScaleExtents(v, min, max, logarithmic); 777 getScaleExtents(v, min, max, logarithmic);
775 778
776 double val = min + (double(h - y) * double(max - min)) / h; 779 double val = min + (double(h - y) * double(max - min)) / h;
777 780
792 if (!m_model) return false; 795 if (!m_model) return false;
793 return (m_verticalScale == AutoAlignScale); 796 return (m_verticalScale == AutoAlignScale);
794 } 797 }
795 798
796 void 799 void
797 FlexiNoteLayer::paint(View *v, QPainter &paint, QRect rect) const 800 FlexiNoteLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const
798 { 801 {
799 if (!m_model || !m_model->isOK()) return; 802 if (!m_model || !m_model->isOK()) return;
800 803
801 sv_samplerate_t sampleRate = m_model->getSampleRate(); 804 sv_samplerate_t sampleRate = m_model->getSampleRate();
802 if (!sampleRate) return; 805 if (!sampleRate) return;
858 if (shouldIlluminate && 861 if (shouldIlluminate &&
859 // "illuminatePoint == p" 862 // "illuminatePoint == p"
860 !FlexiNoteModel::Point::Comparator()(illuminatePoint, p) && 863 !FlexiNoteModel::Point::Comparator()(illuminatePoint, p) &&
861 !FlexiNoteModel::Point::Comparator()(p, illuminatePoint)) { 864 !FlexiNoteModel::Point::Comparator()(p, illuminatePoint)) {
862 865
863 paint.drawLine(x, -1, x, v->height() + 1); 866 paint.drawLine(x, -1, x, v->getPaintHeight() + 1);
864 paint.drawLine(x+w, -1, x+w, v->height() + 1); 867 paint.drawLine(x+w, -1, x+w, v->getPaintHeight() + 1);
865 868
866 paint.setPen(v->getForeground()); 869 paint.setPen(v->getForeground());
867 // paint.setBrush(v->getForeground()); 870 // paint.setBrush(v->getForeground());
868 871
869 QString vlabel = QString("freq: %1%2").arg(p.value).arg(m_model->getScaleUnits()); 872 QString vlabel = QString("freq: %1%2").arg(p.value).arg(m_model->getScaleUnits());
870 // v->drawVisibleText(paint, 873 // PaintAssistant::drawVisibleText(v, paint,
871 // x - paint.fontMetrics().width(vlabel) - 2, 874 // x - paint.fontMetrics().width(vlabel) - 2,
872 // y + paint.fontMetrics().height()/2 875 // y + paint.fontMetrics().height()/2
873 // - paint.fontMetrics().descent(), 876 // - paint.fontMetrics().descent(),
874 // vlabel, View::OutlinedText); 877 // vlabel, PaintAssistant::OutlinedText);
875 v->drawVisibleText(paint, 878 PaintAssistant::drawVisibleText(v, paint,
876 x, 879 x,
877 y - h/2 - 2 - paint.fontMetrics().height() 880 y - h/2 - 2 - paint.fontMetrics().height()
878 - paint.fontMetrics().descent(), 881 - paint.fontMetrics().descent(),
879 vlabel, View::OutlinedText); 882 vlabel, PaintAssistant::OutlinedText);
880 883
881 QString hlabel = "dur: " + QString(RealTime::frame2RealTime 884 QString hlabel = "dur: " + QString(RealTime::frame2RealTime
882 (p.duration, m_model->getSampleRate()).toText(true).c_str()); 885 (p.duration, m_model->getSampleRate()).toText(true).c_str());
883 v->drawVisibleText(paint, 886 PaintAssistant::drawVisibleText(v, paint,
884 x, 887 x,
885 y - h/2 - paint.fontMetrics().descent() - 2, 888 y - h/2 - paint.fontMetrics().descent() - 2,
886 hlabel, View::OutlinedText); 889 hlabel, PaintAssistant::OutlinedText);
887 890
888 QString llabel = QString("%1").arg(p.label); 891 QString llabel = QString("%1").arg(p.label);
889 v->drawVisibleText(paint, 892 PaintAssistant::drawVisibleText(v, paint,
890 x, 893 x,
891 y + h + 2 + paint.fontMetrics().descent(), 894 y + h + 2 + paint.fontMetrics().descent(),
892 llabel, View::OutlinedText); 895 llabel, PaintAssistant::OutlinedText);
893 QString nlabel = QString("%1").arg(noteNumber); 896 QString nlabel = QString("%1").arg(noteNumber);
894 v->drawVisibleText(paint, 897 PaintAssistant::drawVisibleText(v, paint,
895 x + paint.fontMetrics().averageCharWidth() / 2, 898 x + paint.fontMetrics().averageCharWidth() / 2,
896 y + h/2 - paint.fontMetrics().descent(), 899 y + h/2 - paint.fontMetrics().descent(),
897 nlabel, View::OutlinedText); 900 nlabel, PaintAssistant::OutlinedText);
898 } 901 }
899 902
900 paint.drawRect(x, y - h/2, w, h); 903 paint.drawRect(x, y - h/2, w, h);
901 } 904 }
902 905
903 paint.restore(); 906 paint.restore();
904 } 907 }
905 908
906 int 909 int
907 FlexiNoteLayer::getVerticalScaleWidth(View *v, bool, QPainter &paint) const 910 FlexiNoteLayer::getVerticalScaleWidth(LayerGeometryProvider *v, bool, QPainter &paint) const
908 { 911 {
909 if (!m_model || shouldAutoAlign()) { 912 if (!m_model || shouldAutoAlign()) {
910 return 0; 913 return 0;
911 } else { 914 } else {
912 if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) { 915 if (m_verticalScale == LogScale || m_verticalScale == MIDIRangeScale) {
916 } 919 }
917 } 920 }
918 } 921 }
919 922
920 void 923 void
921 FlexiNoteLayer::paintVerticalScale(View *v, bool, QPainter &paint, QRect) const 924 FlexiNoteLayer::paintVerticalScale(LayerGeometryProvider *v, bool, QPainter &paint, QRect) const
922 { 925 {
923 if (!m_model || m_model->getPoints().empty()) return; 926 if (!m_model || m_model->getPoints().empty()) return;
924 927
925 QString unit; 928 QString unit;
926 double min, max; 929 double min, max;
927 bool logarithmic; 930 bool logarithmic;
928 931
929 int w = getVerticalScaleWidth(v, false, paint); 932 int w = getVerticalScaleWidth(v, false, paint);
930 int h = v->height(); 933 int h = v->getPaintHeight();
931 934
932 getScaleExtents(v, min, max, logarithmic); 935 getScaleExtents(v, min, max, logarithmic);
933 936
934 if (logarithmic) { 937 if (logarithmic) {
935 LogNumericalScale().paintVertical(v, this, paint, 0, min, max); 938 LogNumericalScale().paintVertical(v, this, paint, 0, min, max);
954 mw)); 957 mw));
955 } 958 }
956 } 959 }
957 960
958 void 961 void
959 FlexiNoteLayer::drawStart(View *v, QMouseEvent *e) 962 FlexiNoteLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e)
960 { 963 {
961 // SVDEBUG << "FlexiNoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; 964 // SVDEBUG << "FlexiNoteLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl;
962 965
963 if (!m_model) return; 966 if (!m_model) return;
964 967
978 981
979 m_editing = true; 982 m_editing = true;
980 } 983 }
981 984
982 void 985 void
983 FlexiNoteLayer::drawDrag(View *v, QMouseEvent *e) 986 FlexiNoteLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e)
984 { 987 {
985 // SVDEBUG << "FlexiNoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; 988 // SVDEBUG << "FlexiNoteLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl;
986 989
987 if (!m_model || !m_editing) return; 990 if (!m_model || !m_editing) return;
988 991
1007 m_editingPoint.duration = newDuration; 1010 m_editingPoint.duration = newDuration;
1008 m_editingCommand->addPoint(m_editingPoint); 1011 m_editingCommand->addPoint(m_editingPoint);
1009 } 1012 }
1010 1013
1011 void 1014 void
1012 FlexiNoteLayer::drawEnd(View *, QMouseEvent *) 1015 FlexiNoteLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *)
1013 { 1016 {
1014 // SVDEBUG << "FlexiNoteLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; 1017 // SVDEBUG << "FlexiNoteLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl;
1015 if (!m_model || !m_editing) return; 1018 if (!m_model || !m_editing) return;
1016 finish(m_editingCommand); 1019 finish(m_editingCommand);
1017 m_editingCommand = 0; 1020 m_editingCommand = 0;
1018 m_editing = false; 1021 m_editing = false;
1019 } 1022 }
1020 1023
1021 void 1024 void
1022 FlexiNoteLayer::eraseStart(View *v, QMouseEvent *e) 1025 FlexiNoteLayer::eraseStart(LayerGeometryProvider *v, QMouseEvent *e)
1023 { 1026 {
1024 if (!m_model) return; 1027 if (!m_model) return;
1025 1028
1026 if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return; 1029 if (!getPointToDrag(v, e->x(), e->y(), m_editingPoint)) return;
1027 1030
1032 1035
1033 m_editing = true; 1036 m_editing = true;
1034 } 1037 }
1035 1038
1036 void 1039 void
1037 FlexiNoteLayer::eraseDrag(View *, QMouseEvent *) 1040 FlexiNoteLayer::eraseDrag(LayerGeometryProvider *, QMouseEvent *)
1038 { 1041 {
1039 } 1042 }
1040 1043
1041 void 1044 void
1042 FlexiNoteLayer::eraseEnd(View *v, QMouseEvent *e) 1045 FlexiNoteLayer::eraseEnd(LayerGeometryProvider *v, QMouseEvent *e)
1043 { 1046 {
1044 if (!m_model || !m_editing) return; 1047 if (!m_model || !m_editing) return;
1045 1048
1046 m_editing = false; 1049 m_editing = false;
1047 1050
1057 m_editingCommand = 0; 1060 m_editingCommand = 0;
1058 m_editing = false; 1061 m_editing = false;
1059 } 1062 }
1060 1063
1061 void 1064 void
1062 FlexiNoteLayer::editStart(View *v, QMouseEvent *e) 1065 FlexiNoteLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e)
1063 { 1066 {
1064 // SVDEBUG << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; 1067 // SVDEBUG << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << endl;
1065 std::cerr << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl; 1068 std::cerr << "FlexiNoteLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl;
1066 1069
1067 if (!m_model) return; 1070 if (!m_model) return;
1108 } 1111 }
1109 std::cerr << "editStart: mode is " << m_editMode << ", note frame: " << onset << ", left boundary: " << m_greatestLeftNeighbourFrame << ", right boundary: " << m_smallestRightNeighbourFrame << std::endl; 1112 std::cerr << "editStart: mode is " << m_editMode << ", note frame: " << onset << ", left boundary: " << m_greatestLeftNeighbourFrame << ", right boundary: " << m_smallestRightNeighbourFrame << std::endl;
1110 } 1113 }
1111 1114
1112 void 1115 void
1113 FlexiNoteLayer::editDrag(View *v, QMouseEvent *e) 1116 FlexiNoteLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e)
1114 { 1117 {
1115 // SVDEBUG << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl; 1118 // SVDEBUG << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << endl;
1116 std::cerr << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << std::endl; 1119 std::cerr << "FlexiNoteLayer::editDrag(" << e->x() << "," << e->y() << ")" << std::endl;
1117 1120
1118 if (!m_model || !m_editing) return; 1121 if (!m_model || !m_editing) return;
1188 1191
1189 std::cerr << "added new point(" << m_editingPoint.frame << "," << m_editingPoint.duration << ")" << std::endl; 1192 std::cerr << "added new point(" << m_editingPoint.frame << "," << m_editingPoint.duration << ")" << std::endl;
1190 } 1193 }
1191 1194
1192 void 1195 void
1193 FlexiNoteLayer::editEnd(View *v, QMouseEvent *e) 1196 FlexiNoteLayer::editEnd(LayerGeometryProvider *v, QMouseEvent *e)
1194 { 1197 {
1195 // SVDEBUG << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; 1198 // SVDEBUG << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl;
1196 std::cerr << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << std::endl; 1199 std::cerr << "FlexiNoteLayer::editEnd(" << e->x() << "," << e->y() << ")" << std::endl;
1197 1200
1198 if (!m_model || !m_editing) return; 1201 if (!m_model || !m_editing) return;
1227 m_editingCommand = 0; 1230 m_editingCommand = 0;
1228 m_editing = false; 1231 m_editing = false;
1229 } 1232 }
1230 1233
1231 void 1234 void
1232 FlexiNoteLayer::splitStart(View *v, QMouseEvent *e) 1235 FlexiNoteLayer::splitStart(LayerGeometryProvider *v, QMouseEvent *e)
1233 { 1236 {
1234 // GF: note splitting starts (!! remove printing soon) 1237 // GF: note splitting starts (!! remove printing soon)
1235 std::cerr << "splitStart (n.b. editStart will be called later, if the user drags the mouse)" << std::endl; 1238 std::cerr << "splitStart (n.b. editStart will be called later, if the user drags the mouse)" << std::endl;
1236 if (!m_model) return; 1239 if (!m_model) return;
1237 1240
1250 m_dragStartX = e->x(); 1253 m_dragStartX = e->x();
1251 m_dragStartY = e->y(); 1254 m_dragStartY = e->y();
1252 } 1255 }
1253 1256
1254 void 1257 void
1255 FlexiNoteLayer::splitEnd(View *v, QMouseEvent *e) 1258 FlexiNoteLayer::splitEnd(LayerGeometryProvider *v, QMouseEvent *e)
1256 { 1259 {
1257 // GF: note splitting ends. (!! remove printing soon) 1260 // GF: note splitting ends. (!! remove printing soon)
1258 std::cerr << "splitEnd" << std::endl; 1261 std::cerr << "splitEnd" << std::endl;
1259 if (!m_model || !m_editing || m_editMode != SplitNote) return; 1262 if (!m_model || !m_editing || m_editMode != SplitNote) return;
1260 1263
1269 1272
1270 splitNotesAt(v, frame, e); 1273 splitNotesAt(v, frame, e);
1271 } 1274 }
1272 1275
1273 void 1276 void
1274 FlexiNoteLayer::splitNotesAt(View *v, sv_frame_t frame) 1277 FlexiNoteLayer::splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame)
1275 { 1278 {
1276 splitNotesAt(v, frame, 0); 1279 splitNotesAt(v, frame, 0);
1277 } 1280 }
1278 1281
1279 void 1282 void
1280 FlexiNoteLayer::splitNotesAt(View *v, sv_frame_t frame, QMouseEvent *e) 1283 FlexiNoteLayer::splitNotesAt(LayerGeometryProvider *v, sv_frame_t frame, QMouseEvent *e)
1281 { 1284 {
1282 FlexiNoteModel::PointList onPoints = m_model->getPoints(frame); 1285 FlexiNoteModel::PointList onPoints = m_model->getPoints(frame);
1283 if (onPoints.empty()) return; 1286 if (onPoints.empty()) return;
1284 1287
1285 FlexiNote note(*onPoints.begin()); 1288 FlexiNote note(*onPoints.begin());
1315 1318
1316 finish(command); 1319 finish(command);
1317 } 1320 }
1318 1321
1319 void 1322 void
1320 FlexiNoteLayer::addNote(View *v, QMouseEvent *e) 1323 FlexiNoteLayer::addNote(LayerGeometryProvider *v, QMouseEvent *e)
1321 { 1324 {
1322 std::cerr << "addNote" << std::endl; 1325 std::cerr << "addNote" << std::endl;
1323 if (!m_model) return; 1326 if (!m_model) return;
1324 1327
1325 sv_frame_t duration = 10000; 1328 sv_frame_t duration = 10000;
1354 finish(command); 1357 finish(command);
1355 } 1358 }
1356 } 1359 }
1357 1360
1358 SparseTimeValueModel * 1361 SparseTimeValueModel *
1359 FlexiNoteLayer::getAssociatedPitchModel(View *v) const 1362 FlexiNoteLayer::getAssociatedPitchModel(LayerGeometryProvider *v) const
1360 { 1363 {
1361 // Better than we used to do, but still not very satisfactory 1364 // Better than we used to do, but still not very satisfactory
1362 1365
1363 // cerr << "FlexiNoteLayer::getAssociatedPitchModel()" << endl; 1366 // cerr << "FlexiNoteLayer::getAssociatedPitchModel()" << endl;
1364 1367
1365 for (int i = 0; i < v->getLayerCount(); ++i) { 1368 for (int i = 0; i < v->getView()->getLayerCount(); ++i) {
1366 Layer *layer = v->getLayer(i); 1369 Layer *layer = v->getView()->getLayer(i);
1367 if (layer && 1370 if (layer &&
1368 layer->getLayerPresentationName() != "candidate") { 1371 layer->getLayerPresentationName() != "candidate") {
1369 // cerr << "FlexiNoteLayer::getAssociatedPitchModel: looks like our layer is " << layer << endl; 1372 // cerr << "FlexiNoteLayer::getAssociatedPitchModel: looks like our layer is " << layer << endl;
1370 SparseTimeValueModel *model = qobject_cast<SparseTimeValueModel *> 1373 SparseTimeValueModel *model = qobject_cast<SparseTimeValueModel *>
1371 (layer->getModel()); 1374 (layer->getModel());
1379 cerr << "FlexiNoteLayer::getAssociatedPitchModel: failed to find a model" << endl; 1382 cerr << "FlexiNoteLayer::getAssociatedPitchModel: failed to find a model" << endl;
1380 return 0; 1383 return 0;
1381 } 1384 }
1382 1385
1383 void 1386 void
1384 FlexiNoteLayer::snapSelectedNotesToPitchTrack(View *v, Selection s) 1387 FlexiNoteLayer::snapSelectedNotesToPitchTrack(LayerGeometryProvider *v, Selection s)
1385 { 1388 {
1386 if (!m_model) return; 1389 if (!m_model) return;
1387 1390
1388 FlexiNoteModel::PointList points = 1391 FlexiNoteModel::PointList points =
1389 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); 1392 m_model->getPoints(s.getStartFrame(), s.getEndFrame());
1417 1420
1418 finish(command); 1421 finish(command);
1419 } 1422 }
1420 1423
1421 void 1424 void
1422 FlexiNoteLayer::mergeNotes(View *v, Selection s, bool inclusive) 1425 FlexiNoteLayer::mergeNotes(LayerGeometryProvider *v, Selection s, bool inclusive)
1423 { 1426 {
1424 FlexiNoteModel::PointList points = 1427 FlexiNoteModel::PointList points =
1425 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); 1428 m_model->getPoints(s.getStartFrame(), s.getEndFrame());
1426 1429
1427 FlexiNoteModel::PointList::iterator i = points.begin(); 1430 FlexiNoteModel::PointList::iterator i = points.begin();
1460 command->addPoint(newNote); 1463 command->addPoint(newNote);
1461 finish(command); 1464 finish(command);
1462 } 1465 }
1463 1466
1464 bool 1467 bool
1465 FlexiNoteLayer::updateNoteValueFromPitchCurve(View *v, 1468 FlexiNoteLayer::updateNoteValueFromPitchCurve(LayerGeometryProvider *v, FlexiNoteModel::Point &note) const
1466 FlexiNoteModel::Point &note) const
1467 { 1469 {
1468 SparseTimeValueModel *model = getAssociatedPitchModel(v); 1470 SparseTimeValueModel *model = getAssociatedPitchModel(v);
1469 if (!model) return false; 1471 if (!model) return false;
1470 1472
1471 std::cerr << model->getTypeName() << std::endl; 1473 std::cerr << model->getTypeName() << std::endl;
1505 1507
1506 return true; 1508 return true;
1507 } 1509 }
1508 1510
1509 void 1511 void
1510 FlexiNoteLayer::mouseMoveEvent(View *v, QMouseEvent *e) 1512 FlexiNoteLayer::mouseMoveEvent(LayerGeometryProvider *v, QMouseEvent *e)
1511 { 1513 {
1512 // GF: context sensitive cursors 1514 // GF: context sensitive cursors
1513 // v->setCursor(Qt::ArrowCursor); 1515 // v->getView()->setCursor(Qt::ArrowCursor);
1514 FlexiNoteModel::Point note(0); 1516 FlexiNoteModel::Point note(0);
1515 if (!getNoteToEdit(v, e->x(), e->y(), note)) { 1517 if (!getNoteToEdit(v, e->x(), e->y(), note)) {
1516 // v->setCursor(Qt::UpArrowCursor); 1518 // v->getView()->setCursor(Qt::UpArrowCursor);
1517 return; 1519 return;
1518 } 1520 }
1519 1521
1520 bool closeToLeft = false, closeToRight = false, 1522 bool closeToLeft = false, closeToRight = false,
1521 closeToTop = false, closeToBottom = false; 1523 closeToTop = false, closeToBottom = false;
1522 getRelativeMousePosition(v, note, e->x(), e->y(), 1524 getRelativeMousePosition(v, note, e->x(), e->y(),
1523 closeToLeft, closeToRight, 1525 closeToLeft, closeToRight,
1524 closeToTop, closeToBottom); 1526 closeToTop, closeToBottom);
1525 1527
1526 if (closeToLeft) { 1528 if (closeToLeft) {
1527 v->setCursor(Qt::SizeHorCursor); 1529 v->getView()->setCursor(Qt::SizeHorCursor);
1528 m_editMode = LeftBoundary; 1530 m_editMode = LeftBoundary;
1529 cerr << "edit mode -> LeftBoundary" << endl; 1531 cerr << "edit mode -> LeftBoundary" << endl;
1530 } else if (closeToRight) { 1532 } else if (closeToRight) {
1531 v->setCursor(Qt::SizeHorCursor); 1533 v->getView()->setCursor(Qt::SizeHorCursor);
1532 m_editMode = RightBoundary; 1534 m_editMode = RightBoundary;
1533 cerr << "edit mode -> RightBoundary" << endl; 1535 cerr << "edit mode -> RightBoundary" << endl;
1534 } else if (closeToTop) { 1536 } else if (closeToTop) {
1535 v->setCursor(Qt::CrossCursor); 1537 v->getView()->setCursor(Qt::CrossCursor);
1536 m_editMode = DragNote; 1538 m_editMode = DragNote;
1537 cerr << "edit mode -> DragNote" << endl; 1539 cerr << "edit mode -> DragNote" << endl;
1538 } else if (closeToBottom) { 1540 } else if (closeToBottom) {
1539 v->setCursor(Qt::UpArrowCursor); 1541 v->getView()->setCursor(Qt::UpArrowCursor);
1540 m_editMode = SplitNote; 1542 m_editMode = SplitNote;
1541 cerr << "edit mode -> SplitNote" << endl; 1543 cerr << "edit mode -> SplitNote" << endl;
1542 } else { 1544 } else {
1543 v->setCursor(Qt::ArrowCursor); 1545 v->getView()->setCursor(Qt::ArrowCursor);
1544 } 1546 }
1545 } 1547 }
1546 1548
1547 void 1549 void
1548 FlexiNoteLayer::getRelativeMousePosition(View *v, FlexiNoteModel::Point &note, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const 1550 FlexiNoteLayer::getRelativeMousePosition(LayerGeometryProvider *v, FlexiNoteModel::Point &note, int x, int y, bool &closeToLeft, bool &closeToRight, bool &closeToTop, bool &closeToBottom) const
1549 { 1551 {
1550 // GF: TODO: consoloidate the tolerance values 1552 // GF: TODO: consoloidate the tolerance values
1551 if (!m_model) return; 1553 if (!m_model) return;
1552 1554
1553 int ctol = 0; 1555 int ctol = 0;
1572 // cerr << "FlexiNoteLayer::getRelativeMousePosition: close to: left " << closeToLeft << " right " << closeToRight << " top " << closeToTop << " bottom " << closeToBottom << endl; 1574 // cerr << "FlexiNoteLayer::getRelativeMousePosition: close to: left " << closeToLeft << " right " << closeToRight << " top " << closeToTop << " bottom " << closeToBottom << endl;
1573 } 1575 }
1574 1576
1575 1577
1576 bool 1578 bool
1577 FlexiNoteLayer::editOpen(View *v, QMouseEvent *e) 1579 FlexiNoteLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e)
1578 { 1580 {
1579 std::cerr << "Opening note editor dialog" << std::endl; 1581 std::cerr << "Opening note editor dialog" << std::endl;
1580 if (!m_model) return false; 1582 if (!m_model) return false;
1581 1583
1582 FlexiNoteModel::Point note(0); 1584 FlexiNoteModel::Point note(0);
1726 1728
1727 finish(command); 1729 finish(command);
1728 } 1730 }
1729 1731
1730 void 1732 void
1731 FlexiNoteLayer::copy(View *v, Selection s, Clipboard &to) 1733 FlexiNoteLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to)
1732 { 1734 {
1733 if (!m_model) return; 1735 if (!m_model) return;
1734 1736
1735 FlexiNoteModel::PointList points = 1737 FlexiNoteModel::PointList points =
1736 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); 1738 m_model->getPoints(s.getStartFrame(), s.getEndFrame());
1744 } 1746 }
1745 } 1747 }
1746 } 1748 }
1747 1749
1748 bool 1750 bool
1749 FlexiNoteLayer::paste(View *v, const Clipboard &from, sv_frame_t /*frameOffset */, bool /* interactive */) 1751 FlexiNoteLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /*frameOffset */, bool /* interactive */)
1750 { 1752 {
1751 if (!m_model) return false; 1753 if (!m_model) return false;
1752 1754
1753 const Clipboard::PointList &points = from.getPoints(); 1755 const Clipboard::PointList &points = from.getPoints();
1754 1756
1755 bool realign = false; 1757 bool realign = false;
1756 1758
1757 if (clipboardHasDifferentAlignment(v, from)) { 1759 if (clipboardHasDifferentAlignment(v, from)) {
1758 1760
1759 QMessageBox::StandardButton button = 1761 QMessageBox::StandardButton button =
1760 QMessageBox::question(v, tr("Re-align pasted items?"), 1762 QMessageBox::question(v->getView(), tr("Re-align pasted items?"),
1761 tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"), 1763 tr("The items you are pasting came from a layer with different source material from this one. Do you want to re-align them in time, to match the source material for this layer?"),
1762 QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, 1764 QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
1763 QMessageBox::Yes); 1765 QMessageBox::Yes);
1764 1766
1765 if (button == QMessageBox::Cancel) { 1767 if (button == QMessageBox::Cancel) {
1892 // double max = attributes.value("scaleMaximum").toDouble(&alsoOk); 1894 // double max = attributes.value("scaleMaximum").toDouble(&alsoOk);
1893 // if (ok && alsoOk && min != max) setDisplayExtents(min, max); 1895 // if (ok && alsoOk && min != max) setDisplayExtents(min, max);
1894 } 1896 }
1895 1897
1896 void 1898 void
1897 FlexiNoteLayer::setVerticalRangeToNoteRange(View *v) 1899 FlexiNoteLayer::setVerticalRangeToNoteRange(LayerGeometryProvider *v)
1898 { 1900 {
1899 double minf = std::numeric_limits<double>::max(); 1901 double minf = std::numeric_limits<double>::max();
1900 double maxf = 0; 1902 double maxf = 0;
1901 bool hasNotes = 0; 1903 bool hasNotes = 0;
1902 for (FlexiNoteModel::PointList::const_iterator i = m_model->getPoints().begin(); 1904 for (FlexiNoteModel::PointList::const_iterator i = m_model->getPoints().begin();
1908 } 1910 }
1909 1911
1910 std::cerr << "min frequency:" << minf << ", max frequency: " << maxf << std::endl; 1912 std::cerr << "min frequency:" << minf << ", max frequency: " << maxf << std::endl;
1911 1913
1912 if (hasNotes) { 1914 if (hasNotes) {
1913 v->getLayer(1)->setDisplayExtents(minf*0.66,maxf*1.5); 1915 v->getView()->getLayer(1)->setDisplayExtents(minf*0.66,maxf*1.5);
1914 // MM: this is a hack because we rely on 1916 // MM: this is a hack because we rely on
1915 // * this layer being automatically aligned to layer 1 1917 // * this layer being automatically aligned to layer 1
1916 // * layer one is a log frequency layer. 1918 // * layer one is a log frequency layer.
1917 } 1919 }
1918 } 1920 }