QString RegisterPane::getRegisterText(int registerNo) { unsigned int value = m_registerLabels[registerNo]->getValue(); QString alias = ::getRegisterText(registerNo, true); QString regName = ((registerNo >= 32) ? QString("<b>%1</b>").arg(alias) : QString("<b>r%1</b> (%2)").arg(QString::number(registerNo), alias)); QString mText = QString( "<span style=\"font-size: 12;\">%1</span>" "<pre>").arg(regName); if (value == 0) mText += QString("Value = 0"); else { QString one = getNoInBase(value, 16), // two = getNoInBase(value, 2), three = getNoInBase((signed)value, -10),//D_SIGNED_DECIMAL), four = getNoInBase(value, 10); mText += QString( "Hex: %1<br>" // "Binary: %2<br>" "Decimal: %2") .arg(one, /*two, */three); if (three != four) mText += QString("<br>UDecimal: %1").arg(four); } // Display the line which is responsible for setting // the value currently in this register. ParseNode *lastModified = m_registerLabels[registerNo]->m_lastModified; TextEditor *active = NULL; if (lastModified != NULL && lastModified->isValid() && lastModified->getTextBlock() != NULL && (active = m_parent->m_gui->getActiveProgram()) != NULL) { mText += QString("<br>" "(Set by line <i>%1</i>)").arg(1 + active->lineNumber(*lastModified->getTextBlock())); } mText += QString("</pre>"); return mText; }
void TextEditor::pcChanged(ParseNode *pc, bool justRolledBack) { ParseNode *old = m_pc; // cerr << "\tpcChanged id:" << QThread::currentThreadId() << "\n"; if (old == pc) return; m_pc = pc; // if (m_program->getStatus() != PAUSED) // return; if (old != NULL) { QTextBlock *b = old->getTextBlock(); int state = b->userState(); if (state > 0) b->setUserState(state & ~B_CURRENT_PC); } if (m_pc != NULL) { QTextBlock *b = m_pc->getTextBlock(); // cerr << "b: " << b->text().toStdString() << endl; int state = b->userState(); if (state < 0) b->setUserState(B_CURRENT_PC); else b->setUserState(state | B_CURRENT_PC); if (!justRolledBack && b != NULL) { QTextCursor c = textCursor(); c.setPosition(b->position()); setTextCursor(c); ensureCursorVisible(); } } m_parent->updateLineNumbers(0); // the 2 can be changed according to preferences later // just be sure to also change the fading factors in paintEvent. m_program->getLastXInstructions(Options::noPreviousXInstructions(), m_lastInstructions); viewport()->update(); }
void StackView::updateDisplay(State *s, int state) { if (m_dirty && state != RUNNING) { s->getStack(m_stack); int cur_index = 0, size = m_stack.size(); const unsigned int base = 16; // hex const QString &longestAddr = QString::number(STACK_BASE_ADDRESS - 4, base); const int maxAddrLength = longestAddr.length(); m_display->setUpdatesEnabled(false); m_display->setPlainText(""); QString text; unsigned int address = STACK_BASE_ADDRESS - 4; foreach(int value, m_stack) { QString addr = QString::number(address, base); for(int max = addr.length(), i = maxAddrLength; i > max; i--) addr += " "; const QString &valString = QString::number(value, base); text = QString(": %1\n").arg(valString); QTextCursor c = m_display->textCursor(); c.movePosition(QTextCursor::End); //int oldEnd = c.position(); QTextCharFormat format(m_display->currentCharFormat()); if (cur_index++ > 200) { if (VERBOSE) cerr << "STACK_SIZE: " << m_stack.size() << endl; c.insertText(QString("... STACK IS TOO LARGE TO DISPLAY ...\n" "You may be in an infinite loop. Stack size: %1 words").arg(QString::number(size))); /*QMessageBox::warning(this, tr("Stack warning"), QString("Stack is too large to display.\n" "You may be in an infinite loop. Stack size: %1 words").arg(QString::number(size)));*/ break; } // TODO: Have tip tell which line last modified it! QString tip = QString("Hex: %1: %2<br>" "Dec: %3: %4").arg(addr, valString, QString::number(address, 10), QString::number(value, 10)); if (address == m_sp) { format.setFontWeight(100); tip += "<br>(<b>$sp</b>)"; } if (m_modifiedMap.contains(address)) { ParseNode *last = m_modifiedMap[address]; TextEditor *active = NULL; if (last != NULL && last->isValid() && last->getTextBlock() != NULL && (active = m_gui->getActiveProgram()) != NULL) { tip += QString("<br>" "(Set by line <i>%1</i>)").arg(1 + active->lineNumber(*last->getTextBlock())); } } format.setToolTip(tip); c.insertText(addr, format); if (address == m_sp) format.setFontWeight(50); c.insertText(text, format); address -= 4; }