Mercurial > hg > svgui
comparison layer/TextLayer.cpp @ 374:64e84e5efb76 spectrogram-cache-rejig
* Merge from trunk
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 11:59:42 +0000 |
parents | 984c1975f1ff |
children |
comparison
equal
deleted
inserted
replaced
332:6440e280122e | 374:64e84e5efb76 |
---|---|
25 | 25 |
26 #include <QPainter> | 26 #include <QPainter> |
27 #include <QMouseEvent> | 27 #include <QMouseEvent> |
28 #include <QInputDialog> | 28 #include <QInputDialog> |
29 #include <QTextStream> | 29 #include <QTextStream> |
30 #include <QMessageBox> | |
30 | 31 |
31 #include <iostream> | 32 #include <iostream> |
32 #include <cmath> | 33 #include <cmath> |
33 | 34 |
34 TextLayer::TextLayer() : | 35 TextLayer::TextLayer() : |
446 m_editingCommand = 0; | 447 m_editingCommand = 0; |
447 m_editing = false; | 448 m_editing = false; |
448 } | 449 } |
449 | 450 |
450 void | 451 void |
452 TextLayer::eraseStart(View *v, QMouseEvent *e) | |
453 { | |
454 if (!m_model) return; | |
455 | |
456 TextModel::PointList points = getLocalPoints(v, e->x(), e->y()); | |
457 if (points.empty()) return; | |
458 | |
459 m_editingPoint = *points.begin(); | |
460 | |
461 if (m_editingCommand) { | |
462 m_editingCommand->finish(); | |
463 m_editingCommand = 0; | |
464 } | |
465 | |
466 m_editing = true; | |
467 } | |
468 | |
469 void | |
470 TextLayer::eraseDrag(View *v, QMouseEvent *e) | |
471 { | |
472 } | |
473 | |
474 void | |
475 TextLayer::eraseEnd(View *v, QMouseEvent *e) | |
476 { | |
477 if (!m_model || !m_editing) return; | |
478 | |
479 m_editing = false; | |
480 | |
481 TextModel::PointList points = getLocalPoints(v, e->x(), e->y()); | |
482 if (points.empty()) return; | |
483 if (points.begin()->frame != m_editingPoint.frame || | |
484 points.begin()->height != m_editingPoint.height) return; | |
485 | |
486 m_editingCommand = new TextModel::EditCommand | |
487 (m_model, tr("Erase Point")); | |
488 | |
489 m_editingCommand->deletePoint(m_editingPoint); | |
490 | |
491 m_editingCommand->finish(); | |
492 m_editingCommand = 0; | |
493 m_editing = false; | |
494 } | |
495 | |
496 void | |
451 TextLayer::editStart(View *v, QMouseEvent *e) | 497 TextLayer::editStart(View *v, QMouseEvent *e) |
452 { | 498 { |
453 // std::cerr << "TextLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl; | 499 // std::cerr << "TextLayer::editStart(" << e->x() << "," << e->y() << ")" << std::endl; |
454 | 500 |
455 if (!m_model) return; | 501 if (!m_model) return; |
624 | 670 |
625 command->finish(); | 671 command->finish(); |
626 } | 672 } |
627 | 673 |
628 void | 674 void |
629 TextLayer::copy(Selection s, Clipboard &to) | 675 TextLayer::copy(View *v, Selection s, Clipboard &to) |
630 { | 676 { |
631 if (!m_model) return; | 677 if (!m_model) return; |
632 | 678 |
633 TextModel::PointList points = | 679 TextModel::PointList points = |
634 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); | 680 m_model->getPoints(s.getStartFrame(), s.getEndFrame()); |
635 | 681 |
636 for (TextModel::PointList::iterator i = points.begin(); | 682 for (TextModel::PointList::iterator i = points.begin(); |
637 i != points.end(); ++i) { | 683 i != points.end(); ++i) { |
638 if (s.contains(i->frame)) { | 684 if (s.contains(i->frame)) { |
639 Clipboard::Point point(i->frame, i->height, i->label); | 685 Clipboard::Point point(i->frame, i->height, i->label); |
686 point.setReferenceFrame(alignToReference(v, i->frame)); | |
640 to.addPoint(point); | 687 to.addPoint(point); |
641 } | 688 } |
642 } | 689 } |
643 } | 690 } |
644 | 691 |
645 bool | 692 bool |
646 TextLayer::paste(const Clipboard &from, int frameOffset, bool /* interactive */) | 693 TextLayer::paste(View *v, const Clipboard &from, int frameOffset, bool /* interactive */) |
647 { | 694 { |
648 if (!m_model) return false; | 695 if (!m_model) return false; |
649 | 696 |
650 const Clipboard::PointList &points = from.getPoints(); | 697 const Clipboard::PointList &points = from.getPoints(); |
698 | |
699 bool realign = false; | |
700 | |
701 if (clipboardHasDifferentAlignment(v, from)) { | |
702 | |
703 QMessageBox::StandardButton button = | |
704 QMessageBox::question(v, tr("Re-align pasted items?"), | |
705 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?"), | |
706 QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, | |
707 QMessageBox::Yes); | |
708 | |
709 if (button == QMessageBox::Cancel) { | |
710 return false; | |
711 } | |
712 | |
713 if (button == QMessageBox::Yes) { | |
714 realign = true; | |
715 } | |
716 } | |
651 | 717 |
652 TextModel::EditCommand *command = | 718 TextModel::EditCommand *command = |
653 new TextModel::EditCommand(m_model, tr("Paste")); | 719 new TextModel::EditCommand(m_model, tr("Paste")); |
654 | 720 |
655 float valueMin = 0.0, valueMax = 1.0; | 721 float valueMin = 0.0, valueMax = 1.0; |
665 for (Clipboard::PointList::const_iterator i = points.begin(); | 731 for (Clipboard::PointList::const_iterator i = points.begin(); |
666 i != points.end(); ++i) { | 732 i != points.end(); ++i) { |
667 | 733 |
668 if (!i->haveFrame()) continue; | 734 if (!i->haveFrame()) continue; |
669 size_t frame = 0; | 735 size_t frame = 0; |
670 if (frameOffset > 0 || -frameOffset < i->getFrame()) { | 736 |
671 frame = i->getFrame() + frameOffset; | 737 if (!realign) { |
738 | |
739 frame = i->getFrame(); | |
740 | |
741 } else { | |
742 | |
743 if (i->haveReferenceFrame()) { | |
744 frame = i->getReferenceFrame(); | |
745 frame = alignFromReference(v, frame); | |
746 } else { | |
747 frame = i->getFrame(); | |
748 } | |
672 } | 749 } |
750 | |
673 TextModel::Point newPoint(frame); | 751 TextModel::Point newPoint(frame); |
674 | 752 |
675 if (i->haveValue()) { | 753 if (i->haveValue()) { |
676 newPoint.height = (i->getValue() - valueMin) / (valueMax - valueMin); | 754 newPoint.height = (i->getValue() - valueMin) / (valueMax - valueMin); |
677 } else { | 755 } else { |