void InstrumentWizard::on_belowButton_clicked() { QList<QTreeWidgetItem*> wi = partiturList->selectedItems(); if (wi.isEmpty()) return; QTreeWidgetItem* item = wi.front(); if (item->type() != STAFF_LIST_ITEM) return; StaffListItem* sli = (StaffListItem*)item; Staff* staff = sli->staff; PartListItem* pli = (PartListItem*)sli->parent(); StaffListItem* nsli = new StaffListItem(); nsli->staff = staff; nsli->setClef(sli->clef()); if (staff) nsli->op = ITEM_ADD; pli->insertChild(pli->indexOfChild(sli)+1, nsli); partiturList->clearSelection(); // should not be necessary partiturList->setItemSelected(nsli, true); }
void InstrumentWizard::createInstruments(Score* cs) { // // process modified partitur list // QTreeWidget* pl = partiturList; Part* part = 0; int staffIdx = 0; QTreeWidgetItem* item = 0; for (int idx = 0; (item = pl->topLevelItem(idx)); ++idx) { PartListItem* pli = (PartListItem*)item; if (pli->op != ITEM_ADD) { qDebug("bad op\n"); continue; } const InstrumentTemplate* t = ((PartListItem*)item)->it; part = new Part(cs); part->initFromInstrTemplate(t); pli->part = part; QTreeWidgetItem* ci = 0; int rstaff = 0; for (int cidx = 0; (ci = pli->child(cidx)); ++cidx) { StaffListItem* sli = (StaffListItem*)ci; Staff* staff = new Staff(cs, part, rstaff); sli->staff = staff; staff->setRstaff(rstaff); ++rstaff; staff->init(t, cidx); staff->setInitialClef(sli->clef()); if (sli->linked() && !part->staves()->isEmpty()) { Staff* linkedStaff = part->staves()->back(); linkedStaff->linkTo(staff); } part->staves()->push_back(staff); cs->staves().insert(staffIdx + rstaff, staff); } // insert part cs->insertPart(part, staffIdx); int sidx = cs->staffIdx(part); int eidx = sidx + part->nstaves(); for (Measure* m = cs->firstMeasure(); m; m = m->nextMeasure()) m->cmdAddStaves(sidx, eidx, true); staffIdx += rstaff; } // // sort staves // QList<Staff*> dst; for (int idx = 0; (item = pl->topLevelItem(idx)); ++idx) { PartListItem* pli = (PartListItem*)item; if (pli->op == ITEM_DELETE) continue; QTreeWidgetItem* ci = 0; for (int cidx = 0; (ci = item->child(cidx)); ++cidx) { StaffListItem* sli = (StaffListItem*) ci; if (sli->op == ITEM_DELETE) continue; dst.push_back(sli->staff); } } #if 1 // // check for bar lines // for (int staffIdx = 0; staffIdx < cs->nstaves();) { Staff* staff = cs->staff(staffIdx); int barLineSpan = staff->barLineSpan(); if (barLineSpan == 0) staff->setBarLineSpan(1); int nstaffIdx = staffIdx + barLineSpan; for (int idx = staffIdx+1; idx < nstaffIdx; ++idx) cs->staff(idx)->setBarLineSpan(0); staffIdx = nstaffIdx; } #endif cs->setLayoutAll(true); }