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); }
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()); }
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()); }
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); }
void DialogStackEdit::stackPopClicked(bool theValue ) { if ( m_shape ) m_shape->set_push( !theValue ); emit stackChanged(); }
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()); }
// 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()); }
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(); }
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()); }
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); } }