You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
1.9KB

  1. #include "MidiEvent.h"
  2. #include "MidiSelectionModel.h"
  3. #include <assert.h>
  4. extern int _mdb;
  5. MidiSelectionModel::MidiSelectionModel()
  6. {
  7. ++_mdb;
  8. }
  9. MidiSelectionModel::~MidiSelectionModel()
  10. {
  11. --_mdb;
  12. }
  13. void MidiSelectionModel::select(std::shared_ptr<MidiEvent> event)
  14. {
  15. selection.clear();
  16. assert(selection.empty());
  17. selection.insert(event);
  18. }
  19. void MidiSelectionModel::extendSelection(std::shared_ptr<MidiEvent> event)
  20. {
  21. selection.insert(event);
  22. }
  23. MidiSelectionModel::const_iterator MidiSelectionModel::begin() const
  24. {
  25. return selection.begin();
  26. }
  27. MidiSelectionModel::const_iterator MidiSelectionModel::end() const
  28. {
  29. return selection.end();
  30. }
  31. void MidiSelectionModel::clear()
  32. {
  33. selection.clear();
  34. }
  35. bool MidiSelectionModel::isSelected(MidiEventPtr evt) const
  36. {
  37. auto it = selection.find(evt);
  38. return it != selection.end();
  39. }
  40. MidiEventPtr MidiSelectionModel::getLast()
  41. {
  42. MidiEventPtr ret;
  43. float lastTime = 0;
  44. for (auto it : selection) {
  45. MidiNoteEventPtr note = safe_cast<MidiNoteEvent>(it);
  46. if (note) {
  47. float noteEnd = note->startTime + note->duration;
  48. if (noteEnd > lastTime) {
  49. ret = note;
  50. lastTime = noteEnd;
  51. }
  52. } else {
  53. float end = it->startTime;
  54. if (end > lastTime) {
  55. ret = it;
  56. lastTime = end;
  57. }
  58. }
  59. }
  60. return ret;
  61. }
  62. MidiSelectionModelPtr MidiSelectionModel::clone() const
  63. {
  64. MidiSelectionModelPtr ret = std::make_shared<MidiSelectionModel>();
  65. for (auto it : selection) {
  66. MidiEventPtr clonedEvent = it->clone();
  67. ret->selection.insert(clonedEvent);
  68. }
  69. return ret;
  70. }
  71. bool MidiSelectionModel::isSelectedDeep(MidiEventPtr evt) const
  72. {
  73. auto it = std::find_if(begin(), end(), [evt](MidiEventPtr ev) {
  74. return *ev == *evt;
  75. });
  76. return it != end();
  77. }