From 57cbf3a49a37cad361ca646ba3678ef63a443c3a Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Sun, 12 Feb 2023 22:33:34 +0800 Subject: [PATCH] - fix: New non-saved filenames is wrongly saved in the last openfiles list. - fix: File is parsed before editor is fully created. - enhancement: New GAS File in the File Menu - change: rename "New File" to "New C/C++ File" --- NEWS.md | 4 + RedPandaIDE/editor.cpp | 51 +- RedPandaIDE/editor.h | 1 + RedPandaIDE/editorlist.cpp | 7 +- RedPandaIDE/mainwindow.cpp | 110 ++- RedPandaIDE/mainwindow.h | 8 +- RedPandaIDE/mainwindow.ui | 7 +- .../settingsdialog/editorsnippetwidget.ui | 2 +- RedPandaIDE/systemconsts.cpp | 21 + RedPandaIDE/systemconsts.h | 1 + RedPandaIDE/translations/RedPandaIDE_pt_BR.ts | 8 + RedPandaIDE/translations/RedPandaIDE_zh_CN.ts | 715 +++++++++--------- RedPandaIDE/translations/RedPandaIDE_zh_TW.ts | 8 + libs/qsynedit/qsynedit/qsynedit.cpp | 9 + libs/qsynedit/qsynedit/qsynedit.h | 2 + 15 files changed, 535 insertions(+), 419 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2df819a4..9233d603 100644 --- a/NEWS.md +++ b/NEWS.md @@ -11,6 +11,10 @@ Red Panda C++ Version 2.12 - enhancement: Compile/Debug GAS source files in project. - enhancement: Keyword completion for asm/GAS files. - enhancement: If GAS source file has "_start" label, compile it with "-nostartfiles". + - fix: New non-saved filenames is wrongly saved in the last openfiles list. + - fix: File is parsed before editor is fully created. + - enhancement: New GAS File in the File Menu + - change: rename "New File" to "New C/C++ File" Red Panda C++ Version 2.11 diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 5aa2d0de..1fc5d1ef 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -67,8 +67,9 @@ Editor::Editor(QWidget *parent, const QString& filename, Project* pProject, bool isNew, QTabWidget* parentPageControl): QSynEdit(parent), + mInited(false), mEncodingOption(encoding), - mFilename(QFileInfo(filename).absoluteFilePath()), + mFilename(filename), mParentPageControl(parentPageControl), mProject(pProject), mIsNew(isNew), @@ -85,6 +86,7 @@ Editor::Editor(QWidget *parent, const QString& filename, mSaving(false), mHoverModifiedLine(-1) { + mInited=false; mBackupFile=nullptr; mHighlightCharPos1 = QSynedit::BufferCoord{0,0}; mHighlightCharPos2 = QSynedit::BufferCoord{0,0}; @@ -107,10 +109,8 @@ Editor::Editor(QWidget *parent, const QString& filename, tr("Error Load File"), e.reason()); } - syntaxer = syntaxerManager.getSyntaxer(mFilename); - } else { - syntaxer=syntaxerManager.getSyntaxer(QSynedit::ProgrammingLanguage::CPP); } + syntaxer = syntaxerManager.getSyntaxer(mFilename); resolveAutoDetectEncodingOption(); if (syntaxer) { setSyntaxer(syntaxer); @@ -166,7 +166,7 @@ Editor::Editor(QWidget *parent, const QString& filename, pMainWindow, &MainWindow::onEditorContextMenu); mCanAutoSave = false; - if (isNew && parentPageControl!=nullptr) { + if (isNew && parentPageControl!=nullptr ) { QString fileTemplate = pMainWindow->codeSnippetManager()->newFileTemplate(); if (!fileTemplate.isEmpty()) { insertCodeSnippet(fileTemplate); @@ -201,6 +201,7 @@ Editor::Editor(QWidget *parent, const QString& filename, this, &Editor::onScrollBarValueChanged); connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &Editor::onScrollBarValueChanged); + mInited=true; } Editor::~Editor() { @@ -365,12 +366,18 @@ bool Editor::saveAs(const QString &name, bool fromProject){ if (name.isEmpty()) { QString selectedFileFilter; QString defaultExt; - if (pSettings->editor().defaultFileCpp()) { - selectedFileFilter = pSystemConsts->defaultCPPFileFilter(); - defaultExt = "cpp"; + defaultExt=QFileInfo(oldName).suffix(); + qDebug()<editor().defaultFileCpp()) { + selectedFileFilter = pSystemConsts->defaultCPPFileFilter(); + defaultExt = "cpp"; + } else { + selectedFileFilter = pSystemConsts->defaultCFileFilter(); + defaultExt = "c"; + } } else { - selectedFileFilter = pSystemConsts->defaultCFileFilter(); - defaultExt = "c"; + selectedFileFilter = pSystemConsts->fileFilterFor(defaultExt); } QFileDialog dialog(this,tr("Save As"),extractFilePath(mFilename), pSystemConsts->defaultFileFilters().join(";;")); @@ -379,28 +386,6 @@ bool Editor::saveAs(const QString &name, bool fromProject){ dialog.selectFile(mFilename); dialog.setFileMode(QFileDialog::AnyFile); dialog.setAcceptMode(QFileDialog::AcceptSave); -// connect(&dialog, &QFileDialog::filterSelected, -// [&dialog](const QString &filter){ -// if (filter.indexOf("*.*")) { -// dialog.setDefaultSuffix(""); -// qDebug()<<"lllll"; -// return; -// } -// int pos = filter.indexOf("*."); -// if (pos>=0) { -// QString suffix; -// pos+=2; -// while (poscodeCompletion().enabled()) diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index 43fbb249..877ca31e 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -292,6 +292,7 @@ private: QSynedit::PTokenAttribute &attr); void onScrollBarValueChanged(); private: + bool mInited; QDateTime mBackupTime; QFile* mBackupFile; QByteArray mEncodingOption; // the encoding type set by the user diff --git a/RedPandaIDE/editorlist.cpp b/RedPandaIDE/editorlist.cpp index 84e1da44..4d6b4341 100644 --- a/RedPandaIDE/editorlist.cpp +++ b/RedPandaIDE/editorlist.cpp @@ -395,14 +395,11 @@ Editor* EditorList::getOpenedEditorByFilename(QString filename) { if (filename.isEmpty()) return nullptr; - QFileInfo fileInfo(filename); - QString fullname = fileInfo.absoluteFilePath(); for (int i=0;icount();i++) { Editor* e = static_cast(mLeftPageWidget->widget(i)); if (!e) continue; - if (e->filename().compare(filename, PATH_SENSITIVITY)==0 || - e->filename().compare(fullname, PATH_SENSITIVITY)==0) { + if (e->filename().compare(filename, PATH_SENSITIVITY)==0) { return e; } } @@ -410,7 +407,7 @@ Editor* EditorList::getOpenedEditorByFilename(QString filename) Editor* e = static_cast(mRightPageWidget->widget(i)); if (!e) continue; - if (e->filename().compare(filename)==0 || e->filename().compare(fullname)==0) { + if (e->filename().compare(filename)==0) { return e; } } diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index d2298bd4..4dc2c895 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -216,6 +216,7 @@ MainWindow::MainWindow(QWidget *parent) mMenuNew = new QMenu(); mMenuNew->setTitle(tr("New")); mMenuNew->addAction(ui->actionNew); + mMenuNew->addAction(ui->actionNew_GAS_File); mMenuNew->addAction(ui->actionNew_Project); mMenuNew->addSeparator(); mMenuNew->addAction(ui->actionNew_Template); @@ -3031,7 +3032,7 @@ void MainWindow::onBookmarkContextMenu(const QPoint &pos) menu.exec(ui->tableBookmark->mapToGlobal(pos)); } -void MainWindow::saveLastOpens() +bool MainWindow::saveLastOpens() { QString filename = includeTrailingPathDelimiter(pSettings->dirs().config()) + DEV_LASTOPENS_FILE; QFile file(filename); @@ -3042,7 +3043,7 @@ void MainWindow::saveLastOpens() tr("Can't open last open information file '%1' for write!") .arg(filename), QMessageBox::Ok); - return; + return true; } QJsonObject rootObj; if (mProject) { @@ -3052,6 +3053,25 @@ void MainWindow::saveLastOpens() for (int i=0;ipageCount();i++) { Editor * editor = (*mEditorList)[i]; QJsonObject fileObj; + if (editor->isNew()) { + if (!editor->modified()) + continue; + QMessageBox::StandardButton reply; + reply = QMessageBox::question(editor,QObject::tr("Save"), + QString(QObject::tr("Save changes to %1?")).arg(editor->filename()), + QMessageBox::Yes|QMessageBox::No|QMessageBox::Yes|QMessageBox::Cancel); + if (reply == QMessageBox::No) { + editor->setModified(false); + continue; + } else if (reply == QMessageBox::Yes) { + if (!editor->save(false,false)) { + return false; + } + } else { + return false; + } + } + fileObj["filename"] = editor->filename(); fileObj["onLeft"] = (editor->pageControl() != mEditorList->rightPageWidget()); fileObj["focused"] = editor->hasFocus(); @@ -3071,9 +3091,10 @@ void MainWindow::saveLastOpens() tr("Can't save last open info file '%1'") .arg(filename), QMessageBox::Ok); - return; + return true; } file.close(); + return true; } void MainWindow::loadLastOpens() @@ -3223,10 +3244,18 @@ void MainWindow::updateTools() } } -void MainWindow::newEditor() +void MainWindow::newEditor(const QString& suffix) { try { - Editor * editor=mEditorList->newEditor("", + QString filename=QString("untitled%1").arg(getNewFileNumber()); + if (suffix.isEmpty()) { + if (pSettings->editor().defaultFileCpp()) + filename+=".cpp"; + else + filename+=".c"; + } else + filename+= "." + suffix; + Editor * editor=mEditorList->newEditor(filename, pSettings->editor().defaultEncoding(), nullptr,true); editor->activate(); @@ -5198,7 +5227,10 @@ void MainWindow::on_actionNew_triggered() tr("New Project File?"), tr("Do you want to add the new file to the project?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - newProjectUnitFile(); + if (mProject->options().isCpp) + newProjectUnitFile("cpp"); + else + newProjectUnitFile("c"); return; } } @@ -5313,7 +5345,12 @@ void MainWindow::closeEvent(QCloseEvent *event) { } if (!mShouldRemoveAllSettings && pSettings->editor().autoLoadLastFiles()) { - saveLastOpens(); + if (!saveLastOpens()) { //canceled + mClosingAll=false; + mQuitting = false; + event->ignore(); + return ; + } } /*else { //if don't save last open files, close project before editors, to save project openned editors; @@ -7062,7 +7099,7 @@ void MainWindow::prepareTabMessagesData() } } -void MainWindow::newProjectUnitFile() +void MainWindow::newProjectUnitFile(const QString& suffix) { if (!mProject) return; @@ -7092,24 +7129,28 @@ void MainWindow::newProjectUnitFile() modelTypeNode = mProject->rootNode(); } NewProjectUnitDialog newProjectUnitDialog; - if (modelTypeNode == mProject->rootNode()) { - if (mProject->options().isCpp) - newProjectUnitDialog.setSuffix("cpp"); - else - newProjectUnitDialog.setSuffix("c"); + if (!suffix.isEmpty()) { + newProjectUnitDialog.setSuffix(suffix); } else { - switch (modelTypeNode->folderNodeType) { - case ProjectModelNodeType::DUMMY_HEADERS_FOLDER: - newProjectUnitDialog.setSuffix("h"); - break; - case ProjectModelNodeType::DUMMY_SOURCES_FOLDER: + if (modelTypeNode == mProject->rootNode()) { if (mProject->options().isCpp) newProjectUnitDialog.setSuffix("cpp"); else newProjectUnitDialog.setSuffix("c"); - break; - default: - newProjectUnitDialog.setSuffix("txt"); + } else { + switch (modelTypeNode->folderNodeType) { + case ProjectModelNodeType::DUMMY_HEADERS_FOLDER: + newProjectUnitDialog.setSuffix("h"); + break; + case ProjectModelNodeType::DUMMY_SOURCES_FOLDER: + if (mProject->options().isCpp) + newProjectUnitDialog.setSuffix("cpp"); + else + newProjectUnitDialog.setSuffix("c"); + break; + default: + newProjectUnitDialog.setSuffix("txt"); + } } } QString folder = mProject->fileSystemNodeFolderPath(pNode); @@ -7124,10 +7165,14 @@ void MainWindow::newProjectUnitFile() } else { do { newFileName = QString("untitled")+QString("%1").arg(getNewFileNumber()); - if (mProject->options().isCpp) - newFileName += ".cpp"; - else - newFileName += ".c"; + if (!suffix.isEmpty()) { + newFileName += "." + suffix; + } else { + if (mProject->options().isCpp) + newFileName += ".cpp"; + else + newFileName += ".c"; + } } while (QDir(mProject->directory()).exists(newFileName)); newFileName = QInputDialog::getText( this, @@ -9436,3 +9481,18 @@ void MainWindow::on_actionDocument_triggered() QDesktopServices::openUrl(QUrl("https://royqh1979.gitee.io/redpandacpp/docsy/docs/")); } + +void MainWindow::on_actionNew_GAS_File_triggered() +{ + if (mProject) { + if (QMessageBox::question(this, + tr("New Project File?"), + tr("Do you want to add the new file to the project?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + newProjectUnitFile("s"); + return; + } + } + newEditor("s"); +} + diff --git a/RedPandaIDE/mainwindow.h b/RedPandaIDE/mainwindow.h index 007a436a..41a4db85 100644 --- a/RedPandaIDE/mainwindow.h +++ b/RedPandaIDE/mainwindow.h @@ -160,13 +160,13 @@ public: void updateClassBrowserForEditor(Editor* editor); void resetAutoSaveTimer(); void updateShortcuts(); - void saveLastOpens(); + bool saveLastOpens(); void loadLastOpens(); void updateTools(); void openFiles(const QStringList& files); - void newEditor(); + void newEditor(const QString& suffix=""); QPlainTextEdit* txtLocals(); @@ -299,7 +299,7 @@ private: void showHideMessagesTab(QWidget *widget, bool show); void prepareTabInfosData(); void prepareTabMessagesData(); - void newProjectUnitFile(); + void newProjectUnitFile(const QString& suffix=""); void fillProblemCaseInputAndExpected(const POJProblemCase &problemCase); void doFilesViewRemoveFile(const QModelIndex& index); @@ -775,6 +775,8 @@ private slots: void on_actionDocument_triggered(); + void on_actionNew_GAS_File_triggered(); + private: Ui::MainWindow *ui; bool mFullInitialized; diff --git a/RedPandaIDE/mainwindow.ui b/RedPandaIDE/mainwindow.ui index 03fdacad..0ea34e90 100644 --- a/RedPandaIDE/mainwindow.ui +++ b/RedPandaIDE/mainwindow.ui @@ -2063,7 +2063,7 @@ - New File + New C/C++ File New Source File @@ -3327,6 +3327,11 @@ F1 + + + New GAS File + + diff --git a/RedPandaIDE/settingsdialog/editorsnippetwidget.ui b/RedPandaIDE/settingsdialog/editorsnippetwidget.ui index 5a325110..ab970058 100644 --- a/RedPandaIDE/settingsdialog/editorsnippetwidget.ui +++ b/RedPandaIDE/settingsdialog/editorsnippetwidget.ui @@ -17,7 +17,7 @@ - 1 + 0 diff --git a/RedPandaIDE/systemconsts.cpp b/RedPandaIDE/systemconsts.cpp index 6c6c4032..403a424e 100644 --- a/RedPandaIDE/systemconsts.cpp +++ b/RedPandaIDE/systemconsts.cpp @@ -107,6 +107,27 @@ const QString &SystemConsts::defaultAllFileFilter() const noexcept return mDefaultFileFilters[0]; } +QString SystemConsts::fileFilterFor(const QString &suffix) +{ + QString t="*."+suffix; + qDebug()<<" * "<Document + + New C/C++ File + + + + New GAS File + + NewClassDialog diff --git a/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts b/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts index b902fd99..ef17ad68 100644 --- a/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts +++ b/RedPandaIDE/translations/RedPandaIDE_zh_CN.ts @@ -2822,60 +2822,60 @@ Are you really want to continue? FileCompiler - + Checking single file... 检查单个文件... - + Compiling single file... 编译单个文件... - + - Filename: %1 - 文件名: %1 - + - Compiler Set Name: %1 - 编译器配置: %1 - - + + Can't delete the old executable file "%1". 无法删除旧的可执行文件"%1". - + Can't find the compiler for file %1 Can't the compiler for file %1 找不到适合文件%1的编译器 - + The Compiler '%1' doesn't exists! 编译器程序"%1"不存在! - + Please check the "program" page of compiler settings. 请检查编译器设置中的“程序”页。 - + Processing %1 source file: 正在处理%1源程序文件: - + %1 Compiler: %2 %1编译器: %2 - + Command: %1 %2 命令: %1 %2 @@ -4170,18 +4170,18 @@ Are you really want to continue? MainWindow - + Red Panda C++ 小熊猫C++ - - - - - + + + + + Issues 编译器 @@ -4255,7 +4255,7 @@ Are you really want to continue? - + Debug Console 调试主控台 @@ -4389,8 +4389,8 @@ Are you really want to continue? - - + + Compile 编译 @@ -4467,9 +4467,9 @@ Are you really want to continue? - - - + + + Copy 复制 @@ -4480,7 +4480,7 @@ Are you really want to continue? - + Paste 粘贴 @@ -4491,8 +4491,8 @@ Are you really want to continue? - - + + Select All 选择全部 @@ -4618,38 +4618,38 @@ Are you really want to continue? - - + + New Problem Set 新建试题集 - + Add Problem 添加试题 - + Remove Problem 删除试题 - - + + Save Problem Set 保存试题集 - - + + Load Problem Set 载入试题集 @@ -4697,7 +4697,7 @@ Are you really want to continue? - + Remove Problem Case Remove Problem Set 删除试题集 @@ -4705,21 +4705,21 @@ Are you really want to continue? - + Open Anwser Source File 打开答案源代码文件 - + Run All Cases Run Current Case 运行所有案例 - + Problem Cases Validation Options 测试案例验证选项 @@ -4779,15 +4779,15 @@ Are you really want to continue? - - + + Import FPS Problem Set 导入FPS试题集 - - + + Export FPS Problem Set 导出FPS试题集 @@ -4811,6 +4811,11 @@ Are you really want to continue? Ignore Spaces 忽略空格 + + + New C/C++ File + 新建C/C++文件 + New Source File @@ -5029,7 +5034,7 @@ Are you really want to continue? - + Clear all breakpoints 删除所有断点 @@ -5109,6 +5114,11 @@ Are you really want to continue? F1 F1 + + + New GAS File + 新建GNU汇编文件 + Move Selection Up @@ -5249,8 +5259,7 @@ Are you really want to continue? 保存为模板... - - + New File 新建文件 @@ -5291,7 +5300,7 @@ Are you really want to continue? - + Rename Symbol 重命名符号 @@ -5312,13 +5321,13 @@ Are you really want to continue? - + Export As RTF 导出为RTF - + Export As HTML 导出为HTML @@ -5587,42 +5596,42 @@ Are you really want to continue? 运行参数... - + File Encoding 文件编码 - + Recent Files 文件历史 - - - - - - + + + + + + Debugging 正在调试 - - - - - - + + + + + + Running 正在运行 - - - - - - + + + + + + Compiling 正在编译 @@ -5636,17 +5645,17 @@ Are you really want to continue? 行: %1 列: %2 已选择 :%3 总行数: %4 总长度: %5 - + Read Only 只读 - + Insert 插入 - + Overwrite 覆写 @@ -5659,75 +5668,75 @@ Are you really want to continue? 你确定要关闭'%1'吗? - - + + Confirm 确认 - - - + + + Source file is not compiled. 源文件尚未编译。 - - + + Compile now? 现在编译? - - + + Source file is more recent than executable. 源文件比可执行程序新。 - + Recompile now? 重新编译? - - - - + + + + Wrong Compiler Settings 错误的编译器设置 - - - - + + + + Compiler is set not to generate executable. 编译器被设置为不生成可执行文件。 - - + + We need the executabe to run problem case. 我们需要可执行文件来运行试题案例。 - + No compiler set 无编译器设置 - + No compiler set is configured. 没有配置编译器设置。 - + Can't start debugging. 无法启动调试器 - - + + Enable debugging 启用调试参数 @@ -5736,54 +5745,54 @@ Are you really want to continue? 当前编译设置中未启用调试选项(-g3),或启用了信息剥除选项(-s)<br /><br/>是否纠正这一问题? - + Project not built 项目尚未构建 - + Project hasn't been built. Build it now? 项目尚未构建。是否构建? - + Host applcation missing 宿主程序不存在 - + DLL project needs a host application to run. 动态链接库(DLL)需要一个宿主程序来运行。 - + But it's missing. 但它不存在。 - + Host application not exists 宿主程序不存在 - + Host application file '%1' doesn't exist. 宿主程序'%1'不存在。 - - + + Please correct this before start debugging 请在调试前改正设置。 - + Recompile? 重新编译? - - + + Save last open info error 保存上次打开信息失败 @@ -5792,60 +5801,60 @@ Are you really want to continue? 无法删除旧上次打开信息文件'%1' - + Can't save last open info file '%1' 无法保存上次打开信息文件'%1' - - + + Load last open info error 载入上次打开信息失败 - - + + Can't load last open info file '%1' 无法载入上次打开信息文件'%1' - + Open Source File 打开源代码文件 - - + + Batch Set Cases 批量设置案例 - + Show detail debug logs 显示详细调试器日志 - + Copy all 全部复制 - + Go to Line 跳转到行 - + Line - + Template Exists 模板已存在 - + Template %1 already exists. Do you want to overwrite? 模板%1已存在。是否覆盖? @@ -5853,25 +5862,25 @@ Are you really want to continue? - - - + + + Clear 清除 - + Export 导出 - + Insert Snippet 插入代码段 - - + + Problem Set %1 试题集%1 @@ -5892,70 +5901,70 @@ Are you really want to continue? 或者选择使用其他的网络端口。 - - - + + + Rebuild Project 重新构建项目 - - - + + + Project has been modified, do you want to rebuild it? 项目已经被修改过,是否需要重新构建? - + Auto Save Error 自动保存出错 - + Auto save "%1" to "%2" failed:%3 自动保存"%1"到"%2"失败:%3 - + Properties... 试题属性... - + Set Problem Set Name 设置试题集名称 - + Problem Set Name: 试题集名称: - + Remove 删除 - + Remove All Bookmarks 删除全部书签 - + Modify Description 修改描述 - - - + + + Bookmark Description 书签描述 - - - + + + Description: 描述: @@ -5964,65 +5973,65 @@ Are you really want to continue? 在调试主控台中显示调试器输出 - + Remove this search 清除这次搜索 - + Clear all searches 删除所有搜索 - + Breakpoint condition... 断点条件... - + Break point condition 断点条件 - + Enter the condition of the breakpoint: 输入当前断点的生效条件: - + Remove All Breakpoints Remove all breakpoints 删除所有断点 - + Remove Breakpoint 删除当前断点 - + Rename File 重命名文件 - - + + Add Folder 添加文件夹 - - + + New folder 新文件夹 - + Folder name: 文件夹: - + Rename Folder 重命名 @@ -6031,167 +6040,167 @@ Are you really want to continue? 您没有使用DEBUG编译配置。 - - + + Do you want to set it now? 要现在去修改设置吗? - + Rename Problem Set 修改试题集名称 - + Can't open last open information file '%1' for write! 无法写入配置文件'%1'。 - + Rename Problem 修改试题名称 - + Line: %1 Col: %2 Lines: %3 行: %1 列: %2 总行数: %3 - + Goto Url 跳转到试题网址 - + Add Problem Case 添加试题案例 - + Run Current Case 运行当前案例 - + Remove Folder 删除文件夹 - + Switch to normal view 切换为普通视图 - + Switch to custom view 切换为自定义视图 - + Sort By Type 按类型排序 - + Sort alphabetically 按名称排序 - + Show inherited members 显示继承的成员 - + Goto declaration 跳转到声明处 - + Goto definition 跳转到定义处 - + In current file 仅当前文件 - + In current project 整个项目 - - + + New Folder 新建文件夹 - + Rename 重命名 - - - - + + + + Delete 删除 - + Open in Editor 在编辑器中打开 - + Open in External Program 使用外部程序打开 - + Open in Terminal 在终端中打开 - + Open in Windows Explorer 在Windows浏览器中打开 - + Character sets 字符集 - + Convert to %1 转换为%1编码 - + Newline 换行符 - + %1 files autosaved 已自动保存%1个文件 - + Set answer to... 设置答案源代码... - + select other file... 选择其他文件... - + Select Answer Source File 选择答案源代码文件 @@ -6200,17 +6209,17 @@ Are you really want to continue? 中止 - + FPS Problem Set Files (*.fps;*.xml) FPS试题集文件(*.fps;*.xml) - + FPS Problem Set Files (*.fps) FPS试题集文件(*.fps) - + Export Error 导出时出错 @@ -6220,7 +6229,7 @@ Are you really want to continue? C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + New Folder %1 新建文件夹%1 @@ -6233,68 +6242,70 @@ Are you really want to continue? 无标题%1 - + Do you really want to delete %1? 你真的要删除%1吗? - + Do you really want to delete %1 files? 你真的要删除%1个文件吗? - + Save project 保存项目 - + The project '%1' has modifications. 项目'%1'有改动。 - - + + Do you want to save it? 需要保存吗? - - + + File Changed 文件已发生变化 - + + New Project File? 新建项目文件? - + + Do you want to add the new file to the project? 您是否要将新建的文件加入项目? - - - - + + + + Save Error 保存失败 - + Change Project Compiler Set 改变项目编译器配置集 - + Change the project's compiler set will lose all custom compiler set options. 改变项目的编译器配置集会导致所有的自定义编译器选项被重置。 - - + + Do you really want to do that? 你真的想要那么做吗? @@ -6303,12 +6314,12 @@ Are you really want to continue? 批量设置案例 - + Choose input files 选择输入数据文件 - + Input data files (*.in) 输入数据文件 (*.in) @@ -6317,78 +6328,78 @@ Are you really want to continue? 无标题%1 - + Modify Watch 修改监视表达式 - + Watch Expression 监视表达式 - + Do you really want to clear all breakpoints in this file? 您真的要清除该文件的所有断点吗? - + New project 新建项目 - + Close %1 and start new project? 关闭'%1'以打开新项目? - + Folder not exist 文件夹不存在 - + Folder '%1' doesn't exist. Create it now? 文件夹'%1'不存在。是否创建? - + Can't create folder 无法创建文件夹 - + Failed to create folder '%1'. 创建文件夹'%1'失败。 - + Save new project as - + Folder %1 is not empty. 文件夹%1不是空的。 - + Do you really want to delete it? 你真的要删除它吗? - + Change working folder 改变工作文件夹 - + File '%1' is not in the current working folder. File '%1' is not in the current working folder 文件'%1'不在当前工作文件夹中。 - + Do you want to change working folder to '%1'? 是否将工作文件夹改设为'%1'? @@ -6397,28 +6408,28 @@ Are you really want to continue? 正在删除试题... - + Can't Commit 无法提交 - + Git needs user info to commit. Git需要用信息进行提交。 - + Choose Input Data File 选择输入数据文件 - - + + All files (*.*) 所有文件 (*.*) - + Choose Expected Output Data File Choose Expected Input Data File 选择期望输出文件 @@ -6430,59 +6441,59 @@ Are you really want to continue? - + Choose Working Folder 选择工作文件夹 - - + + Header Exists 头文件已存在 - - + + Header file "%1" already exists! 头文件"%1"已存在! - + Source Exists 源文件已存在! - + Source file "%1" already exists! 源文件"%1"已存在! - + Can't commit! 无法提交! - + The following files are in conflicting: 下列文件处于冲突状态,请解决后重新添加和提交: - + Commit Message 提交信息 - + Commit Message: 提交信息: - + Commit Failed 提交失败 - + Commit message shouldn't be empty! 提交信息不能为空! @@ -6491,22 +6502,22 @@ Are you really want to continue? 小熊猫Dev-C++项目文件 (*.dev) - + New project fail 新建项目失败 - + Can't assign project template 无法使用模板创建项目 - + Remove file 删除文件 - + Remove the file from disk? 同时从硬盘上删除文件? @@ -6515,246 +6526,246 @@ Are you really want to continue? 无标题 - + New Project File Name 新的项目文件名 - + File Name: 文件名: - + File Already Exists! 文件已存在! - + File '%1' already exists! 文件'%1'已经存在! - + Add to project 添加到项目 - - + + You are not using a Debug compiler setting. 您没有使用Debug编译器设置。 - + Please use a Debug compiler set, or enable the "generate debugging info (-g3)" and disable the "strip additional info (-s)" options in the compiler settings. 请在工具栏中选择Debug编译器配置集,或者在编译器配置集设置中启用“生成调试信息(-g3)”并禁用“剥除附加信息(-s)”选项。 - + Please choose a Debug compiler set in the toolbar, or enable the "generate debugging info (-g3)" and disable the "strip additional info (-s)" options in the compiler set settings's "settings" page. 请在工具栏中选择Debug编译器配置集,或者在“编译器配置集”设置的“编译/链接选项”页中<b>启用</b>“生成调试信息(-g3)”、<b>禁用</b>“剥除附件信息(-3)”。 - + C/C++ Source Files (*.c *.cpp *.cc *.cxx) C/C++源代码文件 (*.c *.cpp *.cc *.cxx) - + This operation will remove all cases for the current problem. 本操作会删除此试题的所有案例。 - + Red Panda C++ project file (*.dev) 小熊猫C++项目文件(*.dev) - + Rename Error 重命名出错 - + Symbol '%1' is defined in system header. 符号'%1'在系统头文件中定义,无法修改。 - + New Name 新名称 - - - - + + + + Replace Error 替换出错 - + Can't open file '%1' for replace! 无法打开文件'%1'进行替换! - + Contents has changed since last search! 内容和上次查找时不一致。 - + Rich Text Format Files (*.rtf) RTF格式文件 (*.rtf) - + HTML Files (*.html) HTML文件 (*.html) - + The current problem set is not empty. 当前的试题集不是空的。 - + Problem %1 试题%1 - - + + Problem Set Files (*.pbs) 试题集文件 (*.pbs) - - + + Load Error 载入失败 - - + + Problem Case %1 试题案例%1 - - - - - - - - - - - - - + + + + + + + + + + + + + Error 错误 - + Recent Projects 项目历史 - + Load Theme Error 载入主题失败 - - + + Clear History 清除历史 - - + + Version Control 版本控制 - + File '%1' was changed. 磁盘文件'%1'已被修改。 - + Reload its content from disk? 是否重新读取它的内容? - + File '%1' was removed. 磁盘文件'%1'已被删除。 - + Keep it open? 是否保持它在小熊猫C++中打开的编辑窗口? - + Open 打开 - + Compile Failed 编译失败 - + Run Failed 运行失败 - - - - + + + + Confirm Convertion 确认转换 - - - - + + + + The editing file will be saved using %1 encoding. <br />This operation can't be reverted. <br />Are you sure to continue? 当前编辑器中的文件将会使用%1编码保存。<br />这项操作无法被撤回。<br />你确定要继续吗? - + New Watch Expression 新监视表达式 - + Enter Watch Expression (it is recommended to use 'this->' for class members): 输入监视表达式 - + Parsing file %1 of %2: "%3" (%1/%2)正在解析文件"%3" - - + + Done parsing %1 files in %2 seconds 完成%1个文件的解析,用时%2秒 - + (%1 files per second) (每秒%1个文件) @@ -7380,42 +7391,42 @@ Are you really want to continue? - 资源文件: %1 - + Compiling project changes... 正在编译项目修改... - + - Project Filename: %1 - 项目文件名: %1 - + - Compiler Set Name: %1 - 编译器配置: %1 - + Make program '%1' doesn't exists! Make程序“%1”不存在! - + Please check the "program" page of compiler settings. 请检查编译器配置中的“程序”页。 - + Processing makefile: 正在处理makefile... - + - makefile processer: %1 - makefile处理器: %1 - + - Command: %1 %2 - 命令: %1 %2 @@ -9457,18 +9468,18 @@ Are you really want to continue? 性能 - - - + + + Compiler Set 编译器配置集 - - - + + + Compiler @@ -9480,7 +9491,7 @@ Are you really want to continue? 自动链接 - + @@ -9557,15 +9568,15 @@ Are you really want to continue? 杂项 - - + + Program Runner 程序运行 - + Problem Set 试题集 diff --git a/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts b/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts index 64e54cc0..9345f8f3 100644 --- a/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts +++ b/RedPandaIDE/translations/RedPandaIDE_zh_TW.ts @@ -4789,6 +4789,14 @@ Document + + New C/C++ File + + + + New GAS File + + NewClassDialog diff --git a/libs/qsynedit/qsynedit/qsynedit.cpp b/libs/qsynedit/qsynedit/qsynedit.cpp index 60e240cc..9bf957da 100644 --- a/libs/qsynedit/qsynedit/qsynedit.cpp +++ b/libs/qsynedit/qsynedit/qsynedit.cpp @@ -3910,6 +3910,15 @@ void QSynEdit::setBackgroundColor(const QColor &newBackgroundColor) mBackgroundColor = newBackgroundColor; } +bool QSynEdit::isEmpty() +{ + if (mDocument->count()>1) + return false; + if (mDocument->count()==1) + return mDocument->getLine(0).isEmpty(); + return true; +} + const QColor &QSynEdit::foregroundColor() const { return mForegroundColor; diff --git a/libs/qsynedit/qsynedit/qsynedit.h b/libs/qsynedit/qsynedit/qsynedit.h index 499fcf1c..85c7e004 100644 --- a/libs/qsynedit/qsynedit/qsynedit.h +++ b/libs/qsynedit/qsynedit/qsynedit.h @@ -425,6 +425,8 @@ public: const QColor &backgroundColor() const; void setBackgroundColor(const QColor &newBackgroundColor); + bool isEmpty(); + signals: void linesDeleted(int FirstLine, int Count); void linesInserted(int FirstLine, int Count);