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:
parent
df027b3498
commit
2016ff773f
5 changed files with 166 additions and 5 deletions
|
@ -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
|
||||||
|
|
87
apps/opencs/view/world/scripterrortable.cpp
Normal file
87
apps/opencs/view/world/scripterrortable.cpp
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
45
apps/opencs/view/world/scripterrortable.hpp
Normal file
45
apps/opencs/view/world/scripterrortable.hpp
Normal 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
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue