From 91b8a46c804b0e290635233127a365162f0c2bf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=AC=E5=B1=B1=E8=99=8E?= Date: Mon, 13 Feb 2023 05:58:41 +0000 Subject: [PATCH 1/6] update README.md. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 爬山虎 --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index b8a55d1..fb83d62 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,7 @@ 您可以在这个项目提交bug或反馈问题。 -最新版本下载地址:https://gitee.com/cxasm/notepad--/releases/tag/v1.21 - -最新开发版本下载地址:https://gitee.com/cxasm/notepad--/releases/tag/v1.22 +最新版本下载地址:https://gitee.com/cxasm/notepad--/releases/tag/v1.22 NDD已初步推出插件编写功能,希望广大的CPP/QT开发者加入我们,插件功能均可以留上您的大名和捐赠渠道,希望 开发者参与插件功能开发。 From 0a6486efc2ce29a6b369360c0ded221c2ff159da Mon Sep 17 00:00:00 2001 From: joker2770 <1214220480@qq.com> Date: Thu, 9 Feb 2023 09:02:00 +0800 Subject: [PATCH 2/6] fix: use "" instead. :bug: :construction: --- src/qscint/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qscint/CMakeLists.txt b/src/qscint/CMakeLists.txt index c731bfe..5876579 100644 --- a/src/qscint/CMakeLists.txt +++ b/src/qscint/CMakeLists.txt @@ -37,7 +37,7 @@ ${PROJECT_SOURCE_DIR}/scintilla/include) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Concurrent Qt5::Network Qt5::PrintSupport) -if(($ENV{CMAKE_BUILD_TYPE}) STREQUAL "Release") +if("${CMAKE_BUILD_TYPE}" STREQUAL "Release") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qmyedit_qt5") else() set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qmyedit_qt5d") From 600bcb50a8516764594421eac5fc0bce6be6ab77 Mon Sep 17 00:00:00 2001 From: joker2770 <1214220480@qq.com> Date: Thu, 9 Feb 2023 09:07:51 +0800 Subject: [PATCH 3/6] style: remove personalized files. :arrow_down: --- src/.qmake.stash | 18 ------------------ src/plugin/helloworld/helloworld.vcxproj.user | 10 ---------- 2 files changed, 28 deletions(-) delete mode 100755 src/.qmake.stash delete mode 100755 src/plugin/helloworld/helloworld.vcxproj.user diff --git a/src/.qmake.stash b/src/.qmake.stash deleted file mode 100755 index ceb007f..0000000 --- a/src/.qmake.stash +++ /dev/null @@ -1,18 +0,0 @@ -QMAKE_CXX.QT_COMPILER_STDCXX = 199711L -QMAKE_CXX.QMAKE_MSC_VER = 1916 -QMAKE_CXX.QMAKE_MSC_FULL_VER = 191627048 -QMAKE_CXX.COMPILER_MACROS = \ - QT_COMPILER_STDCXX \ - QMAKE_MSC_VER \ - QMAKE_MSC_FULL_VER -QMAKE_CXX.INCDIRS = \ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\include" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\ucrt" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\shared" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\um" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\winrt" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\cppwinrt" -QMAKE_CXX.LIBDIRS = \ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\lib\\x64" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.19041.0\\ucrt\\x64" \ - "C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.19041.0\\um\\x64" diff --git a/src/plugin/helloworld/helloworld.vcxproj.user b/src/plugin/helloworld/helloworld.vcxproj.user deleted file mode 100755 index b7a75e9..0000000 --- a/src/plugin/helloworld/helloworld.vcxproj.user +++ /dev/null @@ -1,10 +0,0 @@ - - - - - 2023-01-06T12:23:11.3148927Z - - - 2023-01-06T12:23:11.4036545Z - - \ No newline at end of file From c8c0a8be8b1ab77b15eab62ab7894153712701e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=AC=E5=B1=B1=E8=99=8E?= Date: Sat, 11 Feb 2023 21:51:08 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E9=87=8D=E6=96=B0=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cceditor/ccnotepad.cpp | 74 +++++++++++++++------- src/cceditor/ccnotepad.h | 1 + src/cceditor/ccnotepad.ui | 28 ++++---- src/include/pluginGl.h | 10 ++- src/plugin.h | 2 +- src/plugin/helloworld/helloworldexport.cpp | 35 +++++++++- src/plugin/test/test.cpp | 40 +++++++++--- src/pluginGl.h | 20 ++++-- 8 files changed, 151 insertions(+), 59 deletions(-) diff --git a/src/cceditor/ccnotepad.cpp b/src/cceditor/ccnotepad.cpp index 0f11c56..ed766b2 100755 --- a/src/cceditor/ccnotepad.cpp +++ b/src/cceditor/ccnotepad.cpp @@ -1475,21 +1475,14 @@ void CCNotePad::setUserDefShortcutKey(int shortcutId) ui.actionGoline->setShortcut(keySeq); break; + case File_Compare_ID: - keySeq = ShortcutKeyMgr::getUserDefShortcutKey(File_Compare); - m_fileCompare->setShortcut(keySeq); - break; case Dir_Compare_ID: - keySeq = ShortcutKeyMgr::getUserDefShortcutKey(Dir_Compare); - m_dirCompare->setShortcut(keySeq); - break; case Bin_Compare_ID: - keySeq = ShortcutKeyMgr::getUserDefShortcutKey(Bin_Compare); - m_binCompare->setShortcut(keySeq); - break; + case Trans_code_ID: keySeq = ShortcutKeyMgr::getUserDefShortcutKey(Trans_code); m_transcode->setShortcut(keySeq); @@ -1545,7 +1538,7 @@ void CCNotePad::slot_dynamicLoadToolMenu() m_isToolMenuLoaded = true; #ifdef NO_PLUGIN - ui.menuTools->addAction(tr("Plugin Manager"), this, &CCNotePad::slot_pluginMgr); + connect(ui.actionPlugin_Manager, &QAction::triggered, this, &CCNotePad::slot_pluginMgr); #endif QMenu* formatMenu = new QMenu(tr("Format Language"), this); @@ -1581,7 +1574,7 @@ void CCNotePad::loadPluginLib() { strDir = dir.absolutePath(); - loadPluginProcs(strDir,ui.menuTools); + loadPluginProcs(strDir,ui.menuPlugin); } } @@ -1594,11 +1587,31 @@ void CCNotePad::onPlugFound(NDD_PROC_DATA& procData, QMenu* pUserData) return; } - QAction* pAction = new QAction(pMenu); + //创建action + if (procData.m_menuType == 0) + { + QAction* pAction = new QAction(procData.m_strPlugName, pMenu); + pMenu->addAction(pAction); pAction->setText(procData.m_strPlugName); pAction->setData(procData.m_strFilePath); - pMenu->addAction(pAction); connect(pAction, &QAction::triggered, this, &CCNotePad::onPlugWork); + } + else if (procData.m_menuType == 1) + { + //创建二级菜单 + QMenu* pluginMenu = new QMenu(procData.m_strPlugName, pMenu); + pMenu->addMenu(pluginMenu); + + //菜单句柄通过procData传递到插件中 + procData.m_rootMenu = pluginMenu; + sendParaToPlugin(procData); + } + else + { + return; + } + + m_pluginList.append(procData); } @@ -1620,7 +1633,7 @@ void CCNotePad::onPlugWork(bool check) { std::function foundCallBack = std::bind(&CCNotePad::getCurEditView, this); - pMainCallBack(this, plugPath, foundCallBack); + pMainCallBack(this, plugPath, foundCallBack, nullptr); } else { @@ -1630,21 +1643,36 @@ void CCNotePad::onPlugWork(bool check) } } +//把插件需要的参数,传递到插件中去 +void CCNotePad::sendParaToPlugin(NDD_PROC_DATA& procData) +{ + QString plugPath = procData.m_strFilePath; + + QLibrary* pLib = new QLibrary(plugPath); + + NDD_PROC_MAIN_CALLBACK pMainCallBack; + pMainCallBack = (NDD_PROC_MAIN_CALLBACK)pLib->resolve("NDD_PROC_MAIN"); + + if (pMainCallBack != NULL) + { + std::function foundCallBack = std::bind(&CCNotePad::getCurEditView, this); + + pMainCallBack(this, plugPath, foundCallBack, &procData); + } + else + { + ui.statusBar->showMessage(tr("plugin %1 load failed !").arg(plugPath), 10000); + } +} + void CCNotePad::loadPluginProcs(QString strLibDir, QMenu* pMenu) { - QMenu* pSubMenu = new QMenu(tr("Plugin"), pMenu); - std::function foundCallBack = std::bind(&CCNotePad::onPlugFound, this, std::placeholders::_1, std::placeholders::_2); - int nRet = loadProc(strLibDir, foundCallBack, pSubMenu); - + int nRet = loadProc(strLibDir, foundCallBack, pMenu); if (nRet > 0) { - pMenu->addMenu(pSubMenu); - } - else - { - delete pSubMenu; + ui.statusBar->showMessage(tr("load plugin in dir %1 success, plugin num %2").arg(strLibDir).arg(nRet)); } } #endif diff --git a/src/cceditor/ccnotepad.h b/src/cceditor/ccnotepad.h index da59ddf..0b63a5c 100755 --- a/src/cceditor/ccnotepad.h +++ b/src/cceditor/ccnotepad.h @@ -341,6 +341,7 @@ private slots: #ifdef NO_PLUGIN void slot_pluginMgr(); void onPlugWork(bool check); + void sendParaToPlugin(NDD_PROC_DATA& procData); #endif void slot_showWebAddr(bool check); void slot_langFileSuffix(); diff --git a/src/cceditor/ccnotepad.ui b/src/cceditor/ccnotepad.ui index 41c84e8..fe1a604 100755 --- a/src/cceditor/ccnotepad.ui +++ b/src/cceditor/ccnotepad.ui @@ -507,6 +507,12 @@ T&ools + + + Plugin + + + @@ -515,6 +521,7 @@ + @@ -2048,6 +2055,11 @@ test + + + Plugin Manager + + @@ -2711,22 +2723,6 @@ - - - - - - - - - - - - - - - - actionLanguage_Format triggered() CCNotePad diff --git a/src/include/pluginGl.h b/src/include/pluginGl.h index 135babf..005c35b 100755 --- a/src/include/pluginGl.h +++ b/src/include/pluginGl.h @@ -1,5 +1,6 @@ #pragma once #include +#include #define NDD_EXPORTDLL @@ -16,10 +17,17 @@ struct ndd_proc_data { QString m_strPlugName; // ѡ - QString m_strFilePath; //lib ȫ·ѡ + QString m_strFilePath; //lib ȫ·ѡڲù,򴫵 QString m_strComment; //˵ QString m_version; //汾롣ѡ QString m_auther;//ơѡ + int m_menuType;//˵͡0ʹö˵ 1˵ + QMenu* m_rootMenu;//m_menuType = 1˵ĵֵַnullptr + + ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0) + { + + } }; diff --git a/src/plugin.h b/src/plugin.h index 918f293..57e920e 100755 --- a/src/plugin.h +++ b/src/plugin.h @@ -5,6 +5,6 @@ class QMenu; class QsciScintilla; class QWidget; -typedef int (*NDD_PROC_MAIN_CALLBACK)(QWidget* parent, const QString& strFileName, std::functiongetCurEdit); +typedef int (*NDD_PROC_MAIN_CALLBACK)(QWidget* parent, const QString& strFileName, std::functiongetCurEdit, NDD_PROC_DATA* procData); int loadProc(const QString& strDirOut, std::function funcallback, QMenu* pUserData); diff --git a/src/plugin/helloworld/helloworldexport.cpp b/src/plugin/helloworld/helloworldexport.cpp index aba2a40..28bc0ff 100755 --- a/src/plugin/helloworld/helloworldexport.cpp +++ b/src/plugin/helloworld/helloworldexport.cpp @@ -22,13 +22,17 @@ #endif NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData); - NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit); + NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, NDD_PROC_DATA* procData); #ifdef __cplusplus } #endif +static NDD_PROC_DATA s_procData; +static QWidget* s_pMainNotepad = nullptr; +std::function s_getCurEdit; + bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) { if(pProcData == NULL) @@ -40,13 +44,38 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) pProcData->m_version = QString("v1.0"); pProcData->m_auther = QString("zuowei.yin"); + + pProcData->m_menuType = 0; + return true; } -//插件的入口点函数 -int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::functiongetCurEdit) +//则点击菜单栏按钮时,会自动调用到该插件的入口点函数。 +//pNotepad:就是CCNotepad的主界面指针 +//strFileName:当前插件DLL的全路径,如果不关心,则可以不使用 +//getCurEdit:从NDD主程序传递过来的仿函数,通过该函数获取当前编辑框操作对象QsciScintilla +//pProcData:如果pProcData->m_menuType = 0 ,则该指针为空;如果pProcData->m_menuType = 1,则该指针有值。目前需要关心s_procData.m_rootMenu +//开发者可以在该菜单下面,自行创建二级菜单 +int NDD_PROC_MAIN(QWidget* pNotepad, const QString &strFileName, std::functiongetCurEdit, NDD_PROC_DATA* pProcData) { QsciScintilla* pEdit = getCurEdit(); + if (pEdit == nullptr) + { + return -1; + } + + //务必拷贝一份pProcData,在外面会释放。 + if (pProcData != nullptr) + { + s_procData = *pProcData; + } + + s_pMainNotepad = pNotepad; + s_getCurEdit = getCurEdit; + + //如果pProcData->m_menuType = 1;是自己要创建二级菜单的场景。则通过s_procData.m_rootMenu 获取该插件的菜单根节点。 + //插件开发者自行在s_procData.m_rootMenu下添加新的二级菜单项目 + //做一个简单的转大写的操作 QtTestClass* p = new QtTestClass(pNotepad,pEdit); diff --git a/src/plugin/test/test.cpp b/src/plugin/test/test.cpp index c2ccca1..667928c 100755 --- a/src/plugin/test/test.cpp +++ b/src/plugin/test/test.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #define NDD_EXPORTDLL @@ -21,13 +22,16 @@ #endif NDD_EXPORT bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData); - NDD_EXPORT int NDD_PROC_MAIN(QWidget* parent, const QString& strFileName, std::functiongetCurEdit); - + NDD_EXPORT int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, NDD_PROC_DATA* procData); #ifdef __cplusplus } #endif +static NDD_PROC_DATA s_procData; +static QWidget* s_pMainNotepad = nullptr; +std::function s_getCurEdit; + bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) { if(pProcData == NULL) @@ -39,21 +43,39 @@ bool NDD_PROC_IDENTIFY(NDD_PROC_DATA* pProcData) pProcData->m_version = QString("v1.0"); pProcData->m_auther = QString("zuowei.yin"); + + pProcData->m_menuType = 1; return true; } -//插件的入口点函数 -int NDD_PROC_MAIN(QWidget* parent, const QString &strFileName, std::functiongetCurEdit) +//则点击菜单栏按钮时,会自动调用到该插件的入口点函数。 +//pNotepad:就是CCNotepad的主界面指针 +//strFileName:当前插件DLL的全路径,如果不关心,则可以不使用 +//getCurEdit:从NDD主程序传递过来的仿函数,通过该函数获取当前编辑框操作对象QsciScintilla +//pProcData:如果pProcData->m_menuType = 0 ,则该指针为空;如果pProcData->m_menuType = 1,则该指针有值。目前需要关心s_procData.m_rootMenu +//开发者可以在该菜单下面,自行创建二级菜单 +int NDD_PROC_MAIN(QWidget* pNotepad, const QString& strFileName, std::functiongetCurEdit, NDD_PROC_DATA* pProcData) { - QsciScintilla* pEidt = getCurEdit(); - QString text = pEidt->text(); + //务必拷贝一份pProcData,在外面会释放。 + if (pProcData != nullptr) + { + s_procData = *pProcData; + } + else + { + return -1; + } - //做一个简单的转大写的操作 + s_pMainNotepad = pNotepad; + s_getCurEdit = getCurEdit; - text = text.toLower(); + //如果pProcData->m_menuType = 1;是自己要创建二级菜单的场景。则通过s_procData.m_rootMenu 获取该插件的菜单根节点。 + //插件开发者自行在s_procData.m_rootMenu下添加新的二级菜单项目 - pEidt->setText(text); + QAction* pAction = new QAction(s_procData.m_strPlugName, s_procData.m_rootMenu); + s_procData.m_rootMenu->addAction(pAction); + pAction->setText("Secondary Menu Example"); return 0; } diff --git a/src/pluginGl.h b/src/pluginGl.h index 41971cc..a7ef5d5 100755 --- a/src/pluginGl.h +++ b/src/pluginGl.h @@ -1,13 +1,21 @@ #pragma once #include +#include struct ndd_proc_data { - QString m_strPlugName; // ѡ - QString m_strFilePath; //lib ȫ·ѡ - QString m_strComment; //˵ - QString m_version; //汾롣ѡ - QString m_auther;//ơѡ + QString m_strPlugName; // ѡд + QString m_strFilePath; //lib ȫ·ѡڲд,򴫵 + QString m_strComment; //˵д + QString m_version; //汾롣ѡд + QString m_auther;//ơѡд + int m_menuType;//˵͡0ʹö˵ 1˵д + QMenu* m_rootMenu;//m_menuType = 1˵ĵֵַnullptr ڲд򴫵 + + ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0) + { + + } }; //#define NDD_PROC_IDENTIFY ("nddProc") @@ -15,4 +23,4 @@ struct ndd_proc_data typedef struct ndd_proc_data NDD_PROC_DATA; typedef bool (*NDD_PROC_IDENTIFY_CALLBACK)(NDD_PROC_DATA* pProcData); -typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserData); \ No newline at end of file +typedef void (*NDD_PROC_FOUND_CALLBACK)(NDD_PROC_DATA* pProcData, void* pUserData); From ab92d95baff6b3db56e14419da2279013aedbcb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=AC=E5=B1=B1=E8=99=8E?= Date: Sun, 12 Feb 2023 21:52:31 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E4=B8=BAutf8-bom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CmpareMode.cpp | 2 +- src/CmpareMode.h | 2 +- src/Sorters.h | 2 +- src/aboutndd.cpp | 2 +- src/aboutndd.h | 2 +- src/batchfindreplace.cpp | 20 +- src/batchfindreplace.h | 2 +- src/bigfilemessage.cpp | 2 +- src/bigfilemessage.h | 2 +- src/cceditor/ccnotepad.cpp | 2 +- src/cceditor/ccnotepad.h | 2 +- src/cceditor/filemanager.cpp | 2 +- src/cceditor/filemanager.h | 38 +- src/columnedit.cpp | 10 +- src/columnedit.h | 2 +- src/common.cpp | 2 +- src/common.h | 2 +- src/ctipwin.cpp | 2 +- src/ctipwin.h | 2 +- src/doctypelistview.h | 2 +- src/draglineedit.cpp | 6 +- src/draglineedit.h | 8 +- src/extLexermanager.cpp | 16 +- src/extlexermanager.h | 10 +- src/filecmprulewin.cpp | 2 +- src/filecmprulewin.h | 2 +- src/filelistview.cpp | 12 +- src/filelistview.h | 2 +- src/findcmpwin.cpp | 2 +- src/findcmpwin.h | 2 +- src/findresultwin.cpp | 2 +- src/findresultwin.h | 2 +- src/findwin.cpp | 2 +- src/findwin.h | 2 +- src/gotolinewin.cpp | 2 +- src/gotolinewin.h | 2 +- src/hexcmprangewin.cpp | 6 +- src/hexcmprangewin.h | 2 +- src/hexfilegoto.cpp | 4 +- src/hexfilegoto.h | 2 +- src/hexrulewin.cpp | 2 +- src/hexrulewin.h | 2 +- src/include/pluginGl.h | 16 +- src/langextset.cpp | 22 +- src/langextset.h | 2 +- src/langstyledefine.cpp | 2 +- src/langstyledefine.h | 2 +- src/mytreeview.cpp | 2 +- src/mytreeview.h | 2 +- src/nddsetting.cpp | 70 ++-- src/nddsetting.h | 34 +- src/ndstyleditemdelegate.cpp | 14 +- src/ndstyleditemdelegate.h | 2 +- src/plugin.cpp | 2 +- src/plugin.h | 2 +- src/plugin/helloworld/helloworld.vcxproj | 182 --------- .../helloworld/helloworld.vcxproj.filters | 69 ---- src/plugin/helloworld/helloworldexport.cpp | 2 +- src/plugin/helloworld/qttestclass.cpp | 2 +- src/plugin/helloworld/qttestclass.h | 2 +- src/plugin/test/test.cpp | 2 +- src/pluginGl.h | 16 +- src/pluginmgr.cpp | 2 +- src/pluginmgr.h | 2 +- .../Python/config-tests/cfgtest_Qsci.cpp | 2 +- src/qscint/scintilla/include/Scintilla.h | 2 +- src/qscint/scintilla/lexers/LexAVS.cpp | 2 +- src/qscint/scintilla/src/Catalogue.cpp | 2 +- src/qscint/src/Qsci/qsciglobal.h | 1 + src/qscint/src/Qsci/qscilexerasm.h | 2 +- src/qscint/src/Qsci/qscilexerglobal.h | 2 +- src/qscint/src/Qsci/qscilexerr.h | 2 +- src/qscint/src/Qsci/qscilexervb.h | 2 +- src/qscint/src/qscilexerasm.cpp | 2 +- src/qscint/src/qscilexerglobal.cpp | 2 +- src/qscint/src/qscilexerr.cpp | 2 +- src/qscint/src/qscilexervb.cpp | 2 +- src/qtlangset.cpp | 344 +++++++++--------- src/qtlangset.h | 2 +- src/rcglobal.h | 2 +- src/renamewin.cpp | 2 +- src/renamewin.h | 2 +- src/rgba_icons.h | 2 +- src/scintillaeditview.cpp | 2 +- src/scintillaeditview.h | 2 +- src/scintillahexeditview.cpp | 2 +- src/scintillahexeditview.h | 2 +- src/shortcutkeyeditwin.cpp | 6 +- src/shortcutkeyeditwin.h | 2 +- src/shortcutkeymgr.cpp | 28 +- src/shortcutkeymgr.h | 4 +- src/styleset.cpp | 28 +- src/styleset.h | 6 +- src/texteditsetwin.h | 2 +- src/userlexdef.cpp | 16 +- src/userlexdef.h | 2 +- 96 files changed, 438 insertions(+), 688 deletions(-) delete mode 100755 src/plugin/helloworld/helloworld.vcxproj delete mode 100755 src/plugin/helloworld/helloworld.vcxproj.filters diff --git a/src/CmpareMode.cpp b/src/CmpareMode.cpp index ae8a250..f0618bd 100755 --- a/src/CmpareMode.cpp +++ b/src/CmpareMode.cpp @@ -1,4 +1,4 @@ -#include "CmpareMode.h" +#include "CmpareMode.h" #include "Encode.h" #include "rcglobal.h" diff --git a/src/CmpareMode.h b/src/CmpareMode.h index d150c0d..a92736b 100755 --- a/src/CmpareMode.h +++ b/src/CmpareMode.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/Sorters.h b/src/Sorters.h index 0ad3e9d..4f3e567 100755 --- a/src/Sorters.h +++ b/src/Sorters.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/aboutndd.cpp b/src/aboutndd.cpp index 0c1392f..eb86931 100644 --- a/src/aboutndd.cpp +++ b/src/aboutndd.cpp @@ -1,4 +1,4 @@ -#include "aboutndd.h" +#include "aboutndd.h" AboutNdd::AboutNdd(QWidget *parent) : QWidget(parent) diff --git a/src/aboutndd.h b/src/aboutndd.h index 2e23f65..8ce15e8 100755 --- a/src/aboutndd.h +++ b/src/aboutndd.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_aboutndd.h" diff --git a/src/batchfindreplace.cpp b/src/batchfindreplace.cpp index 0a49e15..9dabbfc 100755 --- a/src/batchfindreplace.cpp +++ b/src/batchfindreplace.cpp @@ -1,4 +1,4 @@ -#include "batchfindreplace.h" +#include "batchfindreplace.h" #include "scintillaeditview.h" #include "ccnotepad.h" #include "progresswin.h" @@ -31,7 +31,7 @@ void BatchFindReplace::setTabWidget(QTabWidget* editTabWidget) m_editTabWidget = editTabWidget; } -//Զǰڵ״̬˱仯Ҫ϶Ϊ״β +//自动调整当前窗口的状态,如果发生了变化,则需要认定为是首次查找 QWidget* BatchFindReplace::autoAdjustCurrentEditWin() { QWidget* pw = m_editTabWidget->currentWidget(); @@ -53,7 +53,7 @@ void BatchFindReplace::appendToFindTable(QString findKeyword) ui.findReplaceTable->setItem(rNum, 1, new QTableWidgetItem()); } -//ﲻ׷ӣDz룬ӦItemѾڡ򲻲 +//这里不能追加,而是插入,即对应的Item必须已经存在。否则不插入 void BatchFindReplace::insertToReplaceTable(int row, QString replaceKeyword) { QTableWidgetItem* item = ui.findReplaceTable->item(row, 1); @@ -97,11 +97,11 @@ void BatchFindReplace::appendToFindReplaceTable(QStringList& findKeyword) bool BatchFindReplace::tranInputKeyword(QString& findKeyWord, QStringList& outputKeyWordList) { - //ѿհַո\t \r\n ַ滻Ϊո + //把空白字符,空格或者\t \r\n 等字符进行替换为空格 QRegExp re("\\s"); findKeyWord.replace(re, QString(" ")); - //ٽпոָ + //再进行空格分隔处理 outputKeyWordList = findKeyWord.split(" "); if (outputKeyWordList.size() > 20000) @@ -110,7 +110,7 @@ bool BatchFindReplace::tranInputKeyword(QString& findKeyWord, QStringList& outpu return false; } - //ɾÿһյԪ + //删除每一个空的元素 for (int i = outputKeyWordList.size() - 1; i >= 0; --i) { if (outputKeyWordList[i].trimmed().isEmpty()) @@ -166,7 +166,7 @@ void BatchFindReplace::on_freshBtClick() } } -//ҹ +//进行批量查找工作 void BatchFindReplace::on_findBtClick() { if (m_mainNotepad != nullptr && m_mainNotepad) @@ -213,7 +213,7 @@ void BatchFindReplace::on_findBtClick() } } -//滻 +//进行批量替换工作 void BatchFindReplace::on_replaceBtClick() { if (m_mainNotepad != nullptr && m_mainNotepad) @@ -306,9 +306,9 @@ void BatchFindReplace::on_import() QFileDialog fd(this, QString(), CCNotePad::s_lastOpenDirPath); fd.setFileMode(QFileDialog::ExistingFile); - if (fd.exec() == QDialog::Accepted) //ɹִ + if (fd.exec() == QDialog::Accepted) //如果成功的执行 { - QStringList fileNameList = fd.selectedFiles(); //ļб + QStringList fileNameList = fd.selectedFiles(); //返回文件列表的名称 QFileInfo fi(fileNameList[0]); QSettings setting(fi.filePath(), QSettings::IniFormat); diff --git a/src/batchfindreplace.h b/src/batchfindreplace.h index 7ae86f9..fdef375 100755 --- a/src/batchfindreplace.h +++ b/src/batchfindreplace.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/bigfilemessage.cpp b/src/bigfilemessage.cpp index 247d876..c3c699b 100755 --- a/src/bigfilemessage.cpp +++ b/src/bigfilemessage.cpp @@ -1,4 +1,4 @@ -#include "bigfilemessage.h" +#include "bigfilemessage.h" BigFileMessage::BigFileMessage(QWidget *parent) : QDialog(parent), m_result(-1) diff --git a/src/bigfilemessage.h b/src/bigfilemessage.h index a66a162..97e1b1f 100755 --- a/src/bigfilemessage.h +++ b/src/bigfilemessage.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "ccnotepad.h" #include diff --git a/src/cceditor/ccnotepad.cpp b/src/cceditor/ccnotepad.cpp index ed766b2..18d491f 100755 --- a/src/cceditor/ccnotepad.cpp +++ b/src/cceditor/ccnotepad.cpp @@ -1,4 +1,4 @@ -#include +#include #include "ccnotepad.h" #include "filemanager.h" #include "Encode.h" diff --git a/src/cceditor/ccnotepad.h b/src/cceditor/ccnotepad.h index 0b63a5c..84ab6e6 100755 --- a/src/cceditor/ccnotepad.h +++ b/src/cceditor/ccnotepad.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/cceditor/filemanager.cpp b/src/cceditor/filemanager.cpp index 96383cc..cd0b0e0 100755 --- a/src/cceditor/filemanager.cpp +++ b/src/cceditor/filemanager.cpp @@ -1,4 +1,4 @@ -#include "filemanager.h" +#include "filemanager.h" #include "scintillaeditview.h" #include "scintillahexeditview.h" #include "CmpareMode.h" diff --git a/src/cceditor/filemanager.h b/src/cceditor/filemanager.h index 565f9aa..fe5dc97 100755 --- a/src/cceditor/filemanager.h +++ b/src/cceditor/filemanager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "common.h" #include "rcglobal.h" @@ -11,7 +11,7 @@ class ScintillaEditView; class ScintillaHexEditView; -//С100kļһȫȡ +//小于100k的文件一次性全部读取完毕 const int LITTLE_FILE_MAX = 1024000; enum ERROR_TYPE { @@ -29,16 +29,16 @@ struct NewFileIdMgr { } }; -//ļϢ +//管理二进制文件的信息 struct HexFileMgr { QString filePath; QFile* file; qint64 fileOffset; qint64 fileSize; - qint16 lineSize;//ÿζȡУĬΪ64Уû16ַ + qint16 lineSize;//每次读取多少行,默认为64行,没行16个字符 char* contentBuf; int contentRealSize; - bool onetimeRead; //Ƿһȫȡڴ档СڵLITTLE_FILE_MAXIJŻȫȡ + bool onetimeRead; //是否一次性全部读取到内存。小于等于LITTLE_FILE_MAX的才会全部读取 HexFileMgr() :file(nullptr), fileOffset(0), lineSize(64), fileSize(0), contentBuf(nullptr), contentRealSize(0),onetimeRead(false) { @@ -62,17 +62,17 @@ private: HexFileMgr(const HexFileMgr&) = delete; }; -//ıļϢ +//管理大文本文件的信息 struct TextFileMgr { QString filePath; QFile* file; qint64 fileOffset; qint64 fileSize; - qint16 lineSize;//ÿζȡУĬÿζȡ1024С󲻳1Mݡ + qint16 lineSize;//每次读取多少行,默认每次读取1024行。但是最大不超过1M的内容。 char* contentBuf; int contentRealSize; int loadWithCode; - int lineEndType;//βͣwin linux mac + int lineEndType;//行尾类型,win linux mac TextFileMgr() :file(nullptr), fileOffset(0), lineSize(64), fileSize(0), contentBuf(nullptr), contentRealSize(0), loadWithCode(CODE_ID::UNKOWN),lineEndType(RC_LINE_FORM::UNKNOWN_LINE) { @@ -98,23 +98,23 @@ private: }; struct BlockIndex { - qint64 fileOffset;//Ŀʼַ - quint32 fileSize;//ĴС - quint32 lineNumStart;//кŵĿʼֵ - quint32 lineNum;//е + qint64 fileOffset;//块的开始地址 + quint32 fileSize;//块的大小 + quint32 lineNumStart;//块中行号的开始值 + quint32 lineNum;//块中的行数量 }; -//ıļ,Ա༭Ϣ +//管理大文本文件,可以编辑的信息 struct BigTextEditFileMgr { QString filePath; QFile* file; - uchar* filePtr;//ʹõļӳķʽ - quint32 m_curBlockIndex; //ǰչʾеĿ - int loadWithCode; //ԺֱؽļĬUTF8 - int lineEndType;//βͣwin linux mac - static const qint16 BLOCK_SIZE = 1;//СλMʼ4MֿԽԽ࣬ôһжλеλԽ + uchar* filePtr;//使用的是文件映射的方式打开 + quint32 m_curBlockIndex; //当前展示中的块索引序号 + int loadWithCode; //以何种编码来加载解析文件。默认UTF8 + int lineEndType;//行尾类型,win linux mac + static const qint16 BLOCK_SIZE = 1;//块大小,单位M。开始是4M,发现块越大,行越多,那么在一块中定位行的位置越慢 - QVector blocks;//ÿһļʱҪ + QVector blocks;//每一块的索引。打开文件的时候,需要建立该索引 BigTextEditFileMgr():filePtr(nullptr), file(nullptr), m_curBlockIndex(0), loadWithCode(CODE_ID::UNKOWN), lineEndType(RC_LINE_FORM::UNKNOWN_LINE) { diff --git a/src/columnedit.cpp b/src/columnedit.cpp index 3fae34a..d607042 100755 --- a/src/columnedit.cpp +++ b/src/columnedit.cpp @@ -1,4 +1,4 @@ -#include "columnedit.h" +#include "columnedit.h" #include "scintillaeditview.h" ColumnEdit::ColumnEdit(QWidget *parent) @@ -54,7 +54,7 @@ void ColumnEdit::slot_bigChar(bool isCheck) ui.capital->setEnabled(isCheck); } -//Զǰڵ״̬ +//自动调整当前窗口的状态 QWidget* ColumnEdit::autoAdjustCurrentEditWin() { QWidget* pw = m_editTabWidget->currentWidget(); @@ -93,7 +93,7 @@ void ColumnEdit::slot_ok() QString prefix = ui.prefix->text(); bool isCapital = ui.capital->isChecked(); - //Dzıģʽ + //是插入文本模式 if (ui.textGroupBox->isChecked()) { @@ -138,7 +138,7 @@ void ColumnEdit::slot_ok() } else { - //ҪӸʾ + //这里要加个提示 QApplication::beep(); return; } @@ -209,7 +209,7 @@ void ColumnEdit::slot_ok() lineText.chrg.cpMin = static_cast(lineBegin); lineText.chrg.cpMax = static_cast(lineEnd); lineText.lpstrText = lineData.data(); - //ȡԭʼе + //获取原始行的内容 pEdit->SendScintilla(SCI_GETTEXTRANGE, 0, &lineText); if (lineEndCol < cursorCol) diff --git a/src/columnedit.h b/src/columnedit.h index d650e47..7263253 100755 --- a/src/columnedit.h +++ b/src/columnedit.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/common.cpp b/src/common.cpp index d5f43ab..0bab036 100755 --- a/src/common.cpp +++ b/src/common.cpp @@ -1,4 +1,4 @@ -#include "common.h" +#include "common.h" int nbDigitsFromNbLines(size_t nbLines) diff --git a/src/common.h b/src/common.h index 7e61704..a09b19b 100755 --- a/src/common.h +++ b/src/common.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/ctipwin.cpp b/src/ctipwin.cpp index f894ad8..d972901 100755 --- a/src/ctipwin.cpp +++ b/src/ctipwin.cpp @@ -1,4 +1,4 @@ -#include "ctipwin.h" +#include "ctipwin.h" #include diff --git a/src/ctipwin.h b/src/ctipwin.h index c5a3cb5..db85e10 100755 --- a/src/ctipwin.h +++ b/src/ctipwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_ctipwin.h" diff --git a/src/doctypelistview.h b/src/doctypelistview.h index 93fb877..874069b 100755 --- a/src/doctypelistview.h +++ b/src/doctypelistview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/draglineedit.cpp b/src/draglineedit.cpp index c21f3de..a5e35ba 100755 --- a/src/draglineedit.cpp +++ b/src/draglineedit.cpp @@ -1,4 +1,4 @@ -#include "draglineedit.h" +#include "draglineedit.h" DragLineEdit::DragLineEdit(QWidget *parent) : QLineEdit(parent) @@ -12,9 +12,9 @@ DragLineEdit::~DragLineEdit() void DragLineEdit::dragEnterEvent(QDragEnterEvent* event) { - if (event->mimeData()->hasFormat("text/uri-list")) //ֻܴıļ + if (event->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件 { - event->accept(); //ڲϷŶ + event->accept(); //可以在这个窗口部件上拖放对象 } else { diff --git a/src/draglineedit.h b/src/draglineedit.h index f37172c..4965c2a 100755 --- a/src/draglineedit.h +++ b/src/draglineedit.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -16,10 +16,10 @@ public: protected: - ///< ϶ļ + ///< 拖动文件到窗口 触发 void dragEnterEvent(QDragEnterEvent* event) override; - ///< ϶ļƶļ + ///< 拖动文件到窗口移动文件 触发 void dragMoveEvent(QDragMoveEvent* event) override; - ///< ϶ļͷļ + ///< 拖动文件到窗口释放文件触发 void dropEvent(QDropEvent* event) override; }; diff --git a/src/extLexermanager.cpp b/src/extLexermanager.cpp index af9d2a1..56618e2 100755 --- a/src/extLexermanager.cpp +++ b/src/extLexermanager.cpp @@ -1,7 +1,7 @@ -#include "extlexermanager.h" +#include "extlexermanager.h" -//רûԶExt ʷLexerࡣ -//һļext׺ٸ֪ʹʲôlexer﷨ +//专门用来管理用户自定义的Ext 和 词法Lexer关联的类。 +//给出一个文件的ext后缀,快速告知该使用什么lexer进行语法高亮 ExtLexerManager* ExtLexerManager::s_instance = nullptr; @@ -42,9 +42,9 @@ void ExtLexerManager::remove(QString ext) } -//ext:ļĺ׺ langTagName:Եtag -//lexerId ﷨idûԶ壬ȻL_USER_TXT,L_USER_CPP,L_USER_HTML,L_USER_JS,L_USER_XML, L_USER_INI еһ -//langTagName:ֻû£ҪtagNameΪûlexertagnameǹ̶ġ +//ext:文件的后缀名 langTagName:语言的tag名称 +//lexerId 语法的id,如果是用户自定义,则必然是L_USER_TXT,L_USER_CPP,L_USER_HTML,L_USER_JS,L_USER_XML, L_USER_INI 中的一个。 +//langTagName:只有在用户定义语言下,才需要tagName。因为非用户定义的lexer,其tagname是固定的。 void ExtLexerManager::addNewExtType(QString ext, LangType lexerId, QString langTagName) { LexerInfo value(lexerId, langTagName); @@ -61,7 +61,7 @@ bool ExtLexerManager::getLexerTypeByExt(QString ext, LexerInfo& lexer) return false; } -//гtagйļ׺б +//列出tag语言下面的所有关联的文件后缀列表 void ExtLexerManager::getExtlistByLangTag(QString tag, QStringList& extList) { for (QMap::iterator it = m_extToLexerIdMap.begin(); it != m_extToLexerIdMap.end(); ++it) @@ -75,7 +75,7 @@ void ExtLexerManager::getExtlistByLangTag(QString tag, QStringList& extList) } } -//гtagйļ׺б +//列出tag语言下面的所有关联的文件后缀列表 void ExtLexerManager::getExtlistByLangTag(QMap& extLangMap) { for (QMap::iterator it = m_extToLexerIdMap.begin(); it != m_extToLexerIdMap.end(); ++it) diff --git a/src/extlexermanager.h b/src/extlexermanager.h index cc59df6..6dc3427 100755 --- a/src/extlexermanager.h +++ b/src/extlexermanager.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -26,8 +26,8 @@ enum LangType { #endif struct LexerInfo{ - LangType lexerId; //L_USER_DEFINEʾĸ - QString tagName; //tagơ + LangType lexerId; //如果是L_USER_DEFINE,则表示母版的类型 + QString tagName; //语言tag名称。 bool isUserDefineLangs() { return (lexerId > L_USER_DEFINE); @@ -55,10 +55,10 @@ public: bool getLexerTypeByExt(QString ext, LexerInfo& lexer); - //гtagйļ׺б + //列出tag语言下面的所有关联的文件后缀列表 void getExtlistByLangTag(QString tag, QStringList& extList); - //гйļ׺б + //列出所有语言下面的所有关联的文件后缀列表 void getExtlistByLangTag(QMap& extLangMap); diff --git a/src/filecmprulewin.cpp b/src/filecmprulewin.cpp index ecf631c..c6c76b6 100755 --- a/src/filecmprulewin.cpp +++ b/src/filecmprulewin.cpp @@ -1,4 +1,4 @@ -#include "filecmprulewin.h" +#include "filecmprulewin.h" FileCmpRuleWin::FileCmpRuleWin(int mode, bool blankMath, int equalRato,QWidget *parent) : QWidget(parent) diff --git a/src/filecmprulewin.h b/src/filecmprulewin.h index bc569e6..44cd701 100755 --- a/src/filecmprulewin.h +++ b/src/filecmprulewin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_filecmprulewin.h" diff --git a/src/filelistview.cpp b/src/filelistview.cpp index d6663e5..ce9ea39 100755 --- a/src/filelistview.cpp +++ b/src/filelistview.cpp @@ -1,11 +1,11 @@ -#include "filelistview.h" +#include "filelistview.h" #include "rcglobal.h" #include "ccnotepad.h" #include #include -//ʾļԺ󣬰ļڸб +//当显示文件多了以后,把所有文件列在该列表中 FileListView::FileListView(QWidget *parent) : QWidget(parent), m_pNotepad(nullptr) @@ -14,7 +14,7 @@ FileListView::FileListView(QWidget *parent) connect(ui.filelistWidget, &QListWidget::itemDoubleClicked, this, &FileListView::itemDoubleClicked); - setContextMenuPolicy(Qt::CustomContextMenu); //öֵ + setContextMenuPolicy(Qt::CustomContextMenu); //设置枚举值 connect(this, &QListWidget::customContextMenuRequested, this, &FileListView::slot_ShowPopMenu); } @@ -29,7 +29,7 @@ void FileListView::setNotepadWin(QWidget* pNotepad) m_pNotepad = pNotepad; } -//Ҽ˵ +//右键菜单 void FileListView::slot_ShowPopMenu(const QPoint& pos) { QListWidgetItem* curItem = ui.filelistWidget->itemAt(pos); @@ -53,11 +53,11 @@ void FileListView::slot_ShowPopMenu(const QPoint& pos) { pNotePad->closeFileByEditWidget(m_fileEditMap.value(curItem->text()).pEditWidget); } - //עﲻҪɾm_fileEditMapԪأΪcloseFileByEditWidgetá + //注意这里不需要在删除m_fileEditMap元素,因为closeFileByEditWidget里面会调用。 } }); - //ûƱʾǶitemڶӦļֻռλ + //没有名称表示是对齐的item,不存在对应的文件,只是占位 if (curItem->text().isEmpty()) { actionAdd->setEnabled(false); diff --git a/src/filelistview.h b/src/filelistview.h index 32c2a49..d36719f 100755 --- a/src/filelistview.h +++ b/src/filelistview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/findcmpwin.cpp b/src/findcmpwin.cpp index 93186d1..67b7329 100755 --- a/src/findcmpwin.cpp +++ b/src/findcmpwin.cpp @@ -1,4 +1,4 @@ -#include "findcmpwin.h" +#include "findcmpwin.h" #include "qscidisplaywindow.h" #include #include diff --git a/src/findcmpwin.h b/src/findcmpwin.h index 4f53fca..8ea9438 100755 --- a/src/findcmpwin.h +++ b/src/findcmpwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/findresultwin.cpp b/src/findresultwin.cpp index 75af255..228cba6 100755 --- a/src/findresultwin.cpp +++ b/src/findresultwin.cpp @@ -1,4 +1,4 @@ -#include "findresultwin.h" +#include "findresultwin.h" #include "findwin.h" #include "common.h" #include "styleset.h" diff --git a/src/findresultwin.h b/src/findresultwin.h index 408c101..73b8f79 100755 --- a/src/findresultwin.h +++ b/src/findresultwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/findwin.cpp b/src/findwin.cpp index 14aad6c..55d97f6 100755 --- a/src/findwin.cpp +++ b/src/findwin.cpp @@ -1,4 +1,4 @@ -#include "findwin.h" +#include "findwin.h" #include "scintillaeditview.h" #include "ccnotepad.h" #include "progresswin.h" diff --git a/src/findwin.h b/src/findwin.h index 6eebf1f..7bb76ea 100755 --- a/src/findwin.h +++ b/src/findwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/gotolinewin.cpp b/src/gotolinewin.cpp index f57c113..520c87a 100755 --- a/src/gotolinewin.cpp +++ b/src/gotolinewin.cpp @@ -1,4 +1,4 @@ -#include "gotolinewin.h" +#include "gotolinewin.h" GoToLineWin::GoToLineWin(QWidget *parent) : QWidget(parent) diff --git a/src/gotolinewin.h b/src/gotolinewin.h index bb1417b..9c782ed 100755 --- a/src/gotolinewin.h +++ b/src/gotolinewin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_gotolinewin.h" diff --git a/src/hexcmprangewin.cpp b/src/hexcmprangewin.cpp index 20cd7d6..d72ca57 100755 --- a/src/hexcmprangewin.cpp +++ b/src/hexcmprangewin.cpp @@ -1,4 +1,4 @@ -#include "hexcmprangewin.h" +#include "hexcmprangewin.h" #include #include @@ -23,7 +23,7 @@ void HexCmpRangeWin::slot_ok() close(); } -//ͨߵֵͬұߡұ߲ͬߣû +//通过左边的值同步右边。右边不同步左边,加速用户输入 void HexCmpRangeWin::slot_asyncStartPos(const QString& text) { ui.rightStartPos->setText(text); @@ -35,7 +35,7 @@ void HexCmpRangeWin::slot_asyncLenPos(const QString& text) } -//ȡ򲻷κЧΧֵ;ֵҲ +//如果取消,则不返回任何有效范围值;错误值也是 const int MAX_CMP_LENS = 1024 * 1024 * 10; void HexCmpRangeWin::getRange(bool & isCancel, qint64 & leftStartPos, int & leftCmpLen, qint64 & rightStartPos, int & rightCmpLen) diff --git a/src/hexcmprangewin.h b/src/hexcmprangewin.h index ef1ded4..7cf213e 100755 --- a/src/hexcmprangewin.h +++ b/src/hexcmprangewin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_hexcmprangewin.h" diff --git a/src/hexfilegoto.cpp b/src/hexfilegoto.cpp index 29b7639..d3cc790 100755 --- a/src/hexfilegoto.cpp +++ b/src/hexfilegoto.cpp @@ -1,4 +1,4 @@ -#include "hexfilegoto.h" +#include "hexfilegoto.h" HexFileGoto::HexFileGoto(QWidget *parent) : QWidget(parent) @@ -13,7 +13,7 @@ HexFileGoto::~HexFileGoto() { } -//ʾΪ +//显示为 void HexFileGoto::slot_showDecInfo(const QString &text) { bool ok; diff --git a/src/hexfilegoto.h b/src/hexfilegoto.h index d34f29c..ab3c2cb 100755 --- a/src/hexfilegoto.h +++ b/src/hexfilegoto.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_hexfilegoto.h" diff --git a/src/hexrulewin.cpp b/src/hexrulewin.cpp index 85caa65..50d09bf 100755 --- a/src/hexrulewin.cpp +++ b/src/hexrulewin.cpp @@ -1,4 +1,4 @@ -#include "hexrulewin.h" +#include "hexrulewin.h" HexRuleWin::HexRuleWin(int mode, int highlight, QWidget *parent): QWidget(parent), m_mode(mode), m_isHighlightBackgroud(highlight) { diff --git a/src/hexrulewin.h b/src/hexrulewin.h index 8aa7f13..4701f5a 100755 --- a/src/hexrulewin.h +++ b/src/hexrulewin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_hexrulewin.h" diff --git a/src/include/pluginGl.h b/src/include/pluginGl.h index 005c35b..8250d25 100755 --- a/src/include/pluginGl.h +++ b/src/include/pluginGl.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -16,13 +16,13 @@ struct ndd_proc_data { - QString m_strPlugName; // ѡ - QString m_strFilePath; //lib ȫ·ѡڲù,򴫵 - QString m_strComment; //˵ - QString m_version; //汾롣ѡ - QString m_auther;//ơѡ - int m_menuType;//˵͡0ʹö˵ 1˵ - QMenu* m_rootMenu;//m_menuType = 1˵ĵֵַnullptr + QString m_strPlugName; //插件名称 必选 + QString m_strFilePath; //lib 插件的全局路径。必选。插件内部不用管,主程序传递下来 + QString m_strComment; //插件说明 + QString m_version; //版本号码。可选 + QString m_auther;//作者名称。可选 + int m_menuType;//菜单类型。0:不使用二级菜单 1:创建二级菜单 + QMenu* m_rootMenu;//如果m_menuType = 1,给出二级根菜单的地址。其他值nullptr ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0) { diff --git a/src/langextset.cpp b/src/langextset.cpp index 3db6f03..a1db834 100755 --- a/src/langextset.cpp +++ b/src/langextset.cpp @@ -1,4 +1,4 @@ -#include "langextset.h" +#include "langextset.h" #include "scintillaeditview.h" #include "extlexermanager.h" #include "ccnotepad.h" @@ -9,8 +9,8 @@ #include int ITEM_CHANGED = Qt::UserRole; -int ITEM_LEX_ID = Qt::UserRole + 1; //Ӧ﷨lexer ID -int ITEM_LEX_EXT_OLD_VALUE = Qt::UserRole + 2; //Ӧ﷨EXTļľֵ +int ITEM_LEX_ID = Qt::UserRole + 1; //对应的语法lexer的 ID +int ITEM_LEX_EXT_OLD_VALUE = Qt::UserRole + 2; //对应的语法关联EXT文件的旧值 LangExtSet::LangExtSet(QWidget *parent) : QMainWindow(parent), m_isChanged(false) @@ -62,7 +62,7 @@ void LangExtSet::initLangName() QTableWidgetItem* item1 = new QTableWidgetItem(extList.join(',')); item1->setData(ITEM_CHANGED, QVariant(false)); - //Ѿֵ޸ĺԱʵʱ޸ڴеĸĶ + //把旧值记起来,后面修改后对比实时修改内存中的改动 item1->setData(ITEM_LEX_EXT_OLD_VALUE, QVariant(extList)); ui.langTableWidget->setItem(langId, 1, item1); @@ -141,12 +141,12 @@ void LangExtSet::slot_save() QString langLexerTag = QString("%1_lexId").arg(langTag); qs.setValue(langLexerTag, lexId); - //ǸļǸڴ棬ʵʱЧ + //上面是更新文件,下面是更新内存,让实时生效 QStringList oldExtList = item->data(ITEM_LEX_EXT_OLD_VALUE).toStringList(); updataExtLexerManager(langTag, lexId, oldExtList, extList); - //ֵΪܲرʱٴ޸ + //更新新值。因为可能不关闭时再次修改 item->setData(ITEM_LEX_EXT_OLD_VALUE, QVariant(extList)); } } @@ -156,15 +156,15 @@ void LangExtSet::slot_save() ui.statusBar->showMessage(tr("Save Finished !"), 10000); } -//ExtLexerManagertagֵ +//更新ExtLexerManager中tag关联的值 void LangExtSet::updataExtLexerManager(QString tag, int lexId, QStringList & oldExtList, QStringList & newExtList) { - //Ѿɵֱɾ + //把旧的直接删除 for (int i = 0; i < oldExtList.size(); ++i) { ExtLexerManager::getInstance()->remove(oldExtList.at(i)); } - //µ¼һ + //把新的重新加入一遍 for (int i = 0; i < newExtList.size(); ++i) { FileExtLexer v; @@ -175,10 +175,10 @@ void LangExtSet::updataExtLexerManager(QString tag, int lexId, QStringList & old } } -//ļĹ׺﷨ +//加载文件的关联后缀到语法中 void LangExtSet::loadExtRelevanceToMagr() { - QString userLangFile = QString("notepad/tag_ext");//Զв.ַдҪ + QString userLangFile = QString("notepad/tag_ext");//自定义语言中不能有.字符,否则可能有错,后续要检查 QSettings qs(QSettings::IniFormat, QSettings::UserScope, userLangFile); qs.setIniCodec("UTF-8"); diff --git a/src/langextset.h b/src/langextset.h index e6ef42b..f20bdd8 100755 --- a/src/langextset.h +++ b/src/langextset.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_langextset.h" diff --git a/src/langstyledefine.cpp b/src/langstyledefine.cpp index 2df3a4f..3945159 100755 --- a/src/langstyledefine.cpp +++ b/src/langstyledefine.cpp @@ -1,4 +1,4 @@ -#include "langstyledefine.h" +#include "langstyledefine.h" #include "userlexdef.h" #include "extlexermanager.h" diff --git a/src/langstyledefine.h b/src/langstyledefine.h index fdbda84..24438d3 100755 --- a/src/langstyledefine.h +++ b/src/langstyledefine.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_langstyledefine.h" diff --git a/src/mytreeview.cpp b/src/mytreeview.cpp index 2410c9e..4e28b13 100755 --- a/src/mytreeview.cpp +++ b/src/mytreeview.cpp @@ -1,4 +1,4 @@ -#include "mytreeview.h" +#include "mytreeview.h" MyTreeView::MyTreeView(QWidget *parent) : QTreeView(parent) diff --git a/src/mytreeview.h b/src/mytreeview.h index 75ecccf..aeb9b70 100755 --- a/src/mytreeview.h +++ b/src/mytreeview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/nddsetting.cpp b/src/nddsetting.cpp index 24fd83d..9fdc03d 100755 --- a/src/nddsetting.cpp +++ b/src/nddsetting.cpp @@ -1,4 +1,4 @@ -#include "nddsetting.h" +#include "nddsetting.h" #include #include #include @@ -7,8 +7,8 @@ #include #include -static short version_num = 29; //1.22.0 29 -//ļǷڡʼʧܣ򲻴 +static short version_num = 29; //1.22.0 是29 +//配置文件是否存在。如果初始化失败,则不存在 bool NddSetting::s_isExistDb = false; int NddSetting::s_reference = 0; bool NddSetting::s_isContentChanged = false; @@ -17,10 +17,10 @@ QSettings* NddSetting::s_nddSet = nullptr; QSettings* NddSetting::s_winPosSet = nullptr; -//keyڣkey-valueڣtrue +//如果key不存在,则新增key-value。存在:返回true bool NddSetting::checkNoExistAdd(QString key, QVariant& value) { - //ÿ¼ֶκҪһ£ + //每次新加字段后,这里要检查一下,不存在则新增 if (!s_nddSet->contains(key)) { s_nddSet->setValue(key, value); @@ -34,13 +34,13 @@ bool NddSetting::checkNoExistAdd(QString key, QVariant& value) return true; } -//20220402һǰݿ̴߳ģòҪ߳еá -//Ϊ̷߳ʺͶ̳߳ͻ⡣ļĶд߳н +//20220402这里隐含了一个前置条件:数据库句柄是在主线程创建的,最好不要在子线程中调用。 +//避免因为跨线程访问和多线程冲突访问引发的闪退问题。所以最好配置文件的读写都在主线程中进行 void NddSetting::init() { ++s_reference; - //Ѿʼˣֱӷ + //如果已经初始化过了,则直接返回 if (s_isExistDb) { return; @@ -56,42 +56,42 @@ void NddSetting::init() auto initNddSet = []() { QString key = "signdate"; //QString date = QDate::currentDate().toString(QString("yyyy/M/d")); - //дʱ䣬һУᷢ - //ֱдһȥʱ䣬õһУҪǩ + //不写今天的时间,否则第一次运行,无条件不会发送心跳。 + //直接写一个过去的时间,让第一次运行,总是要签到 addKeyValueToSets(key, "2022/2/20"); QString str; - //tabijȣĬΪ4 + //tab的长度,默认为4 addKeyValueToNumSets("tablens", 4); - //space replace tabո滻tabĬ0, 1Ϊtrue,0Ϊfalse + //space replace tab空格替换tab,默认0, 1为true,0为false addKeyValueToNumSets("tabnouse", 0); addKeyValueToSets("mac", "0"); addKeyValueToNumSets("padtimes", 0); addKeyValueToNumSets("serverip", 0); - //Ƿͬ + //是否高亮不同处背景 addKeyValueToNumSets("hexhigh", 1); addKeyValueToNumSets(VERSION, version_num); - //Ƥid + //皮肤id addKeyValueToNumSets(SKIN_KEY, 0); - //index 0:Զѡ 1: 2 Ӣ + //语言index 0:自动选择 1:中文 2 英文 addKeyValueToNumSets(LANGS_KEY, 0); - //Զ + //开启自动换行 addKeyValueToNumSets(AUTOWARP_KEY, 0); - //Զ + //开启自动缩进 addKeyValueToNumSets(INDENT_KEY, 0); - //ʾհ + //显示空白 addKeyValueToNumSets(SHOWSPACE_KEY, 0); - //ıļޡĬ100M.(50-300) + //最大文本文件的门限。默认100M.(50-300) addKeyValueToNumSets(MAX_BIG_TEXT, 100); addKeyValueToSets(SOFT_KEY, "0"); @@ -107,22 +107,22 @@ void NddSetting::init() addKeyValueToNumSets(FILELISTPOS, Qt::LeftDockWidgetArea); - //Ĭ0ʾ + //默认0不显示 addKeyValueToNumSets(FILELISTSHOW, 0); - //Ĭʾ + //默认显示工具栏 addKeyValueToNumSets(TOOLBARSHOW, 1); - //ҳĬϲѡԴķѶ + //打开网页,默认不勾选,资源耗费多 addKeyValueToNumSets(SHOWWEBADDR, 0); - //ҽĬС + //查找结果框的默认字体大小 addKeyValueToNumSets(FIND_RESULT_FONT_SIZE, 14); }; if (!s_nddSet->contains(VERSION)) { - //߳ʼ + //不存在走初始化流程 initNddSet(); s_isContentChanged = true; } @@ -133,7 +133,7 @@ void NddSetting::init() QVariant v(VERSION); if (checkNoExistAdd(VERSION, v)) { - //ڣҰ汾,ҪߺԶ + //如果存在,而且版本是最新,不需要走后面自动检查流程了 int curVersion = s_nddSet->value(VERSION).toInt(); if (curVersion == version_num) { @@ -141,12 +141,12 @@ void NddSetting::init() } else if (curVersion < version_num) { - //°汾 + //更新版本到最新 updataKeyValueFromNumSets(VERSION, version_num); } } } - //ÿ¼ֶκҪһ£ + //每次新加字段后,这里要检查一下,不存在则新增 { QVariant v(1); checkNoExistAdd(SKIN_KEY, v); @@ -237,7 +237,7 @@ void NddSetting::init() -//дһܵĻȡõĽӿڣԺÿֶζҪдһдӿ +//写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口 QString NddSetting::getKeyValueFromSets(QString key) { return s_nddSet->value(key,"").toString(); @@ -250,7 +250,7 @@ bool NddSetting::updataKeyValueFromSets(QString key, QString value) return true; } -//дһܵĻȡõĽӿڣԺÿֶζҪдһдӿ +//写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口 QByteArray NddSetting::getKeyByteArrayValue(QString key) { return s_nddSet->value(key, "").toByteArray(); @@ -262,14 +262,14 @@ void NddSetting::updataKeyByteArrayValue(QString key, QByteArray& value) s_isContentChanged = true; } -//һμһ¼ڳʼ +//第一次加一条记录,用于初始化 void NddSetting::addKeyValueToSets(QString key, QString value) { s_nddSet->setValue(key, QVariant(value)); } -//дһܵĻȡõĽӿڣԺÿֶζҪдһдӿ.0Ĭֵⲿò0ʼֵ +//写一个总的获取配置的接口,避免以后每个字段都需要写一个读写接口.0做默认值,外部最好不用0做初始化值 int NddSetting::getKeyValueFromNumSets(const QString key) { QVariant v = s_nddSet->value(key, QVariant(0)); @@ -283,7 +283,7 @@ bool NddSetting::updataKeyValueFromNumSets(const QString key, int value) } -//һμһ¼ڳʼ +//第一次加一条记录,用于初始化 void NddSetting::addKeyValueToNumSets(QString key, int value) { s_nddSet->setValue(key, QVariant(value)); @@ -300,7 +300,7 @@ void NddSetting::close() { s_isExistDb = false; - //һı + //做一次真正的保存 if (s_isContentChanged) { s_nddSet->sync(); @@ -309,7 +309,7 @@ void NddSetting::close() s_isContentChanged = false; } - //ﱣһӴڵλáųпӴڻڣѾ˳ⲻ + //在这里保存一下子窗口的位置。不排除有可能子窗口还在,主窗口已经退出的情况,不过问题不大。 if (s_winPosSet != nullptr) { s_winPosSet->sync(); @@ -319,7 +319,7 @@ void NddSetting::close() } } -//Ӵڵλãһwinpos.iniļУʱҪȡɱʱٶ +//子窗口的位置,单独放在一个winpos.ini文件中,而且启动程序时,不需要读取,可避免启动时拖慢速度 QByteArray NddSetting::getWinPos(QString key) { winPosInit(); diff --git a/src/nddsetting.h b/src/nddsetting.h index 2fc34d8..28ec0ff 100755 --- a/src/nddsetting.h +++ b/src/nddsetting.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -10,24 +10,24 @@ static QString SHOWSPACE_KEY = "blank"; static QString MAX_BIG_TEXT = "maxtsize"; static QString SOFT_STATUS = "rstatus"; static QString SOFT_KEY = "rkey"; -static QString RESTORE_CLOSE_FILE = "restore"; //ָرʱ򿪵ļ -static QString PRO_DIR = "prodir";//ļ· -//static QString RESTORE_SIZE = "rsize";//رʱĴС -static QString WIN_POS = "pos";//رǵĴС -static QString ICON_SIZE = "iconsize";//ͼС -static QString ZOOMVALUE = "zoom"; //Ŵ -static QString VERSION = "version";//ǰ汾 -static QString FINDRESULTPOS = "findpos";//Ҵλ -static QString FILELISTPOS = "filepos";//ļбλ -static QString FILELISTSHOW = "showfilelist"; //ļбǷʾ -static QString TOOLBARSHOW = "showbar"; //Ƿʾ -static QString FINDWINSIZE = "findwinsize";//ҿĴС150%Ŵʱáÿֶ -static QString SHOWWEBADDR = "showweb";//webַ˫ҳ -static QString FIND_RESULT_FONT_SIZE = "frfs";//ҽĬСĬΪ14 +static QString RESTORE_CLOSE_FILE = "restore"; //恢复关闭时打开的文件 +static QString PRO_DIR = "prodir";//放置配置文件的路径 +//static QString RESTORE_SIZE = "rsize";//保存关闭时的大小 +static QString WIN_POS = "pos";//保存关闭是的大小 +static QString ICON_SIZE = "iconsize";//图标大小 +static QString ZOOMVALUE = "zoom"; //放大倍数 +static QString VERSION = "version";//当前版本 +static QString FINDRESULTPOS = "findpos";//查找窗口悬浮的位置 +static QString FILELISTPOS = "filepos";//文件列表悬浮框的位置 +static QString FILELISTSHOW = "showfilelist"; //文件列表框是否显示 +static QString TOOLBARSHOW = "showbar"; //是否显示工具栏 +static QString FINDWINSIZE = "findwinsize";//保存查找框的大小。150%放大时界面永久。保留避免每次手动调整 +static QString SHOWWEBADDR = "showweb";//高亮web地址,双击网页打开 +static QString FIND_RESULT_FONT_SIZE = "frfs";//查找结果的默认字体大小,默认为14 -//winpos.iniеkeyⵥļ̫ٶ -static QString BATCH_FIND_REPLACE_POS = "bfpos";//滻ڵĴС +//下面这个是winpos.ini中的key,避免单个文件太大,拖慢启动速度 +static QString BATCH_FIND_REPLACE_POS = "bfpos";//批量查找替换窗口的大小 class NddSetting { diff --git a/src/ndstyleditemdelegate.cpp b/src/ndstyleditemdelegate.cpp index 9ee86d0..28cb689 100755 --- a/src/ndstyleditemdelegate.cpp +++ b/src/ndstyleditemdelegate.cpp @@ -1,4 +1,4 @@ -#include "ndstyleditemdelegate.h" +#include "ndstyleditemdelegate.h" #include #include #include @@ -21,7 +21,7 @@ void NdStyledItemDelegate::setFontSize(int size) } -//ʹָ֧ıʽ +//重载使可以支持富文本格式的文字 void NdStyledItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { QStyleOptionViewItem viewOption(option); @@ -29,13 +29,13 @@ void NdStyledItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem if (option.state.testFlag(QStyle::State_HasFocus)) viewOption.state = viewOption.state ^ QStyle::State_HasFocus; - // ... ʡ - // ʾıΪգʹĬʽ + // ... 省略 + // 设置显示文本为空,使用默认样式 QStyle *pStyle = viewOption.widget ? viewOption.widget->style() : QApplication::style(); QTextDocument doc; - //ⲿ޸Сڲиı޸Ļơ + //外部修改了字体大小后,内部进行富文本的修改绘制。 if (m_defaultFontSize != 14) { viewOption.text.replace("font-size:14px",QString("font-size:%1px").arg(m_defaultFontSize)); @@ -51,9 +51,9 @@ void NdStyledItemDelegate::paint(QPainter * painter, const QStyleOptionViewItem QRect textRect = pStyle->subElementRect(QStyle::SE_ItemViewItemText, &viewOption); painter->save(); - // 任ϽΪԭ + // 坐标变换,将左上角设置为原点 painter->translate(textRect.topLeft()); - // HTML + // 设置HTML绘制区域 painter->setClipRect(textRect.translated(-textRect.topLeft())); doc.documentLayout()->draw(painter, paintContext); diff --git a/src/ndstyleditemdelegate.h b/src/ndstyleditemdelegate.h index c9b29da..d1708d2 100755 --- a/src/ndstyleditemdelegate.h +++ b/src/ndstyleditemdelegate.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include diff --git a/src/plugin.cpp b/src/plugin.cpp index 4427e29..774c005 100755 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -1,4 +1,4 @@ -#include "plugin.h" +#include "plugin.h" #include #include #include diff --git a/src/plugin.h b/src/plugin.h index 57e920e..c2731be 100755 --- a/src/plugin.h +++ b/src/plugin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "pluginGl.h" #include class QMenu; diff --git a/src/plugin/helloworld/helloworld.vcxproj b/src/plugin/helloworld/helloworld.vcxproj deleted file mode 100755 index 1735f0a..0000000 --- a/src/plugin/helloworld/helloworld.vcxproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - Release - x64 - - - Debug - x64 - - - - {06EED29A-D357-39F4-B1B8-25129EBC2852} - helloworld - QtVS_v304 - 10.0.19041.0 - 10.0.19041.0 - $(MSBuildProjectDirectory)\QtMsBuild - - - v141 - ..\..\x64\Debug\plugin\ - false - NotSet - DynamicLibrary - release\ - helloworld - - - v141 - ..\..\x64\Debug\plugin\ - false - NotSet - DynamicLibrary - debug\ - helloworld - - - - - - - - - - ..\..\x64\Debug\plugin\debug\helloworldtrue..\..\x64\Debug\plugin\release\helloworldtruefalse5.12.10_msvc2017_64core;gui;widgets5.12.10_msvc2017_64core;gui;widgets - - - - GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\..\include;..\..\qscint\src;..\..\qscint\src\Qsci;release;/include;%(AdditionalIncludeDirectories) - -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) - release\ - false - None - 4577;4467;%(DisableSpecificWarnings) - Sync - release\ - MaxSpeed - _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_NO_DEBUG;NDEBUG;%(PreprocessorDefinitions) - false - - MultiThreadedDLL - true - true - Level3 - true - - qmyedit_qt5d.lib;%(AdditionalDependencies) - ..\..\x64\Debug;%(AdditionalLibraryDirectories) - true - false - true - true - false - $(OutDir)\helloworld.dll - true - Windows - true - - - Unsigned - None - 0 - - - _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_NO_DEBUG;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;%(PreprocessorDefinitions) - - msvc./$(Configuration)/moc_predefs.hMoc'ing %(Identity)...output$(Configuration)moc_%(Filename).cppUic'ing %(Identity)...$(ProjectDir)ui_%(Filename).h - - - GeneratedFiles\$(ConfigurationName);GeneratedFiles;.;..\..\include;..\..\qscint\src;..\..\qscint\src\Qsci;debug;/include;%(AdditionalIncludeDirectories) - -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 %(AdditionalOptions) - debug\ - false - ProgramDatabase - 4577;4467;%(DisableSpecificWarnings) - Sync - debug\ - Disabled - _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;%(PreprocessorDefinitions) - false - MultiThreadedDebugDLL - true - true - Level3 - true - - qmyedit_qt5d.lib;%(AdditionalDependencies) - ..\..\x64\Debug;%(AdditionalLibraryDirectories) - true - true - true - true - $(OutDir)\helloworld.dll - true - Windows - true - - - Unsigned - None - 0 - - - _WINDOWS;UNICODE;_UNICODE;WIN32;_ENABLE_EXTENDED_ALIGNED_STORAGE;WIN64;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB;_DEBUG;%(PreprocessorDefinitions) - - msvc./$(Configuration)/moc_predefs.hMoc'ing %(Identity)...output$(Configuration)moc_%(Filename).cppUic'ing %(Identity)...$(ProjectDir)ui_%(Filename).h - - - - - - - - - - - - - - - - - - - - Document - true - $(QTDIR)\mkspecs\features\data\dummy.cpp;%(AdditionalInputs) - cl -Bx"$(QTDIR)\bin\qmake.exe" -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -Zi -MDd -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -E $(QTDIR)\mkspecs\features\data\dummy.cpp 2>NUL >debug\moc_predefs.h - Generate moc_predefs.h - debug\moc_predefs.h;%(Outputs) - - - Document - $(QTDIR)\mkspecs\features\data\dummy.cpp;%(AdditionalInputs) - cl -Bx"$(QTDIR)\bin\qmake.exe" -nologo -Zc:wchar_t -FS -Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zc:__cplusplus -O2 -MD -W3 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 -wd4577 -wd4467 -E $(QTDIR)\mkspecs\features\data\dummy.cpp 2>NUL >release\moc_predefs.h - Generate moc_predefs.h - release\moc_predefs.h;%(Outputs) - true - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/plugin/helloworld/helloworld.vcxproj.filters b/src/plugin/helloworld/helloworld.vcxproj.filters deleted file mode 100755 index 820a103..0000000 --- a/src/plugin/helloworld/helloworld.vcxproj.filters +++ /dev/null @@ -1,69 +0,0 @@ - - - - - {99349809-55BA-4b9d-BF79-8FDBB0286EB3} - ui - false - - - {99349809-55BA-4b9d-BF79-8FDBB0286EB3} - ui - false - - - {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} - cpp;c;cxx;moc;h;def;odl;idl;res; - - - {71ED8ED8-ACB9-4CE9-BBE1-E00B30144E11} - cpp;c;cxx;moc;h;def;odl;idl;res; - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx - - - - - Source Files - - - Source Files - - - - - Header Files - - - - - - Generated Files - - - Generated Files - - - - - - - - Form Files - - - \ No newline at end of file diff --git a/src/plugin/helloworld/helloworldexport.cpp b/src/plugin/helloworld/helloworldexport.cpp index 28bc0ff..bd635e5 100755 --- a/src/plugin/helloworld/helloworldexport.cpp +++ b/src/plugin/helloworld/helloworldexport.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/plugin/helloworld/qttestclass.cpp b/src/plugin/helloworld/qttestclass.cpp index f602623..392898a 100755 --- a/src/plugin/helloworld/qttestclass.cpp +++ b/src/plugin/helloworld/qttestclass.cpp @@ -1,4 +1,4 @@ -#include "qttestclass.h" +#include "qttestclass.h" #include QtTestClass::QtTestClass(QWidget *parent, QsciScintilla* pEdit) diff --git a/src/plugin/helloworld/qttestclass.h b/src/plugin/helloworld/qttestclass.h index f1e921e..75a0a41 100755 --- a/src/plugin/helloworld/qttestclass.h +++ b/src/plugin/helloworld/qttestclass.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_qttestclass.h" diff --git a/src/plugin/test/test.cpp b/src/plugin/test/test.cpp index 667928c..d6be711 100755 --- a/src/plugin/test/test.cpp +++ b/src/plugin/test/test.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/pluginGl.h b/src/pluginGl.h index a7ef5d5..6b576a6 100755 --- a/src/pluginGl.h +++ b/src/pluginGl.h @@ -1,16 +1,16 @@ -#pragma once +#pragma once #include #include struct ndd_proc_data { - QString m_strPlugName; // ѡд - QString m_strFilePath; //lib ȫ·ѡڲд,򴫵 - QString m_strComment; //˵д - QString m_version; //汾롣ѡд - QString m_auther;//ơѡд - int m_menuType;//˵͡0ʹö˵ 1˵д - QMenu* m_rootMenu;//m_menuType = 1˵ĵֵַnullptr ڲд򴫵 + QString m_strPlugName; //插件名称 必选。插件里面需填写 + QString m_strFilePath; //lib 插件的全局路径。必选。插件内部不用填写,主程序传递下来 + QString m_strComment; //插件说明;插件里面需填写 + QString m_version; //版本号码。可选;插件里面需填写 + QString m_auther;//作者名称。可选;插件里面需填写 + int m_menuType;//菜单类型。0:不使用二级菜单 1:创建二级菜单;插件里面需填写 + QMenu* m_rootMenu;//如果m_menuType = 1,给出二级根菜单的地址。其他值nullptr 插件内部不用填写,主程序传递下来 ndd_proc_data(): m_rootMenu(nullptr), m_menuType(0) { diff --git a/src/pluginmgr.cpp b/src/pluginmgr.cpp index 6ba10e1..3944c6c 100755 --- a/src/pluginmgr.cpp +++ b/src/pluginmgr.cpp @@ -1,4 +1,4 @@ -#include "pluginmgr.h" +#include "pluginmgr.h" #include "rcglobal.h" diff --git a/src/pluginmgr.h b/src/pluginmgr.h index 996d333..c521c31 100755 --- a/src/pluginmgr.h +++ b/src/pluginmgr.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_pluginmgr.h" diff --git a/src/qscint/Python/config-tests/cfgtest_Qsci.cpp b/src/qscint/Python/config-tests/cfgtest_Qsci.cpp index 8bc054e..e66092f 100755 --- a/src/qscint/Python/config-tests/cfgtest_Qsci.cpp +++ b/src/qscint/Python/config-tests/cfgtest_Qsci.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include diff --git a/src/qscint/scintilla/include/Scintilla.h b/src/qscint/scintilla/include/Scintilla.h index eff3878..c7ca77b 100755 --- a/src/qscint/scintilla/include/Scintilla.h +++ b/src/qscint/scintilla/include/Scintilla.h @@ -1,4 +1,4 @@ -/* Scintilla source code edit control */ +/* Scintilla source code edit control */ /** @file Scintilla.h ** Interface to the edit control. **/ diff --git a/src/qscint/scintilla/lexers/LexAVS.cpp b/src/qscint/scintilla/lexers/LexAVS.cpp index 2092ba5..761f010 100755 --- a/src/qscint/scintilla/lexers/LexAVS.cpp +++ b/src/qscint/scintilla/lexers/LexAVS.cpp @@ -1,4 +1,4 @@ -// Scintilla source code edit control +// Scintilla source code edit control /** @file LexAVS.cxx ** Lexer for AviSynth. **/ diff --git a/src/qscint/scintilla/src/Catalogue.cpp b/src/qscint/scintilla/src/Catalogue.cpp index 20e90d8..dc744d7 100755 --- a/src/qscint/scintilla/src/Catalogue.cpp +++ b/src/qscint/scintilla/src/Catalogue.cpp @@ -1,4 +1,4 @@ -// Scintilla source code edit control +// Scintilla source code edit control /** @file Catalogue.cxx ** Lexer infrastructure. ** Contains a list of LexerModules which can be searched to find a module appropriate for a diff --git a/src/qscint/src/Qsci/qsciglobal.h b/src/qscint/src/Qsci/qsciglobal.h index 61e48d5..89e404b 100755 --- a/src/qscint/src/Qsci/qsciglobal.h +++ b/src/qscint/src/Qsci/qsciglobal.h @@ -37,6 +37,7 @@ // Define QSCINTILLA_MAKE_DLL to create a QScintilla shared library, or // define QSCINTILLA_DLL to link against a QScintilla shared library, or define // neither to either build or link against a static QScintilla library. +#define QSCINTILLA_DLL #if defined(QSCINTILLA_DLL) #define QSCINTILLA_EXPORT Q_DECL_IMPORT diff --git a/src/qscint/src/Qsci/qscilexerasm.h b/src/qscint/src/Qsci/qscilexerasm.h index 4ab60c9..935591e 100755 --- a/src/qscint/src/Qsci/qscilexerasm.h +++ b/src/qscint/src/Qsci/qscilexerasm.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once // This defines the interface to the QsciLexerAsm class. // // Copyright (c) 2021 Riverbank Computing Limited diff --git a/src/qscint/src/Qsci/qscilexerglobal.h b/src/qscint/src/Qsci/qscilexerglobal.h index 1d16681..d2e8912 100755 --- a/src/qscint/src/Qsci/qscilexerglobal.h +++ b/src/qscint/src/Qsci/qscilexerglobal.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/qscint/src/Qsci/qscilexerr.h b/src/qscint/src/Qsci/qscilexerr.h index b3a7cf8..e0b225f 100755 --- a/src/qscint/src/Qsci/qscilexerr.h +++ b/src/qscint/src/Qsci/qscilexerr.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #pragma once // This defines the interface to the QsciLexerR class. // diff --git a/src/qscint/src/Qsci/qscilexervb.h b/src/qscint/src/Qsci/qscilexervb.h index 11d2420..fc125ef 100755 --- a/src/qscint/src/Qsci/qscilexervb.h +++ b/src/qscint/src/Qsci/qscilexervb.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #pragma once #include diff --git a/src/qscint/src/qscilexerasm.cpp b/src/qscint/src/qscilexerasm.cpp index fdb2851..019cd84 100755 --- a/src/qscint/src/qscilexerasm.cpp +++ b/src/qscint/src/qscilexerasm.cpp @@ -1,4 +1,4 @@ -// This module implements the QsciLexerAsm class. +// This module implements the QsciLexerAsm class. // // Copyright (c) 2021 Riverbank Computing Limited // diff --git a/src/qscint/src/qscilexerglobal.cpp b/src/qscint/src/qscilexerglobal.cpp index 0ac42e3..1c5d92b 100755 --- a/src/qscint/src/qscilexerglobal.cpp +++ b/src/qscint/src/qscilexerglobal.cpp @@ -1,4 +1,4 @@ -#include "Qsci/qscilexerglobal.h" +#include "Qsci/qscilexerglobal.h" #include "Qsci/qsciscintilla.h" #include "Scintilla.h" #include "SciLexer.h" diff --git a/src/qscint/src/qscilexerr.cpp b/src/qscint/src/qscilexerr.cpp index 1de7014..90d3f0b 100755 --- a/src/qscint/src/qscilexerr.cpp +++ b/src/qscint/src/qscilexerr.cpp @@ -1,4 +1,4 @@ - + #include "Qsci/qsciLexerr.h" #include diff --git a/src/qscint/src/qscilexervb.cpp b/src/qscint/src/qscilexervb.cpp index d537335..6157e07 100755 --- a/src/qscint/src/qscilexervb.cpp +++ b/src/qscint/src/qscilexervb.cpp @@ -1,4 +1,4 @@ -#include "Qsci/qscilexervb.h" +#include "Qsci/qscilexervb.h" QsciLexerVB::QsciLexerVB(QObject *parent) : QsciLexer(parent) diff --git a/src/qtlangset.cpp b/src/qtlangset.cpp index 533623a..7262853 100755 --- a/src/qtlangset.cpp +++ b/src/qtlangset.cpp @@ -1,4 +1,4 @@ -#include "qtlangset.h" +#include "qtlangset.h" #include "scintillaeditview.h" #include "nddsetting.h" #include "rcglobal.h" @@ -42,7 +42,7 @@ QtLangSet::~QtLangSet() } -//ͬʱȹرչۺѭʹ +//在同步字体时,务必先关闭关联槽函数,避免循环触发。务必配对使用 void QtLangSet::enableFontChangeSensitive(bool isSensitive) { if (isSensitive) @@ -65,8 +65,8 @@ void QtLangSet::enableFontChangeSensitive(bool isSensitive) void QtLangSet::startSignSlot() { - //ʼʹõQListWidget::currentItemChangedźţǷָźŴĪĴơ - //QT5.12bugԻitemClickedź + //开始本来使用的是QListWidget::currentItemChanged信号,但是发现该信号存在莫名其妙的触发机制。 + //估计是QT5.12的bug。所以换成itemClicked信号 connect(ui.langListWidget, &QListWidget::itemClicked, this, &QtLangSet::slot_itemSelect); connect(ui.langListWidget, &QListWidget::currentRowChanged, this, &QtLangSet::slot_langListCurRowChanged); @@ -83,12 +83,12 @@ void QtLangSet::startSignSlot() connect(ui.fontComboBox, &QFontComboBox::currentFontChanged, this, &QtLangSet::slot_fontChange); } -//óʼʱѡǰ༭ +//让初始化时选择当前编辑器的语言 void QtLangSet::selectInitLangTag(QString initLangTag) { - //һαԳʼlexidʾʵΪʼlist󣬻ԶѵһΪǰ - //ﻹ⣬qt5.12.4bugƵ:ûѡQListWidgetԶѡһ + //第一次必须以初始化lexid显示。这样做实在是因为初始化list启动后,会自动把第一个设置为当前。 + //这里还是有问题,是qt5.12.4的bug机制导致:如果没有选择QListWidget,会总是自动选择第一个 if (!initLangTag.isEmpty()) { QList destItems = ui.langListWidget->findItems(initLangTag,Qt::MatchExactly); @@ -121,7 +121,7 @@ void QtLangSet::selectInitLangTag(QString initLangTag) void QtLangSet::slot_fontBoldChange(int state) { - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { if (m_curStyleData.font.bold() != ((state == Qt::Unchecked) ? false : true)) @@ -139,19 +139,19 @@ void QtLangSet::slot_fontBoldChange(int state) } else if (ui.useGlobalFont->isVisible() && !ui.useGbFontBold->isChecked()) { - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); } else if (!ui.useGlobalFont->isVisible()) { - //ȫַǵһʽ޸ĵǰȫС - //ȫʽķǵһ + //全局非第一个样式,修改当前全局字体大小 + //全局样式的非第一个 StyleSet::setGlobalFont(m_selectStyleId, m_curStyleData.font); - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -169,7 +169,7 @@ void QtLangSet::slot_fontBoldChange(int state) void QtLangSet::slot_fontItalicChange(int state) { - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { if (m_curStyleData.font.italic() != ((state == Qt::Unchecked) ? false : true)) @@ -186,17 +186,17 @@ void QtLangSet::slot_fontItalicChange(int state) } else if (ui.useGlobalFont->isVisible() && !ui.useGbFontItalic->isChecked()) { - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); } else if (!ui.useGlobalFont->isVisible()) { - //ȫַǵһʽ޸ĵǰȫС - //ȫʽķǵһ + //全局非第一个样式,修改当前全局字体大小 + //全局样式的非第一个 StyleSet::setGlobalFont(m_selectStyleId, m_curStyleData.font); saveLangeSet(m_selectLexer); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -214,7 +214,7 @@ void QtLangSet::slot_fontItalicChange(int state) void QtLangSet::slot_fontUnderlineChange(int state) { - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { if (m_curStyleData.font.underline() != ((state == Qt::Unchecked) ? false : true)) @@ -231,17 +231,17 @@ void QtLangSet::slot_fontUnderlineChange(int state) } else if (ui.useGlobalFont->isVisible() && !ui.useGbFontUnderline->isChecked()) { - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); } else if (!ui.useGlobalFont->isVisible()) { - //ȫַǵһʽ޸ĵǰȫС - //ȫʽķǵһ + //全局非第一个样式,修改当前全局字体大小 + //全局样式的非第一个 StyleSet::setGlobalFont(m_selectStyleId, m_curStyleData.font); saveLangeSet(m_selectLexer); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -257,13 +257,13 @@ void QtLangSet::slot_fontUnderlineChange(int state) } } -//һqtdebugסslot_fontSizeChangeᵼ²۴2Σסreleaseģʽֱܣᴥ2 +//发现一个qt现象:在debug断住该slot_fontSizeChange函数,会导致槽触发2次;不断住或者release模式直接跑,不会触发2次 void QtLangSet::slot_fontSizeChange(int v) { - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { - //ȫ޸ģԵз + //全局修改,把所有语言的所有风格都设置 if (m_isGlobelItem) { if (m_curStyleData.font.pointSize() != v) @@ -273,7 +273,7 @@ void QtLangSet::slot_fontSizeChange(int v) m_isStyleChange = true; m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId); - //ȫֵһʽ޸﷨ʽ + //全局第一个样式,修改所有语法样式 if (ui.useGlobalFont->isVisible() && ui.useGbFontSize->isChecked()) { slot_useAlobalFontSize(true); @@ -281,17 +281,17 @@ void QtLangSet::slot_fontSizeChange(int v) } else if (ui.useGlobalFont->isVisible() && !ui.useGbFontSize->isChecked()) { - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); } else if (!ui.useGlobalFont->isVisible()) { - //ȫַǵһʽ޸ĵǰȫС - //ȫʽķǵһ + //全局非第一个样式,修改当前全局字体大小 + //全局样式的非第一个 StyleSet::setGlobalFont(m_selectStyleId, m_curStyleData.font); saveLangeSet(m_selectLexer); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -325,7 +325,7 @@ void QtLangSet::slot_fontSizeChange(int v) m_curStyleData.font.setPointSize(v); m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { int row = ui.styleListWidget->count(); @@ -337,7 +337,7 @@ void QtLangSet::slot_fontSizeChange(int v) item = ui.styleListWidget->item(i); int styleId = item->data(Qt::UserRole).toInt(); - //С޸Ϊһ + //所有字体大小修改为一致 QFont f = m_selectLexer->font(styleId); f.setPointSize(v); m_selectLexer->setFont(f, styleId); @@ -360,7 +360,7 @@ void QtLangSet::getCurUseLexerTags(QVector& tag) } } -//ʹȫ趨Է +//使用全局设置设定所有语言风格 void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) { QFont oldfont; @@ -369,8 +369,8 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) for (int index = 0; index <= L_TXT; ++index) { - //GLOBAL棬ΪGLOBAL﷨ʽȫֵԷ - //ȫ޸ĵȫСȫҲ޸һ¡ȴСȫ岻һ + //GLOBAL本身不保存,因为GLOBAL不是语法样式,而是全局的属性风格 + //如果全局修改的是全局字体或字体大小,全局也修改一下。避免括弧等大小和全局字体不一样大。 if (index == L_GLOBAL) { if (flag != GLOBAL_FONT_SIZE && flag != GLOBAL_FONT) @@ -387,7 +387,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) { case GLOBAL_FONT: { - //ȫ޸е﷨Ӧʽ + //非全局修改所有的语法对应样式 if (index != L_GLOBAL) { for (int i = 0; i <= 255; ++i) @@ -402,7 +402,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) } else { - //ȫ޸ + //是全局属性修改字体 QsciLexerGlobal* pGlobalLexer = dynamic_cast(pLexer); if (pGlobalLexer != nullptr) { @@ -420,7 +420,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) break; case GLOBAL_FONT_SIZE: { - //ȫ޸е﷨Ӧʽ + //非全局修改所有的语法对应样式 if (index != L_GLOBAL) { for (int i = 0; i <= 255; ++i) @@ -435,7 +435,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) } else { - //ȫ + //是全局 QsciLexerGlobal* pGlobalLexer = dynamic_cast(pLexer); if (pGlobalLexer != nullptr) { @@ -498,7 +498,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) case GLOBAL_BK_COLOR: { pLexer->setPaper(m_curStyleData.paper, -1); - //ĬֽɫQPaletteһ¡Ҫһ + //默认纸背景色会和QPalette保持一致。单独需要单独设置一下 pLexer->setDefaultPaper(m_curStyleData.paper); } break; @@ -511,8 +511,8 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) delete pLexer; } - //ȫֱ仯ˣѵǰȫֽˢһ - //УҪѵǰĵȫַһ£ȫֲЧ + //如果全局变化了,把当前全局界面刷新一下 + //还有,还需要把当前打开文档的全局风格设置一下,否则全局不生效 if (isGlobalChange) { m_previousSysLangItem = nullptr; @@ -520,7 +520,7 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) StyleSet::reloadGolbalStyleFromSetFile(); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -533,12 +533,12 @@ void QtLangSet::updateAllLangeStyleWithGlobal(GLOBAL_STYLE_SET flag) } } -//ָԵijʼárestoreOriginLangOneStyleƣȸ +//恢复所有语言的初始配置。与restoreOriginLangOneStyle类似,但是粒度更大 void QtLangSet::restoreOriginLangAllStyle() { QsciLexer *pLexer = nullptr; - //һãǰ޸档⵱ǰĸոãֱ + //一旦重置,当前修改无条件不保存。否则避免当前的刚刚重置,又被保存 m_isStyleChange = false; for (int index = 0; index <= L_TXT; ++index) @@ -550,7 +550,7 @@ void QtLangSet::restoreOriginLangAllStyle() continue; } - //Զãֱȫɾ + //如果存在自定义的配置,直接全部删除掉 QString cfgPath = QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(pLexer->lexerTag()); QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath); @@ -562,7 +562,7 @@ void QtLangSet::restoreOriginLangAllStyle() delete pLexer; pLexer = nullptr; - //ȫֵģѵǰڴеȫַҲһ + //如果是全局的,把当前内存中的全局风格也更新一下 if (index == L_GLOBAL) { StyleSet::loadGolbalStyle(); @@ -570,7 +570,7 @@ void QtLangSet::restoreOriginLangAllStyle() } } -//ֻrestoreOriginLangOneStyleе +//只在restoreOriginLangOneStyle中调用 static void restoreLangFontFgColorToDarkStyle(QsciLexer *pLexer, int i) { //if (QtLangSet::s_darkColorMap.contains(pLexer->color(i).name())) @@ -579,11 +579,11 @@ static void restoreLangFontFgColorToDarkStyle(QsciLexer *pLexer, int i) //} } -//ֻrestoreOriginLangOneStyleе +//只在restoreOriginLangOneStyle中调用 static void restoreLangPaperColorToDarkStyle(QsciLexer *pLexer, int i) { - //עɫvoid StyleSet::setBlackStyle()бһ - //Ҳɰɫ + //注意下面这个颜色和void StyleSet::setBlackStyle()中保持一致 + //背景也变成暗黑色 if (StyleSet::foldbgColor != pLexer->paper(i)) { pLexer->setPaper(StyleSet::foldbgColor, i); @@ -591,7 +591,7 @@ static void restoreLangPaperColorToDarkStyle(QsciLexer *pLexer, int i) } } -//ָԵijʼ,ָֻGLOBAL_STYLE_SETָķ +//恢复所有语言的初始配置,只恢复GLOBAL_STYLE_SET指定的风格 void QtLangSet::restoreOriginLangOneStyle(GLOBAL_STYLE_SET flag) { @@ -676,7 +676,7 @@ void QtLangSet::restoreOriginLangOneStyle(GLOBAL_STYLE_SET flag) } } -//Ԥȫ޸Чѵǰе﷨嶼޸һ +//预览全局修改字体效果。把当前所有的语法,风格字体都修改一遍 void QtLangSet::previewAllGoblalChange() { QVector tags; @@ -688,10 +688,10 @@ void QtLangSet::previewAllGoblalChange() emit viewLexerChange(tags.at(i)); } - //ﻹһ - //ﻹ⣬Ҫѵǰĵȫַһ£ȫֲЧ + //这里还差一步 + //这里还有问题,还需要把当前打开文档的全局风格设置一下,否则全局不生效 - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -704,10 +704,10 @@ void QtLangSet::previewAllGoblalChange() void QtLangSet::slot_fontChange(const QFont &font) { - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { - //ȫ޸ + //全局修改 if (m_isGlobelItem) { if (m_curStyleData.font != font) @@ -716,7 +716,7 @@ void QtLangSet::slot_fontChange(const QFont &font) m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId); m_isStyleChange = true; - //޸ + //修改所有字体 if (ui.useGlobalFont->isVisible() && ui.useGbFont->isChecked()) { slot_useAlobalFont(true); @@ -724,18 +724,18 @@ void QtLangSet::slot_fontChange(const QFont &font) } else if (ui.useGlobalFont->isVisible() && !ui.useGbFont->isChecked()) { - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); } else if(!ui.useGlobalFont->isVisible()) { - //ȫʽķǵһ + //全局样式的非第一个 StyleSet::setGlobalFont(m_selectStyleId, m_curStyleData.font); - //ȫʽһʽ + //保存全局样式第一条样式本身 saveLangeSet(m_selectLexer); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -747,7 +747,7 @@ void QtLangSet::slot_fontChange(const QFont &font) else { #if 0 - //ͳһ޸壬Сͷ񱣴治 + //统一修改字体,大小和风格保存不变 QFont oldf = m_curStyleData.font; m_curStyleData.font = font; m_curStyleData.font.setBold(oldf.bold()); @@ -755,7 +755,7 @@ void QtLangSet::slot_fontChange(const QFont &font) m_curStyleData.font.setUnderline(oldf.underline()); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { int row = ui.styleListWidget->count(); @@ -768,7 +768,7 @@ void QtLangSet::slot_fontChange(const QFont &font) int styleId = item->data(Qt::UserRole).toInt(); QFont f = m_selectLexer->font(styleId); - //ͳһãǷСϵһ + //新字体的名统一设置,但是风格字体大小保存老的一致 QFont newFont = m_curStyleData.font; newFont.setBold(f.bold()); newFont.setItalic(f.italic()); @@ -811,20 +811,20 @@ void QtLangSet::initLangList() } } - //ǶӵģӳִСǵѡѡУǵһasp + //怀疑这个是队列链接的,会延迟执行。故总是导致选择的选不中,而是第一个语言asp。 ui.langListWidget->sortItems(Qt::AscendingOrder); - //ֶ޸ĵһΪġ + //手动修改第一个名称为中文。 if (ui.langListWidget->item(0)->text() == QString("AllGlobal")) { ui.langListWidget->item(0)->setText(tr("AllGlobal")); } } -//isLoadToUIǷʾǰUI +//isLoadToUI是否加载显示到当前UI界面 bool QtLangSet::readLangSetFile(QString langName,QString &keyword, QString &motherLang, QString & extTypes) { - QString userLangFile = QString("notepad/userlang/%1").arg(langName);//Զв.ַдҪ + QString userLangFile = QString("notepad/userlang/%1").arg(langName);//自定义语言中不能有.字符,否则可能有错,后续要检查 QSettings qs(QSettings::IniFormat, QSettings::UserScope, userLangFile); qs.setIniCodec("UTF-8"); //qDebug() << qs.fileName(); @@ -834,11 +834,11 @@ bool QtLangSet::readLangSetFile(QString langName,QString &keyword, QString &moth return false; } - //ԶԸʽ + //自定义语言格式。 //mz:ndd //name:xxx - //mother:xxx none/cpp/html - //ext:xx xx xx ļ׺ + //mother:xxx none/cpp/html 就三种 + //ext:xx xx xx 文件关联后缀名 //keword:xxx keyword = qs.value("keyword").toString(); extTypes = qs.value("ext").toString(); @@ -847,20 +847,20 @@ bool QtLangSet::readLangSetFile(QString langName,QString &keyword, QString &moth return true; } -//ʼûԶ +//初始化用户自定义的语言配置 void QtLangSet::initUserDefineLangList() { QString userLangDirPath = getUserLangDirPath(); - //ļ + //遍历文件夹 QDir dir_file(userLangDirPath); QFileInfoList list_file = dir_file.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks, QDir::Name); for (int i = 0; i < list_file.size(); ++i) - { //ǰĿ¼ļӵtreewidget + { //将当前目录中所有文件添加到treewidget中 QFileInfo fileInfo = list_file.at(i); - //ļexttagӳļý + //这个文件是ext和tag的映射文件,不做配置解析 if (fileInfo.baseName() == "ext_tag") { continue; @@ -872,9 +872,9 @@ void QtLangSet::initUserDefineLangList() } -//лǰԡ -//QListWidget::currentItemChangedźqt5.12.10ӦǴbug,ĪҪһcurrentItemChangedźųµһθѡǡ -//itemClickedź +//切换当前语言。 +//QListWidget::currentItemChanged这个信号qt5.12.10中应该是存在bug,总是莫名其妙的要发一次currentItemChanged信号出来。导致第一次该选的项被覆盖。 +//换成itemClicked信号 void QtLangSet::slot_itemSelect(QListWidgetItem *item) { if (item == nullptr) @@ -883,7 +883,7 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item) } //qDebug() << item->text() << (previous ? previous->text() : 0); - //ǰⷢ˱仯Ҫ߸£ֹлûʱ + //如果前后主题发生了变化,则依旧要走更新,防止主题切换后没及时更新 if (m_previousSysLangItem == item && (m_lastThemesId == m_themesId)) { return; @@ -896,11 +896,11 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item) ui.userLangListWidget->setCurrentItem(nullptr); - //ǰһѾ޸ĵġѯûǷ񱣴 + //保存前一个已经修改的。询问用户是否保存 if (m_isStyleChange && m_previousSysLangItem != nullptr && m_selectLexer !=nullptr) { - //ֻеǰǷȫ֣ҪʾûǷҪ֡ - //ȫֵIJҪʾΪѾȫˡ + //只有当前是非全局,才需要提示用户是否要保持。 + //全局的不需要提示,因为已经无条件全部保存过了。 if (!m_isGlobelItem) { if (QMessageBox::Yes == QMessageBox::question(this, tr("Save Change"), tr("%1 style configuration has been modified. Do you want to save it?").arg(m_previousSysLangItem->text()))) @@ -925,7 +925,7 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item) int lexId = item->data(Qt::UserRole).toInt(); - //ȫֵҪԴʱûκη + //全局的这个要单独对待,暂时没有任何风格。 if (lexId == L_GLOBAL) { m_isGlobelItem = true; @@ -948,7 +948,7 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item) ui.keywordTe->setPlainText(keyword); ui.motherLangCb->setCurrentIndex(0); - //ùļ + //设置关联文件项 QString langName = item->text(); QStringList extList; ExtLexerManager::getInstance()->getExtlistByLangTag(langName, extList); @@ -968,7 +968,7 @@ void QtLangSet::slot_itemSelect(QListWidgetItem *item) m_previousSysLangItem = item; - //ԶʾһĽ + //自动显示第一条的结果 QListWidgetItem *itemtemp = ui.styleListWidget->item(0); if (itemtemp != nullptr) { @@ -988,7 +988,7 @@ void QtLangSet::slot_langListCurRowChanged(int row) slot_itemSelect(current); } -//ĸģԣԷʾ +//根据母亲模块语言,把属性风格显示出来 void QtLangSet::displayUserMotherLangsStyle(QString langTagName, UserLangMother motherLang) { QsciLexer *pLexer = nullptr; @@ -1010,7 +1010,7 @@ void QtLangSet::displayUserMotherLangsStyle(QString langTagName, UserLangMother if (nullptr != pLexer) { - //һҪԵΪlexertag + //这里一定要以新语言的名称作为lexer的tag。 //pLexer->setLexerTag(langTagName); pLexer->setIsUserDefineKeywords(true); @@ -1033,7 +1033,7 @@ void QtLangSet::displayUserMotherLangsStyle(QString langTagName, UserLangMother } } - //ԶʾһĽ + //自动显示第一条的结果 QListWidgetItem *itemtemp = ui.styleListWidget->item(0); if (itemtemp != nullptr) { @@ -1046,7 +1046,7 @@ void QtLangSet::displayUserMotherLangsStyle(QString langTagName, UserLangMother } -//ǰûԶԵitemtodo:ʱûǰһ޸ı棬Ҫûÿ޸ĺԼsaveܲᱣ +//点击当前用户自定义语言的语言item。todo:暂时没有做前一个的修改保存,需要用户每次修改后自己点击save,否则可能不会保存 void QtLangSet::slot_userLangItemSelect(QListWidgetItem *item) { if (item == nullptr) @@ -1054,7 +1054,7 @@ void QtLangSet::slot_userLangItemSelect(QListWidgetItem *item) return; } - //϶ȫ + //肯定不能是全局设置了 if(m_isGlobelItem || (ui.stackedWidget->currentIndex() == 1)) { m_isGlobelItem = false; @@ -1086,7 +1086,7 @@ void QtLangSet::slot_userLangItemSelect(QListWidgetItem *item) ui.motherLangCb->setCurrentText(motherLang); ui.extFileType->setText(extTypes); - //ĸģԣԷʾ + //根据母亲模块语言,把属性风格显示出来 displayUserMotherLangsStyle(langName, (UserLangMother)(LangType::L_USER_TXT + ui.motherLangCb->currentIndex())); } else @@ -1096,7 +1096,7 @@ void QtLangSet::slot_userLangItemSelect(QListWidgetItem *item) } -//ȡǰuiϵ +//获取当前ui上的字体 void QtLangSet::getCurUiFont(QFont& font) { font = ui.fontComboBox->currentFont(); @@ -1111,7 +1111,7 @@ void QtLangSet::closeEvent(QCloseEvent * e) saveCurLangSettings(); } -//itemĶӦʾڽ +//把item的对应风格显示在界面上 void QtLangSet::syncShowStyleItemToUI(QListWidgetItem *item) { if (item != nullptr && m_selectLexer != nullptr) @@ -1156,7 +1156,7 @@ void QtLangSet::syncShowStyleItemToUI(QListWidgetItem *item) setStyleShow(sd.font, sd.color, sd.paper); m_isStyleChange = false; - //ȫ֣Ѳ޸ĵȫʽҵûѡ + //如果是全局,则把不能修改的全局样式灰掉,避免干扰用户的选择 if (m_isGlobelItem) { QsciLexerGlobal* pGlobalLexer = dynamic_cast(m_selectLexer); @@ -1191,7 +1191,7 @@ void QtLangSet::syncShowStyleItemToUI(QListWidgetItem *item) } } } -//ǰķitem +//点击当前的风格item void QtLangSet::slot_styleItemSelect(QListWidgetItem *current) { qDebug() << "slot_styleItemSelect"; @@ -1217,7 +1217,7 @@ void QtLangSet::slot_styleItemSelect(QListWidgetItem *current) } -//ʹüл +//使用键盘上下切换 void QtLangSet::slot_styleListCurRowChanged(int row) { qDebug() << "slot_curRowChanged"; @@ -1242,7 +1242,7 @@ void QtLangSet::fillBackgroundColor(QColor &bkColor) void QtLangSet::setStyleShow(QFont& font, QColor& fcColor, QColor &bkColor) { - //޸ᴥۺִУȹرһź + //修改字体会触发槽函数执行,务必先关闭一下信号 enableFontChangeSensitive(false); ui.fontComboBox->setCurrentFont(font); @@ -1259,7 +1259,7 @@ void QtLangSet::setStyleShow(QFont& font, QColor& fcColor, QColor &bkColor) } -//ȡضԵãStyleId-1ȡǰ⣬ָStyleId +//读取特定语言的设置;StyleId-1则读取当前主题,否则指定的StyleId主题 bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag, int StyleId) { QString cfgPath = QString("notepad/userstyle/%1/%2").arg((StyleId == -1) ? StyleSet::getCurrentStyle() : StyleSet::getStyleName(StyleId)).arg(tag); @@ -1269,7 +1269,7 @@ bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag, int StyleId) { return lexer->readSettings(qs); } - else//ӦüӸ߼걸ıûжȡûãӦôӱ׼Ŀȥԭʼ + else//这里应该加个逻辑完备的保护。如果没有读取到用户配置,则应该从标准目标去读原始配置 { return readLangOriginSettings(lexer, tag, StyleId, true); } @@ -1277,17 +1277,17 @@ bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag, int StyleId) return false; } -//ȡضԵԭʼʽãStyleId-1ȡǰ⣬ָStyleId -//force:ȡ +//读取特定语言的原始样式设置;StyleId-1则读取当前主题,否则指定的StyleId主题 +//force:无条件读取 bool QtLangSet::readLangOriginSettings(QsciLexer* lexer, QString tag, int StyleId, bool force) { - //ĬⲻҪȡڴѾ + //默认主题不需要读取,内存中已经存在 if (StyleId == 0 && !force) { return true; } - //ĬƤ·ͬĿ¼themesĿ¼ + //默认皮肤路径放在软件的同级目录下面的themes目录 QString cfgPath = QString("%1/themes/%2/%3.ini").arg(QCoreApplication::applicationDirPath()).arg((StyleId == -1)?StyleSet::getCurrentStyle(): StyleSet::getStyleName(StyleId)).arg(tag); QSettings qs(cfgPath, QSettings::IniFormat); if (QFile::exists(qs.fileName())) @@ -1298,7 +1298,7 @@ bool QtLangSet::readLangOriginSettings(QsciLexer* lexer, QString tag, int StyleI } -//һԵá +//保存一种语言的配置。 void QtLangSet::saveLangeSet(QsciLexer *lexer, int StyleId) { if (lexer != nullptr) @@ -1313,7 +1313,7 @@ void QtLangSet::saveLangeSet(QsciLexer *lexer, int StyleId) } } -//浱ǰѡԵ +//保存当前选定语言的配置 bool QtLangSet::saveCurLangSettings() { if (m_isStyleChange && m_selectLexer != nullptr) @@ -1337,13 +1337,13 @@ bool QtLangSet::isUseGlobalBgColor() return ui.useGlobalColor->isVisible() && ui.useGbBc->isChecked(); } -//޸ǰɫ +//修改前景色 void QtLangSet::slot_changeFgColor() { QColor color = QColorDialog::getColor(m_curStyleData.color, this, tr("Style Foreground Color")); if (color.isValid()) { - //ȫ޸ + //全局修改 if (m_isGlobelItem) { if (m_curStyleData.color != color) @@ -1352,24 +1352,24 @@ void QtLangSet::slot_changeFgColor() fillForegroundColor(color); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { - //ʱһQsciLexerGlobal + //此时一定是QsciLexerGlobal m_selectLexer->setColor(color, m_selectStyleId); } - //ֻڵһȫʽʱisUseGlobalFgColorΪtrueԵз + //只有在第一个全局样式时,isUseGlobalFgColor下面才为true。把所有语言的所有风格都设置 if (isUseGlobalFgColor()) { slot_useAlobalFgColor(true); } else if(!ui.useGlobalColor->isVisible()) { - //ȫʽķǵһ + //全局样式的非第一个 StyleSet::setGlobalFgColor(m_selectStyleId, color); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -1383,14 +1383,14 @@ void QtLangSet::slot_changeFgColor() } else { - //ǰǰɫǷ仯 + //当前前景色是否变化 if (m_curStyleData.color != color) { m_curStyleData.color = color; fillForegroundColor(color); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { m_selectLexer->setColor(color, m_selectStyleId); @@ -1401,14 +1401,14 @@ void QtLangSet::slot_changeFgColor() } /*else if (!ui.modiryAllColor->isChecked()) { - ǰǰɫǷ仯 + 当前前景色是否变化 if (m_curStyleData.color != color) { m_curStyleData.color = color; fillForegroundColor(color); m_isStyleChange = true; - ʱ÷ + 即时设置风格 if (m_selectLexer != nullptr) { m_selectLexer->setColor(color, m_selectStyleId); @@ -1419,13 +1419,13 @@ void QtLangSet::slot_changeFgColor() }*/ /*else { - ȫɫ޸ - ǰǰɫǷ仯 + 全部风格颜色修改 + 当前前景色是否变化 m_curStyleData.color = color; fillForegroundColor(color); m_isStyleChange = true; - ʱ÷ + 即时设置风格 if (m_selectLexer != nullptr) { m_selectLexer->setColor(color, -1); @@ -1438,13 +1438,13 @@ void QtLangSet::slot_changeFgColor() } -//޸ıɫ +//修改背景色 void QtLangSet::slot_changeBkColor() { QColor color = QColorDialog::getColor(m_curStyleData.paper, this, tr("Style Background Color")); if (color.isValid()) { - //ȫ޸ģԵз + //全局修改,把所有语言的所有风格都设置 if (m_isGlobelItem) { if (m_curStyleData.paper != color) @@ -1453,7 +1453,7 @@ void QtLangSet::slot_changeBkColor() fillBackgroundColor(color); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { m_selectLexer->setPaper(color, m_selectStyleId); @@ -1467,7 +1467,7 @@ void QtLangSet::slot_changeBkColor() { StyleSet::setGlobalBgColor(m_selectStyleId, color); - //ȫֵʽ֪ͨǰеı༭ȥ޸DZȫʽ + //这里就是全局的样式。通知当前所有的编辑框,去修改他们本身的全局样式 CCNotePad* pMainNote = dynamic_cast(parent()); if (pMainNote != nullptr) { @@ -1480,14 +1480,14 @@ void QtLangSet::slot_changeBkColor() } // else if (!ui.modiryAllColor->isChecked()) // { - // //ǰǰɫǷ仯 + // //当前前景色是否变化 // if (m_curStyleData.paper != color) // { // m_curStyleData.paper = color; // fillBackgroundColor(color); // m_isStyleChange = true; - // //ʱ÷ + // //即时设置风格 // if (m_selectLexer != nullptr) // { // m_selectLexer->setPaper(color, m_selectStyleId); @@ -1497,13 +1497,13 @@ void QtLangSet::slot_changeBkColor() //} else { - //ȫɫ޸ - //ǰǰɫǷ仯 + //全部风格颜色修改 + //当前前景色是否变化 m_curStyleData.paper = color; fillBackgroundColor(color); m_isStyleChange = true; - //ʱ÷ + //即时设置风格 if (m_selectLexer != nullptr) { m_selectLexer->setPaper(color, -1); @@ -1521,7 +1521,7 @@ void QtLangSet::slot_saveClick() saveCurLangSettings(); } -//ָʼ +//恢复初始化设置 void QtLangSet::slot_reset() { if (m_selectLexer != nullptr) @@ -1533,10 +1533,10 @@ void QtLangSet::slot_reset() return; } - //һãǰ޸档⵱ǰĸոãֱ + //一旦重置,当前修改无条件不保存。否则避免当前的刚刚重置,又被保存 m_isStyleChange = false; - //ԶãҲɾ + //如果存在自定义的配置,也删除掉 QString cfgPath = QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(m_selectLexer->lexerTag()); QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath); @@ -1545,15 +1545,15 @@ void QtLangSet::slot_reset() QFile::remove(qs.fileName()); } - //һҪȱ棬ΪselectInitLangTagܻ仯 + //一定要先保存,因为selectInitLangTag后可能会变化 int row = ui.styleListWidget->currentRow(); - //ǿslot_itemSelectĽл + //强行让slot_itemSelect里面的进行切换 m_previousSysLangItem = nullptr; selectInitLangTag(m_selectLexer->lexerTag()); - //ֶˢUI + //手动刷新UI QListWidgetItem* styleItem = ui.styleListWidget->item(row); m_selectStyleId = -1; @@ -1566,7 +1566,7 @@ void QtLangSet::slot_reset() { if (ui.useGlobalFont->isVisible()) { - //ȫãԶ + //如果是全局重置,则把所有语言都重置 if (QMessageBox::Yes != QMessageBox::question(this, tr("Reset All Style"), tr("Are you sure to reset All language sytle"))) { return; @@ -1575,7 +1575,7 @@ void QtLangSet::slot_reset() previewAllGoblalChange(); - //ֶˢUIȫĿǰֻһȫ + //手动刷新UI。全局目前只有一行全局设置 if (m_selectLexer != nullptr) { @@ -1592,11 +1592,11 @@ void QtLangSet::slot_reset() } else { - //ȫʽ - //һãǰ޸档⵱ǰĸոãֱ + //重置所有全局样式 + //一旦重置,当前修改无条件不保存。否则避免当前的刚刚重置,又被保存 m_isStyleChange = false; - //ԶãҲɾ + //如果存在自定义的配置,也删除掉 QString cfgPath = QString("notepad/userstyle/%1/%2").arg(StyleSet::getCurrentStyle()).arg(m_selectLexer->lexerTag()); QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath); @@ -1605,24 +1605,24 @@ void QtLangSet::slot_reset() QFile::remove(qs.fileName()); } - //һҪȱ棬ΪselectInitLangTagܻ仯 + //一定要先保存,因为selectInitLangTag后可能会变化 int row = ui.styleListWidget->currentRow(); - //ǿslot_itemSelectĽл + //强行让slot_itemSelect里面的进行切换 m_previousSysLangItem = nullptr; - //дALLglobalIJҲ + //这里必须写ALLglobal,否则中文查找不到 selectInitLangTag(tr("AllGlobal")); - //ֶˢUI + //手动刷新UI QListWidgetItem* styleItem = ui.styleListWidget->item(row); m_selectStyleId = -1; syncShowStyleItemToUI(styleItem); - //´ӼһδȫʽΪǰ汣ѾɾˣԼصǴġ + //重新从加载一次纯净的全局样式。因为前面保存的已经删了,所以加载的是纯净的。 StyleSet::loadGolbalStyle(); updateThemes(); @@ -1733,8 +1733,8 @@ void QtLangSet::slot_useAlobalFontItalic(bool check) -//ĬԷIJɫ滻Ϊɫ۵ɫ -//ǿԴԶԵġ +//把默认语言风格的部分颜色,替换为暗色下显眼的颜色 +//这个函数是可以处理自定义语言的。 //void QtLangSet::setLangFontFgColorToDarkStyle(LangType langId, QString tag) //{ // QColor blackColor(Qt::black); @@ -1744,7 +1744,7 @@ void QtLangSet::slot_useAlobalFontItalic(bool check) // QColor lightColor1(0xffaa00); // // -// //C++ע͵Ĭɫ +// //C++注释的默认颜色,不显眼 // QColor blackColor2(0x007f00); // QColor lightColor2(0x009000); // @@ -1755,7 +1755,7 @@ void QtLangSet::slot_useAlobalFontItalic(bool check) // QColor blackColor4(0x8000ff); // QColor lightColor4(0xffaa00); // -// עɫvoid StyleSet::setBlackStyle()бһ +// 注意下面这个颜色和void StyleSet::setBlackStyle()中保持一致 // QColor bkPaperColor(0, 0, 0); // // QsciLexer *pLexer = ScintillaEditView::createLexer(langId, tag); @@ -1791,24 +1791,24 @@ void QtLangSet::slot_useAlobalFontItalic(bool check) // pLexer->setColor(QtLangSet::s_darkColorMap.value(pLexer->color(i).name()), i); // } // -// Ҳɰɫ +// 背景也变成暗黑色 // if (StyleSet::foldbgColor != pLexer->paper(i)) // { // pLexer->setPaper(StyleSet::foldbgColor, i); // } // } // } -// ĬֽɫQPaletteһ¡Ϊɫɫ䱳QPaletteһҪһ +// 默认纸背景色会和QPalette保持一致。但是因为黑色特色,其背景和QPalette不一样,所有需要单独设置一下 // pLexer->setDefaultPaper(StyleSet::foldbgColor); // saveLangeSet(pLexer); // delete pLexer; // } // } -//Ѱɫϵ治׿ɫ滻һ¡ĬзģĬϷɫϵġ -//ѷ0x000000壬0xdedede -//0x0000ffɫ0xffff00 -//ûдԶԡ +//把暗色系下面不容易看清的颜色给替换一下。默认是有风格的,但是默认风格是亮色系的。 +//把凡是0x000000的字体,变成0xdedede +//凡是0x0000ff的颜色,变成0xffff00 +//这个函数没有处理自定义语言。 //void QtLangSet::setAllLangFontFgColorToDarkStyle() //{ // initDarkColorMap(); @@ -1820,14 +1820,14 @@ void QtLangSet::slot_useAlobalFontItalic(bool check) //} -//Ĭģ崴һûԷļ +//从默认主题模板创建一份用户的语言风格文件 void QtLangSet::createOneLangStyleFromThemes(int styleId, LangType langId, QString tag) { if (langId == L_GLOBAL) { qDebug("global call"); } - //ָԭʼģжȡһ + //指定从原始模板的主题中读取一份数据 QsciLexer* pLexer = ScintillaEditView::createLexer(langId, tag, true, styleId); if (nullptr != pLexer) { @@ -1836,7 +1836,7 @@ void QtLangSet::createOneLangStyleFromThemes(int styleId, LangType langId, QStri } } -//ԭʼģУһûļ +//从原始主题模板中,创建一份用户主题文件 void QtLangSet::createUserStyleFormThemes(int styleId) { for (int index = 0; index <= L_TXT; ++index) @@ -1845,7 +1845,7 @@ void QtLangSet::createUserStyleFormThemes(int styleId) } } -//鵱ǰǷѾڰɫ +//检查当前是否已经存在暗黑色语言配置 //bool QtLangSet::isExistDarkLangSetings() //{ // QString cfgPath = QString("notepad/userstyle/black/AllGlobal"); @@ -1853,7 +1853,7 @@ void QtLangSet::createUserStyleFormThemes(int styleId) // return QFile::exists(qs.fileName()); //} -//鵱ǰǷѾ +//检查当前是否已经存在主题配置 bool QtLangSet::isExistThemesSetings(int styleId) { QString cfgPath = QString("notepad/userstyle/%1/AllGlobal").arg(StyleSet::getStyleName(styleId)); @@ -1861,10 +1861,10 @@ bool QtLangSet::isExistThemesSetings(int styleId) return QFile::exists(qs.fileName()); } -//ǰⷢ仯 +//当前主题发生变化 void QtLangSet::on_themesChange(int styleIndex) { - //һʱֹʼûгʼ⣬ʼһisExistThemesSetings + //第一次启动时,防止初始情况没有初始化主题,故检测一下isExistThemesSetings if (m_themesId == styleIndex && isExistThemesSetings(styleIndex)) { return; @@ -1873,12 +1873,12 @@ void QtLangSet::on_themesChange(int styleIndex) m_themesId = styleIndex; - //иϣҪQsciLexerĵǰ⡣ֻĬϸķ - //Ĭ⣬ʼȫĬʽ + //这个有个耦合:先要设置QsciLexer的当前主题。只有默认主题才有详细独立的风格。 + //非默认主题,其初始风格全是默认样式。 QsciLexer::setCurThemes(m_themesId); - //ãģ濽һݳ + //如果不存在主题设置,则从模板里面拷贝一份出来 if (!isExistThemesSetings(styleIndex)) { createUserStyleFormThemes(styleIndex); @@ -1888,15 +1888,15 @@ void QtLangSet::on_themesChange(int styleIndex) NddSetting::updataKeyValueFromNumSets(SKIN_KEY, m_themesId); - //Ҫʱлǰ⣬Ԥɫ + //这里就要及时切换当前主题,预览颜色 updateThemes(); - //һҪõǰ༭﷨ + //下一步就是要更好当前编辑器的语法设置 previewAllGoblalChange(); int row = ui.langListWidget->currentRow(); - //ֶˢUI + //手动刷新UI QListWidgetItem* styleItem = ui.langListWidget->item(row); slot_itemSelect(styleItem); @@ -1906,7 +1906,7 @@ void QtLangSet::on_themesChange(int styleIndex) ui.statusBar->showMessage(tr("themes changed finished ..."), 5000); } -//µǰ༭ʽ +//更新当前编辑框中主题的样式 void QtLangSet::updateThemes() { CCNotePad* pMainNote = dynamic_cast(parent()); @@ -1916,7 +1916,7 @@ void QtLangSet::updateThemes() } } -//һʾȫֵİťûҲ +//增加一个快捷显示全局的按钮,避免用户经常找不到 void QtLangSet::on_showGlobalItem() { if (ui.langListWidget->currentRow() != 0) diff --git a/src/qtlangset.h b/src/qtlangset.h index 614733a..8e14b2e 100755 --- a/src/qtlangset.h +++ b/src/qtlangset.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/rcglobal.h b/src/rcglobal.h index 62a86d0..50a4d4c 100755 --- a/src/rcglobal.h +++ b/src/rcglobal.h @@ -15,7 +15,7 @@ static const char* VersionStr = "v1.22.2"; #endif // TEST_PRE -//#define NO_PLUGIN 1 +#define NO_PLUGIN 1 #define CMP_CODE_NOEQUAL diff --git a/src/renamewin.cpp b/src/renamewin.cpp index 6a0f18f..e0ff6bd 100755 --- a/src/renamewin.cpp +++ b/src/renamewin.cpp @@ -1,4 +1,4 @@ -#include "renamewin.h" +#include "renamewin.h" #include "progresswin.h" #include diff --git a/src/renamewin.h b/src/renamewin.h index ab69266..cb141ee 100755 --- a/src/renamewin.h +++ b/src/renamewin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_renamewin.h" diff --git a/src/rgba_icons.h b/src/rgba_icons.h index bcd47f4..9c2a598 100755 --- a/src/rgba_icons.h +++ b/src/rgba_icons.h @@ -1,4 +1,4 @@ -// This file is part of Notepad-- project +// This file is part of Notepad-- project // Copyright (C)2023 zuowei.yin // This program is free software: you can redistribute it and/or modify diff --git a/src/scintillaeditview.cpp b/src/scintillaeditview.cpp index f3413a6..29fcd7c 100755 --- a/src/scintillaeditview.cpp +++ b/src/scintillaeditview.cpp @@ -1,4 +1,4 @@ -#include "scintillaeditview.h" +#include "scintillaeditview.h" #include "common.h" #include "rgba_icons.h" diff --git a/src/scintillaeditview.h b/src/scintillaeditview.h index db44317..1e6a8a4 100755 --- a/src/scintillaeditview.h +++ b/src/scintillaeditview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include #include diff --git a/src/scintillahexeditview.cpp b/src/scintillahexeditview.cpp index 94526ae..ca35a0a 100755 --- a/src/scintillahexeditview.cpp +++ b/src/scintillahexeditview.cpp @@ -1,4 +1,4 @@ -#include "scintillahexeditview.h" +#include "scintillahexeditview.h" #include "styleset.h" #include "ccnotepad.h" diff --git a/src/scintillahexeditview.h b/src/scintillahexeditview.h index fc824ca..26b6c3f 100755 --- a/src/scintillahexeditview.h +++ b/src/scintillahexeditview.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include diff --git a/src/shortcutkeyeditwin.cpp b/src/shortcutkeyeditwin.cpp index 7e253d3..dd22277 100755 --- a/src/shortcutkeyeditwin.cpp +++ b/src/shortcutkeyeditwin.cpp @@ -1,4 +1,4 @@ -#include "shortcutkeyeditwin.h" +#include "shortcutkeyeditwin.h" #include @@ -27,7 +27,7 @@ QKeySequence ShortcutKeyEditWin::getNewKeySeq() return m_newKeys; } -//ȷ޸ģȼһ¡ĸ +//确认修改,先检查一下。最多四个键 void ShortcutKeyEditWin::slot_ok() { QKeySequence keys = ui.keySequenceEdit->keySequence(); @@ -41,7 +41,7 @@ void ShortcutKeyEditWin::slot_ok() done(1); } -//ɾΪ +//删除为空 void ShortcutKeyEditWin::on_delete() { done(2); diff --git a/src/shortcutkeyeditwin.h b/src/shortcutkeyeditwin.h index 2c95de9..fc0e01d 100755 --- a/src/shortcutkeyeditwin.h +++ b/src/shortcutkeyeditwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_shortcutkeyeditwin.h" diff --git a/src/shortcutkeymgr.cpp b/src/shortcutkeymgr.cpp index 3a2507a..7432644 100755 --- a/src/shortcutkeymgr.cpp +++ b/src/shortcutkeymgr.cpp @@ -1,4 +1,4 @@ -#include "shortcutkeymgr.h" +#include "shortcutkeymgr.h" #include "shortcutkeyeditwin.h" #include "ccnotepad.h" @@ -13,12 +13,12 @@ QMap* ShortcutKeyMgr::s_shortcutKeysMap = nullptr; //QMap * qScintShortcutKeyValueMap = nullptr; struct ShortcutKeySt { - QString iniTag;//Iniļе - QString name;//ʾڱе - //QString keyDesc;//qkeysequence + QString iniTag;//保存在Ini文件中的名称 + QString name;//显示在表格中的名称 + //QString keyDesc;//qkeysequence的描述 QKeySequence key; - bool canModify;//ܷ޸ + bool canModify;//能否修改 ShortcutKeySt() = default; ShortcutKeySt(QString name_, QString iniTag_, bool canMofidy=true) :name(name_), iniTag(iniTag_), canModify(canMofidy) @@ -119,12 +119,12 @@ void ShortcutKeyMgr::initShortcutKeysMap() s_shortcutKeysMap->insert(shortCutTable.at(i).iniTag, i); } - //ļжȡû޸Ĺñ + //从文件中读取用户修改过的配置表。 loadUserDefSet(); } } -//ȵinitShortcutKeysMap() +//务必先调用initShortcutKeysMap() QKeySequence ShortcutKeyMgr::getUserDefShortcutKey(QString iniTag) { if (s_shortcutKeysMap->contains(iniTag)) @@ -134,7 +134,7 @@ QKeySequence ShortcutKeyMgr::getUserDefShortcutKey(QString iniTag) return QKeySequence(); } -//ûiniмؿݼ +//从用户ini配置中加载快捷键配置 void ShortcutKeyMgr::loadUserDefSet() { QString userDefFile = QString("notepad/shortcuttab"); @@ -159,7 +159,7 @@ void ShortcutKeyMgr::loadUserDefSet() } } -//޸ļеĿݼ塣inittag inikey, keySeqStr inivalueڴҲ޸ +//修改配置文件中的快捷键定义。inittag ini的key, keySeqStr ini的value。内存也修改了 bool ShortcutKeyMgr::ModifyShortCutKey(QString initTag, QString keySeqStr) { QString userDefFile = QString("notepad/shortcuttab"); @@ -210,7 +210,7 @@ void ShortcutKeyMgr::initNddShortcutTable() } } -//ʼqscintڲĿݼĿǰⲿֲ޸ġ +//初始化qscint内部的快捷键。目前这部分不能修改。 void ShortcutKeyMgr::initQscintShortcutTable() { QsciScintilla* pNote = new QsciScintilla(nullptr); @@ -273,7 +273,7 @@ int ShortcutKeyMgr::isKeySeqExist(int row, QString keySeq, int &type) } return -1; } -//˫޸IJۺ +//双击修改槽函数 void ShortcutKeyMgr::slot_edit(QTableWidgetItem* item) { int row = item->row(); @@ -289,14 +289,14 @@ void ShortcutKeyMgr::slot_edit(QTableWidgetItem* item) pWin->setCurKeyDesc(shortCutTable.at(row).key.toString()); int ret = pWin->exec(); - if (1 == ret) //ȷ + if (1 == ret) //确定 { QKeySequence newKeySeq = pWin->getNewKeySeq(); QTableWidgetItem* item = ui.tableWidget->item(row, 1); if (item != nullptr) { - //ǷͻͻáԤ + //检查是否冲突,如果冲突,则不设置。先预留 int conflictType = 0; int existId = isKeySeqExist(row, newKeySeq.toString(), conflictType); if (-1 == existId) @@ -329,7 +329,7 @@ void ShortcutKeyMgr::slot_edit(QTableWidgetItem* item) } } } - else if (2 == ret)//ɾ + else if (2 == ret)//删除 { QKeySequence newKeySeq(QKeySequence::UnknownKey); diff --git a/src/shortcutkeymgr.h b/src/shortcutkeymgr.h index f7c4e34..e4bebf3 100755 --- a/src/shortcutkeymgr.h +++ b/src/shortcutkeymgr.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_shortcutkeymgr.h" @@ -38,7 +38,7 @@ enum Shortcut_Key_ID { Format_Json_ID, - Shortcut_End_ID,// + Shortcut_End_ID,//总是在最底下 }; static const char* New_File = "newfile"; diff --git a/src/styleset.cpp b/src/styleset.cpp index d4162c8..c1eca51 100755 --- a/src/styleset.cpp +++ b/src/styleset.cpp @@ -1,4 +1,4 @@ -#include "styleset.h" +#include "styleset.h" #include "ccnotepad.h" #include #include @@ -70,7 +70,7 @@ void StyleSet::setCommonStyle(QColor foldfgColor_, QColor foldbgColor_, QColor m foldbgColor = foldbgColor_; marginsBackgroundColor = marginsBackgroundColor_; - QFile file(":/qss/lightbluestyle.qss"); //qssļ·:/lightblue.qss + QFile file(":/qss/lightbluestyle.qss"); //qss文件路径:/lightblue.qss QString styleSheet; if (file.open(QIODevice::Text | QIODevice::ReadOnly)) { @@ -128,7 +128,7 @@ void StyleSet::setSkin(int id) } } -//¼Globalȫַ +//重新加载Global全局风格 void StyleSet::reloadGolbalStyleFromSetFile() { loadGolbalStyle(); @@ -140,7 +140,7 @@ void StyleSet::loadGolbalStyle() QsciLexerGlobal* pGlobalLexer = dynamic_cast(pLexer); if (pGlobalLexer != nullptr) { - //ȡɫȻ롣ScintillaEditViewֱЩOne_Stype_Infoֵ + //获取其属性颜色,然后填入。后续在ScintillaEditView中直接设置这些One_Stype_Info的属性值 One_Stype_Info* pAddr = &s_global_style->global_style; for (int i = 0; i <= URL_HOVERRED; ++i) @@ -158,7 +158,7 @@ QString StyleSet::getCurrentStyle() return getStyleName(m_curStyleId); } -//Ƿɫϵ +//是否深色风格系列 bool StyleSet::isCurrentDeepStyle() { switch (m_curStyleId) @@ -217,7 +217,7 @@ void StyleSet::setDefaultStyle() marginsBackgroundColor = QColor(0xf0f0f0); bookmarkBkColor = QColor(0xececec); - QFile file(":/qss/mystyle.qss"); //qssļ·:/lightblue.qss + QFile file(":/qss/mystyle.qss"); //qss文件路径:/lightblue.qss QString styleSheet; if (file.open(QIODevice::Text | QIODevice::ReadOnly)) { @@ -246,7 +246,7 @@ void StyleSet::setThinBlueStyle() setCommonStyle(QColor(0xd7, 0xe3, 0xf4, 100), QColor(0xd7e3f4), QColor(0xd5e1f1), "#D7E3F4"); } -//ֽ +//纸黄 void StyleSet::setThinYellowStyle() { //m_curStyleId = THIN_YELLOW_SE; @@ -254,7 +254,7 @@ void StyleSet::setThinYellowStyle() setCommonStyle(QColor(0xf9, 0xf0, 0xe1, 100), QColor(0xf9f0e1), QColor(0xf7f0e0), "#F9F0E1"); } -//ֽ +//宣纸黄 void StyleSet::setRiceYellowStyle() { //m_curStyleId = RICE_YELLOW_SE; @@ -262,7 +262,7 @@ void StyleSet::setRiceYellowStyle() setCommonStyle(QColor(0xf6, 0xf3, 0xea, 100), QColor(0xf6f3ea), QColor(0xf4f1e9), "#F6F3EA"); } -//ɫ +//银色 void StyleSet::setSilverStyle() { //m_curStyleId = SILVER_SE; @@ -270,7 +270,7 @@ void StyleSet::setSilverStyle() setCommonStyle(QColor(0xe9, 0xe8, 0xe4, 100), QColor(0xe9e8e4), QColor(0xe7e6e2), "#E9E8E4"); } -//̸ɫ#FFF0F5 +//谈紫色#FFF0F5 void StyleSet::setLavenderBlushStyle() { //m_curStyleId = LAVENDER_SE; @@ -293,14 +293,14 @@ void StyleSet::setBlackStyle() foldfgColor = QColor(0,0, 0); foldbgColor = QColor(32, 32, 40); - //עⰵģʽǵĴڱɫfoldbgColor˱༭ıɫ - //ģʽ屳ȫǺɫ686868 + //注意暗黑模式是单独的窗口背景颜色。上面的foldbgColor决定了编辑器的背景颜色。 + //暗黑模式窗体背景不完全是黑色,而是686868 QColor blackPaletteColor(68,68,68); marginsBackgroundColor = QColor(57, 58, 60); bookmarkBkColor = QColor(53,54,56); - QFile file(":/qss/black.qss"); //qssļ·:/lightblue.qss + QFile file(":/qss/black.qss"); //qss文件路径:/lightblue.qss QString styleSheet; if (file.open(QIODevice::Text | QIODevice::ReadOnly)) { @@ -325,7 +325,7 @@ void StyleSet::setBlackStyle() marginsBackgroundColor = QColor(57, 58, 60); bookmarkBkColor = QColor(53, 54, 56); - QFile file(":/qss/myblack.qss"); //qssļ·:/lightblue.qss + QFile file(":/qss/myblack.qss"); //qss文件路径:/lightblue.qss QString styleSheet; if (file.open(QIODevice::Text | QIODevice::ReadOnly)) { diff --git a/src/styleset.h b/src/styleset.h index 564b0a0..1a90813 100755 --- a/src/styleset.h +++ b/src/styleset.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -30,7 +30,7 @@ struct One_Stype_Info { int styleId; QColor fgColor; QColor bgColor; - QFont font; //fontУ1壬СЩԣŴСû壬дСʹСʾ + QFont font; //这个font代表两个含有,1是字体,而是字体大小。有些属性,比如括号大小,他们没有字体,但是有大小,则使用字体大小来表示 One_Stype_Info() :styleId(-1) { } @@ -40,7 +40,7 @@ struct One_Stype_Info { }; -//ǰȫַԣеʽ޸ģ޸ṹ壬Ȼطٸ޸ĺĽṹ壬ͬ +//当前的全局风格属性,所有的样式修改,都是先修改这个结构体,然后其余地方再根据这个修改后的结构体,来进行同步更新 struct GLOBAL_STYLE_OPS { One_Stype_Info global_style; One_Stype_Info default_style; diff --git a/src/texteditsetwin.h b/src/texteditsetwin.h index 093331d..df3263d 100755 --- a/src/texteditsetwin.h +++ b/src/texteditsetwin.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "ui_texteditsetwin.h" diff --git a/src/userlexdef.cpp b/src/userlexdef.cpp index 6b8c7d2..a1983a6 100755 --- a/src/userlexdef.cpp +++ b/src/userlexdef.cpp @@ -1,4 +1,4 @@ -#include "userlexdef.h" +#include "userlexdef.h" #include "rcglobal.h" #include @@ -12,14 +12,14 @@ UserLexDef::~UserLexDef() } -//Լһ׶ȡͱõĽӿ +//自己定义一套读取和保存配置的接口 bool UserLexDef::readUserSettings(QString langTagName) { - //ԶԸʽ + //自定义语言格式。 //mz:ndd //name:xxx - //mother:xxx none/cpp/html + //mother:xxx none/cpp/html 就三种 //keword:xxx QString userLangFile = QString("notepad/userlang/%1").arg(langTagName); @@ -28,7 +28,7 @@ bool UserLexDef::readUserSettings(QString langTagName) if (!qs.contains(QString("mz"))) { - //MzΪNddļ + //必须包含Mz为Ndd的键,否则错误 return false; } if (qs.value("mz").toString() != QString("ndd")) @@ -84,11 +84,11 @@ void UserLexDef::setMotherLang(UserLangMother words) bool UserLexDef::writeUserSettings(QString langTagName) { - //ԶԸʽ + //自定义语言格式。 //mz:ndd //name:xxx - //mother:xxx none/cpp/html - //ext:xx xx xx ļ׺ + //mother:xxx none/cpp/html 就三种 + //ext:xx xx xx 文件关联后缀名 //keyword:xxx QString userLangFile = QString("notepad/userlang/%1").arg(langTagName); diff --git a/src/userlexdef.h b/src/userlexdef.h index a93b17a..7944c66 100755 --- a/src/userlexdef.h +++ b/src/userlexdef.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include "rcglobal.h" From 169101cc2e31c32bbbee099cc6f218afb3f1a1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=AC=E5=B1=B1=E8=99=8E?= Date: Mon, 13 Feb 2023 21:23:18 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 插件编程开发说明.docx | Bin 604825 -> 624196 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/插件编程开发说明.docx b/插件编程开发说明.docx index 720808713e428fcdaf491762b3159dd0b1b98a94..bdd2bba47219760d3e743c9dec6cd5ad0c10f183 100755 GIT binary patch delta 35312 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 z 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 delta 15876 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