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:
@@ -45,89 +45,55 @@ namespace Internal {
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
QmlConsoleItemModel::QmlConsoleItemModel(QObject *parent) :
|
||||
QAbstractItemModel(parent),
|
||||
m_hasEditableRow(false),
|
||||
m_rootItem(new ConsoleItem(0)),
|
||||
Utils::TreeModel(new ConsoleItem, parent),
|
||||
m_maxSizeOfFileName(0)
|
||||
{
|
||||
}
|
||||
|
||||
QmlConsoleItemModel::~QmlConsoleItemModel()
|
||||
{
|
||||
delete m_rootItem;
|
||||
clear();
|
||||
}
|
||||
|
||||
void QmlConsoleItemModel::clear()
|
||||
{
|
||||
beginResetModel();
|
||||
delete m_rootItem;
|
||||
m_rootItem = new ConsoleItem(0);
|
||||
endResetModel();
|
||||
|
||||
if (m_hasEditableRow)
|
||||
appendEditableRow();
|
||||
Utils::TreeModel::clear();
|
||||
appendItem(new ConsoleItem(ConsoleItem::InputType));
|
||||
emit selectEditableRow(index(0, 0, QModelIndex()), QItemSelectionModel::ClearAndSelect);
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::appendItem(ConsoleItem *item, int position)
|
||||
void QmlConsoleItemModel::appendItem(ConsoleItem *item, int position)
|
||||
{
|
||||
if (position < 0)
|
||||
position = m_rootItem->childCount() - 1;
|
||||
position = rootItem()->childCount() - 1; // append before editable row
|
||||
|
||||
if (position < 0)
|
||||
position = 0;
|
||||
|
||||
beginInsertRows(QModelIndex(), position, position);
|
||||
bool success = m_rootItem->insertChild(position, item);
|
||||
endInsertRows();
|
||||
|
||||
return success;
|
||||
rootItem()->insertChild(position, item);
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::appendMessage(ConsoleItem::ItemType itemType,
|
||||
void QmlConsoleItemModel::appendMessage(ConsoleItem::ItemType itemType,
|
||||
const QString &message, int position)
|
||||
{
|
||||
return appendItem(new ConsoleItem(m_rootItem, itemType, message), position);
|
||||
appendItem(new ConsoleItem(itemType, message), position);
|
||||
}
|
||||
|
||||
void QmlConsoleItemModel::setHasEditableRow(bool hasEditableRow)
|
||||
void QmlConsoleItemModel::shiftEditableRow()
|
||||
{
|
||||
if (m_hasEditableRow && !hasEditableRow)
|
||||
removeEditableRow();
|
||||
int position = rootItem()->childCount();
|
||||
Q_ASSERT(position > 0);
|
||||
|
||||
if (!m_hasEditableRow && hasEditableRow)
|
||||
appendEditableRow();
|
||||
// Disable editing for old editable row
|
||||
rootItem()->lastChild()->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
|
||||
|
||||
m_hasEditableRow = hasEditableRow;
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::hasEditableRow() const
|
||||
{
|
||||
return m_hasEditableRow;
|
||||
}
|
||||
|
||||
void QmlConsoleItemModel::appendEditableRow()
|
||||
{
|
||||
int position = m_rootItem->childCount();
|
||||
if (appendItem(new ConsoleItem(m_rootItem, ConsoleItem::InputType), position))
|
||||
emit selectEditableRow(index(position, 0), QItemSelectionModel::ClearAndSelect);
|
||||
}
|
||||
|
||||
void QmlConsoleItemModel::removeEditableRow()
|
||||
{
|
||||
if (m_rootItem->child(m_rootItem->childCount() - 1)->itemType == ConsoleItem::InputType)
|
||||
removeRow(m_rootItem->childCount() - 1);
|
||||
appendItem(new ConsoleItem(ConsoleItem::InputType), position);
|
||||
emit selectEditableRow(index(position, 0, QModelIndex()), QItemSelectionModel::ClearAndSelect);
|
||||
}
|
||||
|
||||
int QmlConsoleItemModel::sizeOfFile(const QFont &font)
|
||||
{
|
||||
int lastReadOnlyRow = m_rootItem->childCount();
|
||||
if (m_hasEditableRow)
|
||||
lastReadOnlyRow -= 2;
|
||||
else
|
||||
lastReadOnlyRow -= 1;
|
||||
int lastReadOnlyRow = rootItem()->childCount();
|
||||
lastReadOnlyRow -= 2; // skip editable row
|
||||
if (lastReadOnlyRow < 0)
|
||||
return 0;
|
||||
QString filename = m_rootItem->child(lastReadOnlyRow)->file;
|
||||
QString filename = static_cast<ConsoleItem *>(rootItem()->child(lastReadOnlyRow))->file();
|
||||
const int pos = filename.lastIndexOf(QLatin1Char('/'));
|
||||
if (pos != -1)
|
||||
filename = filename.mid(pos + 1);
|
||||
@@ -144,141 +110,5 @@ int QmlConsoleItemModel::sizeOfLineNumber(const QFont &font)
|
||||
return fm.width(QLatin1String("88888"));
|
||||
}
|
||||
|
||||
QVariant QmlConsoleItemModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
ConsoleItem *item = getItem(index);
|
||||
|
||||
if (role == Qt::DisplayRole )
|
||||
return item->text();
|
||||
else if (role == QmlConsoleItemModel::TypeRole)
|
||||
return int(item->itemType);
|
||||
else if (role == QmlConsoleItemModel::FileRole)
|
||||
return item->file;
|
||||
else if (role == QmlConsoleItemModel::LineRole)
|
||||
return item->line;
|
||||
else if (role == QmlConsoleItemModel::ExpressionRole)
|
||||
return item->expression();
|
||||
else
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QModelIndex QmlConsoleItemModel::index(int row, int column, const QModelIndex &parent) const
|
||||
{
|
||||
if (parent.isValid() && parent.column() != 0)
|
||||
return QModelIndex();
|
||||
|
||||
if (column > 0)
|
||||
return QModelIndex();
|
||||
|
||||
ConsoleItem *parentItem = getItem(parent);
|
||||
|
||||
ConsoleItem *childItem = parentItem->child(row);
|
||||
if (childItem)
|
||||
return createIndex(row, column, childItem);
|
||||
else
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex QmlConsoleItemModel::parent(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QModelIndex();
|
||||
|
||||
ConsoleItem *childItem = getItem(index);
|
||||
ConsoleItem *parentItem = childItem->parent();
|
||||
|
||||
if (parentItem == m_rootItem)
|
||||
return QModelIndex();
|
||||
|
||||
if (!parentItem)
|
||||
return QModelIndex();
|
||||
return createIndex(parentItem->childNumber(), 0, parentItem);
|
||||
}
|
||||
|
||||
int QmlConsoleItemModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
ConsoleItem *parentItem = getItem(parent);
|
||||
|
||||
return parentItem->childCount();
|
||||
}
|
||||
|
||||
int QmlConsoleItemModel::columnCount(const QModelIndex & /* parent */) const
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
Qt::ItemFlags QmlConsoleItemModel::flags(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return 0;
|
||||
|
||||
ConsoleItem *item = getItem(index);
|
||||
if (m_hasEditableRow && item->parent() == m_rootItem
|
||||
&& index.row() == m_rootItem->childCount() - 1)
|
||||
return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
ConsoleItem *item = getItem(index);
|
||||
bool result = false;
|
||||
if (role == Qt::DisplayRole) {
|
||||
item->setText(value.toString());
|
||||
result = true;
|
||||
} else if (role == QmlConsoleItemModel::TypeRole) {
|
||||
item->itemType = (ConsoleItem::ItemType)value.toInt();
|
||||
result = true;
|
||||
} else if (role == QmlConsoleItemModel::FileRole) {
|
||||
item->file = value.toString();
|
||||
result = true;
|
||||
} else if (role == QmlConsoleItemModel::LineRole) {
|
||||
item->line = value.toInt();
|
||||
result = true;
|
||||
}
|
||||
|
||||
if (result)
|
||||
emit dataChanged(index, index);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::insertRows(int position, int rows, const QModelIndex &parent)
|
||||
{
|
||||
ConsoleItem *parentItem = getItem(parent);
|
||||
bool success;
|
||||
|
||||
beginInsertRows(parent, position, position + rows - 1);
|
||||
success = parentItem->insertChildren(position, rows);
|
||||
endInsertRows();
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
bool QmlConsoleItemModel::removeRows(int position, int rows, const QModelIndex &parent)
|
||||
{
|
||||
ConsoleItem *parentItem = getItem(parent);
|
||||
bool success = true;
|
||||
|
||||
beginRemoveRows(parent, position, position + rows - 1);
|
||||
success = parentItem->removeChildren(position, rows);
|
||||
endRemoveRows();
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
ConsoleItem *QmlConsoleItemModel::getItem(const QModelIndex &index) const
|
||||
{
|
||||
if (index.isValid()) {
|
||||
ConsoleItem *item = static_cast<ConsoleItem*>(index.internalPointer());
|
||||
if (item)
|
||||
return item;
|
||||
}
|
||||
return m_rootItem;
|
||||
}
|
||||
|
||||
} // Internal
|
||||
} // QmlJSTools
|
||||
|
||||
Reference in New Issue
Block a user