//======================================================================================= // SelectionValidator implementation //======================================================================================= bool SelectionValidator::is_valid_to_add_tie(SelectionSet* pSelection, ImoNote** ppStartNote, ImoNote** ppEndNote) { //Returns TRUE if current selection is valid for adding a tie. //If valid, returns pointers to start and end notes, if not NULL parameters received //Conditions to be valid: // 1. The first note found can be tied to next one // 2. If condition 1 is true, the next note must also be in the selection bool fValid = false; ImoNote* pStart = NULL; ImoNote* pEnd = NULL; ColStaffObjs* pCollection = pSelection->get_staffobjs_collection(); if (pCollection == NULL) return false; ColStaffObjsIterator it; for (it = pCollection->begin(); it != pCollection->end(); ++it) { ImoObj* pImo = (*it)->imo_object(); if (pImo->is_note()) { if (!pStart) { //first note found. Verify if it can be tied to next pStart = static_cast<ImoNote*>(pImo); if (!pStart->is_tied_next()) { ImoScore* pScore = pStart->get_score(); ColStaffObjs* pCol = pScore->get_staffobjs_table(); pEnd = ScoreAlgorithms::find_possible_end_of_tie(pCol, pStart); } } else { //Start note processed. verify if end note is also in the selection if (pEnd && pEnd->get_id() == pImo->get_id()) { fValid = true; //ok. End note is in the selection break; } } } } if (fValid) { if (ppStartNote) *ppStartNote = pStart; if (ppEndNote) *ppEndNote = pEnd; return true; } else return false; }
//--------------------------------------------------------------------------------------- bool SelectionValidator::is_valid_for_toggle_stem(SelectionSet* pSelection) { //Returns TRUE if current selection is valid to toggle stems. //It is valid if there is at least a note with stem ColStaffObjs* pCollection = pSelection->get_staffobjs_collection(); if (pCollection == NULL) return false; ColStaffObjsIterator it; for (it = pCollection->begin(); it != pCollection->end(); ++it) { ImoObj* pImo = (*it)->imo_object(); if (pImo->is_note()) { ImoNote* pNote = static_cast<ImoNote*>(pImo); if (pNote->get_note_type() > k_whole && !pNote->is_in_chord() && pNote->get_stem_direction() != k_stem_none) return true; } } return false; }