Mercurial > hg > svgui
comparison layer/ImageLayer.cpp @ 978:64c2b3a4435a 3.0-integration
Merge from branch osx-retina
author | Chris Cannam |
---|---|
date | Fri, 26 Jun 2015 14:10:40 +0100 |
parents | 4fe7a09be0fe |
children | a34a2a25907c |
comparison
equal
deleted
inserted
replaced
977:f40ccbf228c2 | 978:64c2b3a4435a |
---|---|
114 { | 114 { |
115 return false; | 115 return false; |
116 } | 116 } |
117 | 117 |
118 bool | 118 bool |
119 ImageLayer::isLayerScrollable(const View *) const | 119 ImageLayer::isLayerScrollable(const LayerGeometryProvider *) const |
120 { | 120 { |
121 return true; | 121 return true; |
122 } | 122 } |
123 | 123 |
124 | 124 |
125 ImageModel::PointList | 125 ImageModel::PointList |
126 ImageLayer::getLocalPoints(View *v, int x, int ) const | 126 ImageLayer::getLocalPoints(LayerGeometryProvider *v, int x, int ) const |
127 { | 127 { |
128 if (!m_model) return ImageModel::PointList(); | 128 if (!m_model) return ImageModel::PointList(); |
129 | 129 |
130 // SVDEBUG << "ImageLayer::getLocalPoints(" << x << "," << y << "):"; | 130 // SVDEBUG << "ImageLayer::getLocalPoints(" << x << "," << y << "):"; |
131 const ImageModel::PointList &points(m_model->getPoints()); | 131 const ImageModel::PointList &points(m_model->getPoints()); |
167 | 167 |
168 return rv; | 168 return rv; |
169 } | 169 } |
170 | 170 |
171 QString | 171 QString |
172 ImageLayer::getFeatureDescription(View *v, QPoint &pos) const | 172 ImageLayer::getFeatureDescription(LayerGeometryProvider *v, QPoint &pos) const |
173 { | 173 { |
174 int x = pos.x(); | 174 int x = pos.x(); |
175 | 175 |
176 if (!m_model || !m_model->getSampleRate()) return ""; | 176 if (!m_model || !m_model->getSampleRate()) return ""; |
177 | 177 |
206 | 206 |
207 | 207 |
208 //!!! too much overlap with TimeValueLayer/TimeInstantLayer/TextLayer | 208 //!!! too much overlap with TimeValueLayer/TimeInstantLayer/TextLayer |
209 | 209 |
210 bool | 210 bool |
211 ImageLayer::snapToFeatureFrame(View *v, sv_frame_t &frame, | 211 ImageLayer::snapToFeatureFrame(LayerGeometryProvider *v, sv_frame_t &frame, |
212 int &resolution, | 212 int &resolution, |
213 SnapType snap) const | 213 SnapType snap) const |
214 { | 214 { |
215 if (!m_model) { | 215 if (!m_model) { |
216 return Layer::snapToFeatureFrame(v, frame, resolution, snap); | 216 return Layer::snapToFeatureFrame(v, frame, resolution, snap); |
278 frame = snapped; | 278 frame = snapped; |
279 return found; | 279 return found; |
280 } | 280 } |
281 | 281 |
282 void | 282 void |
283 ImageLayer::paint(View *v, QPainter &paint, QRect rect) const | 283 ImageLayer::paint(LayerGeometryProvider *v, QPainter &paint, QRect rect) const |
284 { | 284 { |
285 if (!m_model || !m_model->isOK()) return; | 285 if (!m_model || !m_model->isOK()) return; |
286 | 286 |
287 sv_samplerate_t sampleRate = m_model->getSampleRate(); | 287 sv_samplerate_t sampleRate = m_model->getSampleRate(); |
288 if (!sampleRate) return; | 288 if (!sampleRate) return; |
289 | 289 |
290 // Profiler profiler("ImageLayer::paint", true); | 290 // Profiler profiler("ImageLayer::paint", true); |
291 | 291 |
292 // int x0 = rect.left(), x1 = rect.right(); | 292 // int x0 = rect.left(), x1 = rect.right(); |
293 int x0 = 0, x1 = v->width(); | 293 int x0 = 0, x1 = v->getPaintWidth(); |
294 | 294 |
295 sv_frame_t frame0 = v->getFrameForX(x0); | 295 sv_frame_t frame0 = v->getFrameForX(x0); |
296 sv_frame_t frame1 = v->getFrameForX(x1); | 296 sv_frame_t frame1 = v->getFrameForX(x1); |
297 | 297 |
298 ImageModel::PointList points(m_model->getPoints(frame0, frame1)); | 298 ImageModel::PointList points(m_model->getPoints(frame0, frame1)); |
299 if (points.empty()) return; | 299 if (points.empty()) return; |
300 | 300 |
301 paint.save(); | 301 paint.save(); |
302 paint.setClipRect(rect.x(), 0, rect.width(), v->height()); | 302 paint.setClipRect(rect.x(), 0, rect.width(), v->getPaintHeight()); |
303 | 303 |
304 QColor penColour; | 304 QColor penColour; |
305 penColour = v->getForeground(); | 305 penColour = v->getForeground(); |
306 | 306 |
307 QColor brushColour; | 307 QColor brushColour; |
336 paint.setRenderHint(QPainter::Antialiasing, false); | 336 paint.setRenderHint(QPainter::Antialiasing, false); |
337 paint.restore(); | 337 paint.restore(); |
338 } | 338 } |
339 | 339 |
340 void | 340 void |
341 ImageLayer::drawImage(View *v, QPainter &paint, const ImageModel::Point &p, | 341 ImageLayer::drawImage(LayerGeometryProvider *v, QPainter &paint, const ImageModel::Point &p, |
342 int x, int nx) const | 342 int x, int nx) const |
343 { | 343 { |
344 QString label = p.label; | 344 QString label = p.label; |
345 QString imageName = p.image; | 345 QString imageName = p.image; |
346 | 346 |
356 | 356 |
357 int topMargin = 10; | 357 int topMargin = 10; |
358 int bottomMargin = 10; | 358 int bottomMargin = 10; |
359 int spacing = 5; | 359 int spacing = 5; |
360 | 360 |
361 if (v->height() < 100) { | 361 if (v->getPaintHeight() < 100) { |
362 topMargin = 5; | 362 topMargin = 5; |
363 bottomMargin = 5; | 363 bottomMargin = 5; |
364 } | 364 } |
365 | 365 |
366 int maxBoxHeight = v->height() - topMargin - bottomMargin; | 366 int maxBoxHeight = v->getPaintHeight() - topMargin - bottomMargin; |
367 | 367 |
368 int availableWidth = nx - x - 3; | 368 int availableWidth = nx - x - 3; |
369 if (availableWidth < 20) availableWidth = 20; | 369 if (availableWidth < 20) availableWidth = 20; |
370 | 370 |
371 QRect labelRect; | 371 QRect labelRect; |
372 | 372 |
373 if (label != "") { | 373 if (label != "") { |
374 | 374 |
375 int likelyHeight = v->height() / 4; | 375 int likelyHeight = v->getPaintHeight() / 4; |
376 | 376 |
377 int likelyWidth = // available height times image aspect | 377 int likelyWidth = // available height times image aspect |
378 ((maxBoxHeight - likelyHeight) * imageSize.width()) | 378 ((maxBoxHeight - likelyHeight) * imageSize.width()) |
379 / imageSize.height(); | 379 / imageSize.height(); |
380 | 380 |
433 } | 433 } |
434 boxHeight += paint.fontMetrics().height(); | 434 boxHeight += paint.fontMetrics().height(); |
435 division += paint.fontMetrics().height(); | 435 division += paint.fontMetrics().height(); |
436 } | 436 } |
437 | 437 |
438 bottomMargin = v->height() - topMargin - boxHeight; | 438 bottomMargin = v->getPaintHeight() - topMargin - boxHeight; |
439 if (bottomMargin > topMargin + v->height()/7) { | 439 if (bottomMargin > topMargin + v->getPaintHeight()/7) { |
440 topMargin += v->height()/8; | 440 topMargin += v->getPaintHeight()/8; |
441 bottomMargin -= v->height()/8; | 441 bottomMargin -= v->getPaintHeight()/8; |
442 } | 442 } |
443 | 443 |
444 paint.drawRect(x - 1, | 444 paint.drawRect(x - 1, |
445 topMargin - 1, | 445 topMargin - 1, |
446 boxWidth + 2, | 446 boxWidth + 2, |
478 label); | 478 label); |
479 } | 479 } |
480 } | 480 } |
481 | 481 |
482 void | 482 void |
483 ImageLayer::setLayerDormant(const View *v, bool dormant) | 483 ImageLayer::setLayerDormant(const LayerGeometryProvider *v, bool dormant) |
484 { | 484 { |
485 if (dormant) { | 485 if (dormant) { |
486 // Delete the images named in the view's scaled map from the | 486 // Delete the images named in the view's scaled map from the |
487 // general image map as well. They can always be re-loaded | 487 // general image map as well. They can always be re-loaded |
488 // if it turns out another view still needs them. | 488 // if it turns out another view still needs them. |
515 return true; | 515 return true; |
516 } | 516 } |
517 } | 517 } |
518 | 518 |
519 QImage | 519 QImage |
520 ImageLayer::getImage(View *v, QString name, QSize maxSize) const | 520 ImageLayer::getImage(LayerGeometryProvider *v, QString name, QSize maxSize) const |
521 { | 521 { |
522 // SVDEBUG << "ImageLayer::getImage(" << v << ", " << name << ", (" | 522 // SVDEBUG << "ImageLayer::getImage(" << v << ", " << name << ", (" |
523 // << maxSize.width() << "x" << maxSize.height() << "))" << endl; | 523 // << maxSize.width() << "x" << maxSize.height() << "))" << endl; |
524 | 524 |
525 if (!m_scaled[v][name].isNull() && | 525 if (!m_scaled[v][name].isNull() && |
552 | 552 |
553 return m_scaled[v][name]; | 553 return m_scaled[v][name]; |
554 } | 554 } |
555 | 555 |
556 void | 556 void |
557 ImageLayer::drawStart(View *v, QMouseEvent *e) | 557 ImageLayer::drawStart(LayerGeometryProvider *v, QMouseEvent *e) |
558 { | 558 { |
559 // SVDEBUG << "ImageLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; | 559 // SVDEBUG << "ImageLayer::drawStart(" << e->x() << "," << e->y() << ")" << endl; |
560 | 560 |
561 if (!m_model) { | 561 if (!m_model) { |
562 SVDEBUG << "ImageLayer::drawStart: no model" << endl; | 562 SVDEBUG << "ImageLayer::drawStart: no model" << endl; |
576 | 576 |
577 m_editing = true; | 577 m_editing = true; |
578 } | 578 } |
579 | 579 |
580 void | 580 void |
581 ImageLayer::drawDrag(View *v, QMouseEvent *e) | 581 ImageLayer::drawDrag(LayerGeometryProvider *v, QMouseEvent *e) |
582 { | 582 { |
583 // SVDEBUG << "ImageLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; | 583 // SVDEBUG << "ImageLayer::drawDrag(" << e->x() << "," << e->y() << ")" << endl; |
584 | 584 |
585 if (!m_model || !m_editing) return; | 585 if (!m_model || !m_editing) return; |
586 | 586 |
592 m_editingPoint.frame = frame; | 592 m_editingPoint.frame = frame; |
593 m_editingCommand->addPoint(m_editingPoint); | 593 m_editingCommand->addPoint(m_editingPoint); |
594 } | 594 } |
595 | 595 |
596 void | 596 void |
597 ImageLayer::drawEnd(View *, QMouseEvent *) | 597 ImageLayer::drawEnd(LayerGeometryProvider *, QMouseEvent *) |
598 { | 598 { |
599 // SVDEBUG << "ImageLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; | 599 // SVDEBUG << "ImageLayer::drawEnd(" << e->x() << "," << e->y() << ")" << endl; |
600 if (!m_model || !m_editing) return; | 600 if (!m_model || !m_editing) return; |
601 | 601 |
602 ImageDialog dialog(tr("Select image"), "", ""); | 602 ImageDialog dialog(tr("Select image"), "", ""); |
636 finish(command); | 636 finish(command); |
637 return true; | 637 return true; |
638 } | 638 } |
639 | 639 |
640 void | 640 void |
641 ImageLayer::editStart(View *v, QMouseEvent *e) | 641 ImageLayer::editStart(LayerGeometryProvider *v, QMouseEvent *e) |
642 { | 642 { |
643 // SVDEBUG << "ImageLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; | 643 // SVDEBUG << "ImageLayer::editStart(" << e->x() << "," << e->y() << ")" << endl; |
644 | 644 |
645 if (!m_model) return; | 645 if (!m_model) return; |
646 | 646 |
658 | 658 |
659 m_editing = true; | 659 m_editing = true; |
660 } | 660 } |
661 | 661 |
662 void | 662 void |
663 ImageLayer::editDrag(View *v, QMouseEvent *e) | 663 ImageLayer::editDrag(LayerGeometryProvider *v, QMouseEvent *e) |
664 { | 664 { |
665 if (!m_model || !m_editing) return; | 665 if (!m_model || !m_editing) return; |
666 | 666 |
667 sv_frame_t frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); | 667 sv_frame_t frameDiff = v->getFrameForX(e->x()) - v->getFrameForX(m_editOrigin.x()); |
668 sv_frame_t frame = m_originalPoint.frame + frameDiff; | 668 sv_frame_t frame = m_originalPoint.frame + frameDiff; |
678 m_editingPoint.frame = frame; | 678 m_editingPoint.frame = frame; |
679 m_editingCommand->addPoint(m_editingPoint); | 679 m_editingCommand->addPoint(m_editingPoint); |
680 } | 680 } |
681 | 681 |
682 void | 682 void |
683 ImageLayer::editEnd(View *, QMouseEvent *) | 683 ImageLayer::editEnd(LayerGeometryProvider *, QMouseEvent *) |
684 { | 684 { |
685 // SVDEBUG << "ImageLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; | 685 // SVDEBUG << "ImageLayer::editEnd(" << e->x() << "," << e->y() << ")" << endl; |
686 if (!m_model || !m_editing) return; | 686 if (!m_model || !m_editing) return; |
687 | 687 |
688 if (m_editingCommand) { | 688 if (m_editingCommand) { |
692 m_editingCommand = 0; | 692 m_editingCommand = 0; |
693 m_editing = false; | 693 m_editing = false; |
694 } | 694 } |
695 | 695 |
696 bool | 696 bool |
697 ImageLayer::editOpen(View *v, QMouseEvent *e) | 697 ImageLayer::editOpen(LayerGeometryProvider *v, QMouseEvent *e) |
698 { | 698 { |
699 if (!m_model) return false; | 699 if (!m_model) return false; |
700 | 700 |
701 ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); | 701 ImageModel::PointList points = getLocalPoints(v, e->x(), e->y()); |
702 if (points.empty()) return false; | 702 if (points.empty()) return false; |
799 | 799 |
800 finish(command); | 800 finish(command); |
801 } | 801 } |
802 | 802 |
803 void | 803 void |
804 ImageLayer::copy(View *v, Selection s, Clipboard &to) | 804 ImageLayer::copy(LayerGeometryProvider *v, Selection s, Clipboard &to) |
805 { | 805 { |
806 if (!m_model) return; | 806 if (!m_model) return; |
807 | 807 |
808 ImageModel::PointList points = | 808 ImageModel::PointList points = |
809 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); | 809 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); |
817 } | 817 } |
818 } | 818 } |
819 } | 819 } |
820 | 820 |
821 bool | 821 bool |
822 ImageLayer::paste(View *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) | 822 ImageLayer::paste(LayerGeometryProvider *v, const Clipboard &from, sv_frame_t /* frameOffset */, bool /* interactive */) |
823 { | 823 { |
824 if (!m_model) return false; | 824 if (!m_model) return false; |
825 | 825 |
826 const Clipboard::PointList &points = from.getPoints(); | 826 const Clipboard::PointList &points = from.getPoints(); |
827 | 827 |
828 bool realign = false; | 828 bool realign = false; |
829 | 829 |
830 if (clipboardHasDifferentAlignment(v, from)) { | 830 if (clipboardHasDifferentAlignment(v, from)) { |
831 | 831 |
832 QMessageBox::StandardButton button = | 832 QMessageBox::StandardButton button = |
833 QMessageBox::question(v, tr("Re-align pasted items?"), | 833 QMessageBox::question(v->getView(), tr("Re-align pasted items?"), |
834 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?"), | 834 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?"), |
835 QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, | 835 QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, |
836 QMessageBox::Yes); | 836 QMessageBox::Yes); |
837 | 837 |
838 if (button == QMessageBox::Cancel) { | 838 if (button == QMessageBox::Cancel) { |