mirror of
https://github.com/rizinorg/cutter.git
synced 2025-02-21 14:16:08 +00:00
Add Plugins Section to Preferences
This commit is contained in:
parent
dffb9dccb9
commit
aa591e1a47
@ -315,6 +315,7 @@ SOURCES += \
|
|||||||
widgets/DebugActions.cpp \
|
widgets/DebugActions.cpp \
|
||||||
widgets/MemoryMapWidget.cpp \
|
widgets/MemoryMapWidget.cpp \
|
||||||
dialogs/preferences/DebugOptionsWidget.cpp \
|
dialogs/preferences/DebugOptionsWidget.cpp \
|
||||||
|
dialogs/preferences/PluginsOptionsWidget.cpp \
|
||||||
widgets/BreakpointWidget.cpp \
|
widgets/BreakpointWidget.cpp \
|
||||||
dialogs/BreakpointsDialog.cpp \
|
dialogs/BreakpointsDialog.cpp \
|
||||||
dialogs/AttachProcDialog.cpp \
|
dialogs/AttachProcDialog.cpp \
|
||||||
@ -431,6 +432,7 @@ HEADERS += \
|
|||||||
widgets/DebugActions.h \
|
widgets/DebugActions.h \
|
||||||
widgets/MemoryMapWidget.h \
|
widgets/MemoryMapWidget.h \
|
||||||
dialogs/preferences/DebugOptionsWidget.h \
|
dialogs/preferences/DebugOptionsWidget.h \
|
||||||
|
dialogs/preferences/PluginsOptionsWidget.h \
|
||||||
widgets/BreakpointWidget.h \
|
widgets/BreakpointWidget.h \
|
||||||
dialogs/BreakpointsDialog.h \
|
dialogs/BreakpointsDialog.h \
|
||||||
dialogs/AttachProcDialog.h \
|
dialogs/AttachProcDialog.h \
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Show plugin information</string>
|
<string>Show radare2 plugin information</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -51,15 +51,6 @@ R2PluginsDialog::R2PluginsDialog(QWidget *parent) :
|
|||||||
ui->RAsmTreeWidget->addTopLevelItem(item);
|
ui->RAsmTreeWidget->addTopLevelItem(item);
|
||||||
}
|
}
|
||||||
qhelpers::adjustColumns(ui->RAsmTreeWidget, 0);
|
qhelpers::adjustColumns(ui->RAsmTreeWidget, 0);
|
||||||
|
|
||||||
for (CutterPlugin *plugin : Plugins()->getPlugins()) {
|
|
||||||
QTreeWidgetItem *item = new QTreeWidgetItem();
|
|
||||||
item->setText(0, plugin->getName());
|
|
||||||
item->setText(1, plugin->getDescription());
|
|
||||||
item->setText(2, plugin->getVersion());
|
|
||||||
item->setText(3, plugin->getAuthor());
|
|
||||||
ui->CutterTreeWidget->addTopLevelItem(item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
R2PluginsDialog::~R2PluginsDialog()
|
R2PluginsDialog::~R2PluginsDialog()
|
||||||
|
@ -188,47 +188,6 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="CutterTab">
|
|
||||||
<attribute name="title">
|
|
||||||
<string>Cutter</string>
|
|
||||||
</attribute>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="CutterLabel">
|
|
||||||
<property name="text">
|
|
||||||
<string>Cutter plugins</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QTreeWidget" name="CutterTreeWidget">
|
|
||||||
<property name="sortingEnabled">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Name</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Description</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Version</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
<column>
|
|
||||||
<property name="text">
|
|
||||||
<string>Author</string>
|
|
||||||
</property>
|
|
||||||
</column>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -30,11 +30,10 @@ static const QHash<QString, ColorFlags> kRelevantSchemes = {
|
|||||||
{ "white", LightFlag }
|
{ "white", LightFlag }
|
||||||
};
|
};
|
||||||
|
|
||||||
AppearanceOptionsWidget::AppearanceOptionsWidget(PreferencesDialog *dialog, QWidget *parent)
|
AppearanceOptionsWidget::AppearanceOptionsWidget(PreferencesDialog *dialog)
|
||||||
: QDialog(parent),
|
: QDialog(dialog),
|
||||||
ui(new Ui::AppearanceOptionsWidget)
|
ui(new Ui::AppearanceOptionsWidget)
|
||||||
{
|
{
|
||||||
Q_UNUSED(dialog);
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
updateFontFromConfig();
|
updateFontFromConfig();
|
||||||
|
@ -19,7 +19,7 @@ class AppearanceOptionsWidget : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AppearanceOptionsWidget(PreferencesDialog *dialog, QWidget *parent = nullptr);
|
explicit AppearanceOptionsWidget(PreferencesDialog *dialog);
|
||||||
~AppearanceOptionsWidget();
|
~AppearanceOptionsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -9,11 +9,10 @@
|
|||||||
#include "common/Helpers.h"
|
#include "common/Helpers.h"
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
AsmOptionsWidget::AsmOptionsWidget(PreferencesDialog *dialog, QWidget *parent)
|
AsmOptionsWidget::AsmOptionsWidget(PreferencesDialog *dialog)
|
||||||
: QDialog(parent),
|
: QDialog(dialog),
|
||||||
ui(new Ui::AsmOptionsWidget)
|
ui(new Ui::AsmOptionsWidget)
|
||||||
{
|
{
|
||||||
Q_UNUSED(dialog)
|
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class AsmOptionsWidget : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AsmOptionsWidget(PreferencesDialog *dialog, QWidget *parent = nullptr);
|
explicit AsmOptionsWidget(PreferencesDialog *dialog);
|
||||||
~AsmOptionsWidget();
|
~AsmOptionsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -10,11 +10,10 @@
|
|||||||
#include "common/Helpers.h"
|
#include "common/Helpers.h"
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
DebugOptionsWidget::DebugOptionsWidget(PreferencesDialog *dialog, QWidget *parent)
|
DebugOptionsWidget::DebugOptionsWidget(PreferencesDialog *dialog)
|
||||||
: QDialog(parent),
|
: QDialog(dialog),
|
||||||
ui(new Ui::DebugOptionsWidget)
|
ui(new Ui::DebugOptionsWidget)
|
||||||
{
|
{
|
||||||
Q_UNUSED(dialog);
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
updateDebugPlugin();
|
updateDebugPlugin();
|
||||||
|
@ -16,7 +16,7 @@ class DebugOptionsWidget : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit DebugOptionsWidget(PreferencesDialog *dialog, QWidget *parent = nullptr);
|
explicit DebugOptionsWidget(PreferencesDialog *dialog);
|
||||||
~DebugOptionsWidget();
|
~DebugOptionsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -9,12 +9,10 @@
|
|||||||
#include "common/Helpers.h"
|
#include "common/Helpers.h"
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
GraphOptionsWidget::GraphOptionsWidget(PreferencesDialog *dialog, QWidget *parent)
|
GraphOptionsWidget::GraphOptionsWidget(PreferencesDialog *dialog)
|
||||||
: QDialog(parent),
|
: QDialog(dialog),
|
||||||
ui(new Ui::GraphOptionsWidget)
|
ui(new Ui::GraphOptionsWidget)
|
||||||
{
|
{
|
||||||
Q_UNUSED(dialog)
|
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
updateOptionsFromVars();
|
updateOptionsFromVars();
|
||||||
|
@ -19,7 +19,7 @@ class GraphOptionsWidget : public QDialog
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit GraphOptionsWidget(PreferencesDialog *dialog, QWidget *parent = nullptr);
|
explicit GraphOptionsWidget(PreferencesDialog *dialog);
|
||||||
~GraphOptionsWidget();
|
~GraphOptionsWidget();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
56
src/dialogs/preferences/PluginsOptionsWidget.cpp
Normal file
56
src/dialogs/preferences/PluginsOptionsWidget.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
|
||||||
|
#include "PluginsOptionsWidget.h"
|
||||||
|
|
||||||
|
#include "PreferencesDialog.h"
|
||||||
|
|
||||||
|
#include "common/Helpers.h"
|
||||||
|
#include "common/Configuration.h"
|
||||||
|
#include "plugins/PluginManager.h"
|
||||||
|
#include "dialogs/R2PluginsDialog.h"
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
|
||||||
|
PluginsOptionsWidget::PluginsOptionsWidget(PreferencesDialog *dialog)
|
||||||
|
: QDialog(dialog)
|
||||||
|
{
|
||||||
|
auto layout = new QVBoxLayout(this);
|
||||||
|
setLayout(layout);
|
||||||
|
|
||||||
|
auto dirLabel = new QLabel(this);
|
||||||
|
layout->addWidget(dirLabel);
|
||||||
|
dirLabel->setText(tr("Plugins are loaded from %1").arg(Plugins()->getPluginsDirectory()));
|
||||||
|
|
||||||
|
auto treeWidget = new QTreeWidget(this);
|
||||||
|
layout->addWidget(treeWidget);
|
||||||
|
treeWidget->setRootIsDecorated(false);
|
||||||
|
treeWidget->setHeaderLabels({
|
||||||
|
tr("Name"),
|
||||||
|
tr("Description"),
|
||||||
|
tr("Version"),
|
||||||
|
tr("Author")
|
||||||
|
});
|
||||||
|
|
||||||
|
for (CutterPlugin *plugin : Plugins()->getPlugins()) {
|
||||||
|
auto item = new QTreeWidgetItem();
|
||||||
|
item->setText(0, plugin->getName());
|
||||||
|
item->setText(1, plugin->getDescription());
|
||||||
|
item->setText(2, plugin->getVersion());
|
||||||
|
item->setText(3, plugin->getAuthor());
|
||||||
|
treeWidget->addTopLevelItem(item);
|
||||||
|
}
|
||||||
|
qhelpers::adjustColumns(treeWidget, 0);
|
||||||
|
|
||||||
|
auto r2PluginsButton = new QPushButton(this);
|
||||||
|
layout->addWidget(r2PluginsButton);
|
||||||
|
r2PluginsButton->setText(tr("Show radare2 plugin information"));
|
||||||
|
connect(r2PluginsButton, &QPushButton::clicked, this, [this]() {
|
||||||
|
R2PluginsDialog dialog(this);
|
||||||
|
dialog.exec();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginsOptionsWidget::~PluginsOptionsWidget() {}
|
19
src/dialogs/preferences/PluginsOptionsWidget.h
Normal file
19
src/dialogs/preferences/PluginsOptionsWidget.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
#ifndef PLUGINSOPTIONSWIDGET_H
|
||||||
|
#define PLUGINSOPTIONSWIDGET_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
class PreferencesDialog;
|
||||||
|
|
||||||
|
class PluginsOptionsWidget : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit PluginsOptionsWidget(PreferencesDialog *dialog);
|
||||||
|
~PluginsOptionsWidget();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //CUTTER_PLUGINSOPTIONSWIDGET_H
|
@ -1,5 +1,3 @@
|
|||||||
#include <QDialogButtonBox>
|
|
||||||
|
|
||||||
#include "PreferencesDialog.h"
|
#include "PreferencesDialog.h"
|
||||||
#include "ui_PreferencesDialog.h"
|
#include "ui_PreferencesDialog.h"
|
||||||
|
|
||||||
@ -7,12 +5,15 @@
|
|||||||
#include "AsmOptionsWidget.h"
|
#include "AsmOptionsWidget.h"
|
||||||
#include "GraphOptionsWidget.h"
|
#include "GraphOptionsWidget.h"
|
||||||
#include "DebugOptionsWidget.h"
|
#include "DebugOptionsWidget.h"
|
||||||
|
#include "PluginsOptionsWidget.h"
|
||||||
|
|
||||||
#include "PreferenceCategory.h"
|
#include "PreferenceCategory.h"
|
||||||
|
|
||||||
#include "common/Helpers.h"
|
#include "common/Helpers.h"
|
||||||
#include "common/Configuration.h"
|
#include "common/Configuration.h"
|
||||||
|
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
|
||||||
|
|
||||||
PreferencesDialog::PreferencesDialog(QWidget *parent)
|
PreferencesDialog::PreferencesDialog(QWidget *parent)
|
||||||
: QDialog(parent),
|
: QDialog(parent),
|
||||||
@ -25,7 +26,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent)
|
|||||||
QList<PreferenceCategory> prefs {
|
QList<PreferenceCategory> prefs {
|
||||||
|
|
||||||
{
|
{
|
||||||
"Assembly",
|
tr("Disassembly"),
|
||||||
new AsmOptionsWidget(this),
|
new AsmOptionsWidget(this),
|
||||||
QIcon(":/img/icons/disas_light.svg"),
|
QIcon(":/img/icons/disas_light.svg"),
|
||||||
{
|
{
|
||||||
@ -37,14 +38,19 @@ PreferencesDialog::PreferencesDialog(QWidget *parent)
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Debug",
|
tr("Debug"),
|
||||||
new DebugOptionsWidget(this),
|
new DebugOptionsWidget(this),
|
||||||
QIcon(":/img/icons/bug_light.svg")
|
QIcon(":/img/icons/bug_light.svg")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Appearance",
|
tr("Appearance"),
|
||||||
new AppearanceOptionsWidget(this),
|
new AppearanceOptionsWidget(this),
|
||||||
QIcon(":/img/icons/polar_light.svg")
|
QIcon(":/img/icons/polar_light.svg")
|
||||||
|
},
|
||||||
|
{
|
||||||
|
tr("Plugins"),
|
||||||
|
new PluginsOptionsWidget(this),
|
||||||
|
QIcon(":/img/icons/plugins_light.svg")
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2,12 +2,13 @@
|
|||||||
#ifndef PREFERENCESDIALOG_H
|
#ifndef PREFERENCESDIALOG_H
|
||||||
#define PREFERENCESDIALOG_H
|
#define PREFERENCESDIALOG_H
|
||||||
|
|
||||||
|
#include "core/Cutter.h"
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QPushButton>
|
|
||||||
#include <QTreeWidget>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "core/Cutter.h"
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class PreferencesDialog;
|
class PreferencesDialog;
|
||||||
|
54
src/img/icons/plugins_light.svg
Normal file
54
src/img/icons/plugins_light.svg
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
style="enable-background:new 0 0 32 32"
|
||||||
|
xml:space="preserve"
|
||||||
|
height="32px"
|
||||||
|
width="32px"
|
||||||
|
version="1.1"
|
||||||
|
y="0px"
|
||||||
|
x="0px"
|
||||||
|
viewBox="0 0 32 32"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="plugin.svg"
|
||||||
|
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
|
||||||
|
id="metadata14"><rdf:RDF><cc:Work
|
||||||
|
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||||
|
id="defs12">
|
||||||
|
|
||||||
|
|
||||||
|
</defs><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1918"
|
||||||
|
inkscape:window-height="1042"
|
||||||
|
id="namedview10"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="10.429825"
|
||||||
|
inkscape:cx="-16.624731"
|
||||||
|
inkscape:cy="16.507785"
|
||||||
|
inkscape:window-x="1920"
|
||||||
|
inkscape:window-y="18"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg8"
|
||||||
|
inkscape:snap-bbox="true" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="rect5115"
|
||||||
|
d="M 13,0 C 10.784,0 9,1.784 9,4 V 6 H 4 C 1.784,6 0,7.784 0,10 v 5 h 2 c 2.216,0 4,1.784 4,4 0,2.216 -1.784,4 -4,4 H 0 v 5 c 0,2.216 1.784,4 4,4 h 5 v -2 c 0,-2.216 1.784,-4 4,-4 2.216,0 4,1.784 4,4 v 2 h 5 c 2.216,0 4,-1.784 4,-4 v -5 h 2 c 2.216,0 4,-1.784 4,-4 0,-2.216 -1.784,-4 -4,-4 H 26 V 10 C 26,7.784 24.216,6 22,6 H 17 V 4 C 17,1.784 15.216,0 13,0 Z"
|
||||||
|
style="display:inline;fill:#aaacaf;fill-opacity:1;stroke:none;stroke-width:1.9352982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
inkscape:label="puzzle" />
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
@ -9,11 +9,13 @@
|
|||||||
#include "dialogs/SetToDataDialog.h"
|
#include "dialogs/SetToDataDialog.h"
|
||||||
#include "dialogs/EditFunctionDialog.h"
|
#include "dialogs/EditFunctionDialog.h"
|
||||||
#include "dialogs/LinkTypeDialog.h"
|
#include "dialogs/LinkTypeDialog.h"
|
||||||
|
|
||||||
#include <QtCore>
|
#include <QtCore>
|
||||||
#include <QShortcut>
|
#include <QShortcut>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent)
|
DisassemblyContextMenu::DisassemblyContextMenu(QWidget *parent)
|
||||||
: QMenu(parent),
|
: QMenu(parent),
|
||||||
|
@ -84,6 +84,7 @@
|
|||||||
<file>img/icons/previous.svg</file>
|
<file>img/icons/previous.svg</file>
|
||||||
<file>img/icons/list.svg</file>
|
<file>img/icons/list.svg</file>
|
||||||
<file>img/icons/fork.svg</file>
|
<file>img/icons/fork.svg</file>
|
||||||
|
<file>img/icons/plugins_light.svg</file>
|
||||||
<file>python/cutter.py</file>
|
<file>python/cutter.py</file>
|
||||||
<file>python/reg_qtres_importer.py</file>
|
<file>python/reg_qtres_importer.py</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
|
Loading…
Reference in New Issue
Block a user