forked from qt-creator/qt-creator
		
	
		
			
	
	
		
			91 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			91 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|   | #include "mainwindow.h"
 | ||
|  | #include <QFileDialog>
 | ||
|  | #include <QTextStream>
 | ||
|  | #include <QDebug>
 | ||
|  | 
 | ||
|  | MainWindow::MainWindow() | ||
|  | :   QMainWindow(0, 0) | ||
|  | { | ||
|  |     setupUi(this); | ||
|  | 
 | ||
|  |     connect(&m_debugger, SIGNAL(debugOutput(const QString&)), SLOT(appendOutput(const QString&))); | ||
|  |     connect(&m_debugger, SIGNAL(debuggeePaused()), SLOT(onDebuggeePaused()));     | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::setDebuggee(const QString& filename) | ||
|  | { | ||
|  |     m_debugger.openProcess(filename); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::on_actionOpen_triggered() | ||
|  | { | ||
|  |     QString exeName; | ||
|  |     exeName = QFileDialog::getOpenFileName(this, "Open Executable", ".", "*.exe"); | ||
|  |     if (!exeName.isNull()) | ||
|  |         m_debugger.openProcess(exeName); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::on_actionExit_triggered() | ||
|  | { | ||
|  |     close(); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::on_actionBreak_triggered() | ||
|  | { | ||
|  |     m_debugger.breakAtCurrentPosition(); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::on_actionRun_triggered() | ||
|  | { | ||
|  |     m_debugger.continueProcess(); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::on_lstStack_itemClicked(QListWidgetItem* item) | ||
|  | { | ||
|  |     Debugger::StackFrame sf = m_stackTrace[ lstStack->row(item) ]; | ||
|  |     QFile f(sf.filename); | ||
|  |     if (!f.exists()) | ||
|  |         return; | ||
|  | 
 | ||
|  |     f.open(QFile::ReadOnly); | ||
|  |     QTextStream ts(&f); | ||
|  |     int cursorPos = 0; | ||
|  |     int currentLine = 0; | ||
|  |     QString fullText; | ||
|  |     do { | ||
|  |         QString strLine = ts.readLine(); | ||
|  |         currentLine++; | ||
|  |         if (currentLine < sf.line) | ||
|  |             cursorPos += strLine.length(); | ||
|  |         fullText.append(strLine + "\n"); | ||
|  |     } while (!ts.atEnd()); | ||
|  |     codeWindow->setPlainText(fullText); | ||
|  | 
 | ||
|  |     //QList<QTextEdit::ExtraSelection> extraSelections;
 | ||
|  |     //extraSelections.append(QTextEdit::ExtraSelection());
 | ||
|  | 
 | ||
|  |     //QTextEdit::ExtraSelection& exsel = extraSelections.first();
 | ||
|  |     //exsel.cursor.setPosition(cursorPos, QTextCursor::MoveAnchor);
 | ||
|  |     //exsel.cursor.select(QTextCursor::LineUnderCursor);
 | ||
|  |     //exsel.format.setBackground(Qt::red);
 | ||
|  |     //exsel.format.setFontUnderline(true);
 | ||
|  |     //codeWindow->setExtraSelections(extraSelections);
 | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::appendOutput(const QString& str) | ||
|  | { | ||
|  |     teOutput->setPlainText(teOutput->toPlainText() + str); | ||
|  | } | ||
|  | 
 | ||
|  | void MainWindow::onDebuggeePaused() | ||
|  | { | ||
|  |     lstStack->clear(); | ||
|  |     m_stackTrace = m_debugger.stackTrace(); | ||
|  |     foreach (Debugger::StackFrame sf, m_stackTrace) { | ||
|  |         QString str = sf.symbol; | ||
|  |         if (!sf.filename.isEmpty()) | ||
|  |             str.append(" at " + sf.filename + ":" + QString::number(sf.line)); | ||
|  |         lstStack->addItem(str); | ||
|  |     } | ||
|  | } |