Merge branch 'master' into gdbmi
This commit is contained in:
commit
e044bb0703
42
NEWS.md
42
NEWS.md
|
@ -1,3 +1,45 @@
|
|||
Version 0.9.2 For Dev-C++ 7 Beta
|
||||
- fix: gutter of the disassembly code control in the cpu info dialog is grayed
|
||||
- fix: problem set & problem views not correctly hidden when disabled in the executor / problem set options
|
||||
- fix: executor / problem set options not correctly saved
|
||||
|
||||
Version 0.9.1 For Dev-C++ 7 Beta
|
||||
- enhancement: code completion suggestion for "__func__" variable
|
||||
- fix: ide failed to start, if there are errors in the compiler set settings
|
||||
- fix: numpad's enter key doesn't work
|
||||
- enhancement: code completion suggestion for phrase after long/short/signed/unsigned
|
||||
- enhancement: save/load default projects folder
|
||||
- enhancement: add editor general options "highlight current word" and "highlight matching braces"
|
||||
|
||||
Version 0.9.0 For Dev-C++ 7 Beta
|
||||
- fix: control keys in the numpad doesn't work in the editor
|
||||
- fix: project layout infos are wrongly saved to registry
|
||||
- fix: project layout infos are not correctly saved/loaded
|
||||
|
||||
Version 0.8.11 For Dev-C++ 7 Beta
|
||||
- fix: text color for cpu info dialog not correctly setted
|
||||
|
||||
Version 0.8.10 For Dev-C++ 7 Beta
|
||||
- fix: Shouldn't update auto link settings, if the header name to be modified is unchanged
|
||||
- fix: add unit to project not correctly set new unit file's encoding
|
||||
- fix: correctly set encoding for the new added project unit file
|
||||
- fix: if there's a project openned, new file should ask user if he want to add the new file to the project
|
||||
- fix: when adding a file openned in the editor to the project, properties of it are not correctly setted.
|
||||
- enhancement: when remove a file from the project, also ask if user want to remove it from disk
|
||||
- fix: double click a project's .dev file in the Files panel should load the project
|
||||
|
||||
Version 0.8.9 For Dev-C++ 7 Beta
|
||||
- fix: text color of labels in statusbar not correctly updated when change theme
|
||||
|
||||
Version 0.8.8 For Dev-C++ 7 Beta
|
||||
- enhancement: drag & drop text in the editor
|
||||
- enhancement: auto calcuate caret line size basing on font size
|
||||
- enhancement: shift+mouse wheel to scroll horizontally
|
||||
- fix: greatly reduces paste time
|
||||
- fix: auto indent shouldn't use preprocessor's indent to calculate
|
||||
- fix: option "don't add leading zeros to line numbers" not work
|
||||
- fix: "collapse all" and "uncollapse all" doesn't work
|
||||
|
||||
Version 0.8.7 For Dev-C++ 7 Beta
|
||||
- enhancement: auto indent line to column 1 when enter '#' at beginning of line
|
||||
- fix: when enter '{' or '}' at beginning of line, auto indent will remove all contents of the line
|
||||
|
|
|
@ -199,6 +199,7 @@ HEADERS += \
|
|||
thememanager.h \
|
||||
todoparser.h \
|
||||
toolsmanager.h \
|
||||
version.h \
|
||||
widgets/aboutdialog.h \
|
||||
widgets/bookmarkmodel.h \
|
||||
widgets/classbrowser.h \
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
@ -4,6 +4,7 @@
|
|||
#include "../systemconsts.h"
|
||||
#include "../platform.h"
|
||||
#include "../editor.h"
|
||||
#include "../version.h"
|
||||
|
||||
#include <QDir>
|
||||
|
||||
|
@ -339,14 +340,14 @@ void ProjectCompiler::writeMakeObjFilesRules(QFile &file)
|
|||
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
|
||||
.arg(unit->editor()->fileEncoding(),
|
||||
defaultSystemEncoding);
|
||||
} else if (unit->encoding()!=ENCODING_ASCII) {
|
||||
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
|
||||
.arg(unit->encoding(),
|
||||
defaultSystemEncoding);
|
||||
} else if (unit->encoding()!=ENCODING_SYSTEM_DEFAULT) {
|
||||
} else if (unit->encoding()==ENCODING_SYSTEM_DEFAULT) {
|
||||
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
|
||||
.arg(defaultSystemEncoding,
|
||||
defaultSystemEncoding);
|
||||
} else if (unit->encoding()!=ENCODING_ASCII && !unit->encoding().isEmpty()) {
|
||||
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
|
||||
.arg(unit->encoding(),
|
||||
defaultSystemEncoding);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,7 @@ bool CppRefacter::findOccurence(Editor *editor, const BufferCoord &pos)
|
|||
bool CppRefacter::findOccurence(const QString &statementFullname, SearchFileScope scope)
|
||||
{
|
||||
PCppParser parser;
|
||||
Editor * editor;
|
||||
Editor * editor=nullptr;
|
||||
std::shared_ptr<Project> project;
|
||||
if (scope == SearchFileScope::currentFile) {
|
||||
editor = pMainWindow->editorList()->getEditor();
|
||||
|
|
|
@ -692,6 +692,16 @@ void Editor::keyPressEvent(QKeyEvent *event)
|
|||
QString lastWord = getPreviousWordAtPositionForSuggestion(caretXY());
|
||||
if (!lastWord.isEmpty()) {
|
||||
if (CppTypeKeywords.contains(lastWord)) {
|
||||
if (lastWord == "long" ||
|
||||
lastWord == "short" ||
|
||||
lastWord == "signed" ||
|
||||
lastWord == "unsigned"
|
||||
) {
|
||||
setSelText(ch);
|
||||
showCompletion(lastWord,false);
|
||||
handled=true;
|
||||
return;
|
||||
}
|
||||
//last word is a type keyword, this is a var or param define, and dont show suggestion
|
||||
// if devEditor.UseTabnine then
|
||||
// ShowTabnineCompletion;
|
||||
|
@ -713,7 +723,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
|
|||
}
|
||||
}
|
||||
setSelText(ch);
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
handled=true;
|
||||
return;
|
||||
}
|
||||
|
@ -727,7 +737,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
|
|||
&& pSettings->codeCompletion().showCompletionWhileInput() ) {
|
||||
mLastIdCharPressed++;
|
||||
setSelText(ch);
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
handled=true;
|
||||
return;
|
||||
}
|
||||
|
@ -739,7 +749,7 @@ void Editor::keyPressEvent(QKeyEvent *event)
|
|||
&& pSettings->codeCompletion().showCompletionWhileInput() ) {
|
||||
mLastIdCharPressed++;
|
||||
setSelText(ch);
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
handled=true;
|
||||
return;
|
||||
}
|
||||
|
@ -910,7 +920,8 @@ void Editor::onPreparePaintHighlightToken(int line, int aChar, const QString &to
|
|||
foreground = mCurrentHighlighWordForeground;
|
||||
if (mCurrentHighlighWordBackground.isValid())
|
||||
background = mCurrentHighlighWordBackground;
|
||||
} else if (!selAvail() && attr->name() == SYNS_AttrSymbol) {
|
||||
} else if (!selAvail() && attr->name() == SYNS_AttrSymbol
|
||||
&& pSettings->editor().highlightMathingBraces()) {
|
||||
// qDebug()<<line<<":"<<aChar<<" - "<<mHighlightCharPos1.Line<<":"<<mHighlightCharPos1.Char<<" - "<<mHighlightCharPos2.Line<<":"<<mHighlightCharPos2.Char;
|
||||
if ( (line == mHighlightCharPos1.Line)
|
||||
&& (aChar == mHighlightCharPos1.Char)) {
|
||||
|
@ -1139,7 +1150,7 @@ void Editor::inputMethodEvent(QInputMethodEvent *event)
|
|||
return;
|
||||
}
|
||||
}
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1398,10 +1409,6 @@ void Editor::onStatusChanged(SynStatusChanges changes)
|
|||
|
||||
if (changes.testFlag(SynStatusChange::scCaretX)
|
||||
|| changes.testFlag(SynStatusChange::scCaretY)) {
|
||||
invalidateLine(mHighlightCharPos1.Line);
|
||||
invalidateLine(mHighlightCharPos2.Line);
|
||||
mHighlightCharPos1 = BufferCoord{0,0};
|
||||
mHighlightCharPos2 = BufferCoord{0,0};
|
||||
if (mTabStopBegin >=0) {
|
||||
if (mTabStopY==caretY()) {
|
||||
if (mLineAfterTabStop.isEmpty()) {
|
||||
|
@ -1427,7 +1434,11 @@ void Editor::onStatusChanged(SynStatusChanges changes)
|
|||
clearUserCodeInTabStops();
|
||||
}
|
||||
}
|
||||
} else if (!selAvail() && highlighter()){
|
||||
} else if (!selAvail() && highlighter() && pSettings->editor().highlightMathingBraces()){
|
||||
invalidateLine(mHighlightCharPos1.Line);
|
||||
invalidateLine(mHighlightCharPos2.Line);
|
||||
mHighlightCharPos1 = BufferCoord{0,0};
|
||||
mHighlightCharPos2 = BufferCoord{0,0};
|
||||
// Is there a bracket char before us?
|
||||
int lineLength = lineText().length();
|
||||
int ch = caretX() - 2;
|
||||
|
@ -1461,8 +1472,11 @@ void Editor::onStatusChanged(SynStatusChanges changes)
|
|||
|
||||
// scSelection includes anything caret related
|
||||
if (changes.testFlag(SynStatusChange::scSelection)) {
|
||||
if (!selAvail()) {
|
||||
if (!selAvail() && pSettings->editor().highlightCurrentWord()) {
|
||||
mCurrentHighlightedWord = wordAtCursor();
|
||||
} else if (selAvail() && blockBegin() == wordStart()
|
||||
&& blockEnd() == wordEnd()){
|
||||
mCurrentHighlightedWord = selText();
|
||||
} else {
|
||||
mCurrentHighlightedWord = "";
|
||||
}
|
||||
|
@ -1904,20 +1918,20 @@ bool Editor::handleCodeCompletion(QChar key)
|
|||
switch(key.unicode()) {
|
||||
case '.':
|
||||
setSelText(key);
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
return true;
|
||||
case '>':
|
||||
setSelText(key);
|
||||
if ((caretX() > 2) && (lineText().length() >= 2) &&
|
||||
(lineText()[caretX() - 3] == '-'))
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
return true;
|
||||
case ':':
|
||||
ExecuteCommand(SynEditorCommand::ecChar,':',nullptr);
|
||||
//setSelText(key);
|
||||
if ((caretX() > 2) && (lineText().length() >= 2) &&
|
||||
(lineText()[caretX() - 3] == ':'))
|
||||
showCompletion(false);
|
||||
showCompletion("",false);
|
||||
return true;
|
||||
case '/':
|
||||
case '\\':
|
||||
|
@ -2260,7 +2274,7 @@ void Editor::exportAsHTML(const QString &htmlFilename)
|
|||
exporter.SaveToFile(htmlFilename);
|
||||
}
|
||||
|
||||
void Editor::showCompletion(bool autoComplete)
|
||||
void Editor::showCompletion(const QString& preWord,bool autoComplete)
|
||||
{
|
||||
if (!pSettings->codeCompletion().enabled())
|
||||
return;
|
||||
|
@ -2337,8 +2351,7 @@ void Editor::showCompletion(bool autoComplete)
|
|||
|
||||
if (word.isEmpty())
|
||||
word=getWordAtPosition(this,caretXY(),pBeginPos,pEndPos, WordPurpose::wpCompletion);
|
||||
//if not fCompletionBox.Visible then
|
||||
mCompletionPopup->prepareSearch(word, mFilename, pBeginPos.Line);
|
||||
mCompletionPopup->prepareSearch(preWord, word, mFilename, pBeginPos.Line);
|
||||
|
||||
// Filter the whole statement list
|
||||
if (mCompletionPopup->search(word, autoComplete)) { //only one suggestion and it's not input while typing
|
||||
|
|
|
@ -202,7 +202,7 @@ private:
|
|||
void undoSymbolCompletion(int pos);
|
||||
QuoteStatus getQuoteStatus();
|
||||
|
||||
void showCompletion(bool autoComplete);
|
||||
void showCompletion(const QString& preWord, bool autoComplete);
|
||||
void showHeaderCompletion(bool autoComplete);
|
||||
|
||||
bool testInFunc(int x,int y);
|
||||
|
|
|
@ -80,7 +80,7 @@ int main(int argc, char *argv[])
|
|||
QApplication app(argc, argv);
|
||||
|
||||
//Translation must be loaded first
|
||||
QTranslator trans;
|
||||
QTranslator trans,transQt;
|
||||
QString settingFilename = getSettingFilename();
|
||||
if (!isGreenEdition()) {
|
||||
QDir::setCurrent(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0]);
|
||||
|
@ -91,9 +91,14 @@ int main(int argc, char *argv[])
|
|||
QSettings languageSetting(settingFilename,QSettings::IniFormat);
|
||||
languageSetting.beginGroup(SETTING_ENVIRONMENT);
|
||||
QString language = languageSetting.value("language",QLocale::system().name()).toString();
|
||||
trans.load("RedPandaIDE_"+language,":/translations");
|
||||
|
||||
if (trans.load("RedPandaIDE_"+language,":/translations")) {
|
||||
app.installTranslator(&trans);
|
||||
}
|
||||
if (transQt.load("qt_"+language,":/translations")) {
|
||||
app.installTranslator(&transQt);
|
||||
}
|
||||
}
|
||||
|
||||
qRegisterMetaType<PCompileIssue>("PCompileIssue");
|
||||
qRegisterMetaType<PCompileIssue>("PCompileIssue&");
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "widgets/darkfusionstyle.h"
|
||||
#include "problems/problemcasevalidator.h"
|
||||
#include "widgets/ojproblempropertywidget.h"
|
||||
#include "version.h"
|
||||
|
||||
#include <QCloseEvent>
|
||||
#include <QComboBox>
|
||||
|
@ -511,6 +512,10 @@ void MainWindow::applySettings()
|
|||
else
|
||||
QApplication::setStyle("fusion");
|
||||
qApp->setPalette(appTheme->palette());
|
||||
//fix for qstatusbar bug
|
||||
mFileEncodingStatus->setPalette(appTheme->palette());
|
||||
mFileModeStatus->setPalette(appTheme->palette());
|
||||
mFileInfoStatus->setPalette(appTheme->palette());
|
||||
updateEditorColorSchemes();
|
||||
|
||||
QFont font(pSettings->environment().interfaceFont(),
|
||||
|
@ -529,7 +534,7 @@ void MainWindow::applySettings()
|
|||
if (!mTcpServer.listen(QHostAddress::LocalHost,pSettings->executor().competivieCompanionPort())) {
|
||||
// QMessageBox::critical(nullptr,
|
||||
// tr("Listen failed"),
|
||||
// tr("Can't listen to port %1 form Competitve Companion.").arg(10045)
|
||||
// tr("Can't listen to port %1 form Competitive Companion.").arg(10045)
|
||||
// + "<BR/>"
|
||||
// +tr("You can turn off competitive companion support in the Problem Set options.")
|
||||
// + "<BR/>"
|
||||
|
@ -569,7 +574,8 @@ void MainWindow::applyUISettings()
|
|||
ui->actionFiles->setChecked(settings.showFiles());
|
||||
showHideInfosTab(ui->tabFiles,settings.showFiles());
|
||||
ui->actionProblem_Set->setChecked(settings.showProblemSet());
|
||||
showHideInfosTab(ui->tabProblemSet,settings.showProblemSet());
|
||||
showHideInfosTab(ui->tabProblemSet,settings.showProblemSet()
|
||||
&& pSettings->executor().enableProblemSet());
|
||||
|
||||
ui->actionIssues->setChecked(settings.showIssues());
|
||||
showHideMessagesTab(ui->tabIssues,settings.showIssues());
|
||||
|
@ -584,7 +590,8 @@ void MainWindow::applyUISettings()
|
|||
ui->actionBookmark->setChecked(settings.showBookmark());
|
||||
showHideMessagesTab(ui->tabBookmark,settings.showBookmark());
|
||||
ui->actionProblem->setChecked(settings.showProblem());
|
||||
showHideMessagesTab(ui->tabProblem,settings.showProblem());
|
||||
showHideMessagesTab(ui->tabProblem,settings.showProblem()
|
||||
&& pSettings->executor().enableProblemSet());
|
||||
//we can't show/hide left/bottom panels here, cause mainwindow layout is not calculated
|
||||
}
|
||||
|
||||
|
@ -2669,12 +2676,14 @@ void MainWindow::onLstProblemSetContextMenu(const QPoint &pos)
|
|||
QAction * action = new QAction(tr("select other file..."),menuSetAnswer);
|
||||
connect(action, &QAction::triggered,
|
||||
[problem,this](){
|
||||
QFileDialog dialog;
|
||||
QString filename = QFileDialog::getOpenFileName(
|
||||
this,
|
||||
tr("Select Answer Source File"),
|
||||
QString(),
|
||||
tr("C/C++Source Files (*.c *.cpp *.cc *.cxx)")
|
||||
);
|
||||
tr("C/C++Source Files (*.c *.cpp *.cc *.cxx)"),
|
||||
nullptr,
|
||||
dialog.options() | QFileDialog::DontUseNativeDialog);
|
||||
if (!filename.isEmpty()) {
|
||||
QDir::setCurrent(extractFileDir(filename));
|
||||
problem->answerProgram = filename;
|
||||
|
@ -3133,7 +3142,7 @@ void MainWindow::onFileChanged(const QString &path)
|
|||
if (e) {
|
||||
if (fileExists(path)) {
|
||||
e->activate();
|
||||
if (QMessageBox::question(this,tr("Compile"),
|
||||
if (QMessageBox::question(this,tr("File Changed"),
|
||||
tr("File '%1' was changed.").arg(path)+"<BR /><BR />" + tr("Reload its content from disk?"),
|
||||
QMessageBox::Yes|QMessageBox::No,
|
||||
QMessageBox::No) == QMessageBox::Yes) {
|
||||
|
@ -3144,7 +3153,7 @@ void MainWindow::onFileChanged(const QString &path)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
if (QMessageBox::question(this,tr("Compile"),
|
||||
if (QMessageBox::question(this,tr("File Changed"),
|
||||
tr("File '%1' was removed.").arg(path)+"<BR /><BR />" + tr("Keep it open?"),
|
||||
QMessageBox::Yes|QMessageBox::No,
|
||||
QMessageBox::Yes) == QMessageBox::No) {
|
||||
|
@ -3201,6 +3210,15 @@ CPUDialog *MainWindow::cpuDialog() const
|
|||
|
||||
void MainWindow::on_actionNew_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();
|
||||
return;
|
||||
}
|
||||
}
|
||||
newEditor();
|
||||
}
|
||||
|
||||
|
@ -3770,7 +3788,7 @@ void MainWindow::on_actionUnfoldAll_triggered()
|
|||
{
|
||||
Editor * editor = mEditorList->getEditor();
|
||||
if (editor != NULL ) {
|
||||
//editor->clearFolds();
|
||||
editor->unCollpaseAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3778,8 +3796,7 @@ void MainWindow::on_actionFoldAll_triggered()
|
|||
{
|
||||
Editor * editor = mEditorList->getEditor();
|
||||
if (editor != NULL ) {
|
||||
//editor->clearFolds();
|
||||
//editor->foldAll();
|
||||
editor->collapseAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4549,6 +4566,10 @@ void MainWindow::on_actionNew_Project_triggered()
|
|||
{
|
||||
NewProjectDialog dialog;
|
||||
if (dialog.exec() == QDialog::Accepted) {
|
||||
if (dialog.useAsDefaultProjectDir()) {
|
||||
pSettings->dirs().setProjectDir(dialog.getLocation());
|
||||
pSettings->dirs().save();
|
||||
}
|
||||
// Take care of the currently opened project
|
||||
QString s;
|
||||
if (mProject) {
|
||||
|
@ -4569,19 +4590,20 @@ void MainWindow::on_actionNew_Project_triggered()
|
|||
}
|
||||
|
||||
//Create the project folder
|
||||
QDir dir(dialog.getLocation());
|
||||
QString location = includeTrailingPathDelimiter(dialog.getLocation())+dialog.getProjectName();
|
||||
QDir dir(location);
|
||||
if (!dir.exists()) {
|
||||
if (QMessageBox::question(this,
|
||||
tr("Folder not exist"),
|
||||
tr("Folder '%1' doesn't exist. Create it now?").arg(dialog.getLocation()),
|
||||
tr("Folder '%1' doesn't exist. Create it now?").arg(location),
|
||||
QMessageBox::Yes | QMessageBox::No,
|
||||
QMessageBox::Yes) != QMessageBox::Yes) {
|
||||
return;
|
||||
}
|
||||
if (!dir.mkpath(dialog.getLocation())) {
|
||||
if (!dir.mkpath(location)) {
|
||||
QMessageBox::critical(this,
|
||||
tr("Can't create folder"),
|
||||
tr("Failed to create folder '%1'.").arg(dialog.getLocation()),
|
||||
tr("Failed to create folder '%1'.").arg(location),
|
||||
QMessageBox::Yes);
|
||||
return;
|
||||
}
|
||||
|
@ -4590,14 +4612,14 @@ void MainWindow::on_actionNew_Project_triggered()
|
|||
// if cbDefault.Checked then
|
||||
// devData.DefCpp := rbCpp.Checked;
|
||||
|
||||
s = includeTrailingPathDelimiter(dialog.getLocation())
|
||||
s = includeTrailingPathDelimiter(location)
|
||||
+ dialog.getProjectName() + "." + DEV_PROJECT_EXT;
|
||||
|
||||
if (fileExists(s)) {
|
||||
QString saveName = QFileDialog::getSaveFileName(
|
||||
this,
|
||||
tr("Save new project as"),
|
||||
dialog.getLocation(),
|
||||
location,
|
||||
tr("Red panda Dev-C++ project file (*.dev)"));
|
||||
if (!saveName.isEmpty()) {
|
||||
s = saveName;
|
||||
|
@ -4645,46 +4667,7 @@ void MainWindow::on_actionSaveAll_triggered()
|
|||
|
||||
void MainWindow::on_actionProject_New_File_triggered()
|
||||
{
|
||||
int idx = -1;
|
||||
if (!mProject)
|
||||
return;
|
||||
QModelIndex current = ui->projectView->currentIndex();
|
||||
FolderNode * node = nullptr;
|
||||
if (current.isValid()) {
|
||||
node = static_cast<FolderNode*>(current.internalPointer());
|
||||
}
|
||||
QString newFileName;
|
||||
do {
|
||||
newFileName = tr("untitled")+QString("%1").arg(getNewFileNumber());
|
||||
if (mProject->options().useGPP) {
|
||||
newFileName+=".cpp";
|
||||
} else {
|
||||
newFileName+=".c";
|
||||
}
|
||||
} while (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName)));
|
||||
|
||||
newFileName = QInputDialog::getText(
|
||||
this,
|
||||
tr("New Project File Name"),
|
||||
tr("File Name:"),
|
||||
QLineEdit::Normal,
|
||||
newFileName);
|
||||
if (newFileName.isEmpty())
|
||||
return;
|
||||
if (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))) {
|
||||
QMessageBox::critical(this,tr("File Already Exists!"),
|
||||
tr("File '%1' already exists!").arg(newFileName));
|
||||
return;
|
||||
}
|
||||
PProjectUnit newUnit = mProject->newUnit(
|
||||
mProject->pointerToNode(node),newFileName);
|
||||
idx = mProject->units().count()-1;
|
||||
mProject->saveUnits();
|
||||
updateProjectView();
|
||||
Editor * editor = mProject->openUnit(idx);
|
||||
//editor->setUseCppSyntax(mProject->options().useGPP);
|
||||
//editor->setModified(true);
|
||||
editor->activate();
|
||||
newProjectUnitFile();
|
||||
}
|
||||
|
||||
|
||||
|
@ -4733,9 +4716,14 @@ void MainWindow::on_actionRemove_from_project_triggered()
|
|||
continue;
|
||||
selected.insert(folderNode->unitIndex);
|
||||
};
|
||||
|
||||
bool removeFile = (QMessageBox::question(this,tr("Remove file"),
|
||||
tr("Remove the file from disk?"),
|
||||
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes);
|
||||
|
||||
for (int i=mProject->units().count()-1;i>=0;i--) {
|
||||
if (selected.contains(i)) {
|
||||
mProject->removeEditor(i,true);
|
||||
mProject->removeUnit(i,true,removeFile);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4943,6 +4931,50 @@ void MainWindow::prepareTabMessagesData()
|
|||
mTabMessagesData[widget]=info;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::newProjectUnitFile()
|
||||
{
|
||||
if (!mProject)
|
||||
return;
|
||||
int idx = -1;
|
||||
QModelIndex current = ui->projectView->currentIndex();
|
||||
FolderNode * node = nullptr;
|
||||
if (current.isValid()) {
|
||||
node = static_cast<FolderNode*>(current.internalPointer());
|
||||
}
|
||||
QString newFileName;
|
||||
do {
|
||||
newFileName = tr("untitled")+QString("%1").arg(getNewFileNumber());
|
||||
if (mProject->options().useGPP) {
|
||||
newFileName+=".cpp";
|
||||
} else {
|
||||
newFileName+=".c";
|
||||
}
|
||||
} while (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName)));
|
||||
|
||||
newFileName = QInputDialog::getText(
|
||||
this,
|
||||
tr("New Project File Name"),
|
||||
tr("File Name:"),
|
||||
QLineEdit::Normal,
|
||||
newFileName);
|
||||
if (newFileName.isEmpty())
|
||||
return;
|
||||
if (fileExists(QDir(mProject->directory()).absoluteFilePath(newFileName))) {
|
||||
QMessageBox::critical(this,tr("File Already Exists!"),
|
||||
tr("File '%1' already exists!").arg(newFileName));
|
||||
return;
|
||||
}
|
||||
PProjectUnit newUnit = mProject->newUnit(
|
||||
mProject->pointerToNode(node),newFileName);
|
||||
idx = mProject->units().count()-1;
|
||||
mProject->saveUnits();
|
||||
updateProjectView();
|
||||
Editor * editor = mProject->openUnit(idx);
|
||||
//editor->setUseCppSyntax(mProject->options().useGPP);
|
||||
//editor->setModified(true);
|
||||
editor->activate();
|
||||
}
|
||||
void MainWindow::on_EditorTabsLeft_currentChanged(int)
|
||||
{
|
||||
Editor * editor = mEditorList->getEditor(-1,ui->EditorTabsLeft);
|
||||
|
@ -5374,9 +5406,10 @@ void MainWindow::on_treeFiles_doubleClicked(const QModelIndex &index)
|
|||
QString filepath = mFileSystemModel.filePath(index);
|
||||
QFileInfo file(filepath);
|
||||
if (file.isFile()) {
|
||||
Editor * editor = mEditorList->getEditorByFilename(filepath);
|
||||
if (editor) {
|
||||
editor->activate();
|
||||
if (getFileType(filepath)==FileType::Project) {
|
||||
openProject(filepath);
|
||||
} else {
|
||||
openFile(filepath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -226,6 +226,7 @@ private:
|
|||
void showHideMessagesTab(QWidget *widget, bool show);
|
||||
void prepareTabInfosData();
|
||||
void prepareTabMessagesData();
|
||||
void newProjectUnitFile();
|
||||
|
||||
private slots:
|
||||
void onAutoSaveTimeout();
|
||||
|
|
|
@ -85,7 +85,7 @@
|
|||
<enum>QTabWidget::West</enum>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="usesScrollButtons">
|
||||
<bool>true</bool>
|
||||
|
|
|
@ -2153,6 +2153,21 @@ void CppParser::handleMethod(const QString &sType, const QString &sName, const Q
|
|||
true,
|
||||
false);
|
||||
}
|
||||
// add "__func__ variable"
|
||||
addStatement(
|
||||
functionStatement,
|
||||
mCurrentFile,
|
||||
"", //dont override hint
|
||||
"static const char ",
|
||||
"__func__",
|
||||
"[]",
|
||||
"\""+scopelessName+"\"",
|
||||
startLine+1,
|
||||
StatementKind::skVariable,
|
||||
StatementScope::ssLocal,
|
||||
StatementClassScope::scsNone,
|
||||
true,
|
||||
false);
|
||||
} else {
|
||||
functionStatement = addStatement(
|
||||
functionClass,
|
||||
|
|
|
@ -154,6 +154,8 @@ void initParser()
|
|||
//CppTypeKeywords.insert("unsigned");
|
||||
CppTypeKeywords.insert("void");
|
||||
CppTypeKeywords.insert("wchar_t");
|
||||
CppTypeKeywords.insert("signed");
|
||||
CppTypeKeywords.insert("unsigned");
|
||||
|
||||
// it's part of type info
|
||||
CppKeywords.insert("const",SkipType::skNone);
|
||||
|
|
|
@ -260,7 +260,7 @@ PProjectUnit Project::newUnit(PFolderNode parentNode, const QString& customFileN
|
|||
newUnit->setOverrideBuildCmd(false);
|
||||
newUnit->setBuildCmd("");
|
||||
newUnit->setModified(true);
|
||||
newUnit->setEncoding(toByteArray(options().encoding));
|
||||
newUnit->setEncoding(toByteArray(mOptions.encoding));
|
||||
return newUnit;
|
||||
}
|
||||
|
||||
|
@ -285,7 +285,7 @@ Editor *Project::openUnit(int index)
|
|||
editor = pMainWindow->editorList()->newEditor(fullPath, encoding, true, unit->isNew());
|
||||
editor->setInProject(true);
|
||||
unit->setEditor(editor);
|
||||
unit->setEncoding(encoding);
|
||||
//unit->setEncoding(encoding);
|
||||
editor->activate();
|
||||
loadUnitLayout(editor,index);
|
||||
return editor;
|
||||
|
@ -340,7 +340,7 @@ void Project::rebuildNodes()
|
|||
emit nodesChanged();
|
||||
}
|
||||
|
||||
bool Project::removeEditor(int index, bool doClose)
|
||||
bool Project::removeUnit(int index, bool doClose , bool removeFile)
|
||||
{
|
||||
mModel.beginUpdate();
|
||||
auto action = finally([this]{
|
||||
|
@ -357,6 +357,10 @@ bool Project::removeEditor(int index, bool doClose)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (removeFile) {
|
||||
QFile::remove(unit->fileName());
|
||||
}
|
||||
|
||||
//if not fUnits.GetItem(index).fNew then
|
||||
PFolderNode node = unit->node();
|
||||
PFolderNode parent = node->parent.lock();
|
||||
|
@ -416,7 +420,7 @@ void Project::saveAll()
|
|||
|
||||
void Project::saveLayout()
|
||||
{
|
||||
QSettings layIni(changeFileExt(mFilename, "layout"),QSettings::IniFormat);
|
||||
SimpleIni layIni;
|
||||
QStringList sl;
|
||||
// Write list of open project files
|
||||
for (int i=0;i<pMainWindow->editorList()->pageCount();i++) {
|
||||
|
@ -424,39 +428,37 @@ void Project::saveLayout()
|
|||
if (e && e->inProject())
|
||||
sl.append(QString("%1").arg(indexInUnits(e)));
|
||||
}
|
||||
layIni.beginGroup("Editors");
|
||||
layIni.setValue("Order",sl.join(","));
|
||||
layIni.SetValue("Editors","Order",sl.join(",").toUtf8());
|
||||
|
||||
Editor *e, *e2;
|
||||
// Remember what files were visible
|
||||
pMainWindow->editorList()->getVisibleEditors(e, e2);
|
||||
if (e)
|
||||
layIni.setValue("Focused", indexInUnits(e));
|
||||
layIni.endGroup();
|
||||
layIni.SetLongValue("Editors","Focused", indexInUnits(e));
|
||||
// save editor info
|
||||
for (int i=0;i<mUnits.count();i++) {
|
||||
layIni.beginGroup(QString("Editor_%1").arg(i));
|
||||
QByteArray groupName = QString("Editor_%1").arg(i).toUtf8();
|
||||
PProjectUnit unit = mUnits[i];
|
||||
Editor* editor = unit->editor();
|
||||
if (editor) {
|
||||
layIni.setValue("CursorCol", editor->caretX());
|
||||
layIni.setValue("CursorRow", editor->caretY());
|
||||
layIni.setValue("TopLine", editor->topLine());
|
||||
layIni.setValue("LeftChar", editor->leftChar());
|
||||
layIni.SetLongValue(groupName,"CursorCol", editor->caretX());
|
||||
layIni.SetLongValue(groupName,"CursorRow", editor->caretY());
|
||||
layIni.SetLongValue(groupName,"TopLine", editor->topLine());
|
||||
layIni.SetLongValue(groupName,"LeftChar", editor->leftChar());
|
||||
}
|
||||
layIni.endGroup();
|
||||
// remove old data from project file
|
||||
SimpleIni ini;
|
||||
ini.LoadFile(mFilename.toLocal8Bit());
|
||||
QByteArray groupName = toByteArray(QString("Unit%1").arg(i+1));
|
||||
ini.LoadFile(filename().toLocal8Bit());
|
||||
groupName = toByteArray(QString("Unit%1").arg(i+1));
|
||||
ini.Delete(groupName,"Open");
|
||||
ini.Delete(groupName,"Top");
|
||||
ini.Delete(groupName,"CursorCol");
|
||||
ini.Delete(groupName,"CursorRow");
|
||||
ini.Delete(groupName,"TopLine");
|
||||
ini.Delete(groupName,"LeftChar");
|
||||
ini.SaveFile(mFilename.toLocal8Bit());
|
||||
ini.SaveFile(filename().toLocal8Bit());
|
||||
}
|
||||
layIni.SaveFile(changeFileExt(filename(), "layout").toLocal8Bit());
|
||||
}
|
||||
|
||||
void Project::saveUnitAs(int i, const QString &sFileName, bool syncEditor)
|
||||
|
@ -496,20 +498,22 @@ void Project::saveUnitLayout(Editor *e, int index)
|
|||
{
|
||||
if (!e)
|
||||
return;
|
||||
QSettings layIni = QSettings(changeFileExt(filename(), "layout"));
|
||||
layIni.beginGroup(QString("Editor_%1").arg(index));
|
||||
layIni.setValue("CursorCol", e->caretX());
|
||||
layIni.setValue("CursorRow", e->caretY());
|
||||
layIni.setValue("TopLine", e->topLine());
|
||||
layIni.setValue("LeftChar", e->leftChar());
|
||||
layIni.endGroup();
|
||||
SimpleIni layIni;
|
||||
QByteArray groupName = (QString("Editor_%1").arg(index)).toUtf8();
|
||||
layIni.SetLongValue(groupName,"CursorCol", e->caretX());
|
||||
layIni.SetLongValue(groupName,"CursorRow", e->caretY());
|
||||
layIni.SetLongValue(groupName,"TopLine", e->topLine());
|
||||
layIni.SetLongValue(groupName,"LeftChar", e->leftChar());
|
||||
layIni.SaveFile((changeFileExt(filename(), "layout")).toLocal8Bit());
|
||||
}
|
||||
|
||||
bool Project::saveUnits()
|
||||
{
|
||||
int count = 0;
|
||||
SimpleIni ini;
|
||||
ini.LoadFile(mFilename.toLocal8Bit());
|
||||
SI_Error error = ini.LoadFile(mFilename.toLocal8Bit());
|
||||
if (error != SI_Error::SI_OK)
|
||||
return false;
|
||||
for (int idx = 0; idx < mUnits.count(); idx++) {
|
||||
PProjectUnit unit = mUnits[idx];
|
||||
bool rd_only = false;
|
||||
|
@ -790,7 +794,15 @@ PProjectUnit Project::addUnit(const QString &inFileName, PFolderNode parentNode,
|
|||
// Set all properties
|
||||
newUnit->setFileName(QDir(directory()).filePath(inFileName));
|
||||
newUnit->setNew(false);
|
||||
Editor * e= pMainWindow->editorList()->getOpenedEditorByFilename(newUnit->fileName());
|
||||
if (e) {
|
||||
newUnit->setEditor(e);
|
||||
newUnit->setEncoding(e->encodingOption());
|
||||
e->setInProject(true);
|
||||
} else {
|
||||
newUnit->setEditor(nullptr);
|
||||
newUnit->setEncoding(ENCODING_AUTO_DETECT);
|
||||
}
|
||||
newUnit->setFolder(getFolderPath(parentNode));
|
||||
newUnit->setNode(makeNewFileNode(extractFileName(newUnit->fileName()), false, parentNode));
|
||||
newUnit->node()->unitIndex = mUnits.count();
|
||||
|
@ -1290,12 +1302,13 @@ QString Project::listUnitStr(const QChar &separator)
|
|||
|
||||
void Project::loadLayout()
|
||||
{
|
||||
QSettings layIni = QSettings(changeFileExt(filename(), "layout"),QSettings::IniFormat);
|
||||
layIni.beginGroup("Editors");
|
||||
int topLeft = layIni.value("Focused", -1).toInt();
|
||||
SimpleIni layIni;
|
||||
SI_Error error = layIni.LoadFile(changeFileExt(filename(), "layout").toLocal8Bit());
|
||||
if (error!=SI_OK)
|
||||
return;
|
||||
int topLeft = layIni.GetLongValue("Editors","Focused",1);
|
||||
//TopRight := layIni.ReadInteger('Editors', 'FocusedRight', -1);
|
||||
QString temp =layIni.value("Order", "").toString();
|
||||
layIni.endGroup();
|
||||
QString temp =layIni.GetValue("Editors","Order", "");
|
||||
QStringList sl = temp.split(",",Qt::SkipEmptyParts);
|
||||
|
||||
foreach (const QString& s,sl) {
|
||||
|
@ -1308,7 +1321,6 @@ void Project::loadLayout()
|
|||
if (topLeft>=0 && topLeft<mUnits.count() && mUnits[topLeft]->editor()) {
|
||||
mUnits[topLeft]->editor()->activate();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Project::loadOptions(SimpleIni& ini)
|
||||
|
@ -1444,13 +1456,16 @@ void Project::loadUnitLayout(Editor *e, int index)
|
|||
{
|
||||
if (!e)
|
||||
return;
|
||||
QSettings layIni(changeFileExt(filename(), "layout"), QSettings::IniFormat);
|
||||
layIni.beginGroup(QString("Editor_%1").arg(index));
|
||||
e->setCaretY(layIni.value("CursorRow",1).toInt());
|
||||
e->setCaretX(layIni.value("CursorCol",1).toInt());
|
||||
e->setTopLine(layIni.value("TopLine",1).toInt());
|
||||
e->setLeftChar(layIni.value("LeftChar",1).toInt());
|
||||
layIni.endGroup();
|
||||
SimpleIni layIni;
|
||||
SI_Error error;
|
||||
error = layIni.LoadFile(changeFileExt(filename(), "layout").toLocal8Bit());
|
||||
if (error != SI_Error::SI_OK)
|
||||
return;
|
||||
QByteArray groupName = (QString("Editor_%1").arg(index)).toUtf8();
|
||||
e->setCaretY(layIni.GetLongValue(groupName,"CursorRow",1));
|
||||
e->setCaretX(layIni.GetLongValue(groupName,"CursorCol",1));
|
||||
e->setTopLine(layIni.GetLongValue(groupName,"TopLine",1));
|
||||
e->setLeftChar(layIni.GetLongValue(groupName,"LeftChar",1));
|
||||
}
|
||||
|
||||
PCppParser Project::cppParser()
|
||||
|
@ -1514,7 +1529,7 @@ void Project::removeFolderRecurse(PFolderNode node)
|
|||
} else if (childNode->unitIndex >= 0 && childNode->level > 0) {
|
||||
// Remove editor in folder from project
|
||||
int editorIndex = childNode->unitIndex;
|
||||
if (!removeEditor(editorIndex,true))
|
||||
if (!removeUnit(editorIndex,true))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1919,7 +1934,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||
// Remove it from the current project...
|
||||
int projindex = mProject->indexInUnits(newName);
|
||||
if (projindex>=0) {
|
||||
mProject->removeEditor(projindex,false);
|
||||
mProject->removeUnit(projindex,false);
|
||||
}
|
||||
|
||||
// All references to the file are removed. Delete the file from disk
|
||||
|
@ -1954,7 +1969,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||
}
|
||||
|
||||
// Add new filename to file minitor
|
||||
pMainWindow->fileSystemWatcher()->removePath(oldName);
|
||||
pMainWindow->fileSystemWatcher()->addPath(newName);
|
||||
return true;
|
||||
} else {
|
||||
//change folder name
|
||||
|
|
|
@ -148,7 +148,7 @@ public:
|
|||
const QString& customFileName="");
|
||||
Editor* openUnit(int index);
|
||||
void rebuildNodes();
|
||||
bool removeEditor(int index, bool doClose);
|
||||
bool removeUnit(int index, bool doClose, bool removeFile = false);
|
||||
bool removeFolder(PFolderNode node);
|
||||
void resetParserProjectFiles();
|
||||
void saveAll(); // save [Project] and all [UnitX]
|
||||
|
|
|
@ -108,7 +108,9 @@ PSynEditKeyStroke SynEditKeyStrokes::findCommand(SynEditorCommand command)
|
|||
PSynEditKeyStroke SynEditKeyStrokes::findKeycode(int key, Qt::KeyboardModifiers modifiers)
|
||||
{
|
||||
for (PSynEditKeyStroke& keyStroke:mList) {
|
||||
if (keyStroke->key() == key && keyStroke->keyModifiers()==modifiers && keyStroke->key2()==0)
|
||||
if (keyStroke->key() == key
|
||||
&& keyStroke->keyModifiers() == (modifiers & ~ Qt::KeypadModifier)
|
||||
&& keyStroke->key2()==0)
|
||||
return keyStroke;
|
||||
}
|
||||
return PSynEditKeyStroke();
|
||||
|
@ -118,8 +120,10 @@ PSynEditKeyStroke SynEditKeyStrokes::findKeycode2(int key, Qt::KeyboardModifiers
|
|||
int key2, Qt::KeyboardModifiers modifiers2)
|
||||
{
|
||||
for (PSynEditKeyStroke& keyStroke:mList) {
|
||||
if (keyStroke->key() == key && keyStroke->keyModifiers()==modifiers && keyStroke->key2()==key2
|
||||
&& keyStroke->keyModifiers2() ==modifiers2)
|
||||
if (keyStroke->key() == key
|
||||
&& keyStroke->keyModifiers()==(modifiers & ~ Qt::KeypadModifier)
|
||||
&& keyStroke->key2()==key2
|
||||
&& keyStroke->keyModifiers2()== (modifiers2 & ~ Qt::KeypadModifier))
|
||||
return keyStroke;
|
||||
}
|
||||
return PSynEditKeyStroke();
|
||||
|
@ -202,8 +206,8 @@ void SynEditKeyStrokes::resetDefaults()
|
|||
add(SynEditorCommand::ecRedo, Qt::Key_Backspace, Qt::AltModifier|Qt::ShiftModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Return, Qt::NoModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Return, Qt::ShiftModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::KeypadModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::KeypadModifier|Qt::ShiftModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::NoModifier);
|
||||
add(SynEditorCommand::ecLineBreak, Qt::Key_Enter, Qt::ShiftModifier);
|
||||
add(SynEditorCommand::ecTab, Qt::Key_Tab, Qt::NoModifier);
|
||||
add(SynEditorCommand::ecShiftTab, Qt::Key_Backtab, Qt::ShiftModifier);
|
||||
add(SynEditorCommand::ecShiftTab, Qt::Key_Tab, Qt::ShiftModifier);
|
||||
|
|
|
@ -95,7 +95,11 @@ QString SynGutter::formatLineNumber(int line)
|
|||
{
|
||||
line += (mLineNumberStart - 1);
|
||||
QString result = QString::number(line);
|
||||
if (mLeadingZeros) {
|
||||
return QString(mAutoSizeDigitCount - result.length(),'0') + result;
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
int SynGutter::realGutterWidth(int charWidth)
|
||||
|
@ -315,10 +319,9 @@ void SynGutter::setBorderColor(const QColor &value)
|
|||
}
|
||||
|
||||
|
||||
SynEditMark::SynEditMark(QObject *parent)
|
||||
SynEditMark::SynEditMark(QObject * /*parent*/)
|
||||
{
|
||||
mBookmarkNum = -1;
|
||||
|
||||
}
|
||||
|
||||
int SynEditMark::Char() const
|
||||
|
@ -405,7 +408,7 @@ void SynEditMark::setLine(int line)
|
|||
}
|
||||
}
|
||||
|
||||
SynBookMarkOpt::SynBookMarkOpt(QObject *parent)
|
||||
SynBookMarkOpt::SynBookMarkOpt(QObject */*parent*/)
|
||||
{
|
||||
mDrawBookmarksFirst = true;
|
||||
mEnableKeys = true;
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
#include <QResizeEvent>
|
||||
#include <QStyleHints>
|
||||
#include <QMessageBox>
|
||||
#include <QDrag>
|
||||
#include <QMimeData>
|
||||
|
||||
SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent)
|
||||
{
|
||||
|
@ -57,6 +59,8 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent)
|
|||
mRedoList->connect(mRedoList.get(), &SynEditUndoList::addedUndo, this, &SynEdit::onRedoAdded);
|
||||
mOrigRedoList = mRedoList;
|
||||
|
||||
mForegroundColor=palette().color(QPalette::Text);
|
||||
mBackgroundColor=palette().color(QPalette::Base);
|
||||
mCaretColor = QColorConstants::Red;
|
||||
mCaretUseTextColor = false;
|
||||
mActiveLineColor = QColorConstants::Svg::lightblue;
|
||||
|
@ -115,7 +119,8 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent)
|
|||
mBlockEnd = mBlockBegin;
|
||||
mOptions = eoAutoIndent
|
||||
| eoDragDropEditing | eoEnhanceEndKey | eoTabIndent |
|
||||
eoGroupUndo | eoKeepCaretX | eoSelectWordByDblClick;
|
||||
eoGroupUndo | eoKeepCaretX | eoSelectWordByDblClick
|
||||
| eoHideShowScrollbars ;
|
||||
|
||||
mScrollTimer = new QTimer(this);
|
||||
mScrollTimer->setInterval(100);
|
||||
|
@ -142,6 +147,7 @@ SynEdit::SynEdit(QWidget *parent) : QAbstractScrollArea(parent)
|
|||
setAttribute(Qt::WA_InputMethodEnabled);
|
||||
|
||||
//setMouseTracking(true);
|
||||
setAcceptDrops(true);
|
||||
}
|
||||
|
||||
int SynEdit::displayLineCount() const
|
||||
|
@ -1063,6 +1069,20 @@ void SynEdit::setCaretAndSelection(const BufferCoord &ptCaret, const BufferCoord
|
|||
setBlockEnd(ptAfter);
|
||||
}
|
||||
|
||||
void SynEdit::collapseAll()
|
||||
{
|
||||
for (int i = mAllFoldRanges.count()-1;i>=0;i--){
|
||||
collapse(mAllFoldRanges[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void SynEdit::unCollpaseAll()
|
||||
{
|
||||
for (int i = mAllFoldRanges.count()-1;i>=0;i--){
|
||||
uncollapse(mAllFoldRanges[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void SynEdit::processGutterClick(QMouseEvent *event)
|
||||
{
|
||||
int X = event->pos().x();
|
||||
|
@ -1208,6 +1228,8 @@ void SynEdit::showCaret()
|
|||
{
|
||||
if (m_blinkTimerId==0)
|
||||
m_blinkTimerId = startTimer(500);
|
||||
m_blinkStatus = 1;
|
||||
updateCaret();
|
||||
}
|
||||
|
||||
void SynEdit::hideCaret()
|
||||
|
@ -1429,7 +1451,7 @@ int SynEdit::calcIndentSpaces(int line, const QString& lineText, bool addIndent)
|
|||
QString s;
|
||||
while (startLine>=1) {
|
||||
s = mLines->getString(startLine-1);
|
||||
if (!s.trimmed().isEmpty()) {
|
||||
if (!s.startsWith('#') && !s.trimmed().isEmpty()) {
|
||||
break;
|
||||
}
|
||||
startLine -- ;
|
||||
|
@ -3580,25 +3602,40 @@ void SynEdit::paintCaret(QPainter &painter, const QRect rcClip)
|
|||
} else {
|
||||
ct =mOverwriteCaret;
|
||||
}
|
||||
QColor caretColor;
|
||||
if (mCaretUseTextColor) {
|
||||
painter.setPen(mForegroundColor);
|
||||
caretColor = mForegroundColor;
|
||||
} else {
|
||||
painter.setPen(mCaretColor);
|
||||
caretColor = mCaretColor;
|
||||
}
|
||||
switch(ct) {
|
||||
case SynEditCaretType::ctVerticalLine:
|
||||
painter.drawLine(rcClip.left()+1,rcClip.top(),rcClip.left()+1,rcClip.bottom());
|
||||
case SynEditCaretType::ctVerticalLine: {
|
||||
QRect caretRC;
|
||||
int size = std::max(1,(rcClip.bottom()-rcClip.top())/15);
|
||||
caretRC.setLeft(rcClip.left()+1);
|
||||
caretRC.setTop(rcClip.top());
|
||||
caretRC.setBottom(rcClip.bottom());
|
||||
caretRC.setRight(rcClip.left()+1+size);
|
||||
painter.fillRect(caretRC,caretColor);
|
||||
break;
|
||||
case SynEditCaretType::ctHorizontalLine:
|
||||
painter.drawLine(rcClip.left(),rcClip.bottom()-1,rcClip.right(),rcClip.bottom()-1);
|
||||
}
|
||||
case SynEditCaretType::ctHorizontalLine: {
|
||||
QRect caretRC;
|
||||
int size = std::max(1,(rcClip.bottom()-rcClip.top())/15);
|
||||
caretRC.setLeft(rcClip.left());
|
||||
caretRC.setTop(rcClip.bottom()-1+size);
|
||||
caretRC.setBottom(rcClip.bottom()-1);
|
||||
caretRC.setRight(rcClip.right());
|
||||
painter.fillRect(caretRC,caretColor);
|
||||
break;
|
||||
}
|
||||
case SynEditCaretType::ctBlock:
|
||||
painter.fillRect(rcClip, mCaretColor);
|
||||
painter.fillRect(rcClip, caretColor);
|
||||
break;
|
||||
case SynEditCaretType::ctHalfBlock:
|
||||
QRect rc=rcClip;
|
||||
rc.setTop(rcClip.top()+rcClip.height() / 2);
|
||||
painter.fillRect(rcClip, mCaretColor);
|
||||
painter.fillRect(rcClip, caretColor);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4922,12 +4959,13 @@ void SynEdit::doLinesInserted(int firstLine, int count)
|
|||
// end;
|
||||
}
|
||||
|
||||
void SynEdit::properSetLine(int ALine, const QString &ALineText)
|
||||
void SynEdit::properSetLine(int ALine, const QString &ALineText, bool notify)
|
||||
{
|
||||
if (mOptions.testFlag(eoTrimTrailingSpaces))
|
||||
mLines->putString(ALine,TrimRight(ALineText));
|
||||
else
|
||||
mLines->putString(ALine,ALineText);
|
||||
if (mOptions.testFlag(eoTrimTrailingSpaces)) {
|
||||
mLines->putString(ALine,TrimRight(ALineText),notify);
|
||||
} else {
|
||||
mLines->putString(ALine,ALineText,notify);
|
||||
}
|
||||
}
|
||||
|
||||
void SynEdit::deleteSelection(const BufferCoord &BB, const BufferCoord &BE)
|
||||
|
@ -5021,6 +5059,10 @@ void SynEdit::insertText(const QString &Value, SynSelectionMode PasteMode,bool A
|
|||
|
||||
int SynEdit::insertTextByNormalMode(const QString &Value)
|
||||
{
|
||||
mLines->beginUpdate();
|
||||
auto actionLines = finally([this] {
|
||||
mLines->endUpdate();
|
||||
});
|
||||
QString sLeftSide;
|
||||
QString sRightSide;
|
||||
QString Str;
|
||||
|
@ -5029,6 +5071,7 @@ int SynEdit::insertTextByNormalMode(const QString &Value)
|
|||
bool bChangeScroll;
|
||||
// int SpaceCount;
|
||||
int Result = 0;
|
||||
int startLine = mCaretY;
|
||||
sLeftSide = lineText().mid(0, mCaretX - 1);
|
||||
if (mCaretX - 1 > sLeftSide.length()) {
|
||||
if (StringIsBlank(sLeftSide))
|
||||
|
@ -5083,7 +5126,7 @@ int SynEdit::insertTextByNormalMode(const QString &Value)
|
|||
Str = GetLeftSpacing(indentSpaces,true)+TrimLeft(Str);
|
||||
}
|
||||
}
|
||||
properSetLine(caretY - 1, Str);
|
||||
properSetLine(caretY - 1, Str,false);
|
||||
rescanRange(caretY);
|
||||
Result++;
|
||||
}
|
||||
|
@ -5097,6 +5140,7 @@ int SynEdit::insertTextByNormalMode(const QString &Value)
|
|||
internalSetCaretXY(BufferCoord{lineText().length()+1,caretY});
|
||||
} else
|
||||
internalSetCaretXY(BufferCoord{Str.length() - sRightSide.length()+1,caretY});
|
||||
onLinesPutted(startLine-1,Result+1);
|
||||
return Result;
|
||||
}
|
||||
|
||||
|
@ -5959,7 +6003,15 @@ void SynEdit::mouseMoveEvent(QMouseEvent *event)
|
|||
|
||||
if ((mStateFlags.testFlag(SynStateFlag::sfWaitForDragging))) {
|
||||
if ( ( event->pos() - mMouseDownPos).manhattanLength()>=QApplication::startDragDistance()) {
|
||||
mStateFlags.setFlag(SynStateFlag::sfWaitForDragging);
|
||||
mStateFlags.setFlag(SynStateFlag::sfWaitForDragging,false);
|
||||
QDrag *drag = new QDrag(this);
|
||||
QMimeData *mimeData = new QMimeData;
|
||||
|
||||
mimeData->setText(selText());
|
||||
drag->setMimeData(mimeData);
|
||||
|
||||
drag->exec(Qt::CopyAction | Qt::MoveAction);
|
||||
//drag->setPixmap(iconPixmap);
|
||||
//BeginDrag(false);
|
||||
}
|
||||
// } else if ((buttons == Qt::LeftButton) && (X > mGutterWidth)) {
|
||||
|
@ -6017,6 +6069,17 @@ void SynEdit::leaveEvent(QEvent *)
|
|||
|
||||
void SynEdit::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
if (event->modifiers() == Qt::ShiftModifier) {
|
||||
if (event->angleDelta().y()>0) {
|
||||
horizontalScrollBar()->setValue(horizontalScrollBar()->value()-mMouseWheelScrollSpeed);
|
||||
event->accept();
|
||||
return;
|
||||
} else if (event->angleDelta().y()<0) {
|
||||
horizontalScrollBar()->setValue(horizontalScrollBar()->value()+mMouseWheelScrollSpeed);
|
||||
event->accept();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (event->angleDelta().y()>0) {
|
||||
verticalScrollBar()->setValue(verticalScrollBar()->value()-mMouseWheelScrollSpeed);
|
||||
event->accept();
|
||||
|
@ -6026,6 +6089,7 @@ void SynEdit::wheelEvent(QWheelEvent *event)
|
|||
event->accept();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QAbstractScrollArea::wheelEvent(event);
|
||||
}
|
||||
|
||||
|
@ -6052,6 +6116,63 @@ QVariant SynEdit::inputMethodQuery(Qt::InputMethodQuery property) const
|
|||
|
||||
}
|
||||
|
||||
void SynEdit::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasFormat("text/plain")) {
|
||||
event->acceptProposedAction();
|
||||
mDragCaretSave = caretXY();
|
||||
mDragSelBeginSave = blockBegin();
|
||||
mDragSelEndSave = blockEnd();
|
||||
BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(),
|
||||
event->pos().y()));
|
||||
setCaretXY(coord);
|
||||
setBlockBegin(mDragSelBeginSave);
|
||||
setBlockEnd(mDragSelEndSave);
|
||||
showCaret();
|
||||
}
|
||||
}
|
||||
|
||||
void SynEdit::dropEvent(QDropEvent *event)
|
||||
{
|
||||
mUndoList->BeginBlock();
|
||||
auto action = finally([this] {
|
||||
mUndoList->EndBlock();
|
||||
});
|
||||
if (event->proposedAction() == Qt::DropAction::MoveAction) {
|
||||
setBlockBegin(mDragSelBeginSave);
|
||||
setBlockEnd(mDragSelEndSave);
|
||||
setSelText("");
|
||||
}
|
||||
BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(),
|
||||
event->pos().y()));
|
||||
setCaretXY(coord);
|
||||
setSelText(event->mimeData()->text());
|
||||
event->acceptProposedAction();
|
||||
}
|
||||
|
||||
void SynEdit::dragMoveEvent(QDragMoveEvent *event)
|
||||
{
|
||||
if (event->keyboardModifiers() == Qt::ControlModifier) {
|
||||
event->setDropAction(Qt::CopyAction);
|
||||
} else {
|
||||
event->setDropAction(Qt::MoveAction);
|
||||
}
|
||||
BufferCoord coord = displayToBufferPos(pixelsToNearestRowColumn(event->pos().x(),
|
||||
event->pos().y()));
|
||||
setCaretXY(coord);
|
||||
setBlockBegin(mDragSelBeginSave);
|
||||
setBlockEnd(mDragSelEndSave);
|
||||
showCaret();
|
||||
}
|
||||
|
||||
void SynEdit::dragLeaveEvent(QDragLeaveEvent *)
|
||||
{
|
||||
setCaretXY(mDragCaretSave);
|
||||
setBlockBegin(mDragSelBeginSave);
|
||||
setBlockEnd(mDragSelEndSave);
|
||||
showCaret();
|
||||
}
|
||||
|
||||
int SynEdit::maxScrollHeight() const
|
||||
{
|
||||
if (mOptions.testFlag(eoScrollPastEof))
|
||||
|
|
|
@ -219,6 +219,8 @@ public:
|
|||
const BufferCoord& ptBefore,
|
||||
const BufferCoord& ptAfter);
|
||||
|
||||
void collapseAll();
|
||||
void unCollpaseAll();
|
||||
void uncollapseAroundLine(int line);
|
||||
PSynEditFoldRange foldHidesLine(int line);
|
||||
void setSelLength(int Value);
|
||||
|
@ -504,7 +506,7 @@ private:
|
|||
const QString& Value, bool AddToUndoList);
|
||||
void doLinesDeleted(int FirstLine, int Count);
|
||||
void doLinesInserted(int FirstLine, int Count);
|
||||
void properSetLine(int ALine, const QString& ALineText);
|
||||
void properSetLine(int ALine, const QString& ALineText, bool notify = true);
|
||||
void deleteSelection(const BufferCoord& BB, const BufferCoord& BE);
|
||||
void insertText(const QString& Value, SynSelectionMode PasteMode,bool AddToUndoList);
|
||||
int insertTextByNormalMode(const QString& Value);
|
||||
|
@ -696,6 +698,10 @@ private:
|
|||
|
||||
int mMouseWheelScrollSpeed;
|
||||
|
||||
BufferCoord mDragCaretSave;
|
||||
BufferCoord mDragSelBeginSave;
|
||||
BufferCoord mDragSelEndSave;
|
||||
|
||||
friend class SynEditTextPainter;
|
||||
|
||||
// QWidget interface
|
||||
|
@ -722,6 +728,13 @@ bool viewportEvent(QEvent * event) override;
|
|||
// QWidget interface
|
||||
public:
|
||||
QVariant inputMethodQuery(Qt::InputMethodQuery property) const override;
|
||||
|
||||
// QWidget interface
|
||||
protected:
|
||||
void dragEnterEvent(QDragEnterEvent *event) override;
|
||||
void dropEvent(QDropEvent *event) override;
|
||||
void dragMoveEvent(QDragMoveEvent *event) override;
|
||||
void dragLeaveEvent(QDragLeaveEvent *event) override;
|
||||
};
|
||||
|
||||
#endif // SYNEDIT_H
|
||||
|
|
|
@ -397,7 +397,7 @@ QString SynEditStringList::getTextStr() const
|
|||
return result;
|
||||
}
|
||||
|
||||
void SynEditStringList::putString(int Index, const QString &s) {
|
||||
void SynEditStringList::putString(int Index, const QString &s, bool notify) {
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (Index == mList.count()) {
|
||||
add(s);
|
||||
|
@ -409,6 +409,7 @@ void SynEditStringList::putString(int Index, const QString &s) {
|
|||
mIndexOfLongestLine = -1;
|
||||
mList[Index]->fString = s;
|
||||
mList[Index]->fColumns = -1;
|
||||
if (notify)
|
||||
emit putted(Index,1);
|
||||
endUpdate();
|
||||
}
|
||||
|
|
|
@ -67,7 +67,7 @@ public:
|
|||
void setContents(const QStringList& text);
|
||||
QStringList contents();
|
||||
|
||||
void putString(int Index, const QString& s);
|
||||
void putString(int Index, const QString& s, bool notify=true);
|
||||
void putObject(int Index, void * AObject);
|
||||
|
||||
void beginUpdate();
|
||||
|
|
|
@ -234,3 +234,8 @@ void ContentsCoord::setCh(int newChar)
|
|||
{
|
||||
mChar = newChar;
|
||||
}
|
||||
|
||||
bool BufferCoord::operator==(const BufferCoord &coord)
|
||||
{
|
||||
return coord.Char == Char && coord.Line == Line;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ enum class SynSelectionMode {smNormal, smLine, smColumn};
|
|||
struct BufferCoord {
|
||||
int Char;
|
||||
int Line;
|
||||
bool operator==(const BufferCoord& coord);
|
||||
};
|
||||
|
||||
class SynEdit;
|
||||
|
|
Binary file not shown.
|
@ -87,6 +87,7 @@ void Settings::load()
|
|||
mCodeCompletion.load();
|
||||
mCodeFormatter.load();
|
||||
mUI.load();
|
||||
mDirs.load();
|
||||
}
|
||||
|
||||
Settings::Dirs &Settings::dirs()
|
||||
|
@ -161,12 +162,7 @@ QString Settings::Dirs::templateDir() const
|
|||
|
||||
QString Settings::Dirs::projectDir() const
|
||||
{
|
||||
if (isGreenEdition()) {
|
||||
return includeTrailingPathDelimiter(app()) + "projects";
|
||||
} else {
|
||||
return includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0])
|
||||
+ "projects";
|
||||
}
|
||||
return mProjectDir;
|
||||
}
|
||||
|
||||
QString Settings::Dirs::data(Settings::Dirs::DataType dataType) const
|
||||
|
@ -205,12 +201,24 @@ QString Settings::Dirs::executable() const
|
|||
|
||||
void Settings::Dirs::doSave()
|
||||
{
|
||||
|
||||
saveValue("projectDir",mProjectDir);
|
||||
}
|
||||
|
||||
void Settings::Dirs::doLoad()
|
||||
{
|
||||
QString defaultProjectDir;
|
||||
if (isGreenEdition()) {
|
||||
defaultProjectDir = includeTrailingPathDelimiter(app()) + "projects";
|
||||
} else {
|
||||
defaultProjectDir = includeTrailingPathDelimiter(QStandardPaths::standardLocations(QStandardPaths::DocumentsLocation)[0])
|
||||
+ "projects";
|
||||
}
|
||||
mProjectDir = stringValue("projectDir",defaultProjectDir);
|
||||
}
|
||||
|
||||
void Settings::Dirs::setProjectDir(const QString &newProjectDir)
|
||||
{
|
||||
mProjectDir = newProjectDir;
|
||||
}
|
||||
|
||||
Settings::_Base::_Base(Settings *settings, const QString &groupName):
|
||||
|
@ -524,6 +532,26 @@ void Settings::Editor::setUseUTF8ByDefault(bool newUseUTF8ByDefault)
|
|||
mUseUTF8ByDefault = newUseUTF8ByDefault;
|
||||
}
|
||||
|
||||
bool Settings::Editor::highlightMathingBraces() const
|
||||
{
|
||||
return mHighlightMathingBraces;
|
||||
}
|
||||
|
||||
void Settings::Editor::setHighlightMathingBraces(bool newHighlightMathingBraces)
|
||||
{
|
||||
mHighlightMathingBraces = newHighlightMathingBraces;
|
||||
}
|
||||
|
||||
bool Settings::Editor::highlightCurrentWord() const
|
||||
{
|
||||
return mHighlightCurrentWord;
|
||||
}
|
||||
|
||||
void Settings::Editor::setHighlightCurrentWord(bool newHighlightCurrentWord)
|
||||
{
|
||||
mHighlightCurrentWord = newHighlightCurrentWord;
|
||||
}
|
||||
|
||||
bool Settings::Editor::enableTooltips() const
|
||||
{
|
||||
return mEnableTooltips;
|
||||
|
@ -994,6 +1022,7 @@ void Settings::Editor::doSave()
|
|||
saveValue("show_indent_lines", mShowIndentLines);
|
||||
saveValue("indent_line_color",mIndentLineColor);
|
||||
saveValue("fill_indents",mfillIndents);
|
||||
|
||||
// caret
|
||||
saveValue("enhance_home_key",mEnhanceHomeKey);
|
||||
saveValue("enhance_end_key",mEnhanceEndKey);
|
||||
|
@ -1003,6 +1032,10 @@ void Settings::Editor::doSave()
|
|||
saveValue("caret_use_text_color",mCaretUseTextColor);
|
||||
saveValue("caret_color",mCaretColor);
|
||||
|
||||
//highlight
|
||||
saveValue("highlight_matching_braces",mHighlightMathingBraces);
|
||||
saveValue("highlight_current_word",mHighlightCurrentWord);
|
||||
|
||||
//scroll
|
||||
saveValue("auto_hide_scroll_bar", mAutoHideScrollbar);
|
||||
saveValue("scroll_past_eof", mScrollPastEof);
|
||||
|
@ -1112,6 +1145,10 @@ void Settings::Editor::doLoad()
|
|||
mCaretUseTextColor = boolValue("caret_use_text_color",true);
|
||||
mCaretColor = colorValue("caret_color",QColorConstants::Svg::yellow);
|
||||
|
||||
//highlight
|
||||
mHighlightMathingBraces = boolValue("highlight_matching_braces",true);
|
||||
mHighlightCurrentWord = boolValue("highlight_current_word",true);
|
||||
|
||||
//scroll
|
||||
mAutoHideScrollbar = boolValue("auto_hide_scroll_bar", false);
|
||||
mScrollPastEof = boolValue("scroll_past_eof", true);
|
||||
|
@ -2393,11 +2430,19 @@ void Settings::CompilerSets::loadSets()
|
|||
mDefaultIndex =mSettings->mSettings.value(SETTING_COMPILTER_SETS_DEFAULT_INDEX,-1).toInt();
|
||||
int listSize = mSettings->mSettings.value(SETTING_COMPILTER_SETS_COUNT,0).toInt();
|
||||
mSettings->mSettings.endGroup();
|
||||
bool loadError = false;
|
||||
for (int i=0;i<listSize;i++) {
|
||||
PCompilerSet pSet=loadSet(i);
|
||||
if (!pSet) {
|
||||
loadError = true;
|
||||
break;
|
||||
}
|
||||
mList.push_back(pSet);
|
||||
}
|
||||
|
||||
if (loadError) {
|
||||
mList.clear();
|
||||
mDefaultIndex = -1;
|
||||
}
|
||||
PCompilerSet pCurrentSet = defaultSet();
|
||||
if (pCurrentSet) {
|
||||
QString msg;
|
||||
|
@ -2419,6 +2464,9 @@ void Settings::CompilerSets::loadSets()
|
|||
mDefaultIndex = mList.size()-1;
|
||||
pCurrentSet = defaultSet();
|
||||
if (!pCurrentSet) {
|
||||
mList.clear();
|
||||
mDefaultIndex = -1;
|
||||
saveSets();
|
||||
return;
|
||||
}
|
||||
saveSet(mDefaultIndex);
|
||||
|
@ -2442,6 +2490,9 @@ void Settings::CompilerSets::loadSets()
|
|||
findSets();
|
||||
pCurrentSet = defaultSet();
|
||||
if (!pCurrentSet) {
|
||||
mList.clear();
|
||||
mDefaultIndex = -1;
|
||||
saveSets();
|
||||
return;
|
||||
}
|
||||
saveSets();
|
||||
|
@ -2641,6 +2692,8 @@ Settings::PCompilerSet Settings::CompilerSets::loadSet(int index)
|
|||
|
||||
mSettings->mSettings.endGroup();
|
||||
|
||||
if (pSet->binDirs().isEmpty())
|
||||
return PCompilerSet();
|
||||
pSet->setDirectories(pSet->binDirs()[0]);
|
||||
pSet->setDefines();
|
||||
return pSet;
|
||||
|
@ -2835,6 +2888,9 @@ void Settings::Executor::doSave()
|
|||
saveValue("redirect_input",mRedirectInput);
|
||||
saveValue("input_filename",mInputFilename);
|
||||
//problem set
|
||||
saveValue("enable_proble_set", mEnableProblemSet);
|
||||
saveValue("enable_competivie_companion", mEnableCompetitiveCompanion);
|
||||
saveValue("competitive_companion_port", mCompetivieCompanionPort);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -96,10 +96,13 @@ public:
|
|||
QString config(DataType dataType = DataType::None) const;
|
||||
QString executable() const;
|
||||
|
||||
// _Base interface
|
||||
void setProjectDir(const QString &newProjectDir);
|
||||
|
||||
protected:
|
||||
void doSave() override;
|
||||
void doLoad() override;
|
||||
private:
|
||||
QString mProjectDir;
|
||||
};
|
||||
|
||||
class Editor: public _Base {
|
||||
|
@ -336,6 +339,12 @@ public:
|
|||
bool useUTF8ByDefault() const;
|
||||
void setUseUTF8ByDefault(bool newUseUTF8ByDefault);
|
||||
|
||||
bool highlightCurrentWord() const;
|
||||
void setHighlightCurrentWord(bool newHighlightCurrentWord);
|
||||
|
||||
bool highlightMathingBraces() const;
|
||||
void setHighlightMathingBraces(bool newHighlightMathingBraces);
|
||||
|
||||
private:
|
||||
//General
|
||||
// indents
|
||||
|
@ -354,6 +363,10 @@ public:
|
|||
bool mCaretUseTextColor;
|
||||
QColor mCaretColor;
|
||||
|
||||
//highlights
|
||||
bool mHighlightCurrentWord;
|
||||
bool mHighlightMathingBraces;
|
||||
|
||||
//scroll
|
||||
bool mAutoHideScrollbar;
|
||||
bool mScrollPastEof;
|
||||
|
|
|
@ -110,6 +110,8 @@ bool AutolinkModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||
if (index.column() == 0) {
|
||||
if (s.isEmpty())
|
||||
return false;
|
||||
if (link->header == s)
|
||||
return false;
|
||||
if (findLink(s)>=0) {
|
||||
QMessageBox::warning(pMainWindow,
|
||||
tr("Header exists"),
|
||||
|
|
|
@ -52,6 +52,9 @@ void EditorGeneralWidget::doLoad()
|
|||
setCaretTypeIndex(ui->cbCaretForOverwrite,pSettings->editor().caretForOverwrite());
|
||||
ui->chkCaretUseTextColor->setChecked(pSettings->editor().caretUseTextColor());
|
||||
ui->colorCaret->setColor(pSettings->editor().caretColor());
|
||||
//highlight
|
||||
ui->chkHighlightCurrentWord->setChecked(pSettings->editor().highlightCurrentWord());
|
||||
ui->chkHighlightMatchingBraces->setChecked(pSettings->editor().highlightMathingBraces());
|
||||
//scrolls;
|
||||
ui->chkAutoHideScrollBars->setChecked(pSettings->editor().autoHideScrollbar());
|
||||
ui->chkScrollPastEOF->setChecked(pSettings->editor().scrollPastEof());
|
||||
|
@ -84,6 +87,10 @@ void EditorGeneralWidget::doSave()
|
|||
pSettings->editor().setCaretForOverwrite(getCaretTypeIndex(ui->cbCaretForOverwrite));
|
||||
pSettings->editor().setCaretUseTextColor(ui->chkCaretUseTextColor->isChecked());
|
||||
pSettings->editor().setCaretColor(ui->colorCaret->color());
|
||||
//highlight
|
||||
pSettings->editor().setHighlightCurrentWord(ui->chkHighlightCurrentWord->isChecked());
|
||||
pSettings->editor().setHighlightMathingBraces(ui->chkHighlightMatchingBraces->isChecked());
|
||||
|
||||
//scrolls;
|
||||
pSettings->editor().setAutoHideScrollbar(ui->chkAutoHideScrollBars->isChecked());
|
||||
pSettings->editor().setScrollPastEof(ui->chkScrollPastEOF->isChecked());
|
||||
|
|
|
@ -228,6 +228,29 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Highlight</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="chkHighlightMatchingBraces">
|
||||
<property name="text">
|
||||
<string>Highlight matching braces</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="chkHighlightCurrentWord">
|
||||
<property name="text">
|
||||
<string>Highlight current word</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
|
|
|
@ -58,6 +58,7 @@ void EnvironmentAppearenceWidget::doSave()
|
|||
pSettings->environment().setInterfaceFontSize(ui->spinFontSize->value());
|
||||
pSettings->environment().setLanguage(ui->cbLanguage->currentData().toString());
|
||||
|
||||
pSettings->editor().save();
|
||||
pSettings->environment().save();
|
||||
pMainWindow->applySettings();
|
||||
}
|
||||
|
|
|
@ -99,6 +99,8 @@ PSettingsDialog SettingsDialog::optionDialog()
|
|||
{
|
||||
PSettingsDialog dialog = std::make_shared<SettingsDialog>();
|
||||
|
||||
dialog->setWindowTitle(tr("Options"));
|
||||
|
||||
SettingsWidget* widget = new EnvironmentAppearenceWidget(tr("Appearence"),tr("Environment"));
|
||||
widget->init();
|
||||
dialog->addWidget(widget);
|
||||
|
@ -206,6 +208,8 @@ PSettingsDialog SettingsDialog::projectOptionDialog()
|
|||
{
|
||||
PSettingsDialog dialog = std::make_shared<SettingsDialog>();
|
||||
|
||||
dialog->setWindowTitle(tr("Project Options"));
|
||||
|
||||
SettingsWidget* widget = new ProjectGeneralWidget(tr("General"),tr("Project"));
|
||||
widget->init();
|
||||
dialog->addWidget(widget);
|
||||
|
|
|
@ -3,8 +3,6 @@
|
|||
|
||||
#include <QStringList>
|
||||
|
||||
#define DEVCPP_VERSION "beta.0.8.6"
|
||||
|
||||
#define APP_SETTSINGS_FILENAME "redpandacpp.ini"
|
||||
#ifdef Q_OS_WIN
|
||||
#define GCC_PROGRAM "gcc.exe"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<RCC>
|
||||
<qresource prefix="/translations">
|
||||
<file>RedPandaIDE_zh_CN.qm</file>
|
||||
<file>qt_zh_CN.qm</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "editorlist.h"
|
||||
#include "editor.h"
|
||||
#include "project.h"
|
||||
#include "version.h"
|
||||
|
||||
const QByteArray GuessTextEncoding(const QByteArray& text){
|
||||
bool allAscii;
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
#ifndef VERSION_H
|
||||
#define VERSION_H
|
||||
#include <QObject>
|
||||
|
||||
#define DEVCPP_VERSION "beta.0.9.2"
|
||||
|
||||
#endif // VERSION_H
|
|
@ -1,6 +1,8 @@
|
|||
#include "aboutdialog.h"
|
||||
#include "ui_aboutdialog.h"
|
||||
#include "../systemconsts.h"
|
||||
#include "../version.h"
|
||||
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent) :
|
||||
QDialog(parent),
|
||||
|
@ -8,9 +10,20 @@ AboutDialog::AboutDialog(QWidget *parent) :
|
|||
{
|
||||
ui->setupUi(this);
|
||||
ui->lblTitle->setText(ui->lblTitle->text() + tr("Version: ") + DEVCPP_VERSION);
|
||||
|
||||
#ifdef __GNUC__
|
||||
ui->lblContent->setText(ui->lblContent->text()
|
||||
.arg(qVersion())
|
||||
.arg("GCC 10.3.0",__DATE__, __TIME__));
|
||||
.arg(QString("GCC %1.%2")
|
||||
.arg(__GNUC__)
|
||||
.arg(__GNUC_MINOR__)
|
||||
,__DATE__, __TIME__));
|
||||
#else
|
||||
ui->lblContent->setText(ui->lblContent->text()
|
||||
.arg(qVersion())
|
||||
.arg("Non-GCC Compiler"
|
||||
,__DATE__, __TIME__));
|
||||
#endif
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
|
|
|
@ -59,7 +59,7 @@ void CodeCompletionPopup::setKeypressedCallback(const KeyPressedCallback &newKey
|
|||
mListView->setKeypressedCallback(newKeypressedCallback);
|
||||
}
|
||||
|
||||
void CodeCompletionPopup::prepareSearch(const QString &phrase, const QString &filename, int line)
|
||||
void CodeCompletionPopup::prepareSearch(const QString& preWord,const QString &phrase, const QString &filename, int line)
|
||||
{
|
||||
QMutexLocker locker(&mMutex);
|
||||
if (!isEnabled())
|
||||
|
@ -69,6 +69,7 @@ void CodeCompletionPopup::prepareSearch(const QString &phrase, const QString &fi
|
|||
QCursor oldCursor = cursor();
|
||||
setCursor(Qt::CursorShape::WaitCursor);
|
||||
|
||||
if (preWord.isEmpty()) {
|
||||
mIncludedFiles = mParser->getFileIncludes(filename);
|
||||
getCompletionFor(filename,phrase,line);
|
||||
|
||||
|
@ -76,12 +77,11 @@ void CodeCompletionPopup::prepareSearch(const QString &phrase, const QString &fi
|
|||
mPhrase = phrase.mid(1);
|
||||
getCompletionFor(filename,mPhrase,line);
|
||||
}
|
||||
} else {
|
||||
mPhrase = phrase;
|
||||
getFullCompletionListFor(preWord);
|
||||
}
|
||||
|
||||
//todo: notify model
|
||||
//CodeComplForm.lbCompletion.Font.Size := FontSize;
|
||||
//CodeComplForm.lbCompletion.ItemHeight := CodeComplForm.lbCompletion.Canvas.TextHeight('F')+6;
|
||||
// Round(2 * FontSize);
|
||||
//CodeComplForm.Update;
|
||||
setCursor(oldCursor);
|
||||
}
|
||||
|
||||
|
@ -453,13 +453,14 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin
|
|||
if (phrase.startsWith('#')) {
|
||||
if (mShowKeywords) {
|
||||
foreach (const QString& keyword, CppDirectives) {
|
||||
PStatement statement = std::make_shared<Statement>();
|
||||
statement->command = keyword;
|
||||
statement->kind = StatementKind::skKeyword;
|
||||
statement->fullName = keyword;
|
||||
statement->usageCount = 0;
|
||||
statement->freqTop = 0;
|
||||
mFullCompletionStatementList.append(statement);
|
||||
addKeyword(keyword);
|
||||
// PStatement statement = std::make_shared<Statement>();
|
||||
// statement->command = keyword;
|
||||
// statement->kind = StatementKind::skKeyword;
|
||||
// statement->fullName = keyword;
|
||||
// statement->usageCount = 0;
|
||||
// statement->freqTop = 0;
|
||||
// mFullCompletionStatementList.append(statement);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@ -469,13 +470,14 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin
|
|||
if (phrase.startsWith('@')) {
|
||||
if (mShowKeywords) {
|
||||
foreach (const QString& keyword,JavadocTags) {
|
||||
PStatement statement = std::make_shared<Statement>();
|
||||
statement->command = keyword;
|
||||
statement->kind = StatementKind::skKeyword;
|
||||
statement->fullName = keyword;
|
||||
statement->usageCount = 0;
|
||||
statement->freqTop = 0;
|
||||
mFullCompletionStatementList.append(statement);
|
||||
addKeyword(keyword);
|
||||
// PStatement statement = std::make_shared<Statement>();
|
||||
// statement->command = keyword;
|
||||
// statement->kind = StatementKind::skKeyword;
|
||||
// statement->fullName = keyword;
|
||||
// statement->usageCount = 0;
|
||||
// statement->freqTop = 0;
|
||||
// mFullCompletionStatementList.append(statement);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@ -506,23 +508,25 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin
|
|||
//add keywords
|
||||
if (mUseCppKeyword) {
|
||||
foreach (const QString& keyword,CppKeywords.keys()) {
|
||||
PStatement statement = std::make_shared<Statement>();
|
||||
statement->command = keyword;
|
||||
statement->kind = StatementKind::skKeyword;
|
||||
statement->fullName = keyword;
|
||||
statement->usageCount = 0;
|
||||
statement->freqTop = 0;
|
||||
mFullCompletionStatementList.append(statement);
|
||||
addKeyword(keyword);
|
||||
// PStatement statement = std::make_shared<Statement>();
|
||||
// statement->command = keyword;
|
||||
// statement->kind = StatementKind::skKeyword;
|
||||
// statement->fullName = keyword;
|
||||
// statement->usageCount = 0;
|
||||
// statement->freqTop = 0;
|
||||
// mFullCompletionStatementList.append(statement);
|
||||
}
|
||||
} else {
|
||||
foreach (const QString& keyword,CKeywords) {
|
||||
PStatement statement = std::make_shared<Statement>();
|
||||
statement->command = keyword;
|
||||
statement->kind = StatementKind::skKeyword;
|
||||
statement->fullName = keyword;
|
||||
statement->usageCount = 0;
|
||||
statement->freqTop = 0;
|
||||
mFullCompletionStatementList.append(statement);
|
||||
addKeyword(keyword);
|
||||
// PStatement statement = std::make_shared<Statement>();
|
||||
// statement->command = keyword;
|
||||
// statement->kind = StatementKind::skKeyword;
|
||||
// statement->fullName = keyword;
|
||||
// statement->usageCount = 0;
|
||||
// statement->freqTop = 0;
|
||||
// mFullCompletionStatementList.append(statement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -750,6 +754,39 @@ void CodeCompletionPopup::getCompletionFor(const QString &fileName, const QStrin
|
|||
}
|
||||
}
|
||||
|
||||
void CodeCompletionPopup::getFullCompletionListFor(const QString &preWord)
|
||||
{
|
||||
mFullCompletionStatementList.clear();
|
||||
if (preWord == "long") {
|
||||
addKeyword("long");
|
||||
addKeyword("double");
|
||||
addKeyword("int");
|
||||
} else if (preWord == "short") {
|
||||
addKeyword("int");
|
||||
} else if (preWord == "signed") {
|
||||
addKeyword("long");
|
||||
addKeyword("short");
|
||||
addKeyword("int");
|
||||
addKeyword("char");
|
||||
} else if (preWord == "unsigned") {
|
||||
addKeyword("long");
|
||||
addKeyword("short");
|
||||
addKeyword("int");
|
||||
addKeyword("char");
|
||||
}
|
||||
}
|
||||
|
||||
void CodeCompletionPopup::addKeyword(const QString &keyword)
|
||||
{
|
||||
PStatement statement = std::make_shared<Statement>();
|
||||
statement->command = keyword;
|
||||
statement->kind = StatementKind::skKeyword;
|
||||
statement->fullName = keyword;
|
||||
statement->usageCount = 0;
|
||||
statement->freqTop = 0;
|
||||
mFullCompletionStatementList.append(statement);
|
||||
}
|
||||
|
||||
bool CodeCompletionPopup::isIncluded(const QString &fileName)
|
||||
{
|
||||
return mIncludedFiles.contains(fileName);
|
||||
|
|
|
@ -31,7 +31,7 @@ public:
|
|||
~CodeCompletionPopup();
|
||||
|
||||
void setKeypressedCallback(const KeyPressedCallback &newKeypressedCallback);
|
||||
void prepareSearch(const QString& phrase, const QString& filename, int line);
|
||||
void prepareSearch(const QString& preWord, const QString& phrase, const QString& filename, int line);
|
||||
bool search(const QString& phrase, bool autoHideOnSingleResult);
|
||||
|
||||
PStatement selectedStatement();
|
||||
|
@ -74,6 +74,8 @@ private:
|
|||
void addStatement(PStatement statement, const QString& fileName, int line);
|
||||
void filterList(const QString& member);
|
||||
void getCompletionFor(const QString& fileName,const QString& phrase, int line);
|
||||
void getFullCompletionListFor(const QString& preWord);
|
||||
void addKeyword(const QString& keyword);
|
||||
bool isIncluded(const QString& fileName);
|
||||
private:
|
||||
CodeCompletionListView * mListView;
|
||||
|
|
|
@ -13,12 +13,28 @@ CPUDialog::CPUDialog(QWidget *parent) :
|
|||
setWindowFlags(windowFlags() | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
|
||||
ui->setupUi(this);
|
||||
ui->txtCode->setHighlighter(highlighterManager.getCppHighlighter());
|
||||
ui->txtCode->setReadOnly(true);
|
||||
ui->txtCode->gutter().setShowLineNumbers(false);
|
||||
ui->txtCode->setCaretUseTextColor(true);
|
||||
|
||||
ui->txtCode->codeFolding().indentGuides = false;
|
||||
ui->txtCode->codeFolding().fillIndents = false;
|
||||
ui->txtCode->setGutterWidth(0);
|
||||
ui->txtCode->setUseCodeFolding(false);
|
||||
highlighterManager.applyColorScheme(ui->txtCode->highlighter(),
|
||||
pSettings->editor().colorScheme());
|
||||
PColorSchemeItem item = pColorManager->getItem(pSettings->editor().colorScheme(),COLOR_SCHEME_ACTIVE_LINE);
|
||||
if (item) {
|
||||
ui->txtCode->setActiveLineColor(item->background());
|
||||
}
|
||||
item = pColorManager->getItem(pSettings->editor().colorScheme(),COLOR_SCHEME_TEXT);
|
||||
if (item) {
|
||||
ui->txtCode->setForegroundColor(item->foreground());
|
||||
ui->txtCode->setBackgroundColor(item->background());
|
||||
} else {
|
||||
ui->txtCode->setForegroundColor(palette().color(QPalette::Text));
|
||||
ui->txtCode->setBackgroundColor(palette().color(QPalette::Base));
|
||||
}
|
||||
ui->lstRegister->setModel(pMainWindow->debugger()->registerModel());
|
||||
|
||||
ui->rdIntel->setChecked(pSettings->debugger().useIntelStyle());
|
||||
|
|
|
@ -794,6 +794,11 @@ QIcon DarkFusionStyle::standardIcon(StandardPixmap standardIcon, const QStyleOpt
|
|||
return QProxyStyle::standardIcon(standardIcon, option, widget);
|
||||
}
|
||||
|
||||
void DarkFusionStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
|
||||
{
|
||||
QProxyStyle::drawComplexControl(control,option,painter,widget);
|
||||
}
|
||||
|
||||
void DarkFusionStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter,
|
||||
const QWidget *widget) const
|
||||
{
|
||||
|
@ -807,8 +812,8 @@ void DarkFusionStyle::drawControl(ControlElement element, const QStyleOption *op
|
|||
case CE_MenuItem:
|
||||
// Draws one item in a popup menu.
|
||||
if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
|
||||
QColor highlightOutline = highlightedOutline;
|
||||
QColor highlight = option->palette.highlight().color();
|
||||
//QColor highlightOutline = highlightedOutline;
|
||||
//QColor highlight = option->palette.highlight().color();
|
||||
if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
|
||||
painter->save();
|
||||
int w = 0;
|
||||
|
|
|
@ -16,6 +16,11 @@ public:
|
|||
const QWidget *widget) const override;
|
||||
QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = nullptr,
|
||||
const QWidget *widget = nullptr) const override;
|
||||
|
||||
// QStyle interface
|
||||
public:
|
||||
void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
|
||||
QPainter *painter, const QWidget *widget) const override;
|
||||
};
|
||||
|
||||
#endif // DARKFUSIONSTYLE_H
|
||||
|
|
|
@ -20,11 +20,12 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) :
|
|||
int i=0;
|
||||
QString projectName;
|
||||
QString location;
|
||||
location = excludeTrailingPathDelimiter(pSettings->dirs().projectDir());
|
||||
while (true) {
|
||||
i++;
|
||||
projectName = tr("Project%1").arg(i);
|
||||
location = includeTrailingPathDelimiter(pSettings->dirs().projectDir()) + projectName;
|
||||
if (!QDir(location).exists())
|
||||
QString tempLocation = includeTrailingPathDelimiter(location)+projectName;
|
||||
if (!QDir(tempLocation).exists())
|
||||
break;
|
||||
}
|
||||
ui->txtProjectName->setText(projectName);
|
||||
|
@ -65,6 +66,11 @@ QString NewProjectDialog::getProjectName()
|
|||
return ui->txtProjectName->text();
|
||||
}
|
||||
|
||||
bool NewProjectDialog::useAsDefaultProjectDir()
|
||||
{
|
||||
return ui->chkAsDefaultLocation->isChecked();
|
||||
}
|
||||
|
||||
bool NewProjectDialog::isCProject()
|
||||
{
|
||||
return ui->rdCProject->isChecked();
|
||||
|
@ -159,12 +165,7 @@ void NewProjectDialog::updateView()
|
|||
|
||||
void NewProjectDialog::updateProjectLocation()
|
||||
{
|
||||
ui->txtLocation->setText(
|
||||
includeTrailingPathDelimiter(
|
||||
extractFilePath(
|
||||
ui->txtLocation->text()))
|
||||
+ ui->txtProjectName->text()
|
||||
);
|
||||
QString newLocation = ui->txtLocation->text();
|
||||
|
||||
QListWidgetItem * current = ui->lstTemplates->currentItem();
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
|
||||
|
@ -210,7 +211,7 @@ void NewProjectDialog::on_btnBrowse_clicked()
|
|||
}
|
||||
QString dir = QFileDialog::getExistingDirectory(
|
||||
this,
|
||||
"Project directory",
|
||||
"Choose directory",
|
||||
dirPath
|
||||
);
|
||||
if (!dir.isEmpty()) {
|
||||
|
|
|
@ -20,6 +20,7 @@ public:
|
|||
PProjectTemplate getTemplate();
|
||||
QString getLocation();
|
||||
QString getProjectName();
|
||||
bool useAsDefaultProjectDir();
|
||||
bool isCProject();
|
||||
bool isCppProject();
|
||||
bool makeProjectDefault();
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>670</width>
|
||||
<height>528</height>
|
||||
<height>546</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -85,6 +85,12 @@
|
|||
<item>
|
||||
<widget class="QWidget" name="widget_3" native="true">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="2">
|
||||
<widget class="QLineEdit" name="txtLocation"/>
|
||||
</item>
|
||||
<item row="0" column="2" colspan="2">
|
||||
<widget class="QLineEdit" name="txtProjectName"/>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
|
@ -92,16 +98,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Location:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QLineEdit" name="txtLocation"/>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QToolButton" name="btnBrowse">
|
||||
<property name="text">
|
||||
|
@ -114,8 +110,19 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" colspan="2">
|
||||
<widget class="QLineEdit" name="txtProjectName"/>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Create in</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="4">
|
||||
<widget class="QCheckBox" name="chkAsDefaultLocation">
|
||||
<property name="text">
|
||||
<string>Use as the default project location</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
|
|
@ -184,6 +184,8 @@ int main(int argc, char** argv) {
|
|||
SetStdHandle(STD_ERROR_HANDLE, hOutput);
|
||||
freopen("CONOUT$","w+",stdout);
|
||||
freopen("CONOUT$","w+",stderr);
|
||||
} else {
|
||||
FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
|
||||
}
|
||||
|
||||
// Save starting timestamp
|
||||
|
|
Loading…
Reference in New Issue