示例#1
0
static QScriptValue prototype_Score_call(QScriptContext* context, QScriptEngine*)
{
    Q_ASSERT(context->callee().isFunction());
    uint _id = context->callee().data().toUInt32();
    Q_ASSERT((_id & 0xFFFF0000) == 0xBABF0000);
    _id &= 0xffff;

    Score* score = qscriptvalue_cast<Score*>(context->thisObject());
    if (!score) {
        return context->throwError(QScriptContext::TypeError,
                                   QString::fromLatin1("Score.%0(): this object is not a Score")
                                   .arg(function_names_score[_id]));
    }
    int argc = context->argumentCount();
    switch(_id) {
    case 0:     // "title",
    {
        Text* t = score->getText(TEXT_TITLE);
        if (argc == 0) {
            QString s = t ? t->getText() : "";
            return qScriptValueFromValue(context->engine(), s);
        }
        else if (argc == 1) {
            QString s = qscriptvalue_cast<QString>(context->argument(0));
            if (t)
                t->setText(s);
            else
                addText(score, TEXT_TITLE, s);
            return context->engine()->undefinedValue();
        }
    }
    break;
    case 1:     // "subtitle",
    {
        Text* t = score->getText(TEXT_SUBTITLE);
        if (argc == 0) {
            QString s = t ? t->getText() : "";
            return qScriptValueFromValue(context->engine(), s);
        }
        else if (argc == 1) {
            QString s = qscriptvalue_cast<QString>(context->argument(0));
            if (t)
                t->setText(s);
            else
                addText(score, TEXT_SUBTITLE, s);
            return context->engine()->undefinedValue();
        }
    }
    break;
    case 2:     // "composer",
    {
        Text* t = score->getText(TEXT_COMPOSER);
        if (argc == 0) {
            QString s = t ? t->getText() : "";
            return qScriptValueFromValue(context->engine(), s);
        }
        else if (argc == 1) {
            QString s = qscriptvalue_cast<QString>(context->argument(0));
            if (t)
                t->setText(s);
            else
                addText(score, TEXT_COMPOSER, s);
            return context->engine()->undefinedValue();
        }
    }
    break;
    case 3:     // "poet",
    {
        Text* t = score->getText(TEXT_POET);
        if (argc == 0) {
            QString s = t ? t->getText() : "";
            return qScriptValueFromValue(context->engine(), s);
        }
        else if (argc == 1) {
            QString s = qscriptvalue_cast<QString>(context->argument(0));
            if (t)
                t->setText(s);
            else
                addText(score, TEXT_POET, s);
            return context->engine()->undefinedValue();
        }
    }
    break;
    case 4:    // "load",
        if (argc == 1) {
            QString s = qscriptvalue_cast<QString>(context->argument(0));
            return qScriptValueFromValue(context->engine(), mscore->readScore(score, s));
        }
        break;
    case 5:     // "save",
    {
        QString s, ext, sf;
        if (argc >= 2) {
            s = qscriptvalue_cast<QString>(context->argument(0));
            ext = qscriptvalue_cast<QString>(context->argument(1));
        }

        if (argc == 2) {
            if(ext == "time") {
                score->updateRepeatList(true);
                QFile file(s);
                file.open(QIODevice::WriteOnly | QIODevice::Text);
                QTextStream out(&file);
                out << "<events>" << endl;
                Measure* lastMeasure = 0;
                foreach (const RepeatSegment* rs, *(score->repeatList())) {
                    int startTick  = rs->tick;
                    int endTick    = startTick + rs->len;
                    int tickOffset = rs->utick - rs->tick;
                    for (Measure* m = score->tick2measure(startTick); m; m = m->nextMeasure()) {
                        int offset = 0;
                        if (lastMeasure && m->isRepeatMeasure())
                            offset = m->tick() - lastMeasure->tick();
                        else
                            lastMeasure = m;

                        SegmentTypes st = SegGrace | SegChordRest;
                        for (Segment* seg = lastMeasure->first(st); seg; seg = seg->next(st)) {
                            int tick = seg->tick() + tickOffset + offset;
                            int time = score->utick2utime(tick) * 1000;
                            out <<  QString(" <event elid=\"%1\" position=\"%2\" />").arg(seg->tick()).arg(time) << endl;
                        }
                        if (m->tick() + m->ticks() >= endTick)
                            break;
                    }
                }
                out << "</events>";
                file.close();
                return context->engine()->undefinedValue();
            }
            else
                return qScriptValueFromValue(context->engine(), mscore->saveAs(score, true, s, ext));
        }

        else if (argc == 6 && ext == "png") {