mirror of
https://github.com/rizinorg/cutter.git
synced 2024-12-24 05:45:27 +00:00
* Add a button Certificate in Dashboard (iCj) #316
This commit is contained in:
parent
00a1f86bba
commit
bba02f4b9d
@ -144,7 +144,9 @@ SOURCES += \
|
|||||||
utils/NestedIPyKernel.cpp \
|
utils/NestedIPyKernel.cpp \
|
||||||
dialogs/R2PluginsDialog.cpp \
|
dialogs/R2PluginsDialog.cpp \
|
||||||
widgets/CutterDockWidget.cpp \
|
widgets/CutterDockWidget.cpp \
|
||||||
widgets/GraphWidget.cpp
|
widgets/GraphWidget.cpp \
|
||||||
|
utils/JsonTreeItem.cpp \
|
||||||
|
utils/JsonModel.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
Cutter.h \
|
Cutter.h \
|
||||||
@ -213,7 +215,9 @@ HEADERS += \
|
|||||||
utils/NestedIPyKernel.h \
|
utils/NestedIPyKernel.h \
|
||||||
dialogs/R2PluginsDialog.h \
|
dialogs/R2PluginsDialog.h \
|
||||||
widgets/CutterDockWidget.h \
|
widgets/CutterDockWidget.h \
|
||||||
widgets/GraphWidget.h
|
widgets/GraphWidget.h \
|
||||||
|
utils/JsonTreeItem.h \
|
||||||
|
utils/JsonModel.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
dialogs/AboutDialog.ui \
|
dialogs/AboutDialog.ui \
|
||||||
|
127
src/utils/JsonModel.cpp
Normal file
127
src/utils/JsonModel.cpp
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
#include "JsonModel.h"
|
||||||
|
|
||||||
|
JsonModel::JsonModel(QObject *parent) :
|
||||||
|
QAbstractItemModel(parent)
|
||||||
|
{
|
||||||
|
mRootItem = new JsonTreeItem;
|
||||||
|
mHeaders.append("key");
|
||||||
|
mHeaders.append("value");
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonModel::~JsonModel()
|
||||||
|
{
|
||||||
|
delete mRootItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JsonModel::load(QIODevice *device)
|
||||||
|
{
|
||||||
|
return loadJson(device->readAll());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JsonModel::loadJson(const QByteArray &json)
|
||||||
|
{
|
||||||
|
mDocument = QJsonDocument::fromJson(json);
|
||||||
|
|
||||||
|
if (!mDocument.isNull())
|
||||||
|
{
|
||||||
|
beginResetModel();
|
||||||
|
delete mRootItem;
|
||||||
|
if (mDocument.isArray()) {
|
||||||
|
mRootItem = JsonTreeItem::load(QJsonValue(mDocument.array()));
|
||||||
|
} else {
|
||||||
|
mRootItem = JsonTreeItem::load(QJsonValue(mDocument.object()));
|
||||||
|
}
|
||||||
|
endResetModel();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant JsonModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!index.isValid())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
|
||||||
|
JsonTreeItem *item = static_cast<JsonTreeItem*>(index.internalPointer());
|
||||||
|
|
||||||
|
|
||||||
|
if (role == Qt::DisplayRole) {
|
||||||
|
|
||||||
|
if (index.column() == 0)
|
||||||
|
return QString("%1").arg(item->key());
|
||||||
|
|
||||||
|
if (index.column() == 1)
|
||||||
|
return QString("%1").arg(item->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant JsonModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
if (role != Qt::DisplayRole)
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
if (orientation == Qt::Horizontal) {
|
||||||
|
|
||||||
|
return mHeaders.value(section);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex JsonModel::index(int row, int column, const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
if (!hasIndex(row, column, parent))
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
JsonTreeItem *parentItem;
|
||||||
|
|
||||||
|
if (!parent.isValid())
|
||||||
|
parentItem = mRootItem;
|
||||||
|
else
|
||||||
|
parentItem = static_cast<JsonTreeItem*>(parent.internalPointer());
|
||||||
|
|
||||||
|
JsonTreeItem *childItem = parentItem->child(row);
|
||||||
|
if (childItem)
|
||||||
|
return createIndex(row, column, childItem);
|
||||||
|
else
|
||||||
|
return QModelIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex JsonModel::parent(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
JsonTreeItem *childItem = static_cast<JsonTreeItem*>(index.internalPointer());
|
||||||
|
JsonTreeItem *parentItem = childItem->parent();
|
||||||
|
|
||||||
|
if (parentItem == mRootItem)
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
return createIndex(parentItem->row(), 0, parentItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
int JsonModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
JsonTreeItem *parentItem;
|
||||||
|
if (parent.column() > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!parent.isValid())
|
||||||
|
parentItem = mRootItem;
|
||||||
|
else
|
||||||
|
parentItem = static_cast<JsonTreeItem*>(parent.internalPointer());
|
||||||
|
|
||||||
|
return parentItem->childCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
int JsonModel::columnCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
36
src/utils/JsonModel.h
Normal file
36
src/utils/JsonModel.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
|
||||||
|
#ifndef JSONMODEL_H
|
||||||
|
#define JSONMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonValue>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
|
#include "JsonTreeItem.h"
|
||||||
|
|
||||||
|
class JsonTreeItem;
|
||||||
|
|
||||||
|
class JsonModel : public QAbstractItemModel
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit JsonModel(QObject *parent = 0);
|
||||||
|
bool load(QIODevice * device);
|
||||||
|
bool loadJson(const QByteArray& json);
|
||||||
|
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role) const Q_DECL_OVERRIDE;
|
||||||
|
QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
~JsonModel();
|
||||||
|
private:
|
||||||
|
JsonTreeItem * mRootItem;
|
||||||
|
QJsonDocument mDocument;
|
||||||
|
QStringList mHeaders;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // JSONMODEL_H
|
109
src/utils/JsonTreeItem.cpp
Normal file
109
src/utils/JsonTreeItem.cpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include "JsonTreeItem.h"
|
||||||
|
|
||||||
|
JsonTreeItem::JsonTreeItem(JsonTreeItem *parent)
|
||||||
|
{
|
||||||
|
mParent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonTreeItem::~JsonTreeItem()
|
||||||
|
{
|
||||||
|
qDeleteAll(mChilds);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonTreeItem::appendChild(JsonTreeItem *item)
|
||||||
|
{
|
||||||
|
mChilds.append(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonTreeItem *JsonTreeItem::child(int row)
|
||||||
|
{
|
||||||
|
return mChilds.value(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonTreeItem *JsonTreeItem::parent()
|
||||||
|
{
|
||||||
|
return mParent;
|
||||||
|
}
|
||||||
|
|
||||||
|
int JsonTreeItem::childCount() const
|
||||||
|
{
|
||||||
|
return mChilds.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
int JsonTreeItem::row() const
|
||||||
|
{
|
||||||
|
if (mParent)
|
||||||
|
return mParent->mChilds.indexOf(const_cast<JsonTreeItem*>(this));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonTreeItem::setKey(const QString &key)
|
||||||
|
{
|
||||||
|
mKey = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonTreeItem::setValue(const QString &value)
|
||||||
|
{
|
||||||
|
mValue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void JsonTreeItem::setType(const QJsonValue::Type &type)
|
||||||
|
{
|
||||||
|
mType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString JsonTreeItem::key() const
|
||||||
|
{
|
||||||
|
return mKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString JsonTreeItem::value() const
|
||||||
|
{
|
||||||
|
return mValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonValue::Type JsonTreeItem::type() const
|
||||||
|
{
|
||||||
|
return mType;
|
||||||
|
}
|
||||||
|
|
||||||
|
JsonTreeItem* JsonTreeItem::load(const QJsonValue& value, JsonTreeItem* parent)
|
||||||
|
{
|
||||||
|
JsonTreeItem * rootItem = new JsonTreeItem(parent);
|
||||||
|
rootItem->setKey("root");
|
||||||
|
|
||||||
|
if ( value.isObject())
|
||||||
|
{
|
||||||
|
|
||||||
|
//Get all QJsonValue childs
|
||||||
|
for (QString key : value.toObject().keys()){
|
||||||
|
QJsonValue v = value.toObject().value(key);
|
||||||
|
JsonTreeItem * child = load(v,rootItem);
|
||||||
|
child->setKey(key);
|
||||||
|
child->setType(v.type());
|
||||||
|
rootItem->appendChild(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if ( value.isArray())
|
||||||
|
{
|
||||||
|
//Get all QJsonValue childs
|
||||||
|
int index = 0;
|
||||||
|
for (QJsonValue v : value.toArray()){
|
||||||
|
|
||||||
|
JsonTreeItem * child = load(v,rootItem);
|
||||||
|
child->setKey(QString::number(index));
|
||||||
|
child->setType(v.type());
|
||||||
|
rootItem->appendChild(child);
|
||||||
|
++index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rootItem->setValue(value.toVariant().toString());
|
||||||
|
rootItem->setType(value.type());
|
||||||
|
}
|
||||||
|
|
||||||
|
return rootItem;
|
||||||
|
}
|
39
src/utils/JsonTreeItem.h
Normal file
39
src/utils/JsonTreeItem.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef JSONTREEITEM_H
|
||||||
|
#define JSONTREEITEM_H
|
||||||
|
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonValue>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QIcon>
|
||||||
|
|
||||||
|
#include "JsonModel.h"
|
||||||
|
|
||||||
|
class JsonTreeItem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
JsonTreeItem(JsonTreeItem * parent = 0);
|
||||||
|
~JsonTreeItem();
|
||||||
|
void appendChild(JsonTreeItem * item);
|
||||||
|
JsonTreeItem *child(int row);
|
||||||
|
JsonTreeItem *parent();
|
||||||
|
int childCount() const;
|
||||||
|
int row() const;
|
||||||
|
void setKey(const QString& key);
|
||||||
|
void setValue(const QString& value);
|
||||||
|
void setType(const QJsonValue::Type& type);
|
||||||
|
QString key() const;
|
||||||
|
QString value() const;
|
||||||
|
QJsonValue::Type type() const;
|
||||||
|
static JsonTreeItem *load(const QJsonValue& value, JsonTreeItem * parent = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString mKey;
|
||||||
|
QString mValue;
|
||||||
|
QJsonValue::Type mType;
|
||||||
|
QList<JsonTreeItem*> mChilds;
|
||||||
|
JsonTreeItem *mParent;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // JSONTREEITEM_H
|
@ -1,6 +1,8 @@
|
|||||||
#include "Dashboard.h"
|
#include "Dashboard.h"
|
||||||
#include "ui_Dashboard.h"
|
#include "ui_Dashboard.h"
|
||||||
#include "utils/Helpers.h"
|
#include "utils/Helpers.h"
|
||||||
|
#include "utils/JsonModel.h"
|
||||||
|
#include "utils/JsonTreeItem.h"
|
||||||
|
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
|
|
||||||
@ -11,6 +13,11 @@
|
|||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QLayoutItem>
|
#include <QLayoutItem>
|
||||||
|
#include <QString>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <QTreeWidget>
|
||||||
|
|
||||||
Dashboard::Dashboard(MainWindow *main, QAction *action) :
|
Dashboard::Dashboard(MainWindow *main, QAction *action) :
|
||||||
CutterDockWidget(main, action),
|
CutterDockWidget(main, action),
|
||||||
@ -171,3 +178,47 @@ void Dashboard::updateContents()
|
|||||||
// Get stats for the graphs
|
// Get stats for the graphs
|
||||||
QStringList stats = CutterCore::getInstance()->getStats();
|
QStringList stats = CutterCore::getInstance()->getStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Dashboard::on_certificateButton_clicked()
|
||||||
|
{
|
||||||
|
static QDialog *viewDialog = nullptr;
|
||||||
|
static QTreeView *view = nullptr;
|
||||||
|
static JsonModel *model = nullptr;
|
||||||
|
static QString qstrCertificates;
|
||||||
|
if(!viewDialog)
|
||||||
|
{
|
||||||
|
viewDialog = new QDialog(this);
|
||||||
|
view = new QTreeView(viewDialog);
|
||||||
|
model = new JsonModel();
|
||||||
|
QJsonDocument qjsonCertificatesDoc = Core()->cmdj("iCj");
|
||||||
|
qstrCertificates = qjsonCertificatesDoc.toJson(QJsonDocument::Compact);
|
||||||
|
}
|
||||||
|
if (QString::compare("{}",qstrCertificates))
|
||||||
|
{
|
||||||
|
if(!viewDialog->isVisible())
|
||||||
|
{
|
||||||
|
std::string strCertificates = qstrCertificates.toUtf8().constData();
|
||||||
|
model->loadJson(QByteArray::fromStdString(strCertificates));
|
||||||
|
view->setModel(model);
|
||||||
|
view->expandAll();
|
||||||
|
view->resize(900,600);
|
||||||
|
QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||||
|
sizePolicy.setHorizontalStretch(0);
|
||||||
|
sizePolicy.setVerticalStretch(0);
|
||||||
|
sizePolicy.setHeightForWidth(view->sizePolicy().hasHeightForWidth());
|
||||||
|
viewDialog->setSizePolicy(sizePolicy);
|
||||||
|
viewDialog->setMinimumSize(QSize(900, 600));
|
||||||
|
viewDialog->setMaximumSize(QSize(900, 600));
|
||||||
|
viewDialog->setSizeGripEnabled(false);
|
||||||
|
viewDialog->setWindowTitle("Certificates");
|
||||||
|
viewDialog->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QMessageBox msgBoxCertificateInf(QMessageBox::Information, "Certificate Information ",
|
||||||
|
"There is no certificate information",
|
||||||
|
QMessageBox::NoButton, this);
|
||||||
|
msgBoxCertificateInf.exec();
|
||||||
|
}
|
||||||
|
}
|
@ -21,6 +21,7 @@ public:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateContents();
|
void updateContents();
|
||||||
|
void on_certificateButton_clicked();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<Ui::Dashboard> ui;
|
std::unique_ptr<Ui::Dashboard> ui;
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true"></string>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string notr="true">Dashboard</string>
|
<string notr="true">Dashboard</string>
|
||||||
@ -56,7 +56,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1055</width>
|
<width>1055</width>
|
||||||
<height>974</height>
|
<height>979</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||||
@ -866,6 +866,26 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="certificateButton">
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>167</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Certificates</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
<property name="topMargin">
|
<property name="topMargin">
|
||||||
|
Loading…
Reference in New Issue
Block a user