From 57bd7b7c613206d391b83e203b1d53cdf78b878b Mon Sep 17 00:00:00 2001 From: wingsummer <1326224942@qq.com> Date: Sat, 10 May 2025 21:07:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E9=87=8D=E7=BD=AE=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=E4=B8=80=E4=BA=9B=E5=A2=9E=E5=BC=BA=E5=92=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rdparty/QHexView/document/qhexdocument.cpp | 28 +- 3rdparty/QHexView/document/qhexdocument.h | 8 +- 3rdparty/QHexView/qhexview.cpp | 47 +- 3rdparty/QHexView/qhexview.h | 4 +- 3rdparty/WingCodeEdit | 2 +- lang/zh_CN/winghex_zh_CN.ts | 588 ++++++++++---------- lang/zh_TW/winghex_zh_TW.ts | 588 ++++++++++---------- src/class/ascompletion.cpp | 84 +-- src/class/scriptsettings.cpp | 103 ++-- src/class/scriptsettings.h | 2 + src/class/settingmanager.cpp | 62 ++- src/class/settingmanager.h | 2 + src/control/codeedit.cpp | 19 +- src/control/scriptingconsole.cpp | 73 ++- src/dialog/mainwindow.cpp | 34 +- src/dialog/settingdialog.cpp | 13 +- src/scriptaddon/scriptqstring.cpp | 447 ++++++++------- src/scriptaddon/scriptqstring.h | 6 - src/scriptaddon/scriptregex.cpp | 5 +- 19 files changed, 1136 insertions(+), 979 deletions(-) diff --git a/3rdparty/QHexView/document/qhexdocument.cpp b/3rdparty/QHexView/document/qhexdocument.cpp index 68d8089..59e2773 100644 --- a/3rdparty/QHexView/document/qhexdocument.cpp +++ b/3rdparty/QHexView/document/qhexdocument.cpp @@ -704,27 +704,31 @@ void QHexDocument::beginMarco(const QString &text) { void QHexDocument::endMarco() { m_undostack->endMacro(); } -void QHexDocument::Insert(QHexCursor *cursor, qsizetype offset, uchar b, +bool QHexDocument::Insert(QHexCursor *cursor, qsizetype offset, uchar b, int nibbleindex) { - this->Insert(cursor, offset, QByteArray(1, char(b)), nibbleindex); + return this->Insert(cursor, offset, QByteArray(1, char(b)), nibbleindex); } -void QHexDocument::Replace(QHexCursor *cursor, qsizetype offset, uchar b, +bool QHexDocument::Replace(QHexCursor *cursor, qsizetype offset, uchar b, int nibbleindex) { - this->Replace(cursor, offset, QByteArray(1, char(b)), nibbleindex); + return this->Replace(cursor, offset, QByteArray(1, char(b)), nibbleindex); } -void QHexDocument::Insert(QHexCursor *cursor, qsizetype offset, +bool QHexDocument::Insert(QHexCursor *cursor, qsizetype offset, const QByteArray &data, int nibbleindex) { - if (m_keepsize || m_readonly || m_islocked) - return; + if (m_keepsize || m_readonly || m_islocked) { + return false; + } auto cmd = MakeInsert(nullptr, cursor, offset, data, nibbleindex); if (cmd) { m_undostack->push(cmd); + } else { + return false; } emit documentChanged(); + return true; } void QHexDocument::Append(QHexCursor *cursor, uchar b, int nibbleindex) { @@ -742,15 +746,19 @@ void QHexDocument::Append(QHexCursor *cursor, const QByteArray &data, emit documentChanged(); } -void QHexDocument::Replace(QHexCursor *cursor, qsizetype offset, +bool QHexDocument::Replace(QHexCursor *cursor, qsizetype offset, const QByteArray &data, int nibbleindex) { - if (m_readonly || m_islocked) - return; + if (m_readonly || m_islocked) { + return false; + } auto cmd = MakeReplace(nullptr, cursor, offset, data, nibbleindex); if (cmd) { m_undostack->push(cmd); + } else { + return false; } emit documentChanged(); + return true; } bool QHexDocument::Remove(QHexCursor *cursor, qsizetype offset, qsizetype len, diff --git a/3rdparty/QHexView/document/qhexdocument.h b/3rdparty/QHexView/document/qhexdocument.h index 5fff4a6..0b9f02f 100644 --- a/3rdparty/QHexView/document/qhexdocument.h +++ b/3rdparty/QHexView/document/qhexdocument.h @@ -148,14 +148,14 @@ public slots: void beginMarco(const QString &text); void endMarco(); - void Insert(QHexCursor *cursor, qsizetype offset, uchar b, int nibbleindex); - void Insert(QHexCursor *cursor, qsizetype offset, const QByteArray &data, + bool Insert(QHexCursor *cursor, qsizetype offset, uchar b, int nibbleindex); + bool Insert(QHexCursor *cursor, qsizetype offset, const QByteArray &data, int nibbleindex); void Append(QHexCursor *cursor, uchar b, int nibbleindex); void Append(QHexCursor *cursor, const QByteArray &data, int nibbleindex); - void Replace(QHexCursor *cursor, qsizetype offset, uchar b, + bool Replace(QHexCursor *cursor, qsizetype offset, uchar b, int nibbleindex); - void Replace(QHexCursor *cursor, qsizetype offset, const QByteArray &data, + bool Replace(QHexCursor *cursor, qsizetype offset, const QByteArray &data, int nibbleindex = 0); bool Remove(QHexCursor *cursor, qsizetype offset, qsizetype len, int nibbleindex = 0); diff --git a/3rdparty/QHexView/qhexview.cpp b/3rdparty/QHexView/qhexview.cpp index 50bd494..b5adb87 100644 --- a/3rdparty/QHexView/qhexview.cpp +++ b/3rdparty/QHexView/qhexview.cpp @@ -355,7 +355,7 @@ qsizetype QHexView::findPrevious(qsizetype begin, const QByteArray &ba) { bool QHexView::RemoveSelection(int nibbleindex) { if (!m_cursor->hasSelection()) - return false; + return true; auto total = m_cursor->selectionCount(); m_document->beginMarco(QStringLiteral("RemoveSelection")); @@ -375,7 +375,7 @@ bool QHexView::RemoveSelection(int nibbleindex) { bool QHexView::removeSelection() { if (!m_cursor->hasSelection()) - return false; + return true; // We essure selections are ordered by desending // by selection-start, so it's safe to remove @@ -417,7 +417,7 @@ QByteArrayList QHexView::selectedBytes() const { return res; } -void QHexView::paste(bool hex) { +bool QHexView::paste(bool hex) { QClipboard *c = qApp->clipboard(); QByteArray data; @@ -426,19 +426,28 @@ void QHexView::paste(bool hex) { } else { auto d = c->mimeData(); data = d->data(QStringLiteral("application/octet-stream")); + if (data.isEmpty()) { + data = d->text().toUtf8(); + } } - if (data.isEmpty()) - return; + if (data.isEmpty()) { + return true; + } - this->removeSelection(); + auto ret = this->removeSelection(); + if (!ret) { + return false; + } auto pos = m_cursor->position().offset(); if (!m_document->isKeepSize()) { - m_document->insert(pos, data); + bool ret = m_document->insert(pos, data); m_cursor->moveTo(pos + data.length()); // added by wingsummer - } else - m_document->replace(pos, data); + return ret; + } else { + return m_document->replace(pos, data); + } } bool QHexView::Cut(bool hex, int nibbleindex) { @@ -457,7 +466,7 @@ bool QHexView::Cut(bool hex, int nibbleindex) { } } -void QHexView::Paste(bool hex, int nibbleindex) { +bool QHexView::Paste(bool hex, int nibbleindex) { QClipboard *c = qApp->clipboard(); QByteArray data; @@ -466,19 +475,27 @@ void QHexView::Paste(bool hex, int nibbleindex) { } else { auto d = c->mimeData(); data = d->data(QStringLiteral("application/octet-stream")); + if (data.isEmpty()) { + data = d->text().toUtf8(); + } } - if (data.isEmpty()) - return; + if (data.isEmpty()) { + return true; + } - this->RemoveSelection(nibbleindex); + auto ret = this->RemoveSelection(nibbleindex); + if (!ret) { + return false; + } auto pos = m_cursor->position().offset(); if (m_cursor->insertionMode() == QHexCursor::InsertionMode::InsertMode) { - m_document->Insert(m_cursor, pos, data, nibbleindex); + auto ret = m_document->Insert(m_cursor, pos, data, nibbleindex); m_cursor->moveTo(pos + data.length()); // added by wingsummer + return ret; } else { - m_document->Replace(m_cursor, pos, data, nibbleindex); + return m_document->Replace(m_cursor, pos, data, nibbleindex); } } diff --git a/3rdparty/QHexView/qhexview.h b/3rdparty/QHexView/qhexview.h index 9df6973..1c7e4c5 100644 --- a/3rdparty/QHexView/qhexview.h +++ b/3rdparty/QHexView/qhexview.h @@ -135,10 +135,10 @@ public: bool cut(bool hex); bool copy(bool hex = false); - void paste(bool hex = false); + bool paste(bool hex = false); bool Cut(bool hex = false, int nibbleindex = 0); - void Paste(bool hex = false, int nibbleindex = 0); + bool Paste(bool hex = false, int nibbleindex = 0); void Replace(qsizetype offset, uchar b, int nibbleindex); void Replace(qsizetype offset, const QByteArray &data, int nibbleindex = 0); diff --git a/3rdparty/WingCodeEdit b/3rdparty/WingCodeEdit index e5cef2d..3a5bb0d 160000 --- a/3rdparty/WingCodeEdit +++ b/3rdparty/WingCodeEdit @@ -1 +1 @@ -Subproject commit e5cef2dcf126037ffdc57a5aaf6a3b1d3f4c70ae +Subproject commit 3a5bb0d8bc45b6150ed4a7513b0712b0a5954a74 diff --git a/lang/zh_CN/winghex_zh_CN.ts b/lang/zh_CN/winghex_zh_CN.ts index 58c1e57..ca635fd 100644 --- a/lang/zh_CN/winghex_zh_CN.ts +++ b/lang/zh_CN/winghex_zh_CN.ts @@ -206,47 +206,47 @@ CodeEdit - + Copy 复制 - + Cut 剪切 - + Paste 粘贴 - + Find 查找 - + Replace 替换 - + Goto 跳转 - + Comment/UnComment 注释/取消注释 - + Fold/UnFold 折叠/展开 - + FoldAll 折叠所有 @@ -853,7 +853,7 @@ - + View 视图 @@ -890,8 +890,8 @@ - - + + Plugin 插件 @@ -901,299 +901,300 @@ 设置 - - + + Log 日志 - + ExportFindResult 导出搜索结果 - + ClearFindResult 清空记录 - - + + FindResult 搜索结果 - - - - - + + + + + + Copy 复制 - - - - - + + + + + CopyToClipBoard 数据已拷贝到粘贴板 - + LittleEndian 小端 - + BigEndian 大端 - + Number 数值 - - + + CheckSum 校验和 - - + + DeleteBookMark 删除书签 - - + + ClearBookMark 清空书签 - - - + + + BookMark 书签 - + DecodeText 解码字符串 - + ScriptConsole 脚本控制台 - - + + Basic 基础 - + New 新建 - + OpenF 打开文件 - + OpenWorkSpace 打开工作区 - + RecentFiles 最近打开 - - - + + + Reload 重新加载 - - + + Save 保存 - + SaveAs 另存为 - + ConvertWS 转为工作区 - + Export 导出 - + SaveSel 保存选区字节 - - - - + + + + General 基本 - + Undo 撤销 - + Redo 恢复 - + Cut 剪切 - + Paste 粘贴 - + Delete 删除 - + Clone 克隆 - + Lookup 查询 - + Find 查找 - + Goto 跳转 - - + + Encoding 编码 - + FileInfo 文件信息 - - + + Hex 十六进制 - + CutHex 剪切(十六进制) - + CopyHex 复制(十六进制) - + PasteHex 粘贴(十六进制) - - + + Fill 填充 - + FillZero 填充零 - - - - - + + + + + MetaData 标注 - + DeleteMetadata 删除标注 - + ClearMetadata 清空标注 - + MetaDataEdit 编辑标注 - + DeleteMetaData 删除标注 - + ClearMetaData 清空标注 - + Display 显示 - + ViewText 文本预览 - + Scale 缩放 @@ -1278,82 +1279,82 @@ 无扩展 - - + + ExportResult 导出结果 - + NothingToSave 没有保存的数据 - + OpenExt 打开 - 拓展 - + ResetScale 重置缩放 - + ShowMetafg 标注前景色 - + ShowMetabg 标注背景色 - + ShowMetaComment 批注 - + MetaShowAll 显示所有标注 - + MetaHideAll 隐藏所有标注 - + FileStatus 文件状态 - + InfoSave 是否保存 - + ReadOnly 可读写 - + SetLocked 启用/禁用锁定编辑 - + ErrUnLock 锁定编辑失败 - + SetOver 启用/禁用改变大小 @@ -1368,687 +1369,692 @@ 脚本引擎启动失败,将自动禁用该功能。 - + UnsignedHex 无符号 Hex - + BgScriptOutputHere 后台脚本执行将会在这里输出 - + SelectAll 全选 - - + + Clear 清空 - + AbortScript 终止脚本 - + BgScriptOutput 后台脚本输出 - + ErrUnOver 锁定文件大小失败 - + Window 窗体 - + Editor 编辑器 - + Tools 工具 - + HexEditorLayout 编辑器布局 - + SetBaseAddr 设置基址 - + addressBase 基址 - + inputAddressBase 请输入基址 - + WarnBigBaseAddress 基址过大,你得到的地址将会不正确! - + ErrBaseAddress 非法基址输入 - + SetColInfo 显示/隐藏地址栏 - + SetHeaderInfo 显示/隐藏表头 - + SetAsciiString 显示/隐藏解码字符串 - + Layout 布局 - + Fullscreen 全屏 - + Default 默认 - - - + + + LayoutRestoring... 恢复布局中... - + RestoreLayout 恢复布局 - - + + SaveLayout 保存布局 - - + + ExportLog 导出日志 - - + + ClearLog 清空日志 - + InsepctQt 监视 Qt - + ScriptEditor 脚本编辑器 - + Scripts 脚本仓库 - + PluginFunctions 插件功能 - + ScriptSetting 脚本设置 - + PluginSettings 插件设置 - + Info 信息 - + Software 软件 - + Sponsor 赞助 - + CheckUpdate 检查更新 - + Wiki 网页 Wiki - + AboutQT 关于 QT - + SetPageIDEmptyTryUseName 设置页 ID 为空,尝试使用名称作为 ID - + SetPageDupNameIgnored 设置页重复的 ID 名称,已忽略加载 - + Plugin %1 contains a duplicate ID (%2) that is already registered by plugin %3 插件 %1 包含重复 ID (%2),该 ID 已被插件 %3 注册 - - + + ChooseFile 选择文件 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + + + Error 错误 - - + + FileNotExist 文件不存在! - - - - - + + + + + FilePermission 因文件权限无法继续! - + ProjectFile (*.wingpro) 项目文件 (*.wingpro) - + ReloadSuccessfully 文件重新加载成功! - + ReloadUnSuccessfully 文件重新加载失败! - - - - + + + + ChooseSaveFile 请选择保存文件路径: - + + PasteFailedNote + 粘贴失败,请注意权限或者内容长度 + + + NoMoreClone 克隆已到上限,无法继续操作! - + FindFininishBusy 查找任务繁忙,请勿重复查找! - + MayTooMuchFindResult 搜索数量已到达上限,结果可能不全,建议请按区段搜索。 - + SaveLayoutSuccess 保存布局成功 - + SaveLayoutError 保存布局失败 - + HasClonedView 该编辑页已被克隆编辑,如果关闭,相关联的页也会被关闭,你确认继续吗? - + FileCloseBigFile 大文件读取模式下目标文件被关闭,该标签将会被关闭。 - - + + ReloadNeededYesOrNo 目标文件被修改,是否重新加载? - + SaveWorkSpace 保存工作区 - + WingHexWorkSpace (*.wingpro) 羽云十六进制工作区 (*.wingpro) - + ConfirmSave 正在关闭未保存的文件或工作区,你确定保存吗? - + [Info] 【信息】 - + [Warn] 【警告】 - + [Error] 【错误】 - + ConfirmAPPSave 你尝试关闭程序,但仍存在未保存的文件或工作区,你确定保存这些更改吗? - - - + + + SaveSuccessfully 保存成功! - - + + SaveWSError 保存工作区错误! - - + + Warn 警告 - + Opening... 打开文件中... - + WorkSpaceOpening... 打开工作区中... - + Reloading... 重载文件中... - + Saving... 保存中... - + SaveNewFirst 请首先保存新建的文件 - + AlreadyWorkSpace 已经是工作区,无需转化 - + ConvWorkSpaceFailed 转化为工作区失败 - + ConvWorkSpaceSuccess 转化为工作区成功 - + SavingAs... 另存为中... - + SaveUnSuccessfully 保存失败! - + Exporting... 导出中... - + ChooseExportFile 请选择导出文件路径: - + ExportSuccessfully 导出成功! - + ExportUnSuccessfully 导出失败! - + SavingSel... 保存选中字节中... - + SaveSelSuccess 保存选区字节成功! - + SaveSelError 保存选区字节失败,因文件不具有可写权限! - - + + CutToClipBoard 数据已剪切到粘贴板! - - + + UnCutToClipBoard 由于保持大小限制,数据剪切到粘贴板失败! - - + + UnCopyToClipBoard 由于保持大小限制,数据剪切到复制板失败! - - + + Finding... 查找中... - + DeleteSuccess 删除成功 - + DeleteFailed 删除失败 - + FindFininish 查找结果完毕! - + PleaseInputFill 请输入填充字节值 - + FillInputTruncWarn 填充输入数值过大,将会被截断填充 - + FillInputError 填充字节输入错误 - + InputComment 请输入批注: - + BookmarkDelSuccess 删除书签成功 - + BookmarkDelNoItem 无书签可删除 - + BookmarkClearSuccess 书签清空完毕 - - - + + + NoSelection 没有选区,无法继续的操作! - + NoMetaData 无可编辑标记 - + PleaseClearSel 请清空选择 - + MetaDelSuccess 元数据删除成功 - + MetaDelNoItem 无元数据可删除 - + MetaClearSuccess 元数据清空完毕 - + FindResultExporting... 查找结果导出中... - - + + EmptyFindResult 没有可导出的搜索结果! - + SaveFindResult 导出搜索结果成功! - + SaveFindResultError 导出结果失败! - + TooManyBytesDecode 超出解码字节限制…… - + NoTextFileMayInvalid 该文件不是文本文件,以文本方式预览并不是一个好的方式,你确认继续吗? - + LayoutSaving... 布局保存中... - + PleaseInput 请输入 - + LogExporting... 日志导出中... - + ExportLogError 导出日志失败! - + ExportLogSuccess 导出日志成功,路径: - + ClearLogSuccess 清空日志成功! - + BadNetwork 无法与远程服务器的更新检查建立连接,请检查网络。 - + NewestVersion 当前软件为最新版本 - + OlderVersion 你使用的软件为老版本,建议到 Github 和 Gitee 的仓库发行版下载更新。 - + CheckingUpdate 检查更新中…… - + Too much opened files 打开的文件过多,无法继续操作! - + FilePermissionSure2Quit 因文件权限无法保存,你确认要退出吗? - + UnknownErrorSure2Quit 因未知错误无法保存,你确认要退出吗? - + WorkSpaceUnSavedSure2Quit 工作区文件无法保存,你确认要退出吗? - + CopyLimit 拷贝字节超出限制 - + ErrOpenFileBelow 打开文件出现错误(由于权限不足),如下为打开错误的文件: @@ -4544,33 +4550,33 @@ 【控制台】 - + MultiCodeCanNotUndo 多行代码粘贴后将不能修改 - + Copy 复制 - + Cut 剪切 - + Paste 粘贴 - - + + Clear 清空 - + AbortScript 终止脚本 @@ -5119,7 +5125,7 @@ 该选项重启软件生效 - + This will reset all settings. Are you sure to continue? 这将会重置所有设置。你确认继续吗? @@ -5127,7 +5133,7 @@ SettingManager - + ConfigUnableSave 程序将无法保存配置,请检查配置文件权限。 diff --git a/lang/zh_TW/winghex_zh_TW.ts b/lang/zh_TW/winghex_zh_TW.ts index 8b701e3..7a7909f 100644 --- a/lang/zh_TW/winghex_zh_TW.ts +++ b/lang/zh_TW/winghex_zh_TW.ts @@ -206,47 +206,47 @@ CodeEdit - + Copy 複製 - + Cut 剪切 - + Paste 粘貼 - + Find 查找 - + Replace 替換 - + Goto 跳轉 - + Comment/UnComment 注釋/取消注釋 - + Fold/UnFold 折疊/展開 - + FoldAll 折疊所有 @@ -853,7 +853,7 @@ - + View 視圖 @@ -890,8 +890,8 @@ - - + + Plugin 插件 @@ -901,299 +901,300 @@ 設置 - - + + Log 日誌 - + ExportFindResult 導出搜索結果 - + ClearFindResult 清空記錄 - - + + FindResult 搜索結果 - - - - - + + + + + + Copy 複製 - - - - - + + + + + CopyToClipBoard 數據已拷貝到粘貼板 - + LittleEndian 小端 - + BigEndian 大端 - + Number 數值 - - + + CheckSum 校驗和 - - + + DeleteBookMark 刪除書簽 - - + + ClearBookMark 清空書簽 - - - + + + BookMark 書簽 - + DecodeText 解碼字串 - + ScriptConsole 腳本控制臺 - - + + Basic 基礎 - + New 新建 - + OpenF 打開檔 - + OpenWorkSpace 打開工作區 - + RecentFiles 最近打開 - - - + + + Reload 重新加載 - - + + Save 保存 - + SaveAs 另存為 - + ConvertWS 轉為工作區 - + Export 導出 - + SaveSel 保存選區位元組 - - - - + + + + General 基本 - + Undo 撤銷 - + Redo 恢復 - + Cut 剪切 - + Paste 粘貼 - + Delete 刪除 - + Clone 克隆 - + Lookup 查詢 - + Find 查找 - + Goto 跳轉 - - + + Encoding 編碼 - + FileInfo 檔資訊 - - + + Hex 十六進制 - + CutHex 剪切(十六進制) - + CopyHex 複製(十六進制) - + PasteHex 粘貼(十六進制) - - + + Fill 填充 - + FillZero 填充零 - - - - - + + + + + MetaData 標注 - + DeleteMetadata 刪除標注 - + ClearMetadata 清空標注 - + MetaDataEdit 編輯標注 - + DeleteMetaData 刪除標注 - + ClearMetaData 清空標注 - + Display 顯示 - + ViewText 文本預覽 - + Scale 縮放 @@ -1278,82 +1279,82 @@ 無擴展 - - + + ExportResult 導出結果 - + NothingToSave 沒有保存的數據 - + OpenExt 打開 - 拓展 - + ResetScale 重置縮放 - + ShowMetafg 標注前景色 - + ShowMetabg 標注背景色 - + ShowMetaComment 批註 - + MetaShowAll 顯示所有標注 - + MetaHideAll 隱藏所有標注 - + FileStatus 檔狀態 - + InfoSave 是否保存 - + ReadOnly 可讀寫 - + SetLocked 啟用/禁用鎖定編輯 - + ErrUnLock 鎖定編輯失敗 - + SetOver 啟用/禁用改變大小 @@ -1368,687 +1369,692 @@ 腳本引擎啟動失敗,將自動禁用該功能。 - + UnsignedHex 無符號 Hex - + BgScriptOutputHere 後臺腳本執行將會在這裏輸出 - + SelectAll 全選 - - + + Clear 清空 - + AbortScript 終止腳本 - + BgScriptOutput 後臺腳本輸出 - + ErrUnOver 鎖定檔大小失敗 - + Window 窗體 - + Editor 編輯器 - + Tools 工具 - + HexEditorLayout 編輯器佈局 - + SetBaseAddr 設置基址 - + addressBase 基址 - + inputAddressBase 請輸入基址 - + WarnBigBaseAddress 基址過大,你得到的地址將會不正確! - + ErrBaseAddress 非法基址輸入 - + SetColInfo 顯示/隱藏地址欄 - + SetHeaderInfo 顯示/隱藏表頭 - + SetAsciiString 顯示/隱藏解碼字串 - + Layout 佈局 - + Fullscreen 全屏 - + Default 默認 - - - + + + LayoutRestoring... 恢復佈局中... - + RestoreLayout 恢復佈局 - - + + SaveLayout 保存佈局 - - + + ExportLog 導出日誌 - - + + ClearLog 清空日誌 - + InsepctQt 監視 Qt - + ScriptEditor 腳本編輯器 - + Scripts 腳本倉庫 - + PluginFunctions 插件功能 - + ScriptSetting 腳本設置 - + PluginSettings 插件設置 - + Info 資訊 - + Software 軟體 - + Sponsor 贊助 - + CheckUpdate 檢查更新 - + Wiki 網頁 Wiki - + AboutQT 關於 QT - + SetPageIDEmptyTryUseName 設置頁 ID 為空,嘗試使用名稱作為 ID - + SetPageDupNameIgnored 設置頁重複的 ID 名稱,已忽略加載 - + Plugin %1 contains a duplicate ID (%2) that is already registered by plugin %3 插件 %1 包含重複 ID (%2),該 ID 已被插件 %3 註冊 - - + + ChooseFile 選擇檔 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - + + + + + Error 錯誤 - - + + FileNotExist 檔不存在! - - - - - + + + + + FilePermission 因檔許可權無法繼續! - + ProjectFile (*.wingpro) 專案檔 (*.wingpro) - + ReloadSuccessfully 檔重新加載成功! - + ReloadUnSuccessfully 檔重新加載失敗! - - - - + + + + ChooseSaveFile 請選擇保存檔路徑: - + + PasteFailedNote + 粘貼失敗,請注意許可權或者內容長度 + + + NoMoreClone 克隆已到上限,無法繼續操作! - + FindFininishBusy 查找任務繁忙,請勿重複查找! - + MayTooMuchFindResult 搜索數量已到達上限,結果可能不全,建議請按區段搜索。 - + SaveLayoutSuccess 保存佈局成功 - + SaveLayoutError 保存佈局失敗 - + HasClonedView 該編輯頁已被克隆編輯,如果關閉,相關聯的頁也會被關閉,你確認繼續嗎? - + FileCloseBigFile 大檔讀取模式下目的檔案被關閉,該標籤將會被關閉。 - - + + ReloadNeededYesOrNo 目的檔案被修改,是否重新載入? - + SaveWorkSpace 保存工作區 - + WingHexWorkSpace (*.wingpro) 羽雲十六進制工作區 (*.wingpro) - + ConfirmSave 正在關閉未保存的檔或工作區,你確定保存嗎? - + [Info] 【資訊】 - + [Warn] 【警告】 - + [Error] 【錯誤】 - + ConfirmAPPSave 你嘗試關閉程式,但仍存在未保存的檔或工作區,你確定保存這些更改嗎? - - - + + + SaveSuccessfully 保存成功! - - + + SaveWSError 保存工作區錯誤! - - + + Warn 警告 - + Opening... 打開檔中... - + WorkSpaceOpening... 打開工作區中... - + Reloading... 重載檔中... - + Saving... 保存中... - + SaveNewFirst 請首先保存新建的檔 - + AlreadyWorkSpace 已經是工作區,無需轉化 - + ConvWorkSpaceFailed 轉化為工作區失敗 - + ConvWorkSpaceSuccess 轉化為工作區成功 - + SavingAs... 另存為中... - + SaveUnSuccessfully 保存失敗! - + Exporting... 導出中... - + ChooseExportFile 請選擇導出檔路徑: - + ExportSuccessfully 導出成功! - + ExportUnSuccessfully 導出失敗! - + SavingSel... 保存選中位元組中... - + SaveSelSuccess 保存選區位元組成功! - + SaveSelError 保存選區位元組失敗,因檔不具有可寫許可權! - - + + CutToClipBoard 數據已剪切到粘貼板! - - + + UnCutToClipBoard 由於保持大小限制,數據剪切到粘貼板失敗! - - + + UnCopyToClipBoard 由於保持大小限制,數據剪切到複製板失敗! - - + + Finding... 查找中... - + DeleteSuccess 刪除成功 - + DeleteFailed 刪除失敗 - + FindFininish 查找結果完畢! - + PleaseInputFill 請輸入填充位元組值 - + FillInputTruncWarn 填充輸入數值過大,將會被截斷填充 - + FillInputError 填充位元組輸入錯誤 - + InputComment 請輸入批註: - + BookmarkDelSuccess 刪除書簽成功 - + BookmarkDelNoItem 無書簽可刪除 - + BookmarkClearSuccess 書簽清空完畢 - - - + + + NoSelection 沒有選區,無法繼續的操作! - + NoMetaData 無可編輯標記 - + PleaseClearSel 請清空選擇 - + MetaDelSuccess 元數據刪除成功 - + MetaDelNoItem 無元數據可刪除 - + MetaClearSuccess 元數據清空完畢 - + FindResultExporting... 查找結果導出中... - - + + EmptyFindResult 沒有可導出的搜索結果! - + SaveFindResult 導出搜索結果成功! - + SaveFindResultError 導出結果失敗! - + TooManyBytesDecode 超出解碼位元組限制…… - + NoTextFileMayInvalid 該檔不是文本檔,以文本方式預覽並不是一個好的方式,你確認繼續嗎? - + LayoutSaving... 佈局保存中... - + PleaseInput 請輸入 - + LogExporting... 日誌導出中... - + ExportLogError 導出日誌失敗! - + ExportLogSuccess 導出日誌成功,路徑: - + ClearLogSuccess 清空日誌成功! - + BadNetwork 無法與遠程伺服器的更新檢查建立連接,請檢查網路。 - + NewestVersion 當前軟體為最新版本 - + OlderVersion 你使用的軟體為老版本,建議到 Github 和 Gitee 的倉庫發行版下載更新。 - + CheckingUpdate 檢查更新中…… - + Too much opened files 打開的檔過多,無法繼續操作! - + FilePermissionSure2Quit 因檔許可權無法保存,你確認要退出嗎? - + UnknownErrorSure2Quit 因未知錯誤無法保存,你確認要退出嗎? - + WorkSpaceUnSavedSure2Quit 工作區檔無法保存,你確認要退出嗎? - + CopyLimit 拷貝位元組超出限制 - + ErrOpenFileBelow 打開檔出現錯誤(由於許可權不足),如下為打開錯誤的檔: @@ -4544,33 +4550,33 @@ 【控制臺】 - + MultiCodeCanNotUndo 多行代碼粘貼後將不能修改 - + Copy 複製 - + Cut 剪切 - + Paste 粘貼 - - + + Clear 清空 - + AbortScript 終止腳本 @@ -5119,7 +5125,7 @@ 該選項重啟軟體生效 - + This will reset all settings. Are you sure to continue? 這將會重置所有設置。你確認繼續嗎? @@ -5127,7 +5133,7 @@ SettingManager - + ConfigUnableSave 程式將無法保存配置,請檢查配置檔許可權。 diff --git a/src/class/ascompletion.cpp b/src/class/ascompletion.cpp index 819ddfd..983a4c9 100644 --- a/src/class/ascompletion.cpp +++ b/src/class/ascompletion.cpp @@ -126,7 +126,7 @@ void AsCompletion::applyClassNodes(QList &nodes) { for (auto &item : n) { if (item.type == CodeInfoTip::Type::Class) { for (auto &c : item.children) { - if (c.type == CodeInfoTip::Type::Function) { + if (c.type == CodeInfoTip::Type::ClsFunction) { if (!c.addinfo.contains(CodeInfoTip::RetType)) { continue; } @@ -361,6 +361,8 @@ bool AsCompletion::processTrigger(const QString &trigger, processTrigger(*DOT_TRIGGER, content.left(etoken.pos)); setCompletionPrefix(prefix); return true; + } else if (etoken.content == QByteArrayLiteral(")")) { + // ignore } else { applyEmptyNsNode(nodes, docNodes); } @@ -370,48 +372,60 @@ bool AsCompletion::processTrigger(const QString &trigger, } if (trigger == *DOT_TRIGGER) { - // member type guessing ? basic match is enough. (>n<) - auto isBasicType = [](const QString &type) { - static QStringList basicType{ - "int", "int8", "int16", "int32", "int64", - "uint", "uint8", "uint16", "uint32", "uint64", - "float", "double", "byte"}; + if (etoken.type == asTC_IDENTIFIER) { + // member type guessing ? basic match is enough. (>n<) + auto isBasicType = [](const QByteArray &type) { + static QByteArrayList basicType{ + "int", "int8", "int16", "int32", "int64", + "uint", "uint8", "uint16", "uint32", "uint64", + "float", "double", "byte"}; - return basicType.contains(type); - }; + return basicType.contains(type); + }; - auto clsNodes = parser.classNodes(); + auto clsNodes = parser.classNodes(); - // filter the type we can use to auto-complete in docNodes - for (auto &item : docNodes) { - if (item.type == CodeInfoTip::Type::Class) { - auto name = item.nameSpace; - if (name.isEmpty()) { - name = item.name; - } else { - name += QStringLiteral("::") + item.name; + // filter the type we can use to auto-complete in docNodes + for (auto &item : docNodes) { + if (item.type == CodeInfoTip::Type::Class) { + auto name = item.nameSpace; + if (name.isEmpty()) { + name = item.name; + } else { + name += QStringLiteral("::") + item.name; + } + clsNodes.insert(name, item.children); } - clsNodes.insert(name, item.children); + // a typedef can only be used to define an alias + // for primitive types, so NO NEED for auto-completing } - // a typedef can only be used to define an alias - // for primitive types, so NO NEED for auto-completing - } - tokens.removeLast(); - auto ns = getNamespace(tokens); - for (auto &item : docNodes) { - if (etoken.content == item.name && ns == item.nameSpace) { - auto retType = item.addinfo.value(CodeInfoTip::RetType); + tokens.removeLast(); + auto ns = getNamespace(tokens); + for (auto &item : docNodes) { + if (etoken.content == item.name && ns == item.nameSpace) { + auto retType = item.addinfo.value(CodeInfoTip::RetType); + auto decl = engine->GetTypeInfoByDecl(retType.toUtf8()); + if (decl) { + QByteArray type = decl->GetNamespace(); + if (type.isEmpty()) { + type = decl->GetName(); + } else { + type += + (QByteArrayLiteral("::") + decl->GetName()); + } - // auto type inference is not supported. - // PRs will be welcomed !!! - if (isBasicType(retType)) { - popup()->hide(); - return false; + // auto type inference is not supported. + // PRs will be welcomed !!! + if (isBasicType(type)) { + popup()->hide(); + return false; + } + + nodes.append(clsNodes.value(type)); + break; + } } - - nodes.append(clsNodes.value(retType)); - break; } } diff --git a/src/class/scriptsettings.cpp b/src/class/scriptsettings.cpp index ad30222..b487b87 100644 --- a/src/class/scriptsettings.cpp +++ b/src/class/scriptsettings.cpp @@ -33,12 +33,24 @@ _setUnsavedEditor.setFlag(flag, false); \ } +#define WRITE_CONFIG_EDITOR_RESET(config, flag, dvalue) \ + do { \ + WRITE_CONFIG(config, dvalue); \ + _setUnsavedEditor.setFlag(flag, false); \ + } while (0); + #define WRITE_CONFIG_CONSOLE_SET(config, flag, dvalue) \ if (this->_setUnsavedConsole.testFlag(flag)) { \ WRITE_CONFIG(config, dvalue); \ _setUnsavedConsole.setFlag(flag, false); \ } +#define WRITE_CONFIG_CONSOLE_RESET(config, flag, dvalue) \ + do { \ + WRITE_CONFIG(config, dvalue); \ + _setUnsavedConsole.setFlag(flag, false); \ + } while (0); + Q_GLOBAL_STATIC_WITH_ARGS(QString, CODEEDIT_FONT, ("codeedit.font")) Q_GLOBAL_STATIC_WITH_ARGS(QString, CODEEDIT_FONT_SIZE, ("codeedit.fontsize")) Q_GLOBAL_STATIC_WITH_ARGS(QString, CODEEDIT_THEME, ("codeedit.theme")) @@ -200,56 +212,59 @@ void ScriptSettings::save(SETTINGS cat) { } void ScriptSettings::reset(SETTINGS cat) { + __reset(cat); + load(); +} + +void ScriptSettings::__reset(SETTINGS cat) { HANDLE_CONFIG; if (cat.testFlag(SETTING::EDITOR)) { - WRITE_CONFIG_EDITOR_SET(CODEEDIT_FONT, SETTING_ITEM::FONT, - _defaultFont.defaultFamily()); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_FONT_SIZE, SETTING_ITEM::FONT_SIZE, - 10); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_THEME, SETTING_ITEM::THEME, {}); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_TABS_WIDTH, SETTING_ITEM::TAB_WIDTH, - 4); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_INDENTATION, SETTING_ITEM::INDENTATION, - 0); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_MATCH_BRACES, - SETTING_ITEM::MATCH_BRACES, true); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_WORD_WRAP, SETTING_ITEM::WORD_WRAP, - false); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_SHOW_LINENUMBER, - SETTING_ITEM::SHOW_LINENUMBER, true); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_SHOW_FOLDING, - SETTING_ITEM::SHOW_FOLDING, true); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_SHOW_INDENTGUIDES, - SETTING_ITEM::SHOW_INDENTGUIDES, true); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_SHOW_LONGLINEEDGE, - SETTING_ITEM::SHOW_LONGLINEEDGE, false); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_SHOW_WHITESPACE, - SETTING_ITEM::SHOW_WHITESPACE, false); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_AUTO_CLOSE_CHAR, - SETTING_ITEM::AUTO_CLOSE_CHAR, true); - WRITE_CONFIG_EDITOR_SET(CODEEDIT_AUTO_IDEN, SETTING_ITEM::AUTO_IDEN, - true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_FONT, SETTING_ITEM::FONT, + _defaultFont.defaultFamily()); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_FONT_SIZE, SETTING_ITEM::FONT_SIZE, + 10); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_THEME, SETTING_ITEM::THEME, {}); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_TABS_WIDTH, SETTING_ITEM::TAB_WIDTH, + 4); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_INDENTATION, + SETTING_ITEM::INDENTATION, 0); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_MATCH_BRACES, + SETTING_ITEM::MATCH_BRACES, true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_WORD_WRAP, SETTING_ITEM::WORD_WRAP, + false); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_SHOW_LINENUMBER, + SETTING_ITEM::SHOW_LINENUMBER, true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_SHOW_FOLDING, + SETTING_ITEM::SHOW_FOLDING, true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_SHOW_INDENTGUIDES, + SETTING_ITEM::SHOW_INDENTGUIDES, true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_SHOW_LONGLINEEDGE, + SETTING_ITEM::SHOW_LONGLINEEDGE, false); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_SHOW_WHITESPACE, + SETTING_ITEM::SHOW_WHITESPACE, false); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_AUTO_CLOSE_CHAR, + SETTING_ITEM::AUTO_CLOSE_CHAR, true); + WRITE_CONFIG_EDITOR_RESET(CODEEDIT_AUTO_IDEN, SETTING_ITEM::AUTO_IDEN, + true); } if (cat.testFlag(SETTING::CONSOLE)) { - WRITE_CONFIG_CONSOLE_SET(CONSOLE_FONT, SETTING_ITEM::FONT, - _defaultFont.defaultFamily()); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_FONT_SIZE, SETTING_ITEM::FONT_SIZE, - 10); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_THEME, SETTING_ITEM::THEME, {}); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_TABS_WIDTH, SETTING_ITEM::TAB_WIDTH, - 4); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_INDENTATION, SETTING_ITEM::INDENTATION, - 0); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_MATCH_BRACES, - SETTING_ITEM::MATCH_BRACES, true); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_SHOW_WHITESPACE, - SETTING_ITEM::SHOW_WHITESPACE, false); - WRITE_CONFIG_CONSOLE_SET(CONSOLE_AUTO_CLOSE_CHAR, - SETTING_ITEM::AUTO_CLOSE_CHAR, true); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_FONT, SETTING_ITEM::FONT, + _defaultFont.defaultFamily()); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_FONT_SIZE, SETTING_ITEM::FONT_SIZE, + 10); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_THEME, SETTING_ITEM::THEME, {}); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_TABS_WIDTH, SETTING_ITEM::TAB_WIDTH, + 4); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_INDENTATION, + SETTING_ITEM::INDENTATION, 0); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_MATCH_BRACES, + SETTING_ITEM::MATCH_BRACES, true); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_SHOW_WHITESPACE, + SETTING_ITEM::SHOW_WHITESPACE, false); + WRITE_CONFIG_CONSOLE_RESET(CONSOLE_AUTO_CLOSE_CHAR, + SETTING_ITEM::AUTO_CLOSE_CHAR, true); } - - load(); } ScriptSettings::ScriptSettings() : QObject() { diff --git a/src/class/scriptsettings.h b/src/class/scriptsettings.h index ee64b12..aecf05d 100644 --- a/src/class/scriptsettings.h +++ b/src/class/scriptsettings.h @@ -57,6 +57,8 @@ public: void save(SETTINGS cat = SETTING::ALL); void reset(SETTINGS cat = SETTING::ALL); + void __reset(SETTINGS cat); + public: QString editorFontFamily() const; void setEditorFontFamily(const QString &newEditorFontFamily); diff --git a/src/class/settingmanager.cpp b/src/class/settingmanager.cpp index 9ea8ef3..30b1da3 100644 --- a/src/class/settingmanager.cpp +++ b/src/class/settingmanager.cpp @@ -31,6 +31,12 @@ _setUnsaved.setFlag(SettingManager::SETTING_ITEM::config, false); \ } +#define WRITE_CONFIG_RESET(config, dvalue) \ + do { \ + WRITE_CONFIG(config, dvalue); \ + _setUnsaved.setFlag(SettingManager::SETTING_ITEM::config, false); \ + } while (0); + Q_GLOBAL_STATIC_WITH_ARGS(QString, DOCK_LAYOUT, ("dock.layout")) Q_GLOBAL_STATIC_WITH_ARGS(QString, SCRIPT_DOCK_LAYOUT, ("script.layout")) Q_GLOBAL_STATIC_WITH_ARGS(QString, APP_LASTUSED_PATH, ("app.lastusedpath")) @@ -423,45 +429,49 @@ void SettingManager::save(SETTINGS cat) { } void SettingManager::reset(SETTINGS cat) { + __reset(cat); + load(); +} + +void SettingManager::__reset(SETTINGS cat) { HANDLE_CONFIG; if (cat.testFlag(SETTING::APP)) { - WRITE_CONFIG_SET(SKIN_THEME, 0); - WRITE_CONFIG_SET(APP_LANGUAGE, QString()); - WRITE_CONFIG_SET(APP_FONTFAMILY, _defaultFont.family()); - WRITE_CONFIG_SET(APP_FONTSIZE, _defaultFont.pointSize()); - WRITE_CONFIG_SET(APP_WINDOWSIZE, Qt::WindowMaximized); + WRITE_CONFIG_RESET(SKIN_THEME, 0); + WRITE_CONFIG_RESET(APP_LANGUAGE, QString()); + WRITE_CONFIG_RESET(APP_FONTFAMILY, _defaultFont.family()); + WRITE_CONFIG_RESET(APP_FONTSIZE, _defaultFont.pointSize()); + WRITE_CONFIG_RESET(APP_WINDOWSIZE, Qt::WindowMaximized); } if (cat.testFlag(SETTING::PLUGIN)) { - WRITE_CONFIG_SET(PLUGIN_ENABLE, true); - WRITE_CONFIG_SET(PLUGIN_ENABLE_ROOT, false); + WRITE_CONFIG_RESET(PLUGIN_ENABLE, true); + WRITE_CONFIG_RESET(PLUGIN_ENABLE_ROOT, false); } if (cat.testFlag(SETTING::EDITOR)) { - WRITE_CONFIG_SET(EDITOR_FONTSIZE, _defaultFont.pointSize()); - WRITE_CONFIG_SET(EDITOR_SHOW_ADDR, true); - WRITE_CONFIG_SET(EDITOR_SHOW_COL, true); - WRITE_CONFIG_SET(EDITOR_SHOW_TEXT, true); - WRITE_CONFIG_SET(EDITOR_FIND_MAXCOUNT, 100); - WRITE_CONFIG_SET(EDITOR_COPY_LIMIT, 100); - WRITE_CONFIG_SET(EDITOR_DECSTRLIMIT, 10); + WRITE_CONFIG_RESET(EDITOR_FONTSIZE, _defaultFont.pointSize()); + WRITE_CONFIG_RESET(EDITOR_SHOW_ADDR, true); + WRITE_CONFIG_RESET(EDITOR_SHOW_COL, true); + WRITE_CONFIG_RESET(EDITOR_SHOW_TEXT, true); + WRITE_CONFIG_RESET(EDITOR_FIND_MAXCOUNT, 100); + WRITE_CONFIG_RESET(EDITOR_COPY_LIMIT, 100); + WRITE_CONFIG_RESET(EDITOR_DECSTRLIMIT, 10); } if (cat.testFlag(SETTING::SCRIPT)) { - WRITE_CONFIG_SET(SCRIPT_ENABLE, true); - WRITE_CONFIG_SET(SCRIPT_TIMEOUT, 10); - WRITE_CONFIG_SET(SCRIPT_ALLOW_USRSCRIPT_INROOT, false); - WRITE_CONFIG_SET(SCRIPT_USRHIDECATS, QStringList()); - WRITE_CONFIG_SET(SCRIPT_SYSHIDECATS, QStringList()); + WRITE_CONFIG_RESET(SCRIPT_ENABLE, true); + WRITE_CONFIG_RESET(SCRIPT_TIMEOUT, 10); + WRITE_CONFIG_RESET(SCRIPT_ALLOW_USRSCRIPT_INROOT, false); + WRITE_CONFIG_RESET(SCRIPT_USRHIDECATS, QStringList()); + WRITE_CONFIG_RESET(SCRIPT_SYSHIDECATS, QStringList()); } if (cat.testFlag(SETTING::OTHER)) { - WRITE_CONFIG_SET(OTHER_USESYS_FILEDIALOG, true); + WRITE_CONFIG_RESET(OTHER_USESYS_FILEDIALOG, true); #ifdef WINGHEX_USE_FRAMELESS - WRITE_CONFIG_SET(OTHER_USE_NATIVE_TITLEBAR, false); + WRITE_CONFIG_RESET(OTHER_USE_NATIVE_TITLEBAR, false); #endif - WRITE_CONFIG_SET(OTHER_DONT_USE_SPLASH, false); - WRITE_CONFIG_SET(OTHER_CHECK_UPDATE, false); - WRITE_CONFIG_SET(OTHER_LOG_LEVEL, Logger::defaultLevel()); - WRITE_CONFIG_SET(OTHER_LOG_COUNT, 20); + WRITE_CONFIG_RESET(OTHER_DONT_USE_SPLASH, false); + WRITE_CONFIG_RESET(OTHER_CHECK_UPDATE, false); + WRITE_CONFIG_RESET(OTHER_LOG_LEVEL, Logger::defaultLevel()); + WRITE_CONFIG_RESET(OTHER_LOG_COUNT, 20); } - load(); } qsizetype SettingManager::decodeStrlimit() const { return m_decodeStrlimit; } diff --git a/src/class/settingmanager.h b/src/class/settingmanager.h index 31f3ea4..a88c2a4 100644 --- a/src/class/settingmanager.h +++ b/src/class/settingmanager.h @@ -119,6 +119,8 @@ public: void save(SETTINGS cat = SETTING::ALL); void reset(SETTINGS cat); + void __reset(SETTINGS cat); + QList recentHexFiles() const; void setRecentFiles(const QList &newRecentFiles); diff --git a/src/control/codeedit.cpp b/src/control/codeedit.cpp index faff1f4..108c729 100644 --- a/src/control/codeedit.cpp +++ b/src/control/codeedit.cpp @@ -104,11 +104,20 @@ void CodeEdit::onCompletion(const QModelIndex &index) { if (selfdata.type == CodeInfoTip::Type::Function || selfdata.type == CodeInfoTip::Type::ClsFunction) { auto args = selfdata.addinfo.value(CodeInfoTip::Args); - auto cursor = textCursor(); - cursor.insertText(QStringLiteral("()")); - if (!args.isEmpty()) { - cursor.movePosition(QTextCursor::Left); - setTextCursor(cursor); + + auto cur = textCursor(); + cur.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); + auto ch = cur.selectedText(); + if (ch.isEmpty() || ch.front().isSpace()) { + auto cursor = textCursor(); + cursor.insertText(QStringLiteral("()")); + if (!args.isEmpty()) { + cursor.movePosition(QTextCursor::Left); + setTextCursor(cursor); + } + } else { + auto cursor = textCursor(); + cursor.insertText(QStringLiteral("(")); } } } diff --git a/src/control/scriptingconsole.cpp b/src/control/scriptingconsole.cpp index 545ea86..af0cd03 100644 --- a/src/control/scriptingconsole.cpp +++ b/src/control/scriptingconsole.cpp @@ -389,11 +389,20 @@ void ScriptingConsole::onCompletion(const QModelIndex &index) { if (selfdata.type == CodeInfoTip::Type::Function || selfdata.type == CodeInfoTip::Type::ClsFunction) { auto args = selfdata.addinfo.value(CodeInfoTip::Args); - auto cursor = textCursor(); - cursor.insertText(QStringLiteral("()")); - if (!args.isEmpty()) { - cursor.movePosition(QTextCursor::Left); - setTextCursor(cursor); + + auto cur = textCursor(); + cur.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); + auto ch = cur.selectedText(); + if (ch.isEmpty() || ch.front().isSpace()) { + auto cursor = textCursor(); + cursor.insertText(QStringLiteral("()")); + if (!args.isEmpty()) { + cursor.movePosition(QTextCursor::Left); + setTextCursor(cursor); + } + } else { + auto cursor = textCursor(); + cursor.insertText(QStringLiteral("(")); } } } @@ -407,7 +416,12 @@ void ScriptingConsole::paste() { const QString text = clipboard->text(); if (!text.isEmpty()) { if (text.indexOf('\n') < 0) { - replaceCommandLine(text); + if (isCursorInEditZone()) { + auto cursor = this->textCursor(); + cursor.insertText(text); + } else { + replaceCommandLine(text); + } } else { auto ret = WingMessageBox::question( nullptr, tr("MultiCodeCanNotUndo"), text); @@ -452,30 +466,37 @@ QString ScriptingConsole::currentCodes() const { void ScriptingConsole::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); - menu.addAction(QIcon(QStringLiteral(":/qeditor/copy.png")), tr("Copy"), - QKeySequence(QKeySequence::Copy), this, - &ScriptingConsole::copy); - menu.addAction(QIcon(QStringLiteral(":/qeditor/cut.png")), tr("Cut"), - QKeySequence(QKeySequence::Cut), this, - &ScriptingConsole::cut); - menu.addAction(QIcon(QStringLiteral(":/qeditor/paste.png")), tr("Paste"), - QKeySequence(QKeySequence::Paste), this, - &ScriptingConsole::paste); + auto a = menu.addAction(QIcon(QStringLiteral(":/qeditor/copy.png")), + tr("Copy"), QKeySequence(QKeySequence::Copy), this, + &ScriptingConsole::copy); + a->setShortcutContext(Qt::WidgetShortcut); + a = menu.addAction(QIcon(QStringLiteral(":/qeditor/cut.png")), tr("Cut"), + QKeySequence(QKeySequence::Cut), this, + &ScriptingConsole::cut); + a->setShortcutContext(Qt::WidgetShortcut); + a = menu.addAction(QIcon(QStringLiteral(":/qeditor/paste.png")), + tr("Paste"), QKeySequence(QKeySequence::Paste), this, + &ScriptingConsole::paste); + a->setShortcutContext(Qt::WidgetShortcut); if (_isTerminal) { - menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), - QKeySequence(Qt::ControlModifier | Qt::Key_L), this, - &ScriptingConsole::clearConsole); + a = menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), + QKeySequence(Qt::ControlModifier | Qt::Key_L), this, + &ScriptingConsole::clearConsole); + a->setShortcutContext(Qt::WidgetShortcut); menu.addSeparator(); - menu.addAction(ICONRES(QStringLiteral("dbgstop")), tr("AbortScript"), - QKeySequence(Qt::ControlModifier | Qt::Key_Q), []() { - ScriptMachine::instance().abortScript( - ScriptMachine::Background); - }); + a = menu.addAction(ICONRES(QStringLiteral("dbgstop")), + tr("AbortScript"), + QKeySequence(Qt::ControlModifier | Qt::Key_Q), []() { + ScriptMachine::instance().abortScript( + ScriptMachine::Background); + }); + a->setShortcutContext(Qt::WidgetShortcut); } else { - menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), - QKeySequence(Qt::ControlModifier | Qt::Key_L), this, - &ScriptingConsole::clear); + a = menu.addAction(ICONRES(QStringLiteral("del")), tr("Clear"), + QKeySequence(Qt::ControlModifier | Qt::Key_L), this, + &ScriptingConsole::clear); + a->setShortcutContext(Qt::WidgetShortcut); } menu.exec(event->globalPos()); diff --git a/src/dialog/mainwindow.cpp b/src/dialog/mainwindow.cpp index 7dab6ce..89ba011 100644 --- a/src/dialog/mainwindow.cpp +++ b/src/dialog/mainwindow.cpp @@ -607,11 +607,13 @@ ads::CDockAreaWidget *MainWindow::buildUpLogDock(ads::CDockManager *dock, m_logbrowser->setOpenExternalLinks(true); m_logbrowser->setUndoRedoEnabled(false); - m_logbrowser->addAction(newAction( + auto a = newAction( ICONRES("copy"), tr("Copy"), [=]() { m_logbrowser->copy(); }, - QKeySequence::Copy)); + QKeySequence::Copy); + a->setShortcutContext(Qt::WidgetShortcut); + m_logbrowser->addAction(a); - auto a = new QAction(this); + a = new QAction(this); a->setSeparator(true); m_logbrowser->addAction(a); @@ -1009,18 +1011,17 @@ MainWindow::buildUpDecodingStrShowDock(ads::CDockManager *dock, tr("DecodeText") + QStringLiteral(" (ASCII)"), m_txtDecode); - auto menu = m_txtDecode->createStandardContextMenu(); - menu->addSeparator(); - auto a = new QAction(tr("Encoding"), this); + auto a = newAction( + ICONRES("copy"), tr("Copy"), [=]() { m_logbrowser->copy(); }, + QKeySequence::Copy); + a->setShortcutContext(Qt::WidgetShortcut); + m_txtDecode->addAction(a); + a = new QAction(tr("Encoding"), this); a->setIcon(ICONRES(QStringLiteral("encoding"))); connect(a, &QAction::triggered, this, &MainWindow::on_encoding); - menu->addAction(a); + m_txtDecode->addAction(a); - m_txtDecode->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_txtDecode, &QTextBrowser::customContextMenuRequested, this, - [=](const QPoint &pos) { - menu->popup(m_txtDecode->viewport()->mapToGlobal(pos)); - }); + m_txtDecode->setContextMenuPolicy(Qt::ActionsContextMenu); connect(m_txtDecode, &QTextBrowser::windowTitleChanged, dw, &QDockWidget::setWindowTitle); @@ -1066,13 +1067,16 @@ MainWindow::buildUpScriptBgOutputDock(ads::CDockManager *dock, auto a = newAction( ICONRES(QStringLiteral("mStr")), tr("SelectAll"), [this]() { m_bgScriptOutput->selectAll(); }, QKeySequence::SelectAll); + a->setShortcutContext(Qt::WidgetShortcut); m_bgScriptOutput->addAction(a); a = newAction( ICONRES(QStringLiteral("copy")), tr("Copy"), [this]() { m_bgScriptOutput->copy(); }, QKeySequence::Copy); + a->setShortcutContext(Qt::WidgetShortcut); m_bgScriptOutput->addAction(a); a = newAction(ICONRES(QStringLiteral("del")), tr("Clear"), [this]() { m_bgScriptOutput->clear(); }); + a->setShortcutContext(Qt::WidgetShortcut); m_bgScriptOutput->addAction(a); a = new QAction(this); a->setSeparator(true); @@ -1083,6 +1087,7 @@ MainWindow::buildUpScriptBgOutputDock(ads::CDockManager *dock, ScriptMachine::instance().abortScript(ScriptMachine::Background); }, QKeySequence(Qt::ControlModifier | Qt::Key_Q)); + a->setShortcutContext(Qt::WidgetShortcut); m_bgScriptOutput->addAction(a); m_bgScriptOutput->setContextMenuPolicy(Qt::ActionsContextMenu); @@ -2077,7 +2082,10 @@ void MainWindow::on_pastefile() { if (hexeditor == nullptr) { return; } - hexeditor->Paste(); + if (!hexeditor->Paste()) { + Toast::toast(this, NAMEICONRES(QStringLiteral("paste")), + tr("PasteFailedNote")); + } } void MainWindow::on_delete() { diff --git a/src/dialog/settingdialog.cpp b/src/dialog/settingdialog.cpp index 7a00cd0..3bfe140 100644 --- a/src/dialog/settingdialog.cpp +++ b/src/dialog/settingdialog.cpp @@ -113,21 +113,26 @@ void SettingDialog::on_buttonBox_clicked(QAbstractButton *button) { page->apply(); } } else if (button == btnbox->button(QDialogButtonBox::RestoreDefaults)) { - for (auto &page : m_pages) { - page->reset(); + auto index = ui->listWidget->currentRow(); + if (index >= 0) { + m_pages.at(index)->reset(); } - + toastTakeEffectReboot(); } else if (button == btnbox->button(QDialogButtonBox::Reset)) { auto res = WingMessageBox::warning( this, qAppName(), tr("This will reset all settings. Are you sure to continue?"), QMessageBox::Yes | QMessageBox::No); - if (res == QMessageBox::No) + + if (res == QMessageBox::No) { return; + } for (auto &page : m_pages) { page->reset(); } + + toastTakeEffectReboot(); } else if (button == btnbox->button(QDialogButtonBox::Cancel)) { for (auto &page : m_pages) { page->cancel(); diff --git a/src/scriptaddon/scriptqstring.cpp b/src/scriptaddon/scriptqstring.cpp index aa1c9dd..d15821a 100644 --- a/src/scriptaddon/scriptqstring.cpp +++ b/src/scriptaddon/scriptqstring.cpp @@ -71,7 +71,7 @@ public: Map_t::iterator it = stringCache.find(strv); if (it == stringCache.end()) { // ret = asERROR; - // TODO: I don't know why invalid string pointer passed to it + // I don't know why invalid string pointer passed to it // just ignore it. } else { it->second--; @@ -311,19 +311,6 @@ static int StringCmp(const QString &a, const QString &b) { return cmp; } -// This function returns the index of the first position where the substring -// exists in the input string. If the substring doesn't exist in the input -// string -1 is returned. -// -// AngelScript signature: -// int string::findFirst(const string &in sub, uint start = 0) const -static int StringFindFirst(const QString &sub, asUINT start, - const QString &str) { - // We don't register the method directly because the argument types change - // between 32bit and 64bit platforms - return (int)str.indexOf(sub, start); -} - // This function returns the index of the first position where the one of the // bytes in substring exists in the input string. If the characters in the // substring doesn't exist in the input string -1 is returned. @@ -498,6 +485,82 @@ static CScriptArray *stringSplit(const QString &sep, bool skipEmpty, "array"); } +static QString fromAscii(CScriptArray *array) { + return QString::fromLatin1( + reinterpret_cast(array->GetBuffer()), array->GetSize()); +} + +static CScriptArray *toAsciiArray(const QString &s) { + return byteArrayWrapperFunction([s]() { return s.toLatin1(); }); +} + +static QString fromUtf8(CScriptArray *array) { + return QString::fromUtf8(reinterpret_cast(array->GetBuffer()), + array->GetSize()); +} + +static CScriptArray *toUtf8Array(const QString &s) { + return byteArrayWrapperFunction([s]() { return s.toUtf8(); }); +} + +static QString fromUtf16(CScriptArray *array) { + return QString::fromUtf16( + reinterpret_cast(array->GetBuffer()), + array->GetSize() / sizeof(char16_t)); +} + +static CScriptArray *toUtf16Array(const QString &s) { + return byteArrayWrapperFunction([s]() { + auto data = s.utf16(); + return QByteArray(reinterpret_cast(data), + s.size() * sizeof(char16_t)); + }); +} + +static QString fromUcs4(CScriptArray *array) { + return QString::fromUcs4( + reinterpret_cast(array->GetBuffer()), + array->GetSize() / sizeof(char32_t)); +} + +static CScriptArray *toUcs4Array(const QString &s) { + return byteArrayWrapperFunction([s]() { return s.toUcs4(); }); +} + +static QString fromRawData(CScriptArray *array) { + auto total = array->GetSize(); + QString buffer; + + buffer.reserve(total); + for (asUINT i = 0; i < total; ++i) { + auto ch = reinterpret_cast(array->At(i)); + buffer.append(*ch); + } + + return buffer; +} + +static void appendStr(const QString &str, QString &s) { s.append(str); } + +static void appendCh(const QChar &ch, QString &s) { s.append(ch); } + +static void prependStr(const QString &str, QString &s) { s.prepend(str); } + +static void prependCh(const QChar &ch, QString &s) { s.prepend(ch); } + +static CScriptArray *toRawData(const QString &s) { + return retarrayWrapperFunction( + [s]() { + QList data; + data.reserve(s.length()); + for (auto &ch : s) { + data.append(ch); + } + return data; + }, + "array"); +} + //================================================= static void ConstructChar(QChar *thisPointer) { new (thisPointer) QChar(); } @@ -669,34 +732,18 @@ void RegisterQString_Native(asIScriptEngine *engine) { Q_UNUSED(r); #endif - // The string length can be accessed through methods or through virtual - // property -#if AS_USE_ACCESSORS != 1 r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLength), asCALL_CDECL_OBJLAST); Q_ASSERT(r >= 0); Q_UNUSED(r); -#endif + r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResize), asCALL_CDECL_OBJLAST); Q_ASSERT(r >= 0); Q_UNUSED(r); -#if AS_USE_ACCESSORS == 1 - // Don't register these if STL names is used, as they conflict with the - // method size() - r = engine->RegisterObjectMethod( - "string", "uint get_length() const property", asFUNCTION(StringLength), - asCALL_CDECL_OBJLAST); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterObjectMethod("string", "void set_length(uint) property", - asFUNCTION(StringResize), - asCALL_CDECL_OBJLAST); - Q_ASSERT(r >= 0); - Q_UNUSED(r); -#endif + // Need to use a wrapper on Mac OS X 10.7/XCode 4.3 and CLang/LLVM, // otherwise the linker fails // r = engine->RegisterObjectMethod("string", "bool isEmpty() const", @@ -851,19 +898,39 @@ void RegisterQString_Native(asIScriptEngine *engine) { #endif // Utilities + r = engine->RegisterObjectMethod( + "string", "void append(const string &in str)", asFUNCTION(appendStr), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", "void append(const char &in ch)", + asFUNCTION(appendCh), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "void prepend(const string &in str)", asFUNCTION(prependStr), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "void prepend(const char &in ch)", asFUNCTION(prependCh), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); r = engine->RegisterObjectMethod( "string", "string substr(uint start = 0, int count = -1) const", asFUNCTION(StringSubString), asCALL_CDECL_OBJLAST); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( - "string", "int findFirst(const string &in, uint start = 0) const", - asFUNCTION(StringFindFirst), asCALL_CDECL_OBJLAST); + "string", "int findFirstOf(const string &in, uint start = 0) const", + asFUNCTION(StringFindFirstOf), asCALL_CDECL_OBJLAST); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( - "string", "int findFirstOf(const string &in, uint start = 0) const", - asFUNCTION(StringFindFirstOf), asCALL_CDECL_OBJLAST); + "string", "int findLastOf(const string &in, uint start = 0) const", + asFUNCTION(StringFindLastOf), asCALL_CDECL_OBJLAST); Q_ASSERT(r >= 0); Q_UNUSED(r); @@ -878,12 +945,6 @@ void RegisterQString_Native(asIScriptEngine *engine) { Q_ASSERT(r >= 0); Q_UNUSED(r); - /* These following things are not avaliable for generic call - * because it needs a lot of wrapper to do - * while WingHexExplorer only needs native call - * (by wingsummer) - * PULL REQUESTS ARE WELCOMED IF YOU WANT TO ADD GENERIC CALL - */ r = engine->RegisterObjectMethod( "string", "int compare(const string &in val, bool caseSensitive = true) const", @@ -933,6 +994,33 @@ void RegisterQString_Native(asIScriptEngine *engine) { Q_ASSERT(r >= 0); Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "array@ toAsciiArray() const", + asFUNCTION(toAsciiArray), asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "array@ toUtf8Array() const", asFUNCTION(toUtf8Array), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "array@ toUtf16Array() const", + asFUNCTION(toUtf16Array), asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod( + "string", "array@ toUcs4Array() const", asFUNCTION(toUcs4Array), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", "array@ toRawData() const", + asFUNCTION(toRawData), + asCALL_CDECL_OBJLAST); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + + // Global functions r = engine->SetDefaultNamespace("string"); Q_ASSERT(r >= 0); Q_UNUSED(r); @@ -970,6 +1058,33 @@ void RegisterQString_Native(asIScriptEngine *engine) { asFUNCTION(parseFloat), asCALL_CDECL); Q_ASSERT(r >= 0); Q_UNUSED(r); + + r = engine->RegisterGlobalFunction( + "string fromAscii(const array &in array)", asFUNCTION(fromAscii), + asCALL_CDECL); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUtf8(const array &in array)", asFUNCTION(fromUtf8), + asCALL_CDECL); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUtf16(const array &in array)", asFUNCTION(fromUtf16), + asCALL_CDECL); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUcs4(const array &in array)", asFUNCTION(fromUcs4), + asCALL_CDECL); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromRawData(const array &in array)", + asFUNCTION(fromRawData), asCALL_CDECL); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + engine->SetDefaultNamespace(""); } @@ -1044,82 +1159,6 @@ static void StringResizeGeneric(asIScriptGeneric *gen) { self->resize(*static_cast(gen->GetAddressOfArg(0))); } -static void StringInsert_Generic(asIScriptGeneric *gen) { - QString *self = static_cast(gen->GetObject()); - asUINT pos = gen->GetArgDWord(0); - QString *other = reinterpret_cast(gen->GetArgAddress(1)); - StringInsert(pos, *other, *self); -} - -static void StringErase_Generic(asIScriptGeneric *gen) { - QString *self = static_cast(gen->GetObject()); - asUINT pos = gen->GetArgDWord(0); - int count = int(gen->GetArgDWord(1)); - StringErase(pos, count, *self); -} - -static void StringFindFirst_Generic(asIScriptGeneric *gen) { - QString *find = reinterpret_cast(gen->GetArgAddress(0)); - asUINT start = gen->GetArgDWord(1); - QString *self = reinterpret_cast(gen->GetObject()); - *reinterpret_cast(gen->GetAddressOfReturnLocation()) = - StringFindFirst(*find, start, *self); -} - -static void StringFindFirstOf_Generic(asIScriptGeneric *gen) { - QString *find = reinterpret_cast(gen->GetArgAddress(0)); - asUINT start = gen->GetArgDWord(1); - QString *self = reinterpret_cast(gen->GetObject()); - *reinterpret_cast(gen->GetAddressOfReturnLocation()) = - StringFindFirstOf(*find, start, *self); -} - -static void StringFindLastOf_Generic(asIScriptGeneric *gen) { - QString *find = reinterpret_cast(gen->GetArgAddress(0)); - asUINT start = gen->GetArgDWord(1); - QString *self = reinterpret_cast(gen->GetObject()); - *reinterpret_cast(gen->GetAddressOfReturnLocation()) = - StringFindLastOf(*find, start, *self); -} - -static void formatInt_Generic(asIScriptGeneric *gen) { - asINT64 val = gen->GetArgQWord(0); - QString *options = reinterpret_cast(gen->GetArgAddress(1)); - new (gen->GetAddressOfReturnLocation()) QString(formatInt(val, *options)); -} - -static void formatUInt_Generic(asIScriptGeneric *gen) { - asQWORD val = gen->GetArgQWord(0); - QString *options = reinterpret_cast(gen->GetArgAddress(1)); - new (gen->GetAddressOfReturnLocation()) QString(formatUInt(val, *options)); -} - -static void formatFloat_Generic(asIScriptGeneric *gen) { - double val = gen->GetArgDouble(0); - QString *options = reinterpret_cast(gen->GetArgAddress(1)); - new (gen->GetAddressOfReturnLocation()) QString(formatFloat(val, *options)); -} - -static void parseInt_Generic(asIScriptGeneric *gen) { - QString *str = reinterpret_cast(gen->GetArgAddress(0)); - asUINT base = gen->GetArgDWord(1); - asUINT *byteCount = reinterpret_cast(gen->GetArgAddress(2)); - gen->SetReturnQWord(parseInt(*str, base, byteCount)); -} - -static void parseUInt_Generic(asIScriptGeneric *gen) { - QString *str = reinterpret_cast(gen->GetArgAddress(0)); - asUINT base = gen->GetArgDWord(1); - bool *ok = reinterpret_cast(gen->GetArgAddress(2)); - gen->SetReturnQWord(parseUInt(*str, base, ok)); -} - -static void parseFloat_Generic(asIScriptGeneric *gen) { - QString *str = reinterpret_cast(gen->GetArgAddress(0)); - bool *ok = reinterpret_cast(gen->GetArgAddress(1)); - gen->SetReturnDouble(parseFloat(*str, ok)); -} - static void StringCharAtGeneric(asIScriptGeneric *gen) { asDWORD index = gen->GetArgDWord(0); QString *self = static_cast(gen->GetObject()); @@ -1277,17 +1316,6 @@ static void AddBool2StringGeneric(asIScriptGeneric *gen) { } #endif -static void StringSubString_Generic(asIScriptGeneric *gen) { - // Get the arguments - QString *str = (QString *)gen->GetObject(); - asUINT start = *(int *)gen->GetAddressOfArg(0); - int count = *(int *)gen->GetAddressOfArg(1); - - // Return the substring - new (gen->GetAddressOfReturnLocation()) - QString(StringSubString(start, count, *str)); -} - void RegisterQString_Generic(asIScriptEngine *engine) { int r = 0; Q_UNUSED(r); @@ -1348,13 +1376,12 @@ void RegisterQString_Generic(asIScriptEngine *engine) { Q_UNUSED(r); // Register the object methods -#if AS_USE_ACCESSORS != 1 r = engine->RegisterObjectMethod("string", "uint length() const", asFUNCTION(StringLengthGeneric), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); -#endif + r = engine->RegisterObjectMethod("string", "void resize(uint)", asFUNCTION(StringResizeGeneric), asCALL_GENERIC); @@ -1487,67 +1514,50 @@ void RegisterQString_Generic(asIScriptEngine *engine) { Q_UNUSED(r); #endif - r = engine->RegisterObjectMethod( - "string", "string substr(uint start = 0, int count = -1) const", - asFUNCTION(StringSubString_Generic), asCALL_GENERIC); + // Utilities + r = engine->RegisterObjectMethod("string", + "void append(const string &in str)", + WRAP_FN(appendStr), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", "void append(const char &in ch)", + WRAP_FN(appendCh), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "void prepend(const string &in str)", + WRAP_FN(prependStr), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "void prepend(const char &in ch)", + WRAP_FN(prependCh), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( - "string", "int findFirst(const string &in, uint start = 0) const", - asFUNCTION(StringFindFirst_Generic), asCALL_GENERIC); + "string", "string substr(uint start = 0, int count = -1) const", + WRAP_FN(StringSubString), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( "string", "int findFirstOf(const string &in, uint start = 0) const", - asFUNCTION(StringFindFirstOf_Generic), asCALL_GENERIC); + WRAP_FN(StringFindFirstOf), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( - "string", "int findLastOf(const string &in, int start = -1) const", - asFUNCTION(StringFindLastOf_Generic), asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterObjectMethod( - "string", "void insert(uint pos, const string &in other)", - asFUNCTION(StringInsert_Generic), asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterObjectMethod( - "string", "void erase(uint pos, int count = -1)", - asFUNCTION(StringErase_Generic), asCALL_GENERIC); + "string", "int findLastOf(const string &in, uint start = 0) const", + WRAP_FN(StringFindLastOf), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); - r = engine->RegisterGlobalFunction( - "string formatInt(int64 val, const string &in options = \"\")", - asFUNCTION(formatInt_Generic), asCALL_GENERIC); + r = engine->RegisterObjectMethod( + "string", "void insert(uint pos, const string &in other)", + WRAP_FN(StringInsert), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); - r = engine->RegisterGlobalFunction( - "string formatUInt(uint64 val, const string &in options = \"\")", - asFUNCTION(formatUInt_Generic), asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterGlobalFunction( - "string formatFloat(double val, const string &in options = \"\")", - asFUNCTION(formatFloat_Generic), asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterGlobalFunction("int64 parseInt(const string &in, uint " - "base = 10, bool &out ok = false)", - asFUNCTION(parseInt_Generic), - asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterGlobalFunction("uint64 parseUInt(const string &in, " - "uint base = 10, bool &out ok = false)", - asFUNCTION(parseUInt_Generic), - asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); - r = engine->RegisterGlobalFunction( - "double parseFloat(const string &in, bool &out ok = false)", - WRAP_FN(parseFloat_Generic), asCALL_GENERIC); + r = engine->RegisterObjectMethod("string", + "void erase(uint pos, int count = -1)", + WRAP_FN(StringErase), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); @@ -1582,7 +1592,8 @@ void RegisterQString_Generic(asIScriptEngine *engine) { Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod("string", "string simplified()", - WRAP_FN(stringSimplified), asCALL_GENERIC); + asFUNCTION(stringSimplified), + asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); r = engine->RegisterObjectMethod( @@ -1599,6 +1610,32 @@ void RegisterQString_Generic(asIScriptEngine *engine) { Q_ASSERT(r >= 0); Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "array@ toAsciiArray() const", + WRAP_FN(toAsciiArray), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "array@ toUtf8Array() const", + WRAP_FN(toUtf8Array), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "array@ toUtf16Array() const", + WRAP_FN(toUtf16Array), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", + "array@ toUcs4Array() const", + WRAP_FN(toUcs4Array), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterObjectMethod("string", "array@ toRawData() const", + WRAP_FN(toRawData), asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + + // Global functions r = engine->SetDefaultNamespace("string"); Q_ASSERT(r >= 0); Q_UNUSED(r); @@ -1636,6 +1673,34 @@ void RegisterQString_Generic(asIScriptEngine *engine) { WRAP_FN(parseFloat), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); + + r = engine->RegisterGlobalFunction( + "string fromAscii(const array &in array)", WRAP_FN(fromAscii), + asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUtf8(const array &in array)", WRAP_FN(fromUtf8), + asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUtf16(const array &in array)", WRAP_FN(fromUtf16), + asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromUcs4(const array &in array)", WRAP_FN(fromUcs4), + asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + r = engine->RegisterGlobalFunction( + "string fromRawData(const array &in array)", WRAP_FN(fromRawData), + asCALL_GENERIC); + Q_ASSERT(r >= 0); + Q_UNUSED(r); + + engine->SetDefaultNamespace(""); } void RegisterQString(asIScriptEngine *engine) { @@ -1725,19 +1790,6 @@ void RegisterQStringUtils(asIScriptEngine *engine) { engine->SetDefaultNamespace(""); } -// This function returns the index of the first position where the substring -// exists in the input string. If the substring doesn't exist in the input -// string -1 is returned. -// -// AngelScript signature: -// int string::findFirst(const regex::exp &in exp, uint start = 0) const -static int StringFindFirstReg(const QRegularExpression &exp, asUINT start, - const QString &str) { - // We don't register the method directly because the argument types change - // between 32bit and 64bit platforms - return (int)str.indexOf(exp, start); -} - // This function returns the index of the first position where the one of the // bytes in substring exists in the input string. If the characters in the // substring doesn't exist in the input string -1 is returned. @@ -1789,12 +1841,6 @@ void RegisterQStringRegExSupport(asIScriptEngine *engine) { Q_UNUSED(r); if (strstr(asGetLibraryOptions(), "AS_MAX_PORTABILITY")) { - r = engine->RegisterObjectMethod( - "string", - "int findFirst(const regex::exp &in, uint start = 0) const", - WRAP_FN(StringFindFirstReg), asCALL_GENERIC); - Q_ASSERT(r >= 0); - Q_UNUSED(r); r = engine->RegisterObjectMethod( "string", "int findFirstOf(const regex::exp &in, uint start = 0) const", @@ -1819,14 +1865,7 @@ void RegisterQStringRegExSupport(asIScriptEngine *engine) { WRAP_FN(stringSplitReg), asCALL_GENERIC); Q_ASSERT(r >= 0); Q_UNUSED(r); - } else { - r = engine->RegisterObjectMethod( - "string", - "int findFirst(const regex::exp &in, uint start = 0) const", - asFUNCTION(StringFindFirstReg), asCALL_CDECL_OBJLAST); - Q_ASSERT(r >= 0); - Q_UNUSED(r); r = engine->RegisterObjectMethod( "string", "int findFirstOf(const regex::exp &in, uint start = 0) const", diff --git a/src/scriptaddon/scriptqstring.h b/src/scriptaddon/scriptqstring.h index 9bd3ad3..6f8418a 100644 --- a/src/scriptaddon/scriptqstring.h +++ b/src/scriptaddon/scriptqstring.h @@ -27,12 +27,6 @@ // Compilation settings // -// Some prefer to use property accessors to get/set the length of the string -// This option registers the accessors instead of the method length() -#ifndef AS_USE_ACCESSORS -#define AS_USE_ACCESSORS 0 -#endif - // This option disables the implicit operators with primitives #ifndef AS_NO_IMPL_OPS_WITH_STRING_AND_PRIMITIVE #define AS_NO_IMPL_OPS_WITH_STRING_AND_PRIMITIVE 0 diff --git a/src/scriptaddon/scriptregex.cpp b/src/scriptaddon/scriptregex.cpp index 043a3e1..d6085b3 100644 --- a/src/scriptaddon/scriptregex.cpp +++ b/src/scriptaddon/scriptregex.cpp @@ -47,7 +47,8 @@ void RegisterScriptRegex(asIScriptEngine *engine) { r = engine->RegisterObjectBehaviour( "exp", asBEHAVE_CONSTRUCT, - "void f(string &in, PatternOptions = PatternOptions::NoPatternOption)", + "void f(const string &in, PatternOptions = " + "regex::PatternOptions::NoPatternOption)", asFUNCTIONPR( [](void *memory, const QString &r, Angel::PatternOptions op) { new (memory) QRegularExpression( @@ -169,7 +170,7 @@ void RegisterScriptRegex(asIScriptEngine *engine) { // QRegularExpression... r = engine->RegisterObjectMethod( - "exp", "void setPattern(string &in)", + "exp", "void setPattern(const string &in)", asMETHODPR(QRegularExpression, setPattern, (const QString &), void), asCALL_THISCALL); Q_ASSERT(r >= 0);