forked from qt-creator/qt-creator
QmlJS: Lazy-load console items to allow for recursion
Using Utils:TreeView automatically gives us the capability for loading item as they are expanded. This way we can show recursive structure in the console as well as load data from the debug server on demand. Also, properly print error messages received from unsuccessful command evaluations. Task-number: QTCREATORBUG-14931 Change-Id: I66d440eedd9723b04670169b27db1ee18f3f2891 Reviewed-by: hjk <hjk@theqtcompany.com>
This commit is contained in:
@@ -38,111 +38,34 @@ namespace QmlJS {
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
ConsoleItem::ConsoleItem(ConsoleItem *parent, ConsoleItem::ItemType itemType,
|
||||
const QString &text)
|
||||
: m_parentItem(parent),
|
||||
itemType(itemType),
|
||||
line(-1)
|
||||
|
||||
QString addZeroWidthSpace(QString text)
|
||||
{
|
||||
setText(text);
|
||||
}
|
||||
|
||||
ConsoleItem::~ConsoleItem()
|
||||
{
|
||||
qDeleteAll(m_childItems);
|
||||
}
|
||||
|
||||
ConsoleItem *ConsoleItem::child(int number)
|
||||
{
|
||||
return m_childItems.value(number);
|
||||
}
|
||||
|
||||
int ConsoleItem::childCount() const
|
||||
{
|
||||
return m_childItems.size();
|
||||
}
|
||||
|
||||
int ConsoleItem::childNumber() const
|
||||
{
|
||||
if (m_parentItem)
|
||||
return m_parentItem->m_childItems.indexOf(const_cast<ConsoleItem *>(this));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ConsoleItem::insertChildren(int position, int count)
|
||||
{
|
||||
if (position < 0 || position > m_childItems.size())
|
||||
return false;
|
||||
|
||||
for (int row = 0; row < count; ++row) {
|
||||
ConsoleItem *item = new ConsoleItem(this, ConsoleItem::UndefinedType,
|
||||
QString());
|
||||
m_childItems.insert(position, item);
|
||||
for (int i = 0; i < text.length(); ++i) {
|
||||
if (text.at(i).isPunct())
|
||||
text.insert(++i, QChar(0x200b)); // ZERO WIDTH SPACE
|
||||
}
|
||||
|
||||
return true;
|
||||
return text;
|
||||
}
|
||||
|
||||
void ConsoleItem::insertChild(ConsoleItem *item, bool sorted)
|
||||
ConsoleItem::ConsoleItem(ItemType itemType, const QString &expression, const QString &file,
|
||||
int line) :
|
||||
m_itemType(itemType), m_text(addZeroWidthSpace(expression)), m_file(file), m_line(line)
|
||||
{
|
||||
if (!sorted) {
|
||||
m_childItems.insert(m_childItems.count(), item);
|
||||
return;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
for (; i < m_childItems.count(); i++) {
|
||||
if (item->m_text < m_childItems[i]->m_text)
|
||||
break;
|
||||
}
|
||||
m_childItems.insert(i, item);
|
||||
setFlags(Qt::ItemFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
|
||||
(itemType == InputType ? Qt::ItemIsEditable : Qt::NoItemFlags)));
|
||||
}
|
||||
|
||||
bool ConsoleItem::insertChild(int position, ConsoleItem *item)
|
||||
ConsoleItem::ConsoleItem(ConsoleItem::ItemType itemType, const QString &expression,
|
||||
std::function<void(ConsoleItem *)> doFetch) :
|
||||
m_itemType(itemType), m_text(addZeroWidthSpace(expression)), m_line(-1), m_doFetch(doFetch)
|
||||
{
|
||||
if (position < 0 || position > m_childItems.size())
|
||||
return false;
|
||||
|
||||
m_childItems.insert(position, item);
|
||||
|
||||
return true;
|
||||
setFlags(Qt::ItemFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable |
|
||||
(itemType == InputType ? Qt::ItemIsEditable : Qt::NoItemFlags)));
|
||||
}
|
||||
|
||||
ConsoleItem *ConsoleItem::parent()
|
||||
ConsoleItem::ItemType ConsoleItem::itemType() const
|
||||
{
|
||||
return m_parentItem;
|
||||
}
|
||||
|
||||
bool ConsoleItem::removeChildren(int position, int count)
|
||||
{
|
||||
if (position < 0 || position + count > m_childItems.size())
|
||||
return false;
|
||||
|
||||
for (int row = 0; row < count; ++row)
|
||||
delete m_childItems.takeAt(position);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ConsoleItem::detachChild(int position)
|
||||
{
|
||||
if (position < 0 || position > m_childItems.size())
|
||||
return false;
|
||||
|
||||
m_childItems.removeAt(position);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void ConsoleItem::setText(const QString &text)
|
||||
{
|
||||
m_text = text;
|
||||
for (int i = 0; i < m_text.length(); ++i) {
|
||||
if (m_text.at(i).isPunct())
|
||||
m_text.insert(++i, QChar(0x200b)); // ZERO WIDTH SPACE
|
||||
}
|
||||
return m_itemType;
|
||||
}
|
||||
|
||||
QString ConsoleItem::text() const
|
||||
@@ -150,10 +73,95 @@ QString ConsoleItem::text() const
|
||||
return m_text;
|
||||
}
|
||||
|
||||
QString ConsoleItem::file() const
|
||||
{
|
||||
return m_file;
|
||||
}
|
||||
|
||||
int ConsoleItem::line() const
|
||||
{
|
||||
return m_line;
|
||||
}
|
||||
|
||||
QVariant ConsoleItem::data(int column, int role) const
|
||||
{
|
||||
if (column != 0)
|
||||
return QVariant();
|
||||
|
||||
switch (role)
|
||||
{
|
||||
case TypeRole:
|
||||
return m_itemType;
|
||||
case FileRole:
|
||||
return m_file;
|
||||
case LineRole:
|
||||
return m_line;
|
||||
case ExpressionRole:
|
||||
return expression();
|
||||
case Qt::DisplayRole:
|
||||
return m_text;
|
||||
default:
|
||||
return TreeItem::data(column, role);
|
||||
}
|
||||
}
|
||||
|
||||
bool ConsoleItem::setData(int column, const QVariant &data, int role)
|
||||
{
|
||||
if (column != 0)
|
||||
return false;
|
||||
|
||||
switch (role)
|
||||
{
|
||||
case TypeRole:
|
||||
m_itemType = ItemType(data.toInt());
|
||||
return true;
|
||||
case FileRole:
|
||||
m_file = data.toString();
|
||||
return true;
|
||||
case LineRole:
|
||||
m_line = data.toInt();
|
||||
return true;
|
||||
case ExpressionRole:
|
||||
m_text = addZeroWidthSpace(data.toString());
|
||||
return true;
|
||||
case Qt::DisplayRole:
|
||||
m_text = data.toString();
|
||||
return true;
|
||||
default:
|
||||
return TreeItem::setData(column, data, role);
|
||||
}
|
||||
}
|
||||
|
||||
bool ConsoleItem::canFetchMore() const
|
||||
{
|
||||
// Always fetch all children, too, as the labels depend on them.
|
||||
foreach (TreeItem *child, children()) {
|
||||
if (static_cast<ConsoleItem *>(child)->m_doFetch)
|
||||
return true;
|
||||
}
|
||||
|
||||
return bool(m_doFetch);
|
||||
}
|
||||
|
||||
void ConsoleItem::fetchMore()
|
||||
{
|
||||
if (m_doFetch) {
|
||||
m_doFetch(this);
|
||||
m_doFetch = std::function<void(ConsoleItem *)>();
|
||||
}
|
||||
|
||||
foreach (TreeItem *child, children()) {
|
||||
ConsoleItem *item = static_cast<ConsoleItem *>(child);
|
||||
if (item->m_doFetch) {
|
||||
item->m_doFetch(item);
|
||||
item->m_doFetch = m_doFetch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString ConsoleItem::expression() const
|
||||
{
|
||||
QString text = m_text;
|
||||
return text.remove(QChar(0x200b)); // ZERO WIDTH SPACE
|
||||
return text().remove(QChar(0x200b)); // ZERO WIDTH SPACE
|
||||
}
|
||||
|
||||
} // QmlJS
|
||||
|
||||
@@ -32,53 +32,56 @@
|
||||
#define CONSOLEITEM_H
|
||||
|
||||
#include "qmljs_global.h"
|
||||
#include <utils/treemodel.h>
|
||||
|
||||
#include <QList>
|
||||
#include <QString>
|
||||
#include <functional>
|
||||
|
||||
namespace QmlJS {
|
||||
|
||||
class QMLJS_EXPORT ConsoleItem
|
||||
class QMLJS_EXPORT ConsoleItem : public Utils::TreeItem
|
||||
{
|
||||
public:
|
||||
enum Roles {
|
||||
TypeRole = Qt::UserRole,
|
||||
FileRole,
|
||||
LineRole,
|
||||
ExpressionRole
|
||||
};
|
||||
|
||||
enum ItemType
|
||||
{
|
||||
UndefinedType = 0x01, // Can be used for unknown and for Return values
|
||||
DebugType = 0x02,
|
||||
WarningType = 0x04,
|
||||
ErrorType = 0x08,
|
||||
InputType = 0x10,
|
||||
DefaultTypes = InputType | UndefinedType
|
||||
DefaultType = 0x01, // Can be used for unknown and for Return values
|
||||
DebugType = 0x02,
|
||||
WarningType = 0x04,
|
||||
ErrorType = 0x08,
|
||||
InputType = 0x10,
|
||||
};
|
||||
Q_DECLARE_FLAGS(ItemTypes, ItemType)
|
||||
|
||||
ConsoleItem(ConsoleItem *parent,
|
||||
ConsoleItem::ItemType type = ConsoleItem::UndefinedType,
|
||||
const QString &data = QString());
|
||||
~ConsoleItem();
|
||||
ConsoleItem(ItemType itemType = ConsoleItem::DefaultType, const QString &expression = QString(),
|
||||
const QString &file = QString(), int line = -1);
|
||||
ConsoleItem(ItemType itemType, const QString &expression,
|
||||
std::function<void(ConsoleItem *)> doFetch);
|
||||
|
||||
ConsoleItem *child(int number);
|
||||
int childCount() const;
|
||||
bool insertChildren(int position, int count);
|
||||
void insertChild(ConsoleItem *item, bool sorted);
|
||||
bool insertChild(int position, ConsoleItem *item);
|
||||
ConsoleItem *parent();
|
||||
bool removeChildren(int position, int count);
|
||||
bool detachChild(int position);
|
||||
int childNumber() const;
|
||||
void setText(const QString &text);
|
||||
QString text() const;
|
||||
ItemType itemType() const;
|
||||
QString expression() const;
|
||||
QString text() const;
|
||||
QString file() const;
|
||||
int line() const;
|
||||
QVariant data(int column, int role) const;
|
||||
bool setData(int column, const QVariant &data, int role);
|
||||
|
||||
bool canFetchMore() const;
|
||||
void fetchMore();
|
||||
|
||||
private:
|
||||
ConsoleItem *m_parentItem;
|
||||
QList<ConsoleItem *> m_childItems;
|
||||
ItemType m_itemType;
|
||||
QString m_text;
|
||||
QString m_file;
|
||||
int m_line;
|
||||
|
||||
public:
|
||||
ConsoleItem::ItemType itemType;
|
||||
QString file;
|
||||
int line;
|
||||
std::function<void(ConsoleItem *)> m_doFetch;
|
||||
};
|
||||
|
||||
} // QmlJS
|
||||
|
||||
@@ -50,8 +50,6 @@ public:
|
||||
|
||||
virtual void showConsolePane() = 0;
|
||||
|
||||
virtual ConsoleItem *rootItem() const = 0;
|
||||
|
||||
virtual void setScriptEvaluator(IScriptEvaluator *scriptEvaluator) = 0;
|
||||
virtual void setContext(const QString &context) = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user