示例#1
0
void Engine::setAccType(QString type) {
    if (currentType != type || recoveredDStack) {
        if (dStack.isEmpty()) {
            currentType = type;
            executeInstructionOnStack("Factory"); // No tr
            state = sAppend;
        } else {
            if (recoveredDStack) {
                //don't call dualReset() or recoveredDStack will be deleted
                dStack.clear();
                iStack.clear();
                braceCount = 0;
                softReset();
                changeResetState(drNone);
                putData(recoveredDStack);
            }
            wantedType = type;

            if (currentType == "NONE") // workaround for bug #3356
                currentType = dStack.top()->getType();

            if (currentType != wantedType) {
                if (!recoveredDStack)
                    executeInstructionOnStack("Convert"); // No tr
                else  // don't convert recoveredStack
                    recoveredDStack = 0;
            }
        }
        // Doublecheck the type in case a factory or convert doesn't go as planned.
        currentType = dStack.top()->getType();
        emit(stackChanged());
    }
    changeResetState(drs);
}
示例#2
0
void Engine::memoryRecall() {
    if (!checkState())
        return;

    if (state == sAppend)
        delete dStack.pop();

    if ( mem ) {
        dStack.push(mem);
        //memory may have different data type
        if (currentType != mem->getType()) {
            wantedType = currentType;
            currentType = mem->getType();
            executeInstructionOnStack("Convert");
            currentType = wantedType;
        }

        executeInstructionOnStack("Copy"); // No tr
        if (!checkState())
            return;
        mem = dStack.pop();
    }
    else
        executeInstructionOnStack("Factory"); // No tr

    changeState(sAppend);
    emit(stackChanged());
}
示例#3
0
void Engine::push(char c) {
    if (!checkState())
        return;
    if (state == sStart) {
        executeInstructionOnStack("Copy"); // No tr
        if (!checkState()) {
            setError("Failed to copy some data"); // No tr
            return;
        }
        dStack.top()->clear();
        if (!dStack.top()->push(c, false)) {
            delete dStack.pop();
            return;
        }
        dStack.top()->clear();
        changeState(sAppend);
    } else {
        if (!Qtopia::mousePreferred() && !iStack.isEmpty() && *iStack.top() == "EvaluateLine") // No tr
            hardReset();
        changeResetState(drSoft);
        if (!dStack.top()->push(c, false)) {
            return;
        }
    }

    dStack.top()->push(c);
    emit(stackChanged());
}
示例#4
0
void Engine::delChar() {
    if (!checkState())
        return;
    if (state == sStart) {
        if (iStack.isEmpty())
            return;
        if (*iStack.top() != "Open brace impl") // No tr
            changeState(sAppend);
        delete iStack.pop();
    }
    else if (state == sAppend) {
        if(dStack.top()->del()) {
            if (dStack.count() == 1) {
                hardReset();
            } else if (dStack.count() > 1) {
                delete dStack.pop();
                if (iStack.count() >= 1) {
                    if (*iStack.top() == "EvaluateLine" ||
                            *iStack.top() != "Open brace impl") {
                        changeState(sAppend);
                    } else {
                        changeState(sStart);
                    }
                    delete iStack.pop();
                } else {
                    changeState(sStart);
                }
            }
        }
    }
    emit(stackChanged());
}
void StackComponent::pop (int numberToRemove, bool autoFocus, bool animate)
{
    numberToRemove = jmin (numberToRemove, contentComps.size());

    int newHead = contentComps.size() - (numberToRemove + 1);
    bool anyRemoved = (numberToRemove > 0);
    bool focusShouldChange = (newHead != getStackFocusIndex()) && anyRemoved;

    if (autoFocus && focusShouldChange && (popAutoFocusOrder == autoFocusBeforeContentChange))
        setStackFocusIndex (newHead, animate);

    while (numberToRemove > 0)
    {
        Component* contentToRemove = contentComps.getLast ();
        contentComps.removeLast ();
        int removalIndex = contentComps.size(); // <- last item is no longer there, so size works

        if (contentToRemove != nullptr) // added to prevent bad access error on NULL contentToRemove
            handleContentComponentRemoved (contentToRemove, removalIndex, animate);
        
        --numberToRemove;
    }

    if (anyRemoved)
    {
        stackChanged ();
    }

    if (autoFocus && focusShouldChange && (popAutoFocusOrder == autoFocusAfterContentChange))
        setStackFocusIndex (newHead, animate);
}
示例#6
0
void DialogStackEdit::stackPopClicked(bool theValue )
{
	if ( m_shape )
		m_shape->set_push( !theValue );

	emit stackChanged();
}
示例#7
0
void Engine::setError(QString s, bool resetStack) {
    if (s.isEmpty())
        s = qApp->translate("Engine","Error");
    if (!resetStack) {
        recoveredDStack = getData();
        putData(recoveredDStack);
    }

    changeState(sError);
    errorString = s;
    emit(stackChanged());
}
示例#8
0
// Input and output
void Engine::pushInstruction(QString name) {
    if (!checkState())
        return;

    Instruction *i = resolve(name);
    previousInstructionsPrecedence = i->precedence;

    // Immediate instructions
    if (!i->precedence) {
        executeInstructionOnStack(i);
        emit(stackChanged());
        return;
    }

    // Overwrite last instruction
    if (!iStack.isEmpty()
            && state == sStart
            && i->precedence
            && previousInstructionsPrecedence) {
        if ("Open brace impl" == *(iStack.top())) { // No tr
            executeInstructionOnStack("Factory"); // No tr
        } else {
            delete iStack.pop();
        }
    }

    // Evaluate previous high-precedence instructions
    if (!iStack.isEmpty()) {
        Instruction *top = resolve(*(iStack.top()));
        if (i->precedence <= top->precedence)
            doEvalStack(top->precedence);
    }

    // Push instruction onto stack
    if (state != sError) {
        iStack.push(new QString(name));
        changeState(sStart);
    }
    emit(stackChanged());
}
示例#9
0
void StackHandler::prependFrames(const StackFrames &frames)
{
    if (frames.isEmpty())
        return;
    const int count = frames.size();
    beginInsertRows(QModelIndex(), 0, count - 1);
    for (int i = count - 1; i >= 0; --i)
        m_stackFrames.prepend(frames.at(i));
    endInsertRows();
    if (m_currentIndex >= 0)
        setCurrentIndex(m_currentIndex + count);
    emit stackChanged();
}
示例#10
0
void Engine::doEvalStack(int p,bool inbrace) {
    if (state == sError || iStack.isEmpty())
        return;
    evalStack(p,inbrace);
    if (!Qtopia::mousePreferred()) {
        if (braceCount == 0)
            iStack.push(new QString("EvaluateLine")); // No tr
        if (braceCount > 0 && inbrace)
            --braceCount;
    }
    if (state != sError)
        changeState(sAppend);
    emit(stackChanged());
}
示例#11
0
void Engine::softReset() {
    if (state == sStart && previousInstructionsPrecedence) {
        if (!iStack.isEmpty())
            delete iStack.pop();
    }

    if (!dStack.isEmpty())
        dStack.top()->clear();
    state = sAppend;

    if (dStack.count() == 1 && !iStack.count())
        changeResetState(drNone);
    else
        changeResetState(drHard);
    emit(stackChanged());
}
void StackComponent::push (Component* contentComponent, bool shouldBeDeleted, bool autoFocus, bool animate)
{
    if (contentComponent)
    {
        jassert (contentComponent != nullptr);
        // The component you are pushing already exists in the stack
        jassert (!contentComps.contains(contentComponent));

        int newIndex = contentComps.size ();
        contentComps.add (contentComponent);

        if (shouldBeDeleted)
            contentComponent->getProperties().set (StackComponentHelpers::deletionFlagId, true);

        handleContentComponentAdded (contentComponent, newIndex, animate);

        stackChanged ();

        if (autoFocus)
            setStackFocusToTop (animate);
    }
}