From 1f36401d206ff29ac9931e96b82f82c8e8644810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Sun, 23 Jun 2019 09:54:54 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@560 a8b55f48-bf90-11e4-a774-851b48703e85 --- piqt_utils/piintrospector/containers_view.cpp | 195 ++++++++++++++++++ piqt_utils/piintrospector/containers_view.h | 66 ++++++ piqt_utils/piintrospector/containers_view.ui | 93 +++++++++ piqt_utils/piintrospector/objects_view.cpp | 60 ++++++ piqt_utils/piintrospector/objects_view.h | 28 +++ piqt_utils/piintrospector/objects_view.ui | 101 +++++++++ 6 files changed, 543 insertions(+) create mode 100644 piqt_utils/piintrospector/containers_view.cpp create mode 100644 piqt_utils/piintrospector/containers_view.h create mode 100644 piqt_utils/piintrospector/containers_view.ui create mode 100644 piqt_utils/piintrospector/objects_view.cpp create mode 100644 piqt_utils/piintrospector/objects_view.h create mode 100644 piqt_utils/piintrospector/objects_view.ui diff --git a/piqt_utils/piintrospector/containers_view.cpp b/piqt_utils/piintrospector/containers_view.cpp new file mode 100644 index 0000000..878704c --- /dev/null +++ b/piqt_utils/piintrospector/containers_view.cpp @@ -0,0 +1,195 @@ +#include "containers_view.h" +#include +#include + +#include +const QString demangle(const char * name) { + int status = -4; + char * res = abi::__cxa_demangle(name, NULL, NULL, &status); + QString ret((status == 0) ? res : name); + free(res); + return ret; +} + + +enum ColumnContainers { + ccType, + ccCount, + ccBytesAllocated, + ccBytesUsed, + ccColumnCount, +}; + + + + +ContainersModel::ContainersModel() { + mode_changes = false; + all.resize(columnCount(), 0L); + prev_all.resize(all.size(), 0L); +} + + +void ContainersModel::update(const PIMap & td, const PIMap & tn) { + prev_typedata = typedata; + typedata = td; + typenames = tn; + PIVector ntypeids = tn.keys(); + for (int i = 0; i < ntypeids.size_s(); ++i) { + if (typeids.size_s() > i) + if (typeids[i] == ntypeids[i]) continue; + beginInsertRows(QModelIndex(), i, i); + typeids.insert(i, ntypeids[i]); + endInsertRows(); + } + prev_all = all; + all.fill(0U); + for (auto i = td.constBegin(); i != td.constEnd(); ++i) { + all[ccCount] += i.value().count; + all[ccBytesAllocated] += i.value().bytes_allocated; + all[ccBytesUsed] += i.value().bytes_used; + } + dataChanged(index(1, 0), index(columnCount(), typeids.size_s() - 1)); + emit headerDataChanged(Qt::Horizontal, 1, columnCount()); +} + + +void ContainersModel::clear() { + beginRemoveRows(QModelIndex(), 0, typeids.size_s() - 1); + typedata.clear(); + prev_typedata.clear(); + typenames.clear(); + typeids.clear(); + all.fill(0L); + endRemoveRows(); +} + + +int ContainersModel::rowCount(const QModelIndex & parent) const { + return typeids.size_s(); +} + + +int ContainersModel::columnCount(const QModelIndex & parent) const { + return ccColumnCount; +} + + +QModelIndex ContainersModel::index(int row, int column, const QModelIndex & parent) const { + if (row >= typenames.size_s() || row >= typedata.size_s()) return QModelIndex(); + return createIndex(row, column, typeids[row]); +} + + +bool ContainersModel::hasChildren(const QModelIndex & parent) const { + if (!parent.isValid()) return true; + return false; +} + + +QVariant ContainersModel::headerData(int section, Qt::Orientation orientation, int role) const { + if (orientation != Qt::Horizontal || role != Qt::DisplayRole) return QVariant(); + PIVector ret = all; + if (mode_changes) { + for (int i = 0; i < all.size_s(); ++i) + ret[i] -= prev_all[i]; + } + switch (section) { + case ccType : return tr("Type"); + case ccCount : return tr("Count (%1)").arg(ret[ccCount]); + case ccBytesAllocated: return tr("Allocated (%1)").arg(PI2QString(PIString::readableSize(ret[ccBytesAllocated]))); + case ccBytesUsed : return tr("Used (%1)").arg(PI2QString(PIString::readableSize(ret[ccBytesUsed]))); + default: break; + } + return QVariant(); +} + + +QVariant ContainersModel::data(const QModelIndex & index, int role) const { + if (role != Qt::DisplayRole && role != Qt::UserRole) return QVariant(); + uint id = uint(index.internalId()); + llong v = 0L; + if (mode_changes) { + switch (index.column()) { + case ccType: return demangle(typenames.value(id).dataAscii()); + case ccCount: return int(typedata.value(id).count) - int(prev_typedata.value(id).count); + case ccBytesAllocated: + v = typedata.value(id).bytes_allocated; + v -= prev_typedata.value(id).bytes_allocated; + if (role == Qt::UserRole) return piAbs(v); + return PI2QString(PIString::readableSize(v)); + case ccBytesUsed: + v = typedata.value(id).bytes_used; + v -= prev_typedata.value(id).bytes_used; + if (role == Qt::UserRole) return piAbs(v); + return PI2QString(PIString::readableSize(v)); + } + } else { + switch (index.column()) { + case ccType: return demangle(typenames.value(id).dataAscii()); + case ccCount: return typedata.value(id).count; + case ccBytesAllocated: + v = typedata.value(id).bytes_allocated; + if (role == Qt::UserRole) return v; + return PI2QString(PIString::readableSize(v)); + case ccBytesUsed: + v = typedata.value(id).bytes_used; + if (role == Qt::UserRole) return v; + return PI2QString(PIString::readableSize(v)); + } + } + return QVariant(); +} + + +Qt::ItemFlags ContainersModel::flags(const QModelIndex & index) const { + return Qt::ItemIsEnabled | Qt::ItemIsSelectable; +} + + +void ContainersModel::setChangesMode(bool yes) { + mode_changes = yes; + dataChanged(index(1, 0), index(columnCount(), typeids.size_s() - 1)); + emit headerDataChanged(Qt::Horizontal, 1, columnCount()); +} + + + + +ContainersView::ContainersView(QWidget * parent): QWidget(parent) { + setupUi(this); + model = new ContainersModel(); + connect(radioChanges, SIGNAL(toggled(bool)), model, SLOT(setChangesMode(bool))); + QSortFilterProxyModel * proxy = new QSortFilterProxyModel(); + proxy->setSourceModel(model); + proxy->setSortRole(Qt::UserRole); + proxy->setDynamicSortFilter(false); + treeContainers->setModel(proxy); +} + + +ContainersView::~ContainersView() { +} + + +void ContainersView::changeEvent(QEvent * e) { + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + retranslateUi(this); + break; + default: + break; + } +} + + +void ContainersView::showContainers(const PIMap & data, const PIMap & typenames) { + model->update(data, typenames); +} + + +void ContainersView::clear() { + model->clear(); +} + diff --git a/piqt_utils/piintrospector/containers_view.h b/piqt_utils/piintrospector/containers_view.h new file mode 100644 index 0000000..1d9e9a5 --- /dev/null +++ b/piqt_utils/piintrospector/containers_view.h @@ -0,0 +1,66 @@ +#ifndef CONTAINERS_VIEW_H +#define CONTAINERS_VIEW_H + +#include "ui_containers_view.h" +#include +#include +#include "piqt.h" +#include "piintrospection_containers_p.h" + + +class ContainersModel: public QAbstractItemModel { + Q_OBJECT +public: + ContainersModel(); + + void update(const PIMap & td, const PIMap & tn); + void clear(); + + int rowCount(const QModelIndex & parent = QModelIndex()) const override; + int columnCount(const QModelIndex & parent = QModelIndex()) const override; + QModelIndex parent(const QModelIndex & child) const override {return QModelIndex();} + QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const override; + bool hasChildren(const QModelIndex & parent = QModelIndex()) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; + QVariant data(const QModelIndex & index, int role) const override; + Qt::ItemFlags flags(const QModelIndex & index) const override; + +protected: + PIMap typedata, prev_typedata; + PIMap typenames; + PIVector typeids; + PIVector all, prev_all; + bool mode_changes; + +public slots: + void setChangesMode(bool yes); + +}; + + + + +class ContainersView: public QWidget, private Ui::ContainersView +{ + Q_OBJECT +public: + ContainersView(QWidget * parent = 0); + ~ContainersView(); + + void showContainers(const PIMap & data, const PIMap & typenames); + void clear(); + +protected: + void changeEvent(QEvent * e); + + QStringList src_header; + ContainersModel * model; + +private slots: + +public slots: + +}; + + +#endif // CONTAINERS_VIEW_H diff --git a/piqt_utils/piintrospector/containers_view.ui b/piqt_utils/piintrospector/containers_view.ui new file mode 100644 index 0000000..b4f73c7 --- /dev/null +++ b/piqt_utils/piintrospector/containers_view.ui @@ -0,0 +1,93 @@ + + + ContainersView + + + + 0 + 0 + 610 + 406 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Overall + + + true + + + + + + + Qt::Horizontal + + + QSizePolicy::Preferred + + + + 20 + 20 + + + + + + + + Changes + + + + + + + Qt::Horizontal + + + + 1 + 20 + + + + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::ScrollPerPixel + + + true + + + + + + + + diff --git a/piqt_utils/piintrospector/objects_view.cpp b/piqt_utils/piintrospector/objects_view.cpp new file mode 100644 index 0000000..f6c8bcc --- /dev/null +++ b/piqt_utils/piintrospector/objects_view.cpp @@ -0,0 +1,60 @@ +#include "objects_view.h" +#include +#include + + +enum ColumnObjects { + coClassName, + coName, + coParents, + coQueuedEvents, +}; + + +ObjectsView::ObjectsView(QWidget * parent): QWidget(parent) { + setupUi(this); +} + + +ObjectsView::~ObjectsView() { +} + + +void ObjectsView::changeEvent(QEvent * e) { + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + retranslateUi(this); + break; + default: + break; + } +} + + +void ObjectsView::showObjects(const PIVector & objects) { + QHash stat; + + int vpos = treeObjects->verticalScrollBar()->value(); + treeObjects->clear(); + piForeachC (PIIntrospection::ObjectInfo & i, objects) { + stat[PI2QString(i.classname)]++; + QTreeWidgetItem * ti = new QTreeWidgetItem(); + ti->setText(coClassName, PI2QString(i.classname)); + ti->setText(coName, PI2QString(i.name)); + ti->setText(coParents, PI2QString(i.parents.join(":"))); + ti->setText(coQueuedEvents, QString::number(i.queued_events)); + treeObjects->addTopLevelItem(ti); + } + treeObjects->verticalScrollBar()->setValue(vpos); + + vpos = treeObjectsStat->verticalScrollBar()->value(); + treeObjectsStat->clear(); + for (auto i = stat.constBegin(); i != stat.constEnd(); ++i) { + QTreeWidgetItem * ti = new QTreeWidgetItem(); + ti->setText(0, i.key()); + ti->setText(1, QString::number(i.value())); + treeObjectsStat->addTopLevelItem(ti); + } + treeObjectsStat->verticalScrollBar()->setValue(vpos); +} diff --git a/piqt_utils/piintrospector/objects_view.h b/piqt_utils/piintrospector/objects_view.h new file mode 100644 index 0000000..c29ee14 --- /dev/null +++ b/piqt_utils/piintrospector/objects_view.h @@ -0,0 +1,28 @@ +#ifndef OBJECTS_VIEW_H +#define OBJECTS_VIEW_H + +#include "ui_objects_view.h" +#include +#include +#include "piqt.h" +#include "piintrospection_server_p.h" + +class ObjectsView: public QWidget, private Ui::ObjectsView +{ + Q_OBJECT +public: + ObjectsView(QWidget * parent = 0); + ~ObjectsView(); + + void showObjects(const PIVector & objects); + +protected: + void changeEvent(QEvent * e); + +private slots: + +public slots: + +}; + +#endif // OBJECTS_VIEW_H diff --git a/piqt_utils/piintrospector/objects_view.ui b/piqt_utils/piintrospector/objects_view.ui new file mode 100644 index 0000000..082ce46 --- /dev/null +++ b/piqt_utils/piintrospector/objects_view.ui @@ -0,0 +1,101 @@ + + + ObjectsView + + + + 0 + 0 + 614 + 413 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + List + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::ScrollPerPixel + + + + class + + + + + name + + + + + parents + + + + + queued_events + + + + + + + + + Statictic + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::ScrollPerPixel + + + + class + + + + + count + + + + + + + + + + + + +