1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-01 07:06:43 +00:00

display script errors in script subview

This commit is contained in:
Marc Zinnschlag 2015-07-16 12:36:20 +02:00
parent df027b3498
commit 2016ff773f
5 changed files with 166 additions and 5 deletions

View file

@ -64,7 +64,7 @@ opencs_units (view/world
table tablesubview scriptsubview util regionmapsubview tablebottombox creator genericcreator table tablesubview scriptsubview util regionmapsubview tablebottombox creator genericcreator
cellcreator referenceablecreator referencecreator scenesubview cellcreator referenceablecreator referencecreator scenesubview
infocreator scriptedit dialoguesubview previewsubview regionmap dragrecordtable nestedtable infocreator scriptedit dialoguesubview previewsubview regionmap dragrecordtable nestedtable
dialoguespinbox recordbuttonbar tableeditidaction dialoguespinbox recordbuttonbar tableeditidaction scripterrortable
) )
opencs_units_noqt (view/world opencs_units_noqt (view/world

View file

@ -0,0 +1,87 @@
#include "scripterrortable.hpp"
#include <QHeaderView>
#include <components/compiler/tokenloc.hpp>
#include <components/compiler/scanner.hpp>
#include <components/compiler/fileparser.hpp>
#include <components/compiler/exception.hpp>
#include <components/compiler/extensions0.hpp>
#include "../../model/doc/document.hpp"
void CSVWorld::ScriptErrorTable::report (const std::string& message, const Compiler::TokenLoc& loc, Type type)
{
addMessage (message, type==Compiler::ErrorHandler::WarningMessage ?
CSMDoc::Message::Severity_Warning : CSMDoc::Message::Severity_Error, loc.mLine);
}
void CSVWorld::ScriptErrorTable::report (const std::string& message, Type type)
{
addMessage (message, type==Compiler::ErrorHandler::WarningMessage ?
CSMDoc::Message::Severity_Warning : CSMDoc::Message::Severity_Error);
}
void CSVWorld::ScriptErrorTable::addMessage (const std::string& message,
CSMDoc::Message::Severity severity, int line)
{
int row = rowCount();
setRowCount (row+1);
setItem (row, 0, new QTableWidgetItem (""));
if (line!=-1)
{
QTableWidgetItem *item = new QTableWidgetItem;
item->setData (Qt::DisplayRole, line+1);
setItem (row, 1, item);
}
setItem (row, 2, new QTableWidgetItem (QString::fromUtf8 (message.c_str())));
}
CSVWorld::ScriptErrorTable::ScriptErrorTable (const CSMDoc::Document& document, QWidget *parent)
: QTableWidget (parent), mContext (document.getData())
{
setColumnCount (3);
QStringList headers;
headers << "Severity" << "Line" << "Description";
setHorizontalHeaderLabels (headers);
horizontalHeader()->setStretchLastSection (true);
Compiler::registerExtensions (mExtensions);
mContext.setExtensions (&mExtensions);
}
void CSVWorld::ScriptErrorTable::updateUserSetting (const QString& name, const QStringList& value)
{
}
void CSVWorld::ScriptErrorTable::update (const std::string& source)
{
setRowCount (0);
try
{
std::istringstream input (source);
Compiler::Scanner scanner (*this, input, mContext.getExtensions());
Compiler::FileParser parser (*this, mContext);
scanner.scan (parser);
}
catch (const Compiler::SourceException&)
{
// error has already been reported via error handler
}
catch (const std::exception& error)
{
addMessage (error.what(), CSMDoc::Message::Severity_SeriousError);
}
}

View file

@ -0,0 +1,45 @@
#ifndef CSV_WORLD_SCRIPTERRORTABLE_H
#define CSV_WORLD_SCRIPTERRORTABLE_H
#include <QTableWidget>
#include <components/compiler/errorhandler.hpp>
#include <components/compiler/extensions.hpp>
#include "../../model/world/scriptcontext.hpp"
#include "../../model/doc/messages.hpp"
namespace CSMDoc
{
class Document;
}
namespace CSVWorld
{
class ScriptErrorTable : public QTableWidget, private Compiler::ErrorHandler
{
Q_OBJECT
Compiler::Extensions mExtensions;
CSMWorld::ScriptContext mContext;
virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type);
///< Report error to the user.
virtual void report (const std::string& message, Type type);
///< Report a file related error
void addMessage (const std::string& message, CSMDoc::Message::Severity severity,
int line = -1);
public:
ScriptErrorTable (const CSMDoc::Document& document, QWidget *parent = 0);
void updateUserSetting (const QString& name, const QStringList& value);
void update (const std::string& source);
};
}
#endif

View file

@ -4,6 +4,7 @@
#include <QStatusBar> #include <QStatusBar>
#include <QStackedLayout> #include <QStackedLayout>
#include <QSplitter>
#include "../../model/doc/document.hpp" #include "../../model/doc/document.hpp"
#include "../../model/world/universalid.hpp" #include "../../model/world/universalid.hpp"
@ -17,6 +18,7 @@
#include "recordbuttonbar.hpp" #include "recordbuttonbar.hpp"
#include "tablebottombox.hpp" #include "tablebottombox.hpp"
#include "genericcreator.hpp" #include "genericcreator.hpp"
#include "scripterrortable.hpp"
void CSVWorld::ScriptSubView::addButtonBar() void CSVWorld::ScriptSubView::addButtonBar()
{ {
@ -40,7 +42,16 @@ CSVWorld::ScriptSubView::ScriptSubView (const CSMWorld::UniversalId& id, CSMDoc:
std::vector<std::string> selection (1, id.getId()); std::vector<std::string> selection (1, id.getId());
mCommandDispatcher.setSelection (selection); mCommandDispatcher.setSelection (selection);
mLayout.addWidget (mEditor = new ScriptEdit (mDocument, ScriptHighlighter::Mode_General, this), 2); mMain = new QSplitter (this);
mMain->setOrientation (Qt::Vertical);
mLayout.addWidget (mMain, 2);
mEditor = new ScriptEdit (mDocument, ScriptHighlighter::Mode_General, this);
mMain->addWidget (mEditor);
mMain->setCollapsible (0, false);
mErrors = new ScriptErrorTable (document, this);
mMain->addWidget (mErrors);
QWidget *widget = new QWidget (this);; QWidget *widget = new QWidget (this);;
widget->setLayout (&mLayout); widget->setLayout (&mLayout);
@ -60,7 +71,9 @@ CSVWorld::ScriptSubView::ScriptSubView (const CSMWorld::UniversalId& id, CSMDoc:
if (mColumn==-1) if (mColumn==-1)
throw std::logic_error ("Can't find script column"); throw std::logic_error ("Can't find script column");
mEditor->setPlainText (mModel->data (mModel->getModelIndex (id.getId(), mColumn)).toString()); QString source = mModel->data (mModel->getModelIndex (id.getId(), mColumn)).toString();
mEditor->setPlainText (source);
// bottom box and buttons // bottom box and buttons
mBottom = new TableBottomBox (CreatorFactory<GenericCreator>(), document, id, this); mBottom = new TableBottomBox (CreatorFactory<GenericCreator>(), document, id, this);
@ -83,6 +96,8 @@ CSVWorld::ScriptSubView::ScriptSubView (const CSMWorld::UniversalId& id, CSMDoc:
updateStatusBar(); updateStatusBar();
connect(mEditor, SIGNAL(cursorPositionChanged()), this, SLOT(updateStatusBar())); connect(mEditor, SIGNAL(cursorPositionChanged()), this, SLOT(updateStatusBar()));
mErrors->update (source.toUtf8().constData());
} }
void CSVWorld::ScriptSubView::updateUserSetting (const QString& name, const QStringList& value) void CSVWorld::ScriptSubView::updateUserSetting (const QString& name, const QStringList& value)
@ -116,6 +131,8 @@ void CSVWorld::ScriptSubView::updateUserSetting (const QString& name, const QStr
if (mButtons) if (mButtons)
mButtons->updateUserSetting (name, value); mButtons->updateUserSetting (name, value);
mErrors->updateUserSetting (name, value);
} }
void CSVWorld::ScriptSubView::setStatusBar (bool show) void CSVWorld::ScriptSubView::setStatusBar (bool show)
@ -173,8 +190,12 @@ void CSVWorld::ScriptSubView::textChanged()
ScriptEdit::ChangeLock lock (*mEditor); ScriptEdit::ChangeLock lock (*mEditor);
QString source = mEditor->toPlainText();
mDocument.getUndoStack().push (new CSMWorld::ModifyCommand (*mModel, mDocument.getUndoStack().push (new CSMWorld::ModifyCommand (*mModel,
mModel->getModelIndex (getUniversalId().getId(), mColumn), mEditor->toPlainText())); mModel->getModelIndex (getUniversalId().getId(), mColumn), source));
mErrors->update (source.toUtf8().constData());
} }
void CSVWorld::ScriptSubView::dataChanged (const QModelIndex& topLeft, const QModelIndex& bottomRight) void CSVWorld::ScriptSubView::dataChanged (const QModelIndex& topLeft, const QModelIndex& bottomRight)
@ -189,9 +210,13 @@ void CSVWorld::ScriptSubView::dataChanged (const QModelIndex& topLeft, const QMo
if (index.row()>=topLeft.row() && index.row()<=bottomRight.row() && if (index.row()>=topLeft.row() && index.row()<=bottomRight.row() &&
index.column()>=topLeft.column() && index.column()<=bottomRight.column()) index.column()>=topLeft.column() && index.column()<=bottomRight.column())
{ {
QString source = mModel->data (index).toString();
QTextCursor cursor = mEditor->textCursor(); QTextCursor cursor = mEditor->textCursor();
mEditor->setPlainText (mModel->data (index).toString()); mEditor->setPlainText (source);
mEditor->setTextCursor (cursor); mEditor->setTextCursor (cursor);
mErrors->update (source.toUtf8().constData());
} }
} }

View file

@ -10,6 +10,7 @@
class QModelIndex; class QModelIndex;
class QLabel; class QLabel;
class QVBoxLayout; class QVBoxLayout;
class QSplitter;
namespace CSMDoc namespace CSMDoc
{ {
@ -26,6 +27,7 @@ namespace CSVWorld
class ScriptEdit; class ScriptEdit;
class RecordButtonBar; class RecordButtonBar;
class TableBottomBox; class TableBottomBox;
class ScriptErrorTable;
class ScriptSubView : public CSVDoc::SubView class ScriptSubView : public CSVDoc::SubView
{ {
@ -39,6 +41,8 @@ namespace CSVWorld
RecordButtonBar *mButtons; RecordButtonBar *mButtons;
CSMWorld::CommandDispatcher mCommandDispatcher; CSMWorld::CommandDispatcher mCommandDispatcher;
QVBoxLayout mLayout; QVBoxLayout mLayout;
QSplitter *mMain;
ScriptErrorTable *mErrors;
private: private: