feat: 设置页相关调整优化;

This commit is contained in:
寂静的羽夏 2025-07-12 20:07:16 +08:00
parent 7bbe4da34b
commit 55ebbcd126
31 changed files with 1257 additions and 329 deletions

View File

@ -28,6 +28,7 @@ add_definitions(-DAS_NO_THREADS)
if(BUILD_TEST_PLUGIN) if(BUILD_TEST_PLUGIN)
add_subdirectory(TestPlugin) add_subdirectory(TestPlugin)
add_subdirectory(TestBadPlugin)
add_subdirectory(TestManager) add_subdirectory(TestManager)
endif() endif()
@ -302,7 +303,9 @@ set(CLASS_SRC
src/class/wingangel.h src/class/wingangel.h
src/class/wingangel.cpp src/class/wingangel.cpp
src/class/winggeneric.h src/class/winggeneric.h
src/class/winggeneric.cpp) src/class/winggeneric.cpp
src/class/changedstringlist.h
src/class/changedstringlist.cpp)
set(INTERNAL_PLG_SRC set(INTERNAL_PLG_SRC
src/class/wingangelapi.h src/class/wingangelapi.cpp src/class/wingangelapi.h src/class/wingangelapi.cpp

View File

@ -0,0 +1,53 @@
cmake_minimum_required(VERSION 3.16)
project(TestBadPlugin)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
# Test mode, please configure the main program directory to facilitate debugging
# 便
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
option(TEST_MODE TRUE)
# For Qt
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(
Qt${QT_VERSION_MAJOR}
COMPONENTS Widgets
REQUIRED)
add_library(TestBadPlugin SHARED TestBadPlugin.json
testbadplugin.h testbadplugin.cpp)
set_target_properties(TestBadPlugin PROPERTIES SUFFIX ".wingplg")
if(TEST_MODE)
# If you want to be able to debug easily every time you compile, please set
# this variable. Because this test plugin is a subproject of the main
# project, use CMAKE_BINARY_DIR
# 便 CMAKE_BINARY_DIR
# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
set(WINGHEX_PATH "${CMAKE_BINARY_DIR}")
set(WINGHEX_PLUGIN_PATH "${WINGHEX_PATH}/plugin")
add_custom_command(
TARGET TestBadPlugin
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${WINGHEX_PLUGIN_PATH}
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:TestBadPlugin> ${WINGHEX_PLUGIN_PATH})
endif()
target_link_libraries(TestBadPlugin PRIVATE Qt${QT_VERSION_MAJOR}::Widgets
WingPlugin)

View File

@ -0,0 +1,12 @@
{
"Id": "TestBadPlugin",
"SDK": 18,
"Version": "0.0.1",
"Vendor": "WingCloudStudio",
"Dependencies": [
],
"Author": "wingsummer",
"License": "MIT",
"Url": "https://github.com/Wing-summer/WingHexExplorer2"
}

View File

@ -0,0 +1,41 @@
/*==============================================================================
** Copyright (C) 2024-2027 WingSummer
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
** THE SOFTWARE.
** =============================================================================
*/
#include "testbadplugin.h"
TestBadPlugin::TestBadPlugin() {}
bool TestBadPlugin::init(const std::unique_ptr<QSettings> &set) {
Q_UNUSED(set);
msgCritical(
nullptr, QStringLiteral("TestBadPlugin"),
QStringLiteral("Hello, pals! I'm a evil MESSAGEBOX! PLEASE BAN ME!"));
return true;
}
void TestBadPlugin::unload(std::unique_ptr<QSettings> &set) { Q_UNUSED(set); }
const QString TestBadPlugin::pluginName() const {
return QStringLiteral("TestBadPlugin");
}
const QString TestBadPlugin::pluginComment() const {
return QStringLiteral("TestBadPlugin: popup a messagebox when startup!");
}

View File

@ -0,0 +1,46 @@
/*==============================================================================
** Copyright (C) 2024-2027 WingSummer
**
** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal
** in the Software without restriction, including without limitation the rights
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
** copies of the Software, and to permit persons to whom the Software is
** furnished to do so.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
** THE SOFTWARE.
** =============================================================================
*/
#ifndef TESTBADPLUGIN_H
#define TESTBADPLUGIN_H
#include "WingPlugin/iwingplugin.h"
class TestBadPlugin : public WingHex::IWingPlugin {
Q_OBJECT
Q_PLUGIN_METADATA(IID "com.wingsummer.iwingplugin" FILE
"TestBadPlugin.json")
Q_INTERFACES(WingHex::IWingPlugin)
public:
TestBadPlugin();
// IWingPluginCoreBase interface
public:
virtual bool init(const std::unique_ptr<QSettings> &set) override;
virtual void unload(std::unique_ptr<QSettings> &set) override;
// IWingPluginBase interface
public:
virtual const QString pluginName() const override;
virtual const QString pluginComment() const override;
};
#endif // TESTBADPLUGIN_H

View File

@ -4,6 +4,6 @@
"Version": "0.0.1", "Version": "0.0.1",
"Vendor": "WingCloudStudio", "Vendor": "WingCloudStudio",
"Author": "wingsummer", "Author": "wingsummer",
"License": "AGPL-3.0", "License": "MIT",
"Url": "https://github.com/Wing-summer/WingHexExplorer2" "Url": "https://github.com/Wing-summer/WingHexExplorer2"
} }

View File

@ -28,11 +28,14 @@ TestManager::~TestManager() {
} }
bool TestManager::init(const std::unique_ptr<QSettings> &set) { bool TestManager::init(const std::unique_ptr<QSettings> &set) {
Q_UNUSED(set); _banTestBadPlugin = set->value("BanTestBadPlugin").toBool();
content->initConfig(this);
return true; return true;
} }
void TestManager::unload(std::unique_ptr<QSettings> &set) { Q_UNUSED(set); } void TestManager::unload(std::unique_ptr<QSettings> &set) {
set->setValue("BanTestBadPlugin", _banTestBadPlugin);
}
const QString TestManager::comment() const { const QString TestManager::comment() const {
return QStringLiteral("Hello world!"); return QStringLiteral("Hello world!");
@ -55,3 +58,12 @@ bool TestManager::enterGuard(const QMetaObject *sender, const QString &sig,
return true; return true;
} }
bool TestManager::onLoadingPlugin(const QString &fileName,
const WingHex::PluginInfo &info) {
Q_UNUSED(fileName);
if (info.id == QStringLiteral("TestBadPlugin")) {
return !_banTestBadPlugin;
}
return true;
}

View File

@ -56,6 +56,10 @@ private:
_cbblk = new QCheckBox(QStringLiteral("Disable msg*"), this); _cbblk = new QCheckBox(QStringLiteral("Disable msg*"), this);
_cbblk->setChecked(false); _cbblk->setChecked(false);
layout->addWidget(_cbblk); layout->addWidget(_cbblk);
_banclk = new QCheckBox(QStringLiteral("BanTestBadPlugin"), this);
layout->addWidget(_banclk);
layout->addStretch(); layout->addStretch();
} }
// PageBase interface // PageBase interface
@ -74,19 +78,31 @@ private:
public: public:
virtual void restore() override { _cbblk->setChecked(false); } virtual void restore() override { _cbblk->setChecked(false); }
void initConfig(TestManager *man) {
_banclk->setChecked(man->_banTestBadPlugin);
connect(_banclk, &QCheckBox::toggled, this, [man, this](bool b) {
man->_banTestBadPlugin = b;
Q_EMIT optionNeedRestartChanged();
});
}
public: public:
bool isDisableMsg() const { return _cbblk->isChecked(); } bool isDisableMsg() const { return _cbblk->isChecked(); }
private: private:
QCheckBox *_cbblk; QCheckBox *_cbblk, *_banclk;
}; };
public slots: public slots:
virtual bool enterGuard(const QMetaObject *sender, const QString &sig, virtual bool enterGuard(const QMetaObject *sender, const QString &sig,
const QVariantList &params) override; const QVariantList &params) override;
virtual bool onLoadingPlugin(const QString &fileName,
const WingHex::PluginInfo &info) override;
private: private:
TestPage *content; TestPage *content;
bool _banTestBadPlugin = false;
}; };
#endif // TESTMANAGER_H #endif // TESTMANAGER_H

View File

@ -7,6 +7,6 @@
], ],
"Author": "wingsummer", "Author": "wingsummer",
"License": "AGPL-3.0", "License": "MIT",
"Url": "https://github.com/Wing-summer/WingHexExplorer2" "Url": "https://github.com/Wing-summer/WingHexExplorer2"
} }

@ -1 +1 @@
Subproject commit ab94fca27d23da495fa743dd15ccb01ca6a431fc Subproject commit 420ad38ba767c180c7edc726aa8641a631e24559

BIN
images/devextdis.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
images/plugindis.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -2298,6 +2298,7 @@
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="81"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="81"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="305"/>
<source>PluginInfo</source> <source>PluginInfo</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2307,97 +2308,129 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="136"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="125"/>
<location filename="../../src/settings/pluginsettingdialog.ui" line="175"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="146"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="313"/>
<source>DevExtInfo</source> <source>DevExtInfo</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="152"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="162"/>
<source>DevExt:</source> <source>DevExt:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="176"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="196"/>
<source>APIMonitor</source> <source>APIMonitor</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="108"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="343"/>
<source>Plugin</source> <source>Plugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="71"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="158"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="128"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="215"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="153"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="272"/>
<source>ID</source> <source>ID</source>
<translation>ID</translation> <translation>ID</translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="129"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="216"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="154"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="273"/>
<source>Name</source> <source>Name</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="72"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="159"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="130"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="218"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="155"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="275"/>
<source>License</source> <source>License</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="73"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="160"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="131"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="219"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="156"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="276"/>
<source>Author</source> <source>Author</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="74"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="161"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="132"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="220"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="157"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="277"/>
<source>Vendor</source> <source>Vendor</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="76"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="163"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="134"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="222"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="159"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="279"/>
<source>Version</source> <source>Version</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="86"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="173"/>
<source>NoMonitorPlugin</source> <source>NoMonitorPlugin</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="80"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="391"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="136"/> <source>SelectAll</source>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="161"/> <translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="372"/>
<source>SelectEnable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="380"/>
<source>SelectDisable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="392"/>
<source>SelectClear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="396"/>
<source>DiscardChanges</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="167"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="223"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="280"/>
<source>Comment</source> <source>Comment</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="78"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="165"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="138"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="235"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="172"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="282"/>
<source>URL</source> <source>URL</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="163"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="225"/>
<source>pluginDependencies:</source> <source>pluginDependencies:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="166"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="228"/>
<source>PUID:</source> <source>PUID:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="167"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="230"/>
<source>Version:</source> <source>Version:</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2405,127 +2438,127 @@
<context> <context>
<name>PluginSystem</name> <name>PluginSystem</name>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3221"/> <location filename="../../src/class/pluginsystem.cpp" line="3231"/>
<source>LoadingPlugin</source> <source>LoadingPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3239"/> <location filename="../../src/class/pluginsystem.cpp" line="3249"/>
<location filename="../../src/class/pluginsystem.cpp" line="3816"/> <location filename="../../src/class/pluginsystem.cpp" line="3844"/>
<source>InvalidPluginBrokenInfo</source> <source>InvalidPluginBrokenInfo</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3261"/> <location filename="../../src/class/pluginsystem.cpp" line="3277"/>
<location filename="../../src/class/pluginsystem.cpp" line="4318"/> <location filename="../../src/class/pluginsystem.cpp" line="4355"/>
<source>PluginBlockByManager</source> <source>PluginBlockByManager</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3655"/> <location filename="../../src/class/pluginsystem.cpp" line="3683"/>
<source>AppClosingCanceled:</source> <source>AppClosingCanceled:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3731"/> <location filename="../../src/class/pluginsystem.cpp" line="3759"/>
<source>- PluginID:</source> <source>- PluginID:</source>
<translation>- ID</translation> <translation>- ID</translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3753"/> <location filename="../../src/class/pluginsystem.cpp" line="3781"/>
<source>FoundDrvPluginCount</source> <source>FoundDrvPluginCount</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3794"/> <location filename="../../src/class/pluginsystem.cpp" line="3822"/>
<source>PluginManagerNeedSingleton</source> <source>PluginManagerNeedSingleton</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3252"/> <location filename="../../src/class/pluginsystem.cpp" line="3262"/>
<location filename="../../src/class/pluginsystem.cpp" line="3810"/> <location filename="../../src/class/pluginsystem.cpp" line="3838"/>
<source>ErrLoadPluginSDKVersion</source> <source>ErrLoadPluginSDKVersion</source>
<translation> SDK </translation> <translation> SDK </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3962"/> <location filename="../../src/class/pluginsystem.cpp" line="3990"/>
<source>ErrLoadPluginNoName</source> <source>ErrLoadPluginNoName</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3840"/> <location filename="../../src/class/pluginsystem.cpp" line="3868"/>
<location filename="../../src/class/pluginsystem.cpp" line="3983"/> <location filename="../../src/class/pluginsystem.cpp" line="4011"/>
<source>ErrLoadInitPlugin</source> <source>ErrLoadInitPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3992"/> <location filename="../../src/class/pluginsystem.cpp" line="4020"/>
<source>PluginName :</source> <source>PluginName :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3993"/> <location filename="../../src/class/pluginsystem.cpp" line="4021"/>
<source>PluginAuthor :</source> <source>PluginAuthor :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3994"/> <location filename="../../src/class/pluginsystem.cpp" line="4022"/>
<source>PluginWidgetRegister</source> <source>PluginWidgetRegister</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4034"/> <location filename="../../src/class/pluginsystem.cpp" line="4062"/>
<source>ExtPluginAuthor :</source> <source>ExtPluginAuthor :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4035"/> <location filename="../../src/class/pluginsystem.cpp" line="4063"/>
<source>ExtPluginWidgetRegister</source> <source>ExtPluginWidgetRegister</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4051"/> <location filename="../../src/class/pluginsystem.cpp" line="4079"/>
<source>ErrLoadInitExtPlugin</source> <source>ErrLoadInitExtPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4074"/> <location filename="../../src/class/pluginsystem.cpp" line="4102"/>
<source>ChooseFile</source> <source>ChooseFile</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4081"/> <location filename="../../src/class/pluginsystem.cpp" line="4109"/>
<location filename="../../src/class/pluginsystem.cpp" line="4086"/> <location filename="../../src/class/pluginsystem.cpp" line="4114"/>
<source>Error</source> <source>Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4082"/> <location filename="../../src/class/pluginsystem.cpp" line="4110"/>
<source>FileNotExist</source> <source>FileNotExist</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4087"/> <location filename="../../src/class/pluginsystem.cpp" line="4115"/>
<source>FilePermission</source> <source>FilePermission</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4117"/> <location filename="../../src/class/pluginsystem.cpp" line="4145"/>
<source>EmptyNameDockWidget:</source> <source>EmptyNameDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4127"/> <location filename="../../src/class/pluginsystem.cpp" line="4155"/>
<source>InvalidNameDockWidget:</source> <source>InvalidNameDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4135"/> <location filename="../../src/class/pluginsystem.cpp" line="4163"/>
<source>InvalidNullDockWidget:</source> <source>InvalidNullDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4248"/> <location filename="../../src/class/pluginsystem.cpp" line="4276"/>
<source>Not allowed operation in non-UI thread</source> <source>Not allowed operation in non-UI thread</source>
<translation> UI 线</translation> <translation> UI 线</translation>
</message> </message>
@ -2535,48 +2568,48 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3779"/> <location filename="../../src/class/pluginsystem.cpp" line="3807"/>
<source>UnsafePluginDir</source> <source>UnsafePluginDir</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3246"/> <location filename="../../src/class/pluginsystem.cpp" line="3256"/>
<location filename="../../src/class/pluginsystem.cpp" line="3813"/> <location filename="../../src/class/pluginsystem.cpp" line="3841"/>
<source>InvalidPluginID</source> <source>InvalidPluginID</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3249"/> <location filename="../../src/class/pluginsystem.cpp" line="3259"/>
<source>InvalidDupPlugin</source> <source>InvalidDupPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3696"/> <location filename="../../src/class/pluginsystem.cpp" line="3724"/>
<source>FoundPluginCount</source> <source>FoundPluginCount</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3727"/> <location filename="../../src/class/pluginsystem.cpp" line="3755"/>
<source>PluginLoadingFailedSummary</source> <source>PluginLoadingFailedSummary</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3732"/> <location filename="../../src/class/pluginsystem.cpp" line="3760"/>
<source>- Dependencies:</source> <source>- Dependencies:</source>
<translation>- </translation> <translation>- </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3734"/> <location filename="../../src/class/pluginsystem.cpp" line="3762"/>
<source>PUID:</source> <source>PUID:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3735"/> <location filename="../../src/class/pluginsystem.cpp" line="3763"/>
<source>Version:</source> <source>Version:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3742"/> <location filename="../../src/class/pluginsystem.cpp" line="3770"/>
<source>PluginLoadingFinished</source> <source>PluginLoadingFinished</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4539,22 +4572,22 @@
<context> <context>
<name>ScriptManager</name> <name>ScriptManager</name>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="91"/> <location filename="../../src/class/scriptmanager.cpp" line="92"/>
<source>RunScript</source> <source>RunScript</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="92"/> <location filename="../../src/class/scriptmanager.cpp" line="93"/>
<source>CanNotRunUsrScriptForPolicy</source> <source>CanNotRunUsrScriptForPolicy</source>
<translation> Root </translation> <translation> Root </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="283"/> <location filename="../../src/class/scriptmanager.cpp" line="279"/>
<source>ScriptRunning</source> <source>ScriptRunning</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="284"/> <location filename="../../src/class/scriptmanager.cpp" line="280"/>
<source>ScriptRunningRequestLastStop?</source> <source>ScriptRunningRequestLastStop?</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4562,42 +4595,67 @@
<context> <context>
<name>ScriptSettingDialog</name> <name>ScriptSettingDialog</name>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="128"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="176"/>
<source>SelectShow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="181"/>
<source>SelectHide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="189"/>
<source>SelectAll</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="190"/>
<source>SelectClear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="194"/>
<source>DiscardChanges</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="200"/>
<source>Script</source> <source>Script</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="155"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="100"/>
<source>RawName:</source> <source>RawName:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="156"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="101"/>
<source>Name:</source> <source>Name:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="157"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="102"/>
<source>Author:</source> <source>Author:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="158"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="103"/>
<source>License:</source> <source>License:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="159"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="104"/>
<source>ContextMenu:</source> <source>ContextMenu:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="162"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="108"/>
<source>HomePage:</source> <source>HomePage:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="163"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="109"/>
<source>Comment:</source> <source>Comment:</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4627,9 +4685,9 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.ui" line="135"/> <location filename="../../src/settings/scriptsettingdialog.ui" line="138"/>
<source>Refresh</source> <source>Save</source>
<translation></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -5234,43 +5292,45 @@
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.ui" line="71"/> <location filename="../../src/dialog/settingdialog.ui" line="71"/>
<location filename="../../src/dialog/settingdialog.cpp" line="73"/> <location filename="../../src/dialog/settingdialog.cpp" line="81"/>
<location filename="../../src/dialog/settingdialog.cpp" line="89"/> <location filename="../../src/dialog/settingdialog.cpp" line="97"/>
<source>Restore</source> <source>Restore</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="40"/> <location filename="../../src/dialog/settingdialog.cpp" line="42"/>
<location filename="../../src/dialog/settingdialog.cpp" line="167"/>
<source>UnsavedChanges</source> <source>UnsavedChanges</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="41"/> <location filename="../../src/dialog/settingdialog.cpp" line="43"/>
<location filename="../../src/dialog/settingdialog.cpp" line="168"/>
<source>SaveChangesDiscardLeave?</source> <source>SaveChangesDiscardLeave?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="71"/> <location filename="../../src/dialog/settingdialog.cpp" line="79"/>
<source>Restore current</source> <source>Restore current</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="74"/> <location filename="../../src/dialog/settingdialog.cpp" line="82"/>
<source>RestoreCurPageSets?</source> <source>RestoreCurPageSets?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="86"/> <location filename="../../src/dialog/settingdialog.cpp" line="94"/>
<source>Restore all</source> <source>Restore all</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="89"/> <location filename="../../src/dialog/settingdialog.cpp" line="97"/>
<source>RestoreAllSets?</source> <source>RestoreAllSets?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="159"/> <location filename="../../src/dialog/settingdialog.cpp" line="188"/>
<source>TakeEffectRestart</source> <source>TakeEffectRestart</source>
<translation></translation> <translation></translation>
</message> </message>
@ -5278,7 +5338,7 @@
<context> <context>
<name>SettingManager</name> <name>SettingManager</name>
<message> <message>
<location filename="../../src/class/settingmanager.cpp" line="214"/> <location filename="../../src/class/settingmanager.cpp" line="261"/>
<source>ConfigUnableSave</source> <source>ConfigUnableSave</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -2298,6 +2298,7 @@
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="81"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="81"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="305"/>
<source>PluginInfo</source> <source>PluginInfo</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2307,97 +2308,129 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="136"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="125"/>
<location filename="../../src/settings/pluginsettingdialog.ui" line="175"/>
<source>Save</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="146"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="313"/>
<source>DevExtInfo</source> <source>DevExtInfo</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="152"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="162"/>
<source>DevExt:</source> <source>DevExt:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.ui" line="176"/> <location filename="../../src/settings/pluginsettingdialog.ui" line="196"/>
<source>APIMonitor</source> <source>APIMonitor</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="108"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="343"/>
<source>Plugin</source> <source>Plugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="71"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="158"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="128"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="215"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="153"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="272"/>
<source>ID</source> <source>ID</source>
<translation>ID</translation> <translation>ID</translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="129"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="216"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="154"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="273"/>
<source>Name</source> <source>Name</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="72"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="159"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="130"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="218"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="155"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="275"/>
<source>License</source> <source>License</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="73"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="160"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="131"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="219"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="156"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="276"/>
<source>Author</source> <source>Author</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="74"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="161"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="132"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="220"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="157"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="277"/>
<source>Vendor</source> <source>Vendor</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="76"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="163"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="134"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="222"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="159"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="279"/>
<source>Version</source> <source>Version</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="86"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="173"/>
<source>NoMonitorPlugin</source> <source>NoMonitorPlugin</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="80"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="391"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="136"/> <source>SelectAll</source>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="161"/> <translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="372"/>
<source>SelectEnable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="380"/>
<source>SelectDisable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="392"/>
<source>SelectClear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="396"/>
<source>DiscardChanges</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="167"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="223"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="280"/>
<source>Comment</source> <source>Comment</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="78"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="165"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="138"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="235"/>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="172"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="282"/>
<source>URL</source> <source>URL</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="163"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="225"/>
<source>pluginDependencies:</source> <source>pluginDependencies:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="166"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="228"/>
<source>PUID:</source> <source>PUID:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/pluginsettingdialog.cpp" line="167"/> <location filename="../../src/settings/pluginsettingdialog.cpp" line="230"/>
<source>Version:</source> <source>Version:</source>
<translation></translation> <translation></translation>
</message> </message>
@ -2405,127 +2438,127 @@
<context> <context>
<name>PluginSystem</name> <name>PluginSystem</name>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3221"/> <location filename="../../src/class/pluginsystem.cpp" line="3231"/>
<source>LoadingPlugin</source> <source>LoadingPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3239"/> <location filename="../../src/class/pluginsystem.cpp" line="3249"/>
<location filename="../../src/class/pluginsystem.cpp" line="3816"/> <location filename="../../src/class/pluginsystem.cpp" line="3844"/>
<source>InvalidPluginBrokenInfo</source> <source>InvalidPluginBrokenInfo</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3261"/> <location filename="../../src/class/pluginsystem.cpp" line="3277"/>
<location filename="../../src/class/pluginsystem.cpp" line="4318"/> <location filename="../../src/class/pluginsystem.cpp" line="4355"/>
<source>PluginBlockByManager</source> <source>PluginBlockByManager</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3655"/> <location filename="../../src/class/pluginsystem.cpp" line="3683"/>
<source>AppClosingCanceled:</source> <source>AppClosingCanceled:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3731"/> <location filename="../../src/class/pluginsystem.cpp" line="3759"/>
<source>- PluginID:</source> <source>- PluginID:</source>
<translation>- ID</translation> <translation>- ID</translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3753"/> <location filename="../../src/class/pluginsystem.cpp" line="3781"/>
<source>FoundDrvPluginCount</source> <source>FoundDrvPluginCount</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3794"/> <location filename="../../src/class/pluginsystem.cpp" line="3822"/>
<source>PluginManagerNeedSingleton</source> <source>PluginManagerNeedSingleton</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3252"/> <location filename="../../src/class/pluginsystem.cpp" line="3262"/>
<location filename="../../src/class/pluginsystem.cpp" line="3810"/> <location filename="../../src/class/pluginsystem.cpp" line="3838"/>
<source>ErrLoadPluginSDKVersion</source> <source>ErrLoadPluginSDKVersion</source>
<translation> SDK </translation> <translation> SDK </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3962"/> <location filename="../../src/class/pluginsystem.cpp" line="3990"/>
<source>ErrLoadPluginNoName</source> <source>ErrLoadPluginNoName</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3840"/> <location filename="../../src/class/pluginsystem.cpp" line="3868"/>
<location filename="../../src/class/pluginsystem.cpp" line="3983"/> <location filename="../../src/class/pluginsystem.cpp" line="4011"/>
<source>ErrLoadInitPlugin</source> <source>ErrLoadInitPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3992"/> <location filename="../../src/class/pluginsystem.cpp" line="4020"/>
<source>PluginName :</source> <source>PluginName :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3993"/> <location filename="../../src/class/pluginsystem.cpp" line="4021"/>
<source>PluginAuthor :</source> <source>PluginAuthor :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3994"/> <location filename="../../src/class/pluginsystem.cpp" line="4022"/>
<source>PluginWidgetRegister</source> <source>PluginWidgetRegister</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4034"/> <location filename="../../src/class/pluginsystem.cpp" line="4062"/>
<source>ExtPluginAuthor :</source> <source>ExtPluginAuthor :</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4035"/> <location filename="../../src/class/pluginsystem.cpp" line="4063"/>
<source>ExtPluginWidgetRegister</source> <source>ExtPluginWidgetRegister</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4051"/> <location filename="../../src/class/pluginsystem.cpp" line="4079"/>
<source>ErrLoadInitExtPlugin</source> <source>ErrLoadInitExtPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4074"/> <location filename="../../src/class/pluginsystem.cpp" line="4102"/>
<source>ChooseFile</source> <source>ChooseFile</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4081"/> <location filename="../../src/class/pluginsystem.cpp" line="4109"/>
<location filename="../../src/class/pluginsystem.cpp" line="4086"/> <location filename="../../src/class/pluginsystem.cpp" line="4114"/>
<source>Error</source> <source>Error</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4082"/> <location filename="../../src/class/pluginsystem.cpp" line="4110"/>
<source>FileNotExist</source> <source>FileNotExist</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4087"/> <location filename="../../src/class/pluginsystem.cpp" line="4115"/>
<source>FilePermission</source> <source>FilePermission</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4117"/> <location filename="../../src/class/pluginsystem.cpp" line="4145"/>
<source>EmptyNameDockWidget:</source> <source>EmptyNameDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4127"/> <location filename="../../src/class/pluginsystem.cpp" line="4155"/>
<source>InvalidNameDockWidget:</source> <source>InvalidNameDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4135"/> <location filename="../../src/class/pluginsystem.cpp" line="4163"/>
<source>InvalidNullDockWidget:</source> <source>InvalidNullDockWidget:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="4248"/> <location filename="../../src/class/pluginsystem.cpp" line="4276"/>
<source>Not allowed operation in non-UI thread</source> <source>Not allowed operation in non-UI thread</source>
<translation> UI </translation> <translation> UI </translation>
</message> </message>
@ -2535,48 +2568,48 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3779"/> <location filename="../../src/class/pluginsystem.cpp" line="3807"/>
<source>UnsafePluginDir</source> <source>UnsafePluginDir</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3246"/> <location filename="../../src/class/pluginsystem.cpp" line="3256"/>
<location filename="../../src/class/pluginsystem.cpp" line="3813"/> <location filename="../../src/class/pluginsystem.cpp" line="3841"/>
<source>InvalidPluginID</source> <source>InvalidPluginID</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3249"/> <location filename="../../src/class/pluginsystem.cpp" line="3259"/>
<source>InvalidDupPlugin</source> <source>InvalidDupPlugin</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3696"/> <location filename="../../src/class/pluginsystem.cpp" line="3724"/>
<source>FoundPluginCount</source> <source>FoundPluginCount</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3727"/> <location filename="../../src/class/pluginsystem.cpp" line="3755"/>
<source>PluginLoadingFailedSummary</source> <source>PluginLoadingFailedSummary</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3732"/> <location filename="../../src/class/pluginsystem.cpp" line="3760"/>
<source>- Dependencies:</source> <source>- Dependencies:</source>
<translation>- </translation> <translation>- </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3734"/> <location filename="../../src/class/pluginsystem.cpp" line="3762"/>
<source>PUID:</source> <source>PUID:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3735"/> <location filename="../../src/class/pluginsystem.cpp" line="3763"/>
<source>Version:</source> <source>Version:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/pluginsystem.cpp" line="3742"/> <location filename="../../src/class/pluginsystem.cpp" line="3770"/>
<source>PluginLoadingFinished</source> <source>PluginLoadingFinished</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4539,22 +4572,22 @@
<context> <context>
<name>ScriptManager</name> <name>ScriptManager</name>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="91"/> <location filename="../../src/class/scriptmanager.cpp" line="92"/>
<source>RunScript</source> <source>RunScript</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="92"/> <location filename="../../src/class/scriptmanager.cpp" line="93"/>
<source>CanNotRunUsrScriptForPolicy</source> <source>CanNotRunUsrScriptForPolicy</source>
<translation> Root </translation> <translation> Root </translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="283"/> <location filename="../../src/class/scriptmanager.cpp" line="279"/>
<source>ScriptRunning</source> <source>ScriptRunning</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/class/scriptmanager.cpp" line="284"/> <location filename="../../src/class/scriptmanager.cpp" line="280"/>
<source>ScriptRunningRequestLastStop?</source> <source>ScriptRunningRequestLastStop?</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4562,42 +4595,67 @@
<context> <context>
<name>ScriptSettingDialog</name> <name>ScriptSettingDialog</name>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="128"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="176"/>
<source>SelectShow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="181"/>
<source>SelectHide</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="189"/>
<source>SelectAll</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="190"/>
<source>SelectClear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="194"/>
<source>DiscardChanges</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="200"/>
<source>Script</source> <source>Script</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="155"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="100"/>
<source>RawName:</source> <source>RawName:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="156"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="101"/>
<source>Name:</source> <source>Name:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="157"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="102"/>
<source>Author:</source> <source>Author:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="158"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="103"/>
<source>License:</source> <source>License:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="159"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="104"/>
<source>ContextMenu:</source> <source>ContextMenu:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="162"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="108"/>
<source>HomePage:</source> <source>HomePage:</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.cpp" line="163"/> <location filename="../../src/settings/scriptsettingdialog.cpp" line="109"/>
<source>Comment:</source> <source>Comment:</source>
<translation></translation> <translation></translation>
</message> </message>
@ -4627,9 +4685,9 @@
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../src/settings/scriptsettingdialog.ui" line="135"/> <location filename="../../src/settings/scriptsettingdialog.ui" line="138"/>
<source>Refresh</source> <source>Save</source>
<translation></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
@ -5234,43 +5292,45 @@
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.ui" line="71"/> <location filename="../../src/dialog/settingdialog.ui" line="71"/>
<location filename="../../src/dialog/settingdialog.cpp" line="73"/> <location filename="../../src/dialog/settingdialog.cpp" line="81"/>
<location filename="../../src/dialog/settingdialog.cpp" line="89"/> <location filename="../../src/dialog/settingdialog.cpp" line="97"/>
<source>Restore</source> <source>Restore</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="40"/> <location filename="../../src/dialog/settingdialog.cpp" line="42"/>
<location filename="../../src/dialog/settingdialog.cpp" line="167"/>
<source>UnsavedChanges</source> <source>UnsavedChanges</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="41"/> <location filename="../../src/dialog/settingdialog.cpp" line="43"/>
<location filename="../../src/dialog/settingdialog.cpp" line="168"/>
<source>SaveChangesDiscardLeave?</source> <source>SaveChangesDiscardLeave?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="71"/> <location filename="../../src/dialog/settingdialog.cpp" line="79"/>
<source>Restore current</source> <source>Restore current</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="74"/> <location filename="../../src/dialog/settingdialog.cpp" line="82"/>
<source>RestoreCurPageSets?</source> <source>RestoreCurPageSets?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="86"/> <location filename="../../src/dialog/settingdialog.cpp" line="94"/>
<source>Restore all</source> <source>Restore all</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="89"/> <location filename="../../src/dialog/settingdialog.cpp" line="97"/>
<source>RestoreAllSets?</source> <source>RestoreAllSets?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../src/dialog/settingdialog.cpp" line="159"/> <location filename="../../src/dialog/settingdialog.cpp" line="188"/>
<source>TakeEffectRestart</source> <source>TakeEffectRestart</source>
<translation></translation> <translation></translation>
</message> </message>
@ -5278,7 +5338,7 @@
<context> <context>
<name>SettingManager</name> <name>SettingManager</name>
<message> <message>
<location filename="../../src/class/settingmanager.cpp" line="214"/> <location filename="../../src/class/settingmanager.cpp" line="261"/>
<source>ConfigUnableSave</source> <source>ConfigUnableSave</source>
<translation></translation> <translation></translation>
</message> </message>

View File

@ -30,6 +30,7 @@
<file>images/defines.png</file> <file>images/defines.png</file>
<file>images/del.png</file> <file>images/del.png</file>
<file>images/devext.png</file> <file>images/devext.png</file>
<file>images/devextdis.png</file>
<file>images/edit.png</file> <file>images/edit.png</file>
<file>images/encoding.png</file> <file>images/encoding.png</file>
<file>images/export.png</file> <file>images/export.png</file>
@ -70,6 +71,7 @@
<file>images/paste.png</file> <file>images/paste.png</file>
<file>images/pastehex.png</file> <file>images/pastehex.png</file>
<file>images/plugin.png</file> <file>images/plugin.png</file>
<file>images/plugindis.png</file>
<file>images/pro.png</file> <file>images/pro.png</file>
<file>images/qt.png</file> <file>images/qt.png</file>
<file>images/qtloginspect.png</file> <file>images/qtloginspect.png</file>

View File

@ -0,0 +1,47 @@
#include "changedstringlist.h"
bool ChangedStringList::containChanges() const { return !mods.isEmpty(); }
bool ChangedStringList::containChanges(const QString &item) const {
return contents.contains(item);
}
void ChangedStringList::clear() {
contents.clear();
mods.clear();
}
void ChangedStringList::pushAddItem(const QString &item) {
if (mods.contains(item)) {
auto v = mods.value(item);
if (v) {
return;
} else {
mods.remove(item);
}
} else {
mods.insert(item, true);
}
contents.append(item);
}
void ChangedStringList::pushRemoveItem(const QString &item) {
if (mods.contains(item)) {
auto v = mods.value(item);
if (v) {
mods.remove(item);
} else {
return;
}
} else {
mods.insert(item, false);
}
contents.removeOne(item);
}
QStringList ChangedStringList::getContents() const { return contents; }
void ChangedStringList::setContents(const QStringList &newContents) {
contents = newContents;
mods.clear();
}

View File

@ -0,0 +1,25 @@
#ifndef CHANGEDSTRINGLIST_H
#define CHANGEDSTRINGLIST_H
#include <QHash>
#include <QString>
#include <QStringList>
class ChangedStringList {
public:
bool containChanges() const;
bool containChanges(const QString &item) const;
void clear();
void pushAddItem(const QString &item);
void pushRemoveItem(const QString &item);
QStringList getContents() const;
void setContents(const QStringList &newContents);
private:
QStringList contents;
QHash<QString, bool> mods;
};
#endif // CHANGEDSTRINGLIST_H

View File

@ -2631,6 +2631,16 @@ bool PluginSystem::checkErrAllAllowAndReport(const QObject *sender,
return false; return false;
} }
QMap<PluginSystem::BlockReason, QList<PluginInfo>>
PluginSystem::blockedDevPlugins() const {
return _blkdevs;
}
QMap<PluginSystem::BlockReason, QList<PluginInfo>>
PluginSystem::blockedPlugins() const {
return _blkplgs;
}
void PluginSystem::doneRegisterScriptObj() { void PluginSystem::doneRegisterScriptObj() {
Q_ASSERT(_angelplg); Q_ASSERT(_angelplg);
// ok, then, we will register all script objects // ok, then, we will register all script objects
@ -3254,15 +3264,33 @@ std::optional<PluginInfo> PluginSystem::loadPlugin(const QFileInfo &fileinfo,
} }
auto m = meta.value(); auto m = meta.value();
if (_manager) { if (_manager) {
if (!_manager->onLoadingPlugin(fileName, m)) { if (!_manager->onLoadingPlugin(fileName, m)) {
if constexpr (std::is_same_v<T, IWingPlugin>) {
_blkplgs[BlockReason::BlockedByManager].append(m);
} else if constexpr (std::is_same_v<T, IWingDevice>) {
_blkdevs[BlockReason::BlockedByManager].append(m);
}
Logger::critical(QStringLiteral("{ ") + m.id + Logger::critical(QStringLiteral("{ ") + m.id +
QStringLiteral("} ") + QStringLiteral(" } ") +
tr("PluginBlockByManager")); tr("PluginBlockByManager"));
return std::nullopt; return std::nullopt;
} }
} }
if constexpr (std::is_same_v<T, IWingPlugin>) {
if (!_enabledExtIDs.contains(m.id)) {
_blkplgs[BlockReason::Disabled].append(m);
return std::nullopt;
}
} else if constexpr (std::is_same_v<T, IWingDevice>) {
if (!_enabledDevIDs.contains(m.id)) {
_blkdevs[BlockReason::Disabled].append(m);
return std::nullopt;
}
}
auto p = qobject_cast<T *>(loader.instance()); auto p = qobject_cast<T *>(loader.instance());
if (Q_UNLIKELY(p == nullptr)) { if (Q_UNLIKELY(p == nullptr)) {
Logger::critical(loader.errorString()); Logger::critical(loader.errorString());
@ -4270,6 +4298,9 @@ void PluginSystem::loadAllPlugin() {
try2LoadManagerPlugin(); try2LoadManagerPlugin();
auto &set = SettingManager::instance(); auto &set = SettingManager::instance();
_enabledExtIDs = set.enabledExtPlugins();
_enabledDevIDs = set.enabledDevPlugins();
// manager plugin can not block WingAngelAPI, only settings // manager plugin can not block WingAngelAPI, only settings
if (set.scriptEnabled()) { if (set.scriptEnabled()) {
_angelplg = new WingAngelAPI; _angelplg = new WingAngelAPI;
@ -4307,15 +4338,21 @@ void PluginSystem::loadAllPlugin() {
// internal plugin has no filename // internal plugin has no filename
if (_manager == nullptr || if (_manager == nullptr ||
(_manager && _manager->onLoadingPlugin({}, meta))) { (_manager && _manager->onLoadingPlugin({}, meta))) {
auto cstructplg = new WingCStruct; if (_enabledExtIDs.contains(meta.id)) {
QDir setd(Utilities::getAppDataPath()); auto cstructplg = new WingCStruct;
auto plgset = QStringLiteral("plgset"); QDir setd(Utilities::getAppDataPath());
setd.mkdir(plgset); auto plgset = QStringLiteral("plgset");
retranslateMetadata(cstructplg, meta); setd.mkdir(plgset);
loadPlugin(cstructplg, meta, setd); retranslateMetadata(cstructplg, meta);
loadPlugin(cstructplg, meta, setd);
} else {
_blkplgs[BlockReason::Disabled].append(meta);
}
} else { } else {
_blkplgs[BlockReason::BlockedByManager].append(meta);
Logger::critical(QStringLiteral("{ ") + meta.id + Logger::critical(QStringLiteral("{ ") + meta.id +
QStringLiteral("} ") + tr("PluginBlockByManager")); QStringLiteral(" } ") +
tr("PluginBlockByManager"));
} }
} }

View File

@ -111,7 +111,8 @@ public:
DupID, DupID,
LackDependencies LackDependencies
}; };
Q_ENUM(PluginStatus)
enum class BlockReason { Disabled, BlockedByManager };
private: private:
struct PluginFileContext { struct PluginFileContext {
@ -260,6 +261,10 @@ public:
const std::optional<PluginInfo> &monitorManagerInfo() const; const std::optional<PluginInfo> &monitorManagerInfo() const;
QMap<BlockReason, QList<PluginInfo>> blockedPlugins() const;
QMap<BlockReason, QList<PluginInfo>> blockedDevPlugins() const;
private: private:
template <typename T> template <typename T>
T readBasicTypeContent(IWingPlugin *plg, qsizetype offset) { T readBasicTypeContent(IWingPlugin *plg, qsizetype offset) {
@ -738,6 +743,11 @@ private:
QList<IWingDevice *> _loadeddevs; QList<IWingDevice *> _loadeddevs;
QStringList _enabledExtIDs;
QStringList _enabledDevIDs;
QMap<BlockReason, QList<PluginInfo>> _blkplgs;
QMap<BlockReason, QList<PluginInfo>> _blkdevs;
QMap<IWingPlugin::RegisteredEvent, QList<IWingPlugin *>> _evplgs; QMap<IWingPlugin::RegisteredEvent, QList<IWingPlugin *>> _evplgs;
QHash<IWingPlugin *, PluginFile> m_plgviewMap; QHash<IWingPlugin *, PluginFile> m_plgviewMap;

View File

@ -48,7 +48,8 @@ ScriptManager::ScriptManager() {
m_usrScriptsPath = Utilities::getAppDataPath() + QDir::separator() + m_usrScriptsPath = Utilities::getAppDataPath() + QDir::separator() +
QStringLiteral("scripts"); QStringLiteral("scripts");
refresh(); refreshSysScriptsDbCats();
refreshUsrScriptsDbCats();
} }
ScriptManager::~ScriptManager() {} ScriptManager::~ScriptManager() {}
@ -120,11 +121,6 @@ QStringList ScriptManager::getSysScriptFileNames(const QString &cat) const {
return getScriptFileNames(scriptDir); return getScriptFileNames(scriptDir);
} }
void ScriptManager::refresh() {
refreshSysScriptsDbCats();
refreshUsrScriptsDbCats();
}
void ScriptManager::refreshUsrScriptsDbCats() { void ScriptManager::refreshUsrScriptsDbCats() {
m_usrScriptsDbCats.clear(); m_usrScriptsDbCats.clear();

View File

@ -55,16 +55,16 @@ public:
QStringList getSysScriptFileNames(const QString &cat) const; QStringList getSysScriptFileNames(const QString &cat) const;
void refresh();
void refreshUsrScriptsDbCats();
void refreshSysScriptsDbCats();
ScriptDirMeta usrDirMeta(const QString &cat) const; ScriptDirMeta usrDirMeta(const QString &cat) const;
ScriptDirMeta sysDirMeta(const QString &cat) const; ScriptDirMeta sysDirMeta(const QString &cat) const;
static QList<QMenu *> buildUpScriptRunnerContext(RibbonButtonGroup *group, static QList<QMenu *> buildUpScriptRunnerContext(RibbonButtonGroup *group,
QWidget *parent); QWidget *parent);
private:
void refreshUsrScriptsDbCats();
void refreshSysScriptsDbCats();
private: private:
static QToolButton *addPannelAction(RibbonButtonGroup *pannel, static QToolButton *addPannelAction(RibbonButtonGroup *pannel,
const QString &iconName, const QString &iconName,

View File

@ -21,6 +21,8 @@
#include "class/skinmanager.h" #include "class/skinmanager.h"
#include "settings/settings.h" #include "settings/settings.h"
#include "utilities.h"
#include <QApplication> #include <QApplication>
#include <QFileInfo> #include <QFileInfo>
#include <QMetaEnum> #include <QMetaEnum>
@ -37,6 +39,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(QString, APP_LANGUAGE, ("app.lang"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLE, ("plugin.enableplugin")) Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLE, ("plugin.enableplugin"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLE_ROOT, Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLE_ROOT,
("plugin.rootenableplugin")) ("plugin.rootenableplugin"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLEDPLUGINS_EXT, ("plugin.ext"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, PLUGIN_ENABLEDPLUGINS_DEV, ("plugin.dev"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, EDITOR_FONTSIZE, ("editor.fontsize")) Q_GLOBAL_STATIC_WITH_ARGS(QString, EDITOR_FONTSIZE, ("editor.fontsize"))
Q_GLOBAL_STATIC_WITH_ARGS(QString, EDITOR_SHOW_ADDR, ("editor.showaddr")) Q_GLOBAL_STATIC_WITH_ARGS(QString, EDITOR_SHOW_ADDR, ("editor.showaddr"))
@ -110,6 +114,21 @@ void SettingManager::load() {
READ_CONFIG_BOOL(m_enablePlugin, PLUGIN_ENABLE, true); READ_CONFIG_BOOL(m_enablePlugin, PLUGIN_ENABLE, true);
READ_CONFIG_BOOL(m_enablePlgInRoot, PLUGIN_ENABLE_ROOT, false); READ_CONFIG_BOOL(m_enablePlgInRoot, PLUGIN_ENABLE_ROOT, false);
{
auto data = READ_CONFIG(PLUGIN_ENABLEDPLUGINS_EXT, {});
if (data.isValid()) {
auto rawRules = data.toByteArray();
m_enabledExtPlugins = readPluginRule(rawRules);
}
data = READ_CONFIG(PLUGIN_ENABLEDPLUGINS_DEV, {});
if (data.isValid()) {
auto rawRules = data.toByteArray();
m_enabledDevPlugins = readPluginRule(rawRules);
}
}
READ_CONFIG_INT_POSITIVE(m_editorfontSize, EDITOR_FONTSIZE, READ_CONFIG_INT_POSITIVE(m_editorfontSize, EDITOR_FONTSIZE,
defaultFontSize); defaultFontSize);
m_editorfontSize = qBound(5, m_editorfontSize, 25); m_editorfontSize = qBound(5, m_editorfontSize, 25);
@ -187,6 +206,34 @@ QVariantList SettingManager::getVarList(
return varlist; return varlist;
} }
QStringList SettingManager::enabledDevPlugins() const {
return m_enabledDevPlugins;
}
void SettingManager::setEnabledDevPlugins(
const QStringList &newEnabledDevPlugins) {
if (m_enabledDevPlugins != newEnabledDevPlugins) {
HANDLE_CONFIG;
WRITE_CONFIG(PLUGIN_ENABLEDPLUGINS_DEV,
savePluginRule(newEnabledDevPlugins));
m_enabledDevPlugins = newEnabledDevPlugins;
}
}
QStringList SettingManager::enabledExtPlugins() const {
return m_enabledExtPlugins;
}
void SettingManager::setEnabledExtPlugins(
const QStringList &newEnabledPlugins) {
if (m_enabledExtPlugins != newEnabledPlugins) {
HANDLE_CONFIG;
WRITE_CONFIG(PLUGIN_ENABLEDPLUGINS_EXT,
savePluginRule(newEnabledPlugins));
m_enabledExtPlugins = newEnabledPlugins;
}
}
int SettingManager::scriptTimeout() const { return m_scriptTimeout; } int SettingManager::scriptTimeout() const { return m_scriptTimeout; }
void SettingManager::setScriptTimeout(int newScriptTimeout) { void SettingManager::setScriptTimeout(int newScriptTimeout) {
@ -216,6 +263,27 @@ void SettingManager::checkWriteableAndWarn() {
} }
} }
QStringList SettingManager::readPluginRule(const QByteArray &data) {
if (!data.isEmpty()) {
auto up = qUncompress(data);
if (!up.isEmpty()) {
auto rules = QString::fromUtf8(up);
auto rlist = rules.split('|', Qt::SkipEmptyParts);
rlist.removeIf([](const QString &str) {
return !Utilities::isValidIdentifier(str);
});
return rlist;
}
}
return {};
}
QByteArray SettingManager::savePluginRule(const QStringList &rules) {
auto plgs = rules.join('|');
auto data = qCompress(plgs.toUtf8());
return data;
}
bool SettingManager::checkUpdate() const { return m_checkUpdate; } bool SettingManager::checkUpdate() const { return m_checkUpdate; }
void SettingManager::setCheckUpdate(bool newCheckUpdate) { void SettingManager::setCheckUpdate(bool newCheckUpdate) {

View File

@ -81,6 +81,9 @@ public:
qsizetype logCount() const; qsizetype logCount() const;
int scriptTimeout() const; int scriptTimeout() const;
QStringList enabledExtPlugins() const;
QStringList enabledDevPlugins() const;
public slots: public slots:
void setThemeID(int newThemeID); void setThemeID(int newThemeID);
void setDockLayout(const QByteArray &newDockLayout); void setDockLayout(const QByteArray &newDockLayout);
@ -114,9 +117,15 @@ public slots:
void setLogCount(qsizetype newLogCount); void setLogCount(qsizetype newLogCount);
void setScriptTimeout(int newScriptTimeout); void setScriptTimeout(int newScriptTimeout);
void setEnabledExtPlugins(const QStringList &newEnabledPlugins);
void setEnabledDevPlugins(const QStringList &newEnabledDevPlugins);
public: public:
void checkWriteableAndWarn(); void checkWriteableAndWarn();
QStringList readPluginRule(const QByteArray &data);
QByteArray savePluginRule(const QStringList &rules);
signals: signals:
void sigEditorfontSizeChanged(int v); void sigEditorfontSizeChanged(int v);
void sigDecodeStrlimitChanged(int v); void sigDecodeStrlimitChanged(int v);
@ -162,6 +171,8 @@ private:
QStringList m_usrHideCats; QStringList m_usrHideCats;
QStringList m_sysHideCats; QStringList m_sysHideCats;
QStringList m_enabledExtPlugins;
QStringList m_enabledDevPlugins;
QString m_lastUsedPath; QString m_lastUsedPath;
bool m_dontUseSplash = false; bool m_dontUseSplash = false;

View File

@ -23,8 +23,10 @@
#include "utilities.h" #include "utilities.h"
#include <QApplication> #include <QApplication>
#include <QCloseEvent>
#include <QMenu> #include <QMenu>
#include <QPushButton> #include <QPushButton>
#include <QTimer>
SettingDialog::SettingDialog(QWidget *parent) SettingDialog::SettingDialog(QWidget *parent)
: QWidget(parent), ui(new Ui::SettingDialog) { : QWidget(parent), ui(new Ui::SettingDialog) {
@ -34,7 +36,7 @@ SettingDialog::SettingDialog(QWidget *parent)
[this](QListWidgetItem *current, QListWidgetItem *previous) { [this](QListWidgetItem *current, QListWidgetItem *previous) {
if (previous) { if (previous) {
auto page = m_pages.at( auto page = m_pages.at(
ui->listWidget->indexFromItem(current).row()); ui->listWidget->indexFromItem(previous).row());
if (page->containUnsavedChanges()) { if (page->containUnsavedChanges()) {
auto ret = WingMessageBox::question( auto ret = WingMessageBox::question(
this, tr("UnsavedChanges"), this, tr("UnsavedChanges"),
@ -42,7 +44,12 @@ SettingDialog::SettingDialog(QWidget *parent)
if (ret == QMessageBox::Yes) { if (ret == QMessageBox::Yes) {
page->discard(); page->discard();
} else { } else {
ui->listWidget->setCurrentItem(previous); QTimer::singleShot(100, this, [this, previous]() {
ui->listWidget->blockSignals(true);
ui->listWidget->setCurrentItem(previous);
ui->listWidget->blockSignals(false);
});
page->highlightUnsavedChange();
return; return;
} }
} }
@ -60,6 +67,7 @@ SettingDialog::SettingDialog(QWidget *parent)
}); });
_dialog = new FramelessDialogBase(parent); _dialog = new FramelessDialogBase(parent);
_dialog->installEventFilter(this);
_dialog->buildUpContent(this); _dialog->buildUpContent(this);
_dialog->setWindowTitle(this->windowTitle()); _dialog->setWindowTitle(this->windowTitle());
@ -127,9 +135,11 @@ void SettingDialog::build() {
} }
void SettingDialog::showConfig(int index) { void SettingDialog::showConfig(int index) {
ui->listWidget->blockSignals(true);
if (index >= 0 && index < m_pages.size()) { if (index >= 0 && index < m_pages.size()) {
ui->listWidget->setCurrentRow(index); ui->listWidget->setCurrentRow(index);
} }
ui->listWidget->blockSignals(false);
Utilities::moveToCenter(this); Utilities::moveToCenter(this);
_dialog->exec(); _dialog->exec();
} }
@ -149,6 +159,25 @@ void SettingDialog::showConfig(const QString &id) {
_dialog->exec(); _dialog->exec();
} }
bool SettingDialog::eventFilter(QObject *, QEvent *event) {
if (event->type() == QEvent::Close) {
auto e = static_cast<QCloseEvent *>(event);
auto page = m_pages.at(ui->listWidget->currentRow());
if (page->containUnsavedChanges()) {
auto ret = WingMessageBox::question(this, tr("UnsavedChanges"),
tr("SaveChangesDiscardLeave?"));
if (ret == QMessageBox::Yes) {
page->discard();
} else {
page->highlightUnsavedChange();
event->ignore();
return true;
}
}
}
return false;
}
void SettingDialog::toastTakeEffectReboot() { void SettingDialog::toastTakeEffectReboot() {
auto page = qobject_cast<WingHex::SettingPage *>(sender()); auto page = qobject_cast<WingHex::SettingPage *>(sender());
if (page) { if (page) {

View File

@ -39,6 +39,10 @@ public:
void showConfig(int index = -1); void showConfig(int index = -1);
void showConfig(const QString &id); void showConfig(const QString &id);
// QObject interface
public:
virtual bool eventFilter(QObject *watched, QEvent *event) override;
public slots: public slots:
void toastTakeEffectReboot(); void toastTakeEffectReboot();

View File

@ -16,11 +16,18 @@
*/ */
#include "pluginsettingdialog.h" #include "pluginsettingdialog.h"
#include "class/eventfilter.h"
#include "class/pluginsystem.h" #include "class/pluginsystem.h"
#include "class/settingmanager.h" #include "class/settingmanager.h"
#include "ui_pluginsettingdialog.h" #include "ui_pluginsettingdialog.h"
#include "utilities.h" #include "utilities.h"
enum PLUGIN_INFO {
PLUIGN_META = Qt::UserRole,
PLUIGN_NAME,
PLUIGN_COMMENT,
};
PluginSettingDialog::PluginSettingDialog(QWidget *parent) PluginSettingDialog::PluginSettingDialog(QWidget *parent)
: WingHex::SettingPage(parent), ui(new Ui::PluginSettingDialog) { : WingHex::SettingPage(parent), ui(new Ui::PluginSettingDialog) {
ui->setupUi(this); ui->setupUi(this);
@ -50,18 +57,98 @@ PluginSettingDialog::PluginSettingDialog(QWidget *parent)
for (auto &p : plgsys.plugins()) { for (auto &p : plgsys.plugins()) {
auto pco = p->pluginIcon(); auto pco = p->pluginIcon();
ui->plglist->addItem( auto lwi =
new QListWidgetItem(pco.isNull() ? pico : pco, p->pluginName())); new QListWidgetItem(pco.isNull() ? pico : pco, p->pluginName());
auto info = plgsys.getPluginInfo(p);
auto flags = lwi->flags();
if (Q_LIKELY(p != plgsys.angelApi())) {
flags.setFlag(Qt::ItemIsUserCheckable);
lwi->setFlags(flags);
lwi->setCheckState(Qt::Checked);
} else {
flags.setFlag(Qt::ItemIsUserCheckable, false);
lwi->setFlags(flags);
}
lwi->setData(PLUIGN_META, QVariant::fromValue(info));
lwi->setData(PLUIGN_NAME, p->pluginName());
lwi->setData(PLUIGN_COMMENT, p->pluginComment());
ui->plglist->addItem(lwi);
} }
pico = ICONRES("plugindis");
auto blkplgs = plgsys.blockedPlugins();
auto dblkplgs = blkplgs[PluginSystem::BlockReason::Disabled];
for (auto &meta : dblkplgs) {
auto lwi = new QListWidgetItem(pico, meta.id);
auto flags = lwi->flags();
flags.setFlag(Qt::ItemIsUserCheckable);
lwi->setFlags(flags);
lwi->setData(PLUIGN_META, QVariant::fromValue(meta));
lwi->setCheckState(Qt::Unchecked);
ui->plglist->addItem(lwi);
}
pico = getGrayIcon(NAMEICONRES("plugin"));
dblkplgs = blkplgs[PluginSystem::BlockReason::BlockedByManager];
for (auto &meta : dblkplgs) {
auto lwi = new QListWidgetItem(pico, meta.id);
auto flags = lwi->flags();
flags.setFlag(Qt::ItemIsUserCheckable, false);
lwi->setFlags(flags);
auto font = lwi->font();
font.setStrikeOut(true);
lwi->setFont(font);
lwi->setData(PLUIGN_META, QVariant::fromValue(meta));
ui->plglist->addItem(lwi);
}
ui->txtc->clear(); ui->txtc->clear();
pico = ICONRES("devext"); pico = ICONRES("devext");
ui->devlist->clear(); ui->devlist->clear();
for (auto &d : plgsys.devices()) { for (auto &d : plgsys.devices()) {
auto pco = d->pluginIcon(); auto pco = d->pluginIcon();
ui->devlist->addItem( auto lwi =
new QListWidgetItem(pco.isNull() ? pico : pco, d->pluginName())); new QListWidgetItem(pco.isNull() ? pico : pco, d->pluginName());
auto info = plgsys.getPluginInfo(d);
auto flags = lwi->flags();
flags.setFlag(Qt::ItemIsUserCheckable);
lwi->setFlags(flags);
lwi->setData(PLUIGN_META, QVariant::fromValue(info));
lwi->setData(PLUIGN_NAME, d->pluginName());
lwi->setData(PLUIGN_COMMENT, d->pluginComment());
lwi->setCheckState(Qt::Checked);
ui->devlist->addItem(lwi);
} }
pico = ICONRES("devextdis");
auto blkdevs = plgsys.blockedDevPlugins();
auto dblkdevs = blkdevs[PluginSystem::BlockReason::Disabled];
for (auto &meta : dblkdevs) {
auto lwi = new QListWidgetItem(pico, meta.id);
auto flags = lwi->flags();
flags.setFlag(Qt::ItemIsUserCheckable);
lwi->setFlags(flags);
lwi->setData(PLUIGN_META, QVariant::fromValue(meta));
lwi->setCheckState(Qt::Unchecked);
ui->devlist->addItem(lwi);
}
pico = getGrayIcon(NAMEICONRES("devext"));
dblkdevs = blkdevs[PluginSystem::BlockReason::BlockedByManager];
for (auto &meta : dblkdevs) {
auto lwi = new QListWidgetItem(pico, meta.id);
auto flags = lwi->flags();
flags.setFlag(Qt::ItemIsUserCheckable, false);
lwi->setFlags(flags);
auto font = lwi->font();
font.setStrikeOut(true);
lwi->setFont(font);
lwi->setData(PLUIGN_META, QVariant::fromValue(meta));
ui->devlist->addItem(lwi);
}
ui->txtd->clear(); ui->txtd->clear();
auto minfo = plgsys.monitorManagerInfo(); auto minfo = plgsys.monitorManagerInfo();
@ -91,6 +178,154 @@ PluginSettingDialog::PluginSettingDialog(QWidget *parent)
&SettingManager::setEnablePlugin); &SettingManager::setEnablePlugin);
connect(ui->cbEnablePluginRoot, &QCheckBox::toggled, set, connect(ui->cbEnablePluginRoot, &QCheckBox::toggled, set,
&SettingManager::setEnablePlgInRoot); &SettingManager::setEnablePlgInRoot);
connect(ui->plglist, &QListWidget::itemChanged, this,
[this](QListWidgetItem *item) {
if (item == nullptr) {
return;
}
auto info = item->data(PLUIGN_META).value<PluginInfo>();
auto id = info.id;
switch (item->checkState()) {
case Qt::Unchecked:
_plgChanged.pushRemoveItem(id);
break;
case Qt::Checked:
_plgChanged.pushAddItem(id);
break;
case Qt::PartiallyChecked:
break;
}
ui->btnplgSave->setEnabled(_plgChanged.containChanges());
});
connect(
ui->plglist, &QListWidget::currentItemChanged, this,
[this](QListWidgetItem *current, QListWidgetItem *) {
if (current == nullptr) {
return;
}
auto info = current->data(PLUIGN_META).value<PluginInfo>();
auto plgName = current->data(PLUIGN_NAME).toString();
auto plgComment = current->data(PLUIGN_COMMENT).toString();
ui->txtc->clear();
static auto sep = QStringLiteral(" : ");
ui->txtc->append(getWrappedText(tr("ID") + sep + info.id));
ui->txtc->append(getWrappedText(tr("Name") + sep + plgName));
ui->txtc->append(
getWrappedText(tr("License") + sep + info.license));
ui->txtc->append(getWrappedText(tr("Author") + sep + info.author));
ui->txtc->append(getWrappedText(tr("Vendor") + sep + info.vendor));
ui->txtc->append(
getWrappedText(tr("Version") + sep + info.version.toString()));
ui->txtc->append(getWrappedText(tr("Comment") + sep + plgComment));
if (!info.dependencies.isEmpty()) {
ui->txtc->append(getWrappedText(tr("pluginDependencies:")));
for (auto &d : info.dependencies) {
ui->txtc->append(
getWrappedText(QString(4, ' ') + tr("PUID:") + d.puid));
ui->txtc->append(getWrappedText(QString(4, ' ') +
tr("Version:") +
d.version.toString()));
}
}
ui->txtc->append(getWrappedText(
tr("URL") + sep + QStringLiteral("<a href=\"") + info.url +
QStringLiteral("\">") + info.url + QStringLiteral("</a> ")));
});
connect(ui->devlist, &QListWidget::itemChanged, this,
[this](QListWidgetItem *item) {
if (item == nullptr) {
return;
}
auto info = item->data(PLUIGN_META).value<PluginInfo>();
auto id = info.id;
switch (item->checkState()) {
case Qt::Unchecked:
_devChanged.pushRemoveItem(id);
break;
case Qt::Checked:
_devChanged.pushAddItem(id);
break;
case Qt::PartiallyChecked:
break;
}
ui->btndevSave->setEnabled(_devChanged.containChanges());
});
connect(
ui->devlist, &QListWidget::currentItemChanged, this,
[this](QListWidgetItem *current, QListWidgetItem *) {
if (current == nullptr) {
return;
}
auto info = current->data(PLUIGN_META).value<PluginInfo>();
auto plgName = current->data(PLUIGN_NAME).toString();
auto plgComment = current->data(PLUIGN_COMMENT).toString();
ui->txtd->clear();
static auto sep = QStringLiteral(" : ");
ui->txtd->append(getWrappedText(tr("ID") + sep + info.id));
ui->txtd->append(getWrappedText(tr("Name") + sep + plgName));
ui->txtd->append(
getWrappedText(tr("License") + sep + info.license));
ui->txtd->append(getWrappedText(tr("Author") + sep + info.author));
ui->txtd->append(getWrappedText(tr("Vendor") + sep + info.vendor));
ui->txtd->append(
getWrappedText(tr("Version") + sep + info.version.toString()));
ui->txtd->append(getWrappedText(tr("Comment") + sep + plgComment));
ui->txtd->append(getWrappedText(
tr("URL") + sep + QStringLiteral("<a href=\"") + info.url +
QStringLiteral("\">") + info.url + QStringLiteral("</a>")));
});
connect(ui->btnplgSave, &QPushButton::clicked, set, [this]() {
SettingManager::instance().setEnabledExtPlugins(
_plgChanged.getContents());
_plgChanged.clear();
ui->btnplgSave->setEnabled(false);
Q_EMIT optionNeedRestartChanged();
});
connect(ui->btndevSave, &QPushButton::clicked, set, [this]() {
SettingManager::instance().setEnabledDevPlugins(
_devChanged.getContents());
_devChanged.clear();
ui->btndevSave->setEnabled(false);
Q_EMIT optionNeedRestartChanged();
});
auto ev = new EventFilter(QEvent::EnabledChange, this);
connect(ev, &EventFilter::eventTriggered, this,
[this](QObject *obj, QEvent *) {
if (obj == ui->btnplgSave) {
auto tabName = QCoreApplication::translate(
"PluginSettingDialog", "PluginInfo", nullptr);
if (ui->btnplgSave->isEnabled()) {
tabName.append(QStringLiteral(" *"));
}
ui->tabWidget->setTabText(
ui->tabWidget->indexOf(ui->tabPluginInfo), tabName);
} else if (obj == ui->btndevSave) {
auto tabName = QCoreApplication::translate(
"PluginSettingDialog", "DevExtInfo", nullptr);
if (ui->btndevSave->isEnabled()) {
tabName.append(QStringLiteral(" *"));
}
ui->tabWidget->setTabText(
ui->tabWidget->indexOf(ui->tabDevInfo), tabName);
}
});
ui->btnplgSave->installEventFilter(ev);
ui->btndevSave->installEventFilter(ev);
resetChangedList();
createPluginStandardMenu(ui->plglist);
createPluginStandardMenu(ui->devlist);
} }
PluginSettingDialog::~PluginSettingDialog() { delete ui; } PluginSettingDialog::~PluginSettingDialog() { delete ui; }
@ -109,68 +344,117 @@ QString PluginSettingDialog::name() const { return tr("Plugin"); }
QString PluginSettingDialog::id() const { return QStringLiteral("Plugin"); } QString PluginSettingDialog::id() const { return QStringLiteral("Plugin"); }
bool PluginSettingDialog::containUnsavedChanges() const {
return ui->btndevSave->isEnabled() || ui->btnplgSave->isEnabled();
}
void PluginSettingDialog::highlightUnsavedChange() {
if (ui->btnplgSave->isEnabled()) {
ui->tabWidget->setCurrentWidget(ui->tabPluginInfo);
} else if (ui->btndevSave->isEnabled()) {
ui->tabWidget->setCurrentWidget(ui->tabDevInfo);
}
}
void PluginSettingDialog::discard() {
resetChangedList();
resetUIChagned();
}
void PluginSettingDialog::restore() { void PluginSettingDialog::restore() {
SettingManager::instance().reset(SettingManager::SETTING::PLUGIN); SettingManager::instance().reset(SettingManager::SETTING::PLUGIN);
reload(); reload();
} }
void PluginSettingDialog::on_devlist_currentRowChanged(int currentRow) { void PluginSettingDialog::createPluginStandardMenu(QListWidget *widget) {
if (currentRow < 0) { widget->setSelectionMode(QListWidget::ExtendedSelection);
return; widget->setContextMenuPolicy(Qt::ActionsContextMenu);
} widget->addAction(tr("SelectEnable"), widget, [widget]() {
for (auto &item : widget->selectedItems()) {
auto &plgsys = PluginSystem::instance(); auto flags = item->flags();
auto plg = plgsys.device(currentRow); if (flags.testFlag(Qt::ItemIsUserCheckable)) {
item->setCheckState(Qt::Checked);
auto info = plgsys.getPluginInfo(plg); }
ui->txtd->clear(); }
static auto sep = QStringLiteral(" : "); });
ui->txtd->append(getWrappedText(tr("ID") + sep + info.id)); widget->addAction(tr("SelectDisable"), widget, [widget]() {
ui->txtd->append(getWrappedText(tr("Name") + sep + plg->pluginName())); for (auto &item : widget->selectedItems()) {
ui->txtd->append(getWrappedText(tr("License") + sep + info.license)); auto flags = item->flags();
ui->txtd->append(getWrappedText(tr("Author") + sep + info.author)); if (flags.testFlag(Qt::ItemIsUserCheckable)) {
ui->txtd->append(getWrappedText(tr("Vendor") + sep + info.vendor)); item->setCheckState(Qt::Unchecked);
ui->txtd->append( }
getWrappedText(tr("Version") + sep + info.version.toString())); }
ui->txtd->append( });
getWrappedText(tr("Comment") + sep + plg->pluginComment())); auto a = new QAction(widget);
ui->txtd->append(getWrappedText( a->setSeparator(true);
tr("URL") + sep + QStringLiteral("<a href=\"") + info.url + widget->addAction(a);
QStringLiteral("\">") + info.url + QStringLiteral("</a>"))); widget->addAction(tr("SelectAll"), widget, &QListWidget::selectAll);
widget->addAction(tr("SelectClear"), widget, &QListWidget::clearSelection);
a = new QAction(widget);
a->setSeparator(true);
widget->addAction(a);
widget->addAction(tr("DiscardChanges"), this,
&PluginSettingDialog::discard);
} }
void PluginSettingDialog::on_plglist_currentRowChanged(int currentRow) { QIcon PluginSettingDialog::getGrayIcon(const QString &path) {
if (currentRow < 0) { QImage dpico(path);
return; for (int y = 0; y < dpico.height(); ++y) {
} auto row = reinterpret_cast<QRgb *>(dpico.scanLine(y));
for (int x = 0; x < dpico.width(); ++x) {
auto &plgsys = PluginSystem::instance(); auto c = row[x];
auto plg = plgsys.plugin(currentRow); if (c) {
auto p = qGray(c);
auto info = plgsys.getPluginInfo(plg); row[x] = qRgba(p, p, p, qAlpha(c));
ui->txtc->clear(); }
static auto sep = QStringLiteral(" : ");
ui->txtc->append(getWrappedText(tr("ID") + sep + info.id));
ui->txtc->append(getWrappedText(tr("Name") + sep + plg->pluginName()));
ui->txtc->append(getWrappedText(tr("License") + sep + info.license));
ui->txtc->append(getWrappedText(tr("Author") + sep + info.author));
ui->txtc->append(getWrappedText(tr("Vendor") + sep + info.vendor));
ui->txtc->append(
getWrappedText(tr("Version") + sep + info.version.toString()));
ui->txtc->append(
getWrappedText(tr("Comment") + sep + plg->pluginComment()));
if (!info.dependencies.isEmpty()) {
ui->txtc->append(getWrappedText(tr("pluginDependencies:")));
for (auto &d : info.dependencies) {
ui->txtc->append(
getWrappedText(QString(4, ' ') + tr("PUID:") + d.puid));
ui->txtc->append(getWrappedText(QString(4, ' ') + tr("Version:") +
d.version.toString()));
} }
} }
ui->txtc->append(getWrappedText( return QIcon(QPixmap::fromImage(dpico));
tr("URL") + sep + QStringLiteral("<a href=\"") + info.url + }
QStringLiteral("\">") + info.url + QStringLiteral("</a> ")));
void PluginSettingDialog::resetChangedList() {
auto &set = SettingManager::instance();
_plgChanged.setContents(set.enabledExtPlugins());
_devChanged.setContents(set.enabledDevPlugins());
}
void PluginSettingDialog::resetUIChagned() {
ui->plglist->blockSignals(true);
ui->devlist->blockSignals(true);
for (int i = 0; i < ui->plglist->count(); ++i) {
auto item = ui->plglist->item(i);
auto flags = item->flags();
if (flags.testFlag(Qt::ItemIsUserCheckable)) {
auto info = item->data(PLUIGN_META).value<PluginInfo>();
auto id = info.id;
if (_plgChanged.containChanges(id)) {
item->setCheckState(Qt::Checked);
} else {
item->setCheckState(Qt::Unchecked);
}
}
}
for (int i = 0; i < ui->devlist->count(); ++i) {
auto item = ui->devlist->item(i);
auto flags = item->flags();
if (flags.testFlag(Qt::ItemIsUserCheckable)) {
auto info = item->data(PLUIGN_META).value<PluginInfo>();
auto id = info.id;
if (_devChanged.containChanges(id)) {
item->setCheckState(Qt::Checked);
} else {
item->setCheckState(Qt::Unchecked);
}
}
}
ui->plglist->blockSignals(false);
ui->devlist->blockSignals(false);
ui->btnplgSave->setEnabled(false);
ui->btndevSave->setEnabled(false);
} }
QString PluginSettingDialog::getWrappedText(const QString &str) { QString PluginSettingDialog::getWrappedText(const QString &str) {

View File

@ -19,6 +19,9 @@
#define PLUGINSETTINGDIALOG_H #define PLUGINSETTINGDIALOG_H
#include "WingPlugin/settingpage.h" #include "WingPlugin/settingpage.h"
#include "class/changedstringlist.h"
#include <QListWidget>
#include <QWidget> #include <QWidget>
namespace Ui { namespace Ui {
@ -35,6 +38,10 @@ public:
private: private:
Ui::PluginSettingDialog *ui; Ui::PluginSettingDialog *ui;
ChangedStringList _devChanged;
ChangedStringList _plgChanged;
private:
void reload(); void reload();
// SettingPage interface // SettingPage interface
@ -43,11 +50,18 @@ public:
virtual QString name() const override; virtual QString name() const override;
virtual QString id() const override; virtual QString id() const override;
virtual bool containUnsavedChanges() const override;
virtual void highlightUnsavedChange() override;
virtual void discard() override;
virtual void restore() override; virtual void restore() override;
private slots: private:
void on_devlist_currentRowChanged(int currentRow); void createPluginStandardMenu(QListWidget *widget);
void on_plglist_currentRowChanged(int currentRow);
QIcon getGrayIcon(const QString &path);
void resetChangedList();
void resetUIChagned();
private: private:
QString getWrappedText(const QString &str); QString getWrappedText(const QString &str);

View File

@ -72,7 +72,7 @@
<property name="usesScrollButtons"> <property name="usesScrollButtons">
<bool>true</bool> <bool>true</bool>
</property> </property>
<widget class="QWidget" name="tab"> <widget class="QWidget" name="tabPluginInfo">
<attribute name="icon"> <attribute name="icon">
<iconset resource="../../resources.qrc"> <iconset resource="../../resources.qrc">
<normaloff>:/com.wingsummer.winghex/images/plugin.png</normaloff>:/com.wingsummer.winghex/images/plugin.png</iconset> <normaloff>:/com.wingsummer.winghex/images/plugin.png</normaloff>:/com.wingsummer.winghex/images/plugin.png</iconset>
@ -116,6 +116,16 @@
<item> <item>
<widget class="QListWidget" name="plglist"/> <widget class="QListWidget" name="plglist"/>
</item> </item>
<item>
<widget class="QPushButton" name="btnplgSave">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QTextBrowser" name="txtc"> <widget class="QTextBrowser" name="txtc">
@ -127,7 +137,7 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="widget"> <widget class="QWidget" name="tabDevInfo">
<attribute name="icon"> <attribute name="icon">
<iconset resource="../../resources.qrc"> <iconset resource="../../resources.qrc">
<normaloff>:/com.wingsummer.winghex/images/devext.png</normaloff>:/com.wingsummer.winghex/images/devext.png</iconset> <normaloff>:/com.wingsummer.winghex/images/devext.png</normaloff>:/com.wingsummer.winghex/images/devext.png</iconset>
@ -156,6 +166,16 @@
<item> <item>
<widget class="QListWidget" name="devlist"/> <widget class="QListWidget" name="devlist"/>
</item> </item>
<item>
<widget class="QPushButton" name="btndevSave">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Save</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QTextBrowser" name="txtd"> <widget class="QTextBrowser" name="txtd">
@ -167,7 +187,7 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_2"> <widget class="QWidget" name="tabAPIMon">
<attribute name="icon"> <attribute name="icon">
<iconset resource="../../resources.qrc"> <iconset resource="../../resources.qrc">
<normaloff>:/com.wingsummer.winghex/images/monitor.png</normaloff>:/com.wingsummer.winghex/images/monitor.png</iconset> <normaloff>:/com.wingsummer.winghex/images/monitor.png</normaloff>:/com.wingsummer.winghex/images/monitor.png</iconset>

View File

@ -47,26 +47,24 @@ ScriptSettingDialog::ScriptSettingDialog(QWidget *parent)
switch (item->checkState()) { switch (item->checkState()) {
case Qt::Unchecked: { case Qt::Unchecked: {
if (meta.isSys) { if (meta.isSys) {
m_sysHideCats.append(meta.rawName); m_sysHideCats.pushAddItem(meta.rawName);
} else { } else {
m_usrHideCats.append(meta.rawName); m_usrHideCats.pushAddItem(meta.rawName);
} }
} break; } break;
case Qt::Checked: { case Qt::Checked: {
if (meta.isSys) { if (meta.isSys) {
m_sysHideCats.removeOne(meta.rawName); m_sysHideCats.pushRemoveItem(meta.rawName);
} else { } else {
m_usrHideCats.removeOne(meta.rawName); m_usrHideCats.pushRemoveItem(meta.rawName);
} }
} break; } break;
case Qt::PartiallyChecked: case Qt::PartiallyChecked:
break; break;
} }
}
auto &set = SettingManager::instance(); ui->btnSave->setEnabled(containUnsavedChanges());
set.setUsrHideCats(m_sysHideCats); }
set.setSysHideCats(m_usrHideCats);
}); });
auto set = &SettingManager::instance(); auto set = &SettingManager::instance();
@ -76,6 +74,47 @@ ScriptSettingDialog::ScriptSettingDialog(QWidget *parent)
&SettingManager::setAllowUsrScriptInRoot); &SettingManager::setAllowUsrScriptInRoot);
connect(ui->sbTimeout, &QSpinBox::valueChanged, set, connect(ui->sbTimeout, &QSpinBox::valueChanged, set,
&SettingManager::setScriptTimeout); &SettingManager::setScriptTimeout);
connect(ui->btnSave, &QPushButton::clicked, this, [this]() {
auto &set = SettingManager::instance();
set.setUsrHideCats(m_usrHideCats.getContents());
set.setSysHideCats(m_sysHideCats.getContents());
m_sysHideCats.clear();
m_usrHideCats.clear();
ui->btnSave->setEnabled(false);
Q_EMIT optionNeedRestartChanged();
});
connect(ui->listWidget, &QListWidget::currentRowChanged, this,
[this](int currentRow) {
if (currentRow < 0) {
ui->textBrowser->clear();
return;
}
auto lw = ui->listWidget->item(currentRow);
auto var = lw->data(Qt::UserRole);
if (var.isValid()) {
auto meta = var.value<ScriptManager::ScriptDirMeta>();
auto info = ui->textBrowser;
info->clear();
info->append(tr("RawName:") + meta.rawName);
info->append(tr("Name:") + meta.name);
info->append(tr("Author:") + meta.author);
info->append(tr("License:") + meta.license);
info->append(tr("ContextMenu:") +
(meta.isContextMenu
? QStringLiteral("true")
: QStringLiteral("false")));
info->append(tr("HomePage:") + meta.homepage);
info->append(tr("Comment:"));
auto cur = info->textCursor();
cur.movePosition(QTextCursor::End);
info->setTextCursor(cur);
info->insertHtml(meta.comment);
}
});
createPluginStandardMenu();
} }
ScriptSettingDialog::~ScriptSettingDialog() { delete ui; } ScriptSettingDialog::~ScriptSettingDialog() { delete ui; }
@ -94,19 +133,26 @@ void ScriptSettingDialog::loadData() {
auto &sm = ScriptManager::instance(); auto &sm = ScriptManager::instance();
auto usrCats = sm.usrScriptsDbCats(); auto usrCats = sm.usrScriptsDbCats();
auto hidden = set.usrHideCats(); auto hidden = set.usrHideCats();
QStringList buffer;
for (auto &cat : usrCats) { for (auto &cat : usrCats) {
if (addCatagory(sm.usrDirMeta(cat), true, hidden.contains(cat))) { if (addCatagory(sm.usrDirMeta(cat), true, hidden.contains(cat))) {
m_usrHideCats << cat; buffer.append(cat);
} }
} }
_usrHideCats = buffer;
m_usrHideCats.setContents(buffer);
buffer.clear();
auto sysCats = sm.sysScriptsDbCats(); auto sysCats = sm.sysScriptsDbCats();
hidden = set.sysHideCats(); hidden = set.sysHideCats();
for (auto &cat : sysCats) { for (auto &cat : sysCats) {
if (addCatagory(sm.sysDirMeta(cat), false, hidden.contains(cat))) { if (addCatagory(sm.sysDirMeta(cat), false, hidden.contains(cat))) {
m_sysHideCats << cat; buffer.append(cat);
} }
} }
_sysHideCats = buffer;
m_sysHideCats.setContents(buffer);
} else { } else {
ui->groupBox_2->setEnabled(false); ui->groupBox_2->setEnabled(false);
} }
@ -120,7 +166,33 @@ bool ScriptSettingDialog::addCatagory(const ScriptManager::ScriptDirMeta &meta,
meta.name, ui->listWidget); meta.name, ui->listWidget);
lw->setData(Qt::UserRole, QVariant::fromValue(meta)); lw->setData(Qt::UserRole, QVariant::fromValue(meta));
lw->setCheckState(hidden ? Qt::Unchecked : Qt::Checked); lw->setCheckState(hidden ? Qt::Unchecked : Qt::Checked);
return !hidden; return hidden;
}
void ScriptSettingDialog::createPluginStandardMenu() {
auto widget = ui->listWidget;
widget->setSelectionMode(QListWidget::ExtendedSelection);
widget->setContextMenuPolicy(Qt::ActionsContextMenu);
widget->addAction(tr("SelectShow"), widget, [widget]() {
for (auto &item : widget->selectedItems()) {
item->setCheckState(Qt::Checked);
}
});
widget->addAction(tr("SelectHide"), widget, [widget]() {
for (auto &item : widget->selectedItems()) {
item->setCheckState(Qt::Unchecked);
}
});
auto a = new QAction(widget);
a->setSeparator(true);
widget->addAction(a);
widget->addAction(tr("SelectAll"), widget, &QListWidget::selectAll);
widget->addAction(tr("SelectClear"), widget, &QListWidget::clearSelection);
a = new QAction(widget);
a->setSeparator(true);
widget->addAction(a);
widget->addAction(tr("DiscardChanges"), this,
&ScriptSettingDialog::discard);
} }
QIcon ScriptSettingDialog::categoryIcon() const { return ICONRES("script"); } QIcon ScriptSettingDialog::categoryIcon() const { return ICONRES("script"); }
@ -129,41 +201,40 @@ QString ScriptSettingDialog::name() const { return tr("Script"); }
QString ScriptSettingDialog::id() const { return QStringLiteral("Script"); } QString ScriptSettingDialog::id() const { return QStringLiteral("Script"); }
bool ScriptSettingDialog::containUnsavedChanges() const {
return m_usrHideCats.containChanges() || m_sysHideCats.containChanges();
}
void ScriptSettingDialog::restore() { void ScriptSettingDialog::restore() {
auto &set = SettingManager::instance(); auto &set = SettingManager::instance();
set.reset(SettingManager::SCRIPT); set.reset(SettingManager::SCRIPT);
loadData(); loadData();
} }
void ScriptSettingDialog::on_btnRefresh_clicked() { void ScriptSettingDialog::discard() {
ui->listWidget->clear(); m_usrHideCats.setContents(_usrHideCats);
ScriptManager::instance().refresh(); m_sysHideCats.setContents(_sysHideCats);
loadData();
}
void ScriptSettingDialog::on_listWidget_currentRowChanged(int currentRow) { ui->listWidget->blockSignals(true);
if (currentRow < 0) { for (int i = 0; i < ui->listWidget->count(); ++i) {
ui->textBrowser->clear(); auto item = ui->listWidget->item(i);
return; auto var = item->data(Qt::UserRole);
} if (var.isValid()) {
auto lw = ui->listWidget->item(currentRow); auto meta = var.value<ScriptManager::ScriptDirMeta>();
auto var = lw->data(Qt::UserRole); if (meta.isSys) {
if (var.isValid()) { if (_sysHideCats.contains(meta.rawName)) {
auto meta = var.value<ScriptManager::ScriptDirMeta>(); item->setCheckState(Qt::Unchecked);
auto info = ui->textBrowser; } else {
info->clear(); item->setCheckState(Qt::Checked);
info->append(tr("RawName:") + meta.rawName); }
info->append(tr("Name:") + meta.name); } else {
info->append(tr("Author:") + meta.author); if (_usrHideCats.contains(meta.rawName)) {
info->append(tr("License:") + meta.license); item->setCheckState(Qt::Unchecked);
info->append(tr("ContextMenu:") + (meta.isContextMenu } else {
? QStringLiteral("true") item->setCheckState(Qt::Checked);
: QStringLiteral("false"))); }
info->append(tr("HomePage:") + meta.homepage); }
info->append(tr("Comment:")); }
auto cur = info->textCursor();
cur.movePosition(QTextCursor::End);
info->setTextCursor(cur);
info->insertHtml(meta.comment);
} }
ui->listWidget->blockSignals(false);
} }

View File

@ -19,6 +19,7 @@
#define SCRIPTSETTINGDIALOG_H #define SCRIPTSETTINGDIALOG_H
#include "WingPlugin/settingpage.h" #include "WingPlugin/settingpage.h"
#include "class/changedstringlist.h"
#include "class/scriptmanager.h" #include "class/scriptmanager.h"
#include <QWidget> #include <QWidget>
@ -36,25 +37,28 @@ public:
private: private:
Ui::ScriptSettingDialog *ui; Ui::ScriptSettingDialog *ui;
QStringList m_usrHideCats; QStringList _usrHideCats;
QStringList m_sysHideCats; QStringList _sysHideCats;
ChangedStringList m_usrHideCats;
ChangedStringList m_sysHideCats;
private: private:
void loadData(); void loadData();
bool addCatagory(const ScriptManager::ScriptDirMeta &meta, bool isUser, bool addCatagory(const ScriptManager::ScriptDirMeta &meta, bool isUser,
bool hidden); bool hidden);
void createPluginStandardMenu();
// SettingPage interface // SettingPage interface
public: public:
virtual QIcon categoryIcon() const override; virtual QIcon categoryIcon() const override;
virtual QString name() const override; virtual QString name() const override;
virtual QString id() const override; virtual QString id() const override;
virtual bool containUnsavedChanges() const override;
virtual void restore() override; virtual void restore() override;
virtual void discard() override;
private slots:
void on_btnRefresh_clicked();
void on_listWidget_currentRowChanged(int currentRow);
}; };
#endif // SCRIPTSETTINGDIALOG_H #endif // SCRIPTSETTINGDIALOG_H

View File

@ -130,9 +130,12 @@
<widget class="QTextBrowser" name="textBrowser"/> <widget class="QTextBrowser" name="textBrowser"/>
</item> </item>
<item> <item>
<widget class="QPushButton" name="btnRefresh"> <widget class="QPushButton" name="btnSave">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Refresh</string> <string>Save</string>
</property> </property>
</widget> </widget>
</item> </item>