* work save: compile issue panel
This commit is contained in:
parent
aad78fa475
commit
92ffbb084f
|
@ -10,6 +10,8 @@ CompilerManager::CompilerManager(QObject *parent) : QObject(parent)
|
||||||
mCompiler = nullptr;
|
mCompiler = nullptr;
|
||||||
mBackgroundSyntaxChecker = nullptr;
|
mBackgroundSyntaxChecker = nullptr;
|
||||||
mRunner = nullptr;
|
mRunner = nullptr;
|
||||||
|
mSyntaxCheckErrorCount = 0;
|
||||||
|
mCompileErrorCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CompilerManager::compiling()
|
bool CompilerManager::compiling()
|
||||||
|
@ -28,8 +30,10 @@ void CompilerManager::compile(const QString& filename, const QByteArray& encodin
|
||||||
if (mCompiler!=nullptr) {
|
if (mCompiler!=nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
mCompileErrorCount = 0;
|
||||||
mCompiler = new FileCompiler(filename,encoding,silent,onlyCheckSyntax);
|
mCompiler = new FileCompiler(filename,encoding,silent,onlyCheckSyntax);
|
||||||
connect(mCompiler, &Compiler::compileFinished, this ,&CompilerManager::onCompileFinished);
|
connect(mCompiler, &Compiler::compileFinished, this ,&CompilerManager::onCompileFinished);
|
||||||
|
connect(mCompiler, &Compiler::compileFinished, pMainWindow, &MainWindow::onCompileFinished);
|
||||||
connect(mCompiler, &Compiler::compileOutput, pMainWindow, &MainWindow::onCompileLog);
|
connect(mCompiler, &Compiler::compileOutput, pMainWindow, &MainWindow::onCompileLog);
|
||||||
connect(mCompiler, &Compiler::compileIssue, pMainWindow, &MainWindow::onCompileIssue);
|
connect(mCompiler, &Compiler::compileIssue, pMainWindow, &MainWindow::onCompileIssue);
|
||||||
connect(mCompiler, &Compiler::compileErrorOccured, pMainWindow, &MainWindow::onCompileErrorOccured);
|
connect(mCompiler, &Compiler::compileErrorOccured, pMainWindow, &MainWindow::onCompileErrorOccured);
|
||||||
|
@ -60,7 +64,6 @@ bool CompilerManager::canCompile(const QString &filename)
|
||||||
void CompilerManager::onCompileFinished()
|
void CompilerManager::onCompileFinished()
|
||||||
{
|
{
|
||||||
QMutexLocker locker(&compileMutex);
|
QMutexLocker locker(&compileMutex);
|
||||||
qDebug() << "Compile finished";
|
|
||||||
mCompiler=nullptr;
|
mCompiler=nullptr;
|
||||||
delete mCompiler;
|
delete mCompiler;
|
||||||
}
|
}
|
||||||
|
@ -72,6 +75,16 @@ void CompilerManager::onRunnerTerminated()
|
||||||
mRunner=nullptr;
|
mRunner=nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CompilerManager::syntaxCheckErrorCount() const
|
||||||
|
{
|
||||||
|
return mSyntaxCheckErrorCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CompilerManager::compileErrorCount() const
|
||||||
|
{
|
||||||
|
return mCompileErrorCount;
|
||||||
|
}
|
||||||
|
|
||||||
CompileError::CompileError(const QString &reason):BaseError(reason)
|
CompileError::CompileError(const QString &reason):BaseError(reason)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -19,11 +19,17 @@ public:
|
||||||
void compile(const QString& filename, const QByteArray& encoding, bool silent=false,bool onlyCheckSyntax=false);
|
void compile(const QString& filename, const QByteArray& encoding, bool silent=false,bool onlyCheckSyntax=false);
|
||||||
void run(const QString& filename, const QString& arguments, const QString& workDir);
|
void run(const QString& filename, const QString& arguments, const QString& workDir);
|
||||||
bool canCompile(const QString& filename);
|
bool canCompile(const QString& filename);
|
||||||
|
int compileErrorCount() const;
|
||||||
|
|
||||||
|
int syntaxCheckErrorCount() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onCompileFinished();
|
void onCompileFinished();
|
||||||
void onRunnerTerminated();
|
void onRunnerTerminated();
|
||||||
private:
|
private:
|
||||||
Compiler* mCompiler;
|
Compiler* mCompiler;
|
||||||
|
int mCompileErrorCount;
|
||||||
|
int mSyntaxCheckErrorCount;
|
||||||
Compiler* mBackgroundSyntaxChecker;
|
Compiler* mBackgroundSyntaxChecker;
|
||||||
ExecutableRunner* mRunner;
|
ExecutableRunner* mRunner;
|
||||||
QMutex compileMutex;
|
QMutex compileMutex;
|
||||||
|
|
|
@ -409,6 +409,115 @@ void Editor::copyAsHTML()
|
||||||
QGuiApplication::clipboard()->setMimeData(mimeData);
|
QGuiApplication::clipboard()->setMimeData(mimeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Editor::addSyntaxIssues(int line, int startChar, CompileIssueType errorType, const QString &hint)
|
||||||
|
{
|
||||||
|
PSyntaxIssue pError;
|
||||||
|
BufferCoord p;
|
||||||
|
QString token;
|
||||||
|
SynHighlighterTokenType tokenType;
|
||||||
|
int tokenKind,start;
|
||||||
|
PSynHighlighterAttribute attr;
|
||||||
|
PSyntaxIssueList lst;
|
||||||
|
if ((line<1) || (line>lines()->count()))
|
||||||
|
return;
|
||||||
|
pError = std::make_shared<SyntaxIssue>();
|
||||||
|
p.Char = startChar;
|
||||||
|
p.Line = line;
|
||||||
|
if (startChar >= lines()->getString(line-1).length()) {
|
||||||
|
start = 1;
|
||||||
|
token = lines()->getString(line-1);
|
||||||
|
} else {
|
||||||
|
if (!GetHighlighterAttriAtRowColEx(p,token,tokenType,tokenKind,start,attr))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pError->startChar = start;
|
||||||
|
pError->endChar = start + token.length();
|
||||||
|
pError->col = charToColumn(line,pError->startChar);
|
||||||
|
pError->endCol = charToColumn(line,pError->endChar);
|
||||||
|
pError->hint = hint;
|
||||||
|
pError->token = token;
|
||||||
|
pError->issueType = errorType;
|
||||||
|
if (mSyntaxIssues.contains(line)) {
|
||||||
|
lst = mSyntaxIssues[line];
|
||||||
|
} else {
|
||||||
|
lst = std::make_shared<SyntaxIssueList>();
|
||||||
|
mSyntaxIssues[line] = lst;
|
||||||
|
}
|
||||||
|
lst->append(pError);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::clearSyntaxIssues()
|
||||||
|
{
|
||||||
|
mSyntaxIssues.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::gotoNextSyntaxIssue()
|
||||||
|
{
|
||||||
|
auto iter = mSyntaxIssues.find(caretY());
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return;
|
||||||
|
iter++;
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return;
|
||||||
|
BufferCoord p;
|
||||||
|
p.Char = (*iter)->at(0)->startChar;
|
||||||
|
p.Line = iter.key();
|
||||||
|
setCaretXY(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Editor::gotoPrevSyntaxIssue()
|
||||||
|
{
|
||||||
|
auto iter = mSyntaxIssues.find(caretY());
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return;
|
||||||
|
if (iter==mSyntaxIssues.begin())
|
||||||
|
return;
|
||||||
|
iter--;
|
||||||
|
BufferCoord p;
|
||||||
|
p.Char = (*iter)->at(0)->startChar;
|
||||||
|
p.Line = iter.key();
|
||||||
|
setCaretXY(p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Editor::hasNextSyntaxIssue() const
|
||||||
|
{
|
||||||
|
auto iter = mSyntaxIssues.find(caretY());
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return false;
|
||||||
|
iter++;
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Editor::hasPrevSyntaxIssue() const
|
||||||
|
{
|
||||||
|
auto iter = mSyntaxIssues.find(caretY());
|
||||||
|
if (iter==mSyntaxIssues.end())
|
||||||
|
return true;
|
||||||
|
if (iter==mSyntaxIssues.begin())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Editor::PSyntaxIssueList Editor::getErrorsAtLine(int line)
|
||||||
|
{
|
||||||
|
if (mSyntaxIssues.contains(line))
|
||||||
|
return mSyntaxIssues[line];
|
||||||
|
return PSyntaxIssueList();
|
||||||
|
}
|
||||||
|
|
||||||
|
Editor::PSyntaxIssue Editor::getErrorAtPosition(const BufferCoord &pos)
|
||||||
|
{
|
||||||
|
PSyntaxIssueList lst = getErrorsAtLine(pos.Line);
|
||||||
|
for (PSyntaxIssue issue: *lst) {
|
||||||
|
if (issue->startChar<=pos.Char && pos.Char<=issue->endChar)
|
||||||
|
return issue;
|
||||||
|
}
|
||||||
|
return PSyntaxIssue();
|
||||||
|
}
|
||||||
|
|
||||||
void Editor::onModificationChanged(bool) {
|
void Editor::onModificationChanged(bool) {
|
||||||
updateCaption();
|
updateCaption();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <QTabWidget>
|
#include <QTabWidget>
|
||||||
#include "qsynedit/SynEdit.h"
|
#include "qsynedit/SynEdit.h"
|
||||||
#include "colorscheme.h"
|
#include "colorscheme.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
class SaveException: public std::exception {
|
class SaveException: public std::exception {
|
||||||
|
|
||||||
|
@ -46,6 +47,20 @@ public:
|
||||||
RawStringNoEscape
|
RawStringNoEscape
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SyntaxIssue {
|
||||||
|
int col;
|
||||||
|
int endCol;
|
||||||
|
int startChar;
|
||||||
|
int endChar;
|
||||||
|
CompileIssueType issueType;
|
||||||
|
QString token;
|
||||||
|
QString hint;
|
||||||
|
};
|
||||||
|
|
||||||
|
using PSyntaxIssue = std::shared_ptr<SyntaxIssue>;
|
||||||
|
using SyntaxIssueList = QVector<PSyntaxIssue>;
|
||||||
|
using PSyntaxIssueList = std::shared_ptr<SyntaxIssueList>;
|
||||||
|
|
||||||
explicit Editor(QWidget *parent);
|
explicit Editor(QWidget *parent);
|
||||||
|
|
||||||
explicit Editor(QWidget *parent, const QString& filename,
|
explicit Editor(QWidget *parent, const QString& filename,
|
||||||
|
@ -82,6 +97,15 @@ public:
|
||||||
void copyToClipboard() override;
|
void copyToClipboard() override;
|
||||||
void cutToClipboard() override;
|
void cutToClipboard() override;
|
||||||
void copyAsHTML();
|
void copyAsHTML();
|
||||||
|
|
||||||
|
void addSyntaxIssues(int line, int startChar, CompileIssueType errorType, const QString& hint);
|
||||||
|
void clearSyntaxIssues();
|
||||||
|
void gotoNextSyntaxIssue();
|
||||||
|
void gotoPrevSyntaxIssue();
|
||||||
|
bool hasPrevSyntaxIssue() const;
|
||||||
|
bool hasNextSyntaxIssue() const;
|
||||||
|
PSyntaxIssueList getErrorsAtLine(int line);
|
||||||
|
PSyntaxIssue getErrorAtPosition(const BufferCoord& pos);
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
|
|
||||||
|
@ -114,6 +138,7 @@ private:
|
||||||
QTabWidget* mParentPageControl;
|
QTabWidget* mParentPageControl;
|
||||||
bool mInProject;
|
bool mInProject;
|
||||||
bool mIsNew;
|
bool mIsNew;
|
||||||
|
QMap<int,PSyntaxIssueList> mSyntaxIssues;
|
||||||
|
|
||||||
// QWidget interface
|
// QWidget interface
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <mainwindow.h>
|
#include <mainwindow.h>
|
||||||
#include <iconv.h>
|
#include <iconv.h>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
#include <QFileInfo>
|
||||||
|
|
||||||
EditorList::EditorList(QTabWidget* leftPageWidget,
|
EditorList::EditorList(QTabWidget* leftPageWidget,
|
||||||
QTabWidget* rightPageWidget,
|
QTabWidget* rightPageWidget,
|
||||||
|
@ -128,6 +129,23 @@ void EditorList::applyColorSchemes(const QString& name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EditorList::isFileOpened(const QString &name)
|
||||||
|
{
|
||||||
|
QFileInfo fileInfo(name);
|
||||||
|
QString filename = fileInfo.absoluteFilePath();
|
||||||
|
for (int i=0;i<mLeftPageWidget->count();i++) {
|
||||||
|
Editor* e = static_cast<Editor*>(mLeftPageWidget->widget(i));
|
||||||
|
if (e->filename().compare(filename)==0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (int i=0;i<mRightPageWidget->count();i++) {
|
||||||
|
Editor* e = static_cast<Editor*>(mRightPageWidget->widget(i));
|
||||||
|
if (e->filename().compare(filename)==0)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool EditorList::closeAll(bool force) {
|
bool EditorList::closeAll(bool force) {
|
||||||
beginUpdate();
|
beginUpdate();
|
||||||
auto end = finally([this] {
|
auto end = finally([this] {
|
||||||
|
|
|
@ -40,6 +40,7 @@ public:
|
||||||
void endUpdate();
|
void endUpdate();
|
||||||
void applySettings();
|
void applySettings();
|
||||||
void applyColorSchemes(const QString& name);
|
void applyColorSchemes(const QString& name);
|
||||||
|
bool isFileOpened(const QString& name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QTabWidget* getNewEditorPageControl() const;
|
QTabWidget* getNewEditorPageControl() const;
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
MainWindow* pMainWindow;
|
MainWindow* pMainWindow;
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: QMainWindow(parent)
|
: QMainWindow(parent),
|
||||||
, ui(new Ui::MainWindow)
|
ui(new Ui::MainWindow),
|
||||||
|
mMessageControlChanged(false),
|
||||||
|
mCheckSyntaxInBack(false)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
// status bar
|
// status bar
|
||||||
|
@ -71,8 +73,9 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
ui->actionEncode_in_ANSI->setCheckable(true);
|
ui->actionEncode_in_ANSI->setCheckable(true);
|
||||||
ui->actionEncode_in_UTF_8->setCheckable(true);
|
ui->actionEncode_in_UTF_8->setCheckable(true);
|
||||||
|
|
||||||
|
openCloseMessageSheet(false);
|
||||||
|
mPreviousHeight = 250;
|
||||||
updateEditorActions();
|
updateEditorActions();
|
||||||
|
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -249,6 +252,36 @@ void MainWindow::updateCompilerSet()
|
||||||
mCompilerSet->setCurrentIndex(index);
|
mCompilerSet->setCurrentIndex(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::openCloseMessageSheet(bool open)
|
||||||
|
{
|
||||||
|
// if Assigned(fReportToolWindow) then
|
||||||
|
// Exit;
|
||||||
|
|
||||||
|
// Switch between open and close
|
||||||
|
if (open) {
|
||||||
|
QList<int> sizes = ui->splitterMessages->sizes();
|
||||||
|
int tabHeight = ui->tabMessages->tabBar()->height();
|
||||||
|
ui->tabMessages->setMinimumHeight(tabHeight+5);
|
||||||
|
int totalSize = sizes[0] + sizes[1];
|
||||||
|
sizes[1] = mPreviousHeight;
|
||||||
|
sizes[0] = std::max(1,totalSize - sizes[1]);
|
||||||
|
ui->splitterMessages->setSizes(sizes);
|
||||||
|
} else {
|
||||||
|
QList<int> sizes = ui->splitterMessages->sizes();
|
||||||
|
mPreviousHeight = sizes[1];
|
||||||
|
int totalSize = sizes[0] + sizes[1];
|
||||||
|
int tabHeight = ui->tabMessages->tabBar()->height();
|
||||||
|
ui->tabMessages->setMinimumHeight(tabHeight);
|
||||||
|
sizes[1] = tabHeight;
|
||||||
|
sizes[0] = std::max(1,totalSize - sizes[1]);
|
||||||
|
ui->splitterMessages->setSizes(sizes);
|
||||||
|
}
|
||||||
|
QSplitterHandle* handle = ui->splitterMessages->handle(1);
|
||||||
|
handle->setEnabled(open);
|
||||||
|
int idxClose = ui->tabMessages->indexOf(ui->tabClose);
|
||||||
|
ui->tabMessages->setTabVisible(idxClose,open);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_actionNew_triggered()
|
void MainWindow::on_actionNew_triggered()
|
||||||
{
|
{
|
||||||
|
@ -337,6 +370,104 @@ void MainWindow::onCompileLog(const QString &msg)
|
||||||
void MainWindow::onCompileIssue(PCompileIssue issue)
|
void MainWindow::onCompileIssue(PCompileIssue issue)
|
||||||
{
|
{
|
||||||
ui->tableIssues->addIssue(issue);
|
ui->tableIssues->addIssue(issue);
|
||||||
|
|
||||||
|
// Update tab caption
|
||||||
|
// if CompilerOutput.Items.Count = 1 then
|
||||||
|
// CompSheet.Caption := Lang[ID_SHEET_COMP] + ' (' + IntToStr(CompilerOutput.Items.Count) + ')';
|
||||||
|
|
||||||
|
if (issue->type == CompileIssueType::Error || issue->type ==
|
||||||
|
CompileIssueType::Warning) {
|
||||||
|
Editor* e = mEditorList->getOpenedEditorByFilename(issue->filename);
|
||||||
|
if (e!=nullptr && (issue->line>0)) {
|
||||||
|
int line = issue->line;
|
||||||
|
if (line > e->lines()->count())
|
||||||
|
return;
|
||||||
|
int col = std::min(issue->column,e->lines()->getString(line-1).length()+1);
|
||||||
|
e->addSyntaxIssues(line,col,issue->type,issue->description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onCompileFinished()
|
||||||
|
{
|
||||||
|
// Update tab caption
|
||||||
|
int i = ui->tabMessages->indexOf(ui->tabIssues);
|
||||||
|
if (i==-1)
|
||||||
|
return;
|
||||||
|
ui->tabMessages->setTabText(i, tr("Issues") +
|
||||||
|
QString(" (%1)").arg(ui->tableIssues->model()->rowCount()));
|
||||||
|
|
||||||
|
// Close it if there's nothing to show
|
||||||
|
if (mCheckSyntaxInBack) {
|
||||||
|
// check syntax in back, don't change message panel
|
||||||
|
} else if (
|
||||||
|
(ui->tableIssues->count() == 0)
|
||||||
|
// and (ResourceOutput.Items.Count = 0)
|
||||||
|
// and devData.AutoCloseProgress
|
||||||
|
) {
|
||||||
|
openCloseMessageSheet(false);
|
||||||
|
// Or open it if there is anything to show
|
||||||
|
} else {
|
||||||
|
if (ui->tableIssues->count() > 0) {
|
||||||
|
if (ui->tabMessages->currentIndex() != i) {
|
||||||
|
ui->tabMessages->setCurrentIndex(i);
|
||||||
|
mMessageControlChanged = false;
|
||||||
|
}
|
||||||
|
// end else if (ResourceOutput.Items.Count > 0) then begin
|
||||||
|
// if MessageControl.ActivePage <> ResSheet then begin
|
||||||
|
// MessageControl.ActivePage := ResSheet;
|
||||||
|
// fMessageControlChanged := False;
|
||||||
|
// end;
|
||||||
|
// end;
|
||||||
|
openCloseMessageSheet(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Editor * e = mEditorList->getEditor();
|
||||||
|
if (e!=nullptr) {
|
||||||
|
e->beginUpdate();
|
||||||
|
e->endUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Jump to problem location, sorted by significance
|
||||||
|
if ((mCompilerManager->compileErrorCount() > 0) && (!mCheckSyntaxInBack)) {
|
||||||
|
// First try to find errors
|
||||||
|
for (int i=0;i<ui->tableIssues->count();i++) {
|
||||||
|
PCompileIssue issue = ui->tableIssues->issue(i);
|
||||||
|
if (issue->type == CompileIssueType::Error) {
|
||||||
|
ui->tableIssues->selectRow(i);
|
||||||
|
QModelIndex index =ui->tableIssues->model()->index(i,0);
|
||||||
|
ui->tableIssues->doubleClicked(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then try to find warnings
|
||||||
|
for (int i=0;i<ui->tableIssues->count();i++) {
|
||||||
|
PCompileIssue issue = ui->tableIssues->issue(i);
|
||||||
|
if (issue->type == CompileIssueType::Warning) {
|
||||||
|
ui->tableIssues->selectRow(i);
|
||||||
|
QModelIndex index =ui->tableIssues->model()->index(i,0);
|
||||||
|
ui->tableIssues->doubleClicked(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Then try to find anything with a line number...
|
||||||
|
// for I := 0 to CompilerOutput.Items.Count - 1 do begin
|
||||||
|
// if not SameStr(CompilerOutput.Items[I].Caption, '') then begin
|
||||||
|
// CompilerOutput.Selected := CompilerOutput.Items[I];
|
||||||
|
// CompilerOutput.Selected.MakeVisible(False);
|
||||||
|
// CompilerOutputDblClick(CompilerOutput);
|
||||||
|
// Exit;
|
||||||
|
// end;
|
||||||
|
// end;
|
||||||
|
|
||||||
|
// Then try to find a resource error
|
||||||
|
// if ResourceOutput.Items.Count > 0 then begin
|
||||||
|
// ResourceOutput.Selected := ResourceOutput.Items[0];
|
||||||
|
// ResourceOutput.Selected.MakeVisible(False);
|
||||||
|
// CompilerOutputDblClick(ResourceOutput);
|
||||||
|
// end;
|
||||||
|
}
|
||||||
|
mCheckSyntaxInBack=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::onCompileErrorOccured(const QString &reason)
|
void MainWindow::onCompileErrorOccured(const QString &reason)
|
||||||
|
@ -523,3 +654,14 @@ void MainWindow::on_actionConvert_to_UTF_8_triggered()
|
||||||
return;
|
return;
|
||||||
editor->convertToEncoding(ENCODING_UTF8);
|
editor->convertToEncoding(ENCODING_UTF8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_tabMessages_tabBarClicked(int index)
|
||||||
|
{
|
||||||
|
mMessageControlChanged = false;
|
||||||
|
int idxClose = ui->tabMessages->indexOf(ui->tabClose);
|
||||||
|
if (index == idxClose) {
|
||||||
|
openCloseMessageSheet(false);
|
||||||
|
} else {
|
||||||
|
openCloseMessageSheet(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -88,15 +88,19 @@ private slots:
|
||||||
|
|
||||||
void on_actionConvert_to_UTF_8_triggered();
|
void on_actionConvert_to_UTF_8_triggered();
|
||||||
|
|
||||||
|
void on_tabMessages_tabBarClicked(int index);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void onCompileLog(const QString& msg);
|
void onCompileLog(const QString& msg);
|
||||||
void onCompileIssue(PCompileIssue issue);
|
void onCompileIssue(PCompileIssue issue);
|
||||||
|
void onCompileFinished();
|
||||||
void onCompileErrorOccured(const QString& reason);
|
void onCompileErrorOccured(const QString& reason);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupActions();
|
void setupActions();
|
||||||
|
|
||||||
void updateCompilerSet();
|
void updateCompilerSet();
|
||||||
|
void openCloseMessageSheet(bool open);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow *ui;
|
||||||
|
@ -108,6 +112,9 @@ private:
|
||||||
QMenu * mMenuEncodingList;
|
QMenu * mMenuEncodingList;
|
||||||
QComboBox* mCompilerSet;
|
QComboBox* mCompilerSet;
|
||||||
CompilerManager* mCompilerManager;
|
CompilerManager* mCompilerManager;
|
||||||
|
bool mMessageControlChanged;
|
||||||
|
bool mCheckSyntaxInBack;
|
||||||
|
int mPreviousHeight;
|
||||||
|
|
||||||
// QWidget interface
|
// QWidget interface
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -33,10 +33,13 @@
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSplitter" name="splitter">
|
<widget class="QSplitter" name="splitterMessages">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="childrenCollapsible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
<widget class="QWidget" name="widget" native="true">
|
<widget class="QWidget" name="widget" native="true">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
@ -58,11 +61,14 @@
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QSplitter" name="splitter_2">
|
<widget class="QSplitter" name="splitterInfos">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QTabWidget" name="tabWidget_2">
|
<property name="childrenCollapsible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QTabWidget" name="tabInfos">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
|
<sizepolicy hsizetype="Fixed" vsizetype="Expanding">
|
||||||
<horstretch>1</horstretch>
|
<horstretch>1</horstretch>
|
||||||
|
@ -147,7 +153,7 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QTabWidget" name="tabWidget">
|
<widget class="QTabWidget" name="tabMessages">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
@ -158,9 +164,14 @@
|
||||||
<enum>QTabWidget::South</enum>
|
<enum>QTabWidget::South</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>0</number>
|
<number>5</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tabIssues">
|
<widget class="QWidget" name="tabIssues">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/013-compile.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Issues</string>
|
<string>Issues</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -204,7 +215,22 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabResource">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/068-resrc.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Resource</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
<widget class="QWidget" name="tabCompilerOutput">
|
<widget class="QWidget" name="tabCompilerOutput">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/015-compres.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Compile Log</string>
|
<string>Compile Log</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
@ -239,6 +265,36 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabDebug">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/020-debug.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Debug</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabSearch">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/074-search.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Search</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="tabClose">
|
||||||
|
<attribute name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normalon>:/icons/images/newlook24/008-close.png</normalon>
|
||||||
|
</iconset>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Close</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -69,6 +69,11 @@ PCompileIssue IssuesModel::issue(int row)
|
||||||
return mIssues[row];
|
return mIssues[row];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int IssuesModel::count()
|
||||||
|
{
|
||||||
|
return mIssues.size();
|
||||||
|
}
|
||||||
|
|
||||||
void IssuesTable::addIssue(PCompileIssue issue)
|
void IssuesTable::addIssue(PCompileIssue issue)
|
||||||
{
|
{
|
||||||
mModel->addIssue(issue);
|
mModel->addIssue(issue);
|
||||||
|
@ -84,6 +89,11 @@ PCompileIssue IssuesTable::issue(const int row)
|
||||||
return mModel->issue(row);
|
return mModel->issue(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int IssuesTable::count()
|
||||||
|
{
|
||||||
|
return mModel->count();
|
||||||
|
}
|
||||||
|
|
||||||
void IssuesTable::clearIssues()
|
void IssuesTable::clearIssues()
|
||||||
{
|
{
|
||||||
mModel->clearIssues();
|
mModel->clearIssues();
|
||||||
|
|
|
@ -26,6 +26,7 @@ private:
|
||||||
|
|
||||||
// QAbstractItemModel interface
|
// QAbstractItemModel interface
|
||||||
public:
|
public:
|
||||||
|
int count();
|
||||||
int rowCount(const QModelIndex &parent) const override;
|
int rowCount(const QModelIndex &parent) const override;
|
||||||
int columnCount(const QModelIndex &parent) const override;
|
int columnCount(const QModelIndex &parent) const override;
|
||||||
QVariant data(const QModelIndex &index, int role) const override;
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
|
@ -51,6 +52,7 @@ public slots:
|
||||||
|
|
||||||
PCompileIssue issue(const QModelIndex& index);
|
PCompileIssue issue(const QModelIndex& index);
|
||||||
PCompileIssue issue(const int row);
|
PCompileIssue issue(const int row);
|
||||||
|
int count();
|
||||||
|
|
||||||
void clearIssues();
|
void clearIssues();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue