更新一下

This commit is contained in:
寂静的羽夏 2022-07-07 10:45:30 +08:00
parent c06bb2c6b1
commit 14b29b9ebc
13 changed files with 106 additions and 37 deletions

View File

@ -20,6 +20,8 @@ QMenu *BadPlugin::registerMenu() { return nullptr; }
QDockWidget *BadPlugin::registerDockWidget() { return nullptr; }
QToolButton *BadPlugin::registerToolButton() { return nullptr; }
QString BadPlugin::pluginName() { return "BadPlugin"; }
QString BadPlugin::pluginAuthor() { return "wingsummer"; }

View File

@ -20,6 +20,7 @@ public:
~BadPlugin() override;
void unload() override;
QMenu *registerMenu() override;
QToolButton *registerToolButton() override;
QDockWidget *registerDockWidget() override;
QString pluginName() override;
QString pluginAuthor() override;

View File

@ -3,7 +3,7 @@
#include <QMessageBox>
#include <QStringList>
TestPlugin::TestPlugin(QObject *parent){Q_UNUSED(parent)}
TestPlugin::TestPlugin(QObject *parent) { Q_UNUSED(parent) }
TestPlugin::~TestPlugin() {}
@ -72,6 +72,8 @@ QMenu *TestPlugin::registerMenu() { return testmenu; }
QDockWidget *TestPlugin::registerDockWidget() { return dw; }
QToolButton *TestPlugin::registerToolButton() { return nullptr; }
Qt::DockWidgetArea TestPlugin::registerDockWidgetDockArea() {
return Qt::DockWidgetArea::LeftDockWidgetArea;
}

View File

@ -20,6 +20,7 @@ public:
~TestPlugin() override;
void unload() override;
QMenu *registerMenu() override;
QToolButton *registerToolButton() override;
QDockWidget *registerDockWidget() override;
QString pluginName() override;
QString pluginAuthor() override;

View File

@ -608,29 +608,27 @@ bool QHexDocument::saveTo(QIODevice *device, bool cleanUndo) {
return true;
}
qint64 QHexDocument::searchForward(const QByteArray &ba) {
qint64 startPos = m_cursor->position().offset();
qint64 findPos = m_buffer->indexOf(ba, startPos);
if (findPos > -1) {
m_cursor->clearSelection();
m_cursor->moveTo(findPos);
m_cursor->select(ba.length());
qint64 QHexDocument::searchForward(qint64 begin, const QByteArray &ba) {
qint64 startPos;
if (begin < 0) {
startPos = m_cursor->position().offset();
} else {
startPos = begin;
}
return findPos;
return m_buffer->indexOf(ba, startPos);
}
qint64 QHexDocument::searchBackward(const QByteArray &ba) {
qint64 startPos = m_cursor->position().offset() - 1;
if (m_cursor->hasSelection()) {
startPos = m_cursor->selectionStart().offset() - 1;
qint64 QHexDocument::searchBackward(qint64 begin, const QByteArray &ba) {
qint64 startPos;
if (begin < 0) {
startPos = m_cursor->position().offset() - 1;
if (m_cursor->hasSelection()) {
startPos = m_cursor->selectionStart().offset() - 1;
}
} else {
startPos = begin;
}
qint64 findPos = m_buffer->lastIndexOf(ba, startPos);
if (findPos > -1) {
m_cursor->clearSelection();
m_cursor->moveTo(findPos);
m_cursor->select(ba.length());
}
return findPos;
return m_buffer->lastIndexOf(ba, startPos);
}
QHexDocument *QHexDocument::fromLargeFile(QString filename, bool readonly,

View File

@ -123,12 +123,14 @@ public slots:
QByteArray read(qint64 offset, int len) const;
bool saveTo(QIODevice *device, bool cleanUndo);
qint64 searchForward(const QByteArray &ba);
qint64 searchBackward(const QByteArray &ba);
// qint64 searchForward(const QByteArray &ba);
// qint64 searchBackward(const QByteArray &ba);
/*================================*/
// added by wingsummer
qint64 searchForward(qint64 begin, const QByteArray &ba);
qint64 searchBackward(qint64 begin, const QByteArray &ba);
bool cut(bool hex = false);
void paste(bool hex = false);
bool insert(qint64 offset, uchar b);

View File

@ -170,6 +170,8 @@ void QHexView::establishSignal(QHexDocument *doc) {
QHexView::metaCommentVisibleChanged(b);
emit this->metaStatusChanged();
});
connect(doc, &QHexDocument::metaLineChanged, this,
[=] { this->viewport()->update(); });
}
/*======================*/

View File

@ -593,6 +593,7 @@ MainWindow::MainWindow(DMainWindow *parent) {
toolbar->addSeparator();
AddToolBarTool("general", MainWindow::on_setting_general, tr("General"));
AddToolBarTool("soft", MainWindow::on_about, tr("About"));
toolbar->addSeparator();
this->addToolBar(toolbar);
status = new DStatusBar(this);
@ -1027,6 +1028,8 @@ MainWindow::MainWindow(DMainWindow *parent) {
&MainWindow::PluginMenuNeedAdd);
connect(plgsys, &PluginSystem::PluginDockWidgetAdd, this,
&MainWindow::PluginDockWidgetAdd);
connect(plgsys, &PluginSystem::PluginToolButtonAdd, this,
&MainWindow::PluginToolButtonAdd);
plgsys->LoadPlugin();
} else {
plgmenu->setEnabled(false);
@ -1077,6 +1080,11 @@ void MainWindow::PluginDockWidgetAdd(QDockWidget *dockw,
}
}
void MainWindow::PluginToolButtonAdd(QToolButton *btn) {
if (btn)
toolbar->addWidget(btn);
}
void MainWindow::connectBase(IWingPlugin *plugin) {
if (plugin == nullptr)
return;
@ -1113,7 +1121,13 @@ void MainWindow::connectBase(IWingPlugin *plugin) {
} \
return F;
ConnectBaseLamba2(WingPlugin::Reader::currentDoc, [=] { return _pcurfile; });
ConnectBaseLamba2(WingPlugin::Reader::currentDoc,
[=] { PCHECKRETURN(_pcurfile, _currentfile, -1) });
ConnectBaseLamba2(WingPlugin::Reader::currentDocFilename, [=] {
PCHECKRETURN(hexfiles[_pcurfile].filename, hexfiles[_currentfile].filename,
QString());
});
ConnectBaseLamba2(WingPlugin::Reader::isLocked, [=] {
PCHECKRETURN(hexfiles[_pcurfile].doc->isLocked(),
hexeditor->document()->isLocked(), true);
@ -1277,16 +1291,20 @@ void MainWindow::connectBase(IWingPlugin *plugin) {
hexeditor->document()->findAllBytes(
begin, end, b, results, maxCount), );
});
ConnectBaseLamba2(
WingPlugin::Reader::searchForward, [=](const QByteArray &ba) {
PCHECKRETURN(hexfiles[_pcurfile].doc->searchForward(ba),
hexeditor->document()->searchForward(ba), qint64(-1));
});
ConnectBaseLamba2(
WingPlugin::Reader::searchBackward, [=](const QByteArray &ba) {
PCHECKRETURN(hexfiles[_pcurfile].doc->searchBackward(ba),
hexeditor->document()->searchBackward(ba), qint64(-1));
});
ConnectBaseLamba2(WingPlugin::Reader::searchForward,
[=](qint64 begin, const QByteArray &ba) {
PCHECKRETURN(
hexfiles[_pcurfile].doc->searchForward(begin, ba),
hexeditor->document()->searchForward(begin, ba),
qint64(-1));
});
ConnectBaseLamba2(WingPlugin::Reader::searchBackward,
[=](qint64 begin, const QByteArray &ba) {
PCHECKRETURN(
hexfiles[_pcurfile].doc->searchBackward(begin, ba),
hexeditor->document()->searchBackward(begin, ba),
qint64(-1));
});
ConnectBaseLamba2(WingPlugin::Reader::getMetaLine, [=](quint64 line) {
auto ometas = hexfiles[_pcurfile].doc->metadata()->get(line);
HexLineMetadata metas;
@ -1949,11 +1967,18 @@ void MainWindow::connectControl(IWingPlugin *plugin) {
plgsys->resetTimeout(qobject_cast<IWingPlugin *>(sender()));
on_fillnop();
});
ConnectControlLamba2(
WingPlugin::Controller::toast, [=](QIcon icon, QString message) {
plgsys->resetTimeout(qobject_cast<IWingPlugin *>(sender()));
DMessageManager::instance()->sendMessage(this, icon, message);
});
}
bool MainWindow::requestControl(int timeout) {
auto s = qobject_cast<IWingPlugin *>(sender());
return plgsys->requestControl(s, timeout);
auto res = plgsys->requestControl(s, timeout);
_pcurfile = _currentfile;
return res;
}
bool MainWindow::requestRelease() {

View File

@ -232,6 +232,7 @@ private:
private:
void PluginMenuNeedAdd(QMenu *menu);
void PluginDockWidgetAdd(QDockWidget *dockw, Qt::DockWidgetArea align);
void PluginToolButtonAdd(QToolButton *btn);
void connectBase(IWingPlugin *plugin);
void connectControl(IWingPlugin *plugin);
// shadow

View File

@ -6,6 +6,7 @@
#include <QList>
#include <QMenu>
#include <QObject>
#include <QToolButton>
#include <QWidget>
#include <QtCore>
@ -145,6 +146,7 @@ class Reader : public QObject {
Q_OBJECT
signals:
int currentDoc();
QString currentDocFilename();
// document
bool isReadOnly();
@ -174,8 +176,8 @@ signals:
void copy(bool hex = false);
QByteArray read(qint64 offset, int len);
qint64 searchForward(const QByteArray &ba);
qint64 searchBackward(const QByteArray &ba);
qint64 searchForward(qint64 begin, const QByteArray &ba);
qint64 searchBackward(qint64 begin, const QByteArray &ba);
void findAllBytes(qlonglong begin, qlonglong end, QByteArray b,
QList<quint64> &results, int maxCount = -1);
@ -291,6 +293,7 @@ signals:
// workspace
bool openWorkSpace(QString filename, bool readonly = false);
bool setCurrentEncoding(QString encoding);
void toast(QIcon icon, QString message);
};
} // namespace WingPlugin
@ -309,6 +312,7 @@ public:
virtual ~IWingPlugin() {}
virtual void unload() = 0;
virtual QMenu *registerMenu() = 0;
virtual QToolButton *registerToolButton() = 0;
virtual QDockWidget *registerDockWidget() = 0;
virtual Qt::DockWidgetArea registerDockWidgetDockArea() = 0;
virtual QString pluginName() = 0;
@ -335,13 +339,20 @@ public:
};
#define WINGSUMMER "wingsummer"
#define PluginToolButtonInit(tbtn, menu, icon) \
tbtn = new QToolButton; \
tbtn->setMenu(menu); \
tbtn->setIcon(icon); \
tbtn->setPopupMode(QToolButton::ToolButtonPopupMode::InstantPopup);
#define PluginDockWidgetInit(dw, widget, title, objname) \
dw = new QDockWidget; \
dw->setWidget(widget); \
dw->setWindowTitle(title); \
dw->setObjectName(objname);
#define PluginWidgetFree(w) w->deleteLater();
#define PluginWidgetFree(w) w->deleteLater()
#define PluginMenuInitBegin(menu, title) \
menu = new QMenu; \
@ -369,6 +380,20 @@ public:
connect(a, &QAction::triggered, this, lamba); \
menu->addAction(a);
#define PluginMenuAddItemCheckAction(menu, title, checked, slot) \
a = new QAction(icon, title, this); \
a->setCheckable(true); \
a->setChecked(checked); \
connect(a, &QAction::triggered, this, &slot); \
menu->addAction(a);
#define PluginMenuAddItemCheckLamba(menu, title, checked, lamba) \
a = new QAction(title, this); \
a->setCheckable(true); \
a->setChecked(checked); \
connect(a, &QAction::triggered, this, lamba); \
menu->addAction(a);
#define PluginMenuInitEnd() }
#define USINGCONTROL(Segment) \

View File

@ -97,6 +97,11 @@ void PluginSystem::loadPlugin(QFileInfo fileinfo) {
emit this->PluginMenuNeedAdd(menu);
}
auto tbtn = p->registerToolButton();
if (tbtn) {
emit this->PluginToolButtonAdd(tbtn);
}
auto dockw = p->registerDockWidget();
if (dockw) {
emit this->PluginDockWidgetAdd(dockw, p->registerDockWidgetDockArea());

View File

@ -11,6 +11,7 @@
#include <QObject>
#include <QTimer>
#include <QTimerEvent>
#include <QToolButton>
#include <QVariant>
class PluginSystem : public QObject {
@ -38,6 +39,7 @@ private:
signals:
void PluginMenuNeedAdd(QMenu *menu);
void PluginDockWidgetAdd(QDockWidget *dockw, Qt::DockWidgetArea align);
void PluginToolButtonAdd(QToolButton *btn);
void ConnectBase(IWingPlugin *plugin);
void ConnectControl(IWingPlugin *plugin);
void DisconnectControl(IWingPlugin *plugin);

View File

@ -82,3 +82,6 @@ v1.4.0 ( Wiki 公测版 ):
3. 增加更多的插件接口和消息订阅
4. 修复插件释放控制权但互斥锁未释放导致之后的插件无法再次获取控制的 Bug
5. 修改有关文档的未获取控制的默认值为编辑器默认
6. 增加新的插件接口和开发宏,删除无用插件接口
7. 增加插件添加到工具栏的支持
8. 软件内置 ELF 文件结构分析插件(由寂静的羽夏开发,可以作为很好的插件系统测试插件)