refactor: remove ProjectUnit's mEditor field

This commit is contained in:
Roy Qu 2022-03-21 09:08:05 +08:00
parent 947374b907
commit 090cccc033
6 changed files with 143 additions and 90 deletions

View File

@ -356,9 +356,10 @@ void ProjectCompiler::writeMakeObjFilesRules(QFile &file)
if (mProject->options().addCharset) {
QByteArray defaultSystemEncoding = pCharsetInfoManager->getDefaultSystemEncoding();
if (unit->encoding() == ENCODING_AUTO_DETECT) {
if (unit->editor() && unit->editor()->fileEncoding()!=ENCODING_ASCII)
Editor* editor = mProject->unitEditor(unit);
if (editor && editor->fileEncoding()!=ENCODING_ASCII)
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")
.arg(QString(unit->editor()->fileEncoding()),
.arg(QString(editor->fileEncoding()),
QString(defaultSystemEncoding));
} else if (unit->encoding()==ENCODING_SYSTEM_DEFAULT) {
encodingStr = QString(" -finput-charset=%1 -fexec-charset=%2")

View File

@ -321,11 +321,15 @@ bool Editor::saveAs(const QString &name, bool fromProject){
QDir::setCurrent(extractFileDir(newName));
}
if (pMainWindow->editorList()->getOpenedEditorByFilename(newName)) {
QMessageBox::critical(pMainWindow,tr("Error"),
tr("File %1 already openned!").arg(newName));
return false;
}
// Update project information
if (mInProject && pMainWindow->project() && !fromProject) {
int unitIndex = pMainWindow->project()->indexInUnits(mFilename);
if (unitIndex>=0) {
pMainWindow->project()->units()[unitIndex]->setEditor(nullptr);
int unitIndex = pMainWindow->project()->indexInUnits(newName);
if (unitIndex<0) {
mInProject = false;
}
}

View File

@ -1146,7 +1146,9 @@ void MainWindow::openProject(const QString &filename, bool openFiles)
auto action = finally([this]{
mClassBrowserModel.endUpdate();
});
mProject = std::make_shared<Project>(filename,DEV_INTERNAL_OPEN);
mProject = std::make_shared<Project>(filename,DEV_INTERNAL_OPEN,
mEditorList,
&mFileSystemWatcher);
updateProjectView();
pSettings->history().removeProject(filename);
@ -5485,7 +5487,9 @@ void MainWindow::on_actionNew_Project_triggered()
}
// Create an empty project
mProject = std::make_shared<Project>(s,dialog.getProjectName());
mProject = std::make_shared<Project>(s,dialog.getProjectName(),
mEditorList,
&mFileSystemWatcher);
if (!mProject->assignTemplate(dialog.getTemplate(),dialog.isCppProject())) {
mProject = nullptr;
QMessageBox::critical(this,

View File

@ -16,7 +16,6 @@
*/
#include "project.h"
#include "editor.h"
#include "mainwindow.h"
#include "utils.h"
#include "systemconsts.h"
#include "editorlist.h"
@ -27,26 +26,33 @@
#include "systemconsts.h"
#include "iconsmanager.h"
#include <QFileSystemWatcher>
#include <QDir>
#include <QFileDialog>
#include <QFileInfo>
#include <QMessageBox>
#include <QTextCodec>
#include <QMessageBox>
#include <QDirIterator>
#include "customfileiconprovider.h"
#include <QMimeData>
#include "settings.h"
#include "vcs/gitrepository.h"
Project::Project(const QString &filename, const QString &name, QObject *parent) :
Project::Project(const QString &filename, const QString &name,
EditorList* editorList,
QFileSystemWatcher* fileSystemWatcher,
QObject *parent) :
QObject(parent),
mModel(this)
mModel(this),
mEditorList(editorList),
mFileSystemWatcher(fileSystemWatcher)
{
mFilename = QFileInfo(filename).absoluteFilePath();
mParser = std::make_shared<CppParser>();
mParser->setOnGetFileStream(
std::bind(
&EditorList::getContentFromOpenedEditor,pMainWindow->editorList(),
&EditorList::getContentFromOpenedEditor,mEditorList,
std::placeholders::_1, std::placeholders::_2));
if (name == DEV_INTERNAL_OPEN) {
open();
@ -64,14 +70,14 @@ Project::Project(const QString &filename, const QString &name, QObject *parent)
Project::~Project()
{
pMainWindow->editorList()->beginUpdate();
mEditorList->beginUpdate();
foreach (const PProjectUnit& unit, mUnits) {
if (unit->editor()) {
pMainWindow->editorList()->forceCloseEditor(unit->editor());
unit->setEditor(nullptr);
Editor * editor = unitEditor(unit);
if (editor) {
mEditorList->forceCloseEditor(editor);
}
}
pMainWindow->editorList()->endUpdate();
mEditorList->endUpdate();
}
QString Project::directory() const
@ -155,7 +161,7 @@ void Project::open()
dir.absoluteFilePath(
fromByteArray(ini.GetValue(groupName,"FileName",""))));
if (!QFileInfo(newUnit->fileName()).exists()) {
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("File Not Found"),
tr("Project file '%1' can't be found!")
.arg(newUnit->fileName()),
@ -179,7 +185,6 @@ void Project::open()
if (QTextCodec::codecForName(newUnit->encoding())==nullptr) {
newUnit->setEncoding(ENCODING_AUTO_DETECT);
}
newUnit->setEditor(nullptr);
newUnit->setNew(false);
newUnit->setParent(this);
newUnit->setNode(makeNewFileNode(extractFileName(newUnit->fileName()), false, folderNodeFromName(newUnit->folder())));
@ -268,7 +273,6 @@ PProjectUnit Project::newUnit(PProjectModelNode parentNode, const QString& custo
// Set all properties
newUnit->setFileName(s);
newUnit->setNew(true);
newUnit->setEditor(nullptr);
newUnit->setFolder(getFolderPath(parentNode));
newUnit->setNode(makeNewFileNode(extractFileName(newUnit->fileName()),
false, parentNode));
@ -293,9 +297,8 @@ Editor *Project::openUnit(int index)
PProjectUnit unit = mUnits[index];
if (!unit->fileName().isEmpty()) {
QDir dir(directory());
QString fullPath = dir.absoluteFilePath(unit->fileName());
Editor * editor = pMainWindow->editorList()->getOpenedEditorByFilename(fullPath);
QString fullPath = unitFullPath(unit);
Editor * editor = mEditorList->getOpenedEditorByFilename(fullPath);
if (editor) {//already opened in the editors
editor->setInProject(true);
editor->activate();
@ -303,9 +306,8 @@ Editor *Project::openUnit(int index)
}
QByteArray encoding;
encoding = unit->encoding();
editor = pMainWindow->editorList()->newEditor(fullPath, encoding, true, unit->isNew());
editor = mEditorList->newEditor(fullPath, encoding, true, unit->isNew());
editor->setInProject(true);
unit->setEditor(editor);
//unit->setEncoding(encoding);
editor->activate();
loadUnitLayout(editor,index);
@ -314,6 +316,28 @@ Editor *Project::openUnit(int index)
return nullptr;
}
QString Project::unitFullPath(const PProjectUnit &unit) const
{
QDir dir(directory());
return dir.absoluteFilePath(unit->fileName());
}
QString Project::unitFullPath(const ProjectUnit *unit) const
{
QDir dir(directory());
return dir.absoluteFilePath(unit->fileName());
}
Editor *Project::unitEditor(const PProjectUnit &unit) const
{
return mEditorList->getOpenedEditorByFilename(unitFullPath(unit));
}
Editor *Project::unitEditor(const ProjectUnit *unit) const
{
return mEditorList->getOpenedEditorByFilename(unitFullPath(unit));
}
void Project::rebuildNodes()
{
mModel.beginUpdate();
@ -378,10 +402,12 @@ bool Project::removeUnit(int index, bool doClose , bool removeFile)
// qDebug()<<unit->fileName();
// qDebug()<<(qint64)unit->editor();
// Attempt to close it
if (doClose && (unit->editor())) {
unit->editor()->setInProject(false);
if (!pMainWindow->editorList()->closeEditor(unit->editor()))
return false;
if (doClose) {
Editor* editor = unitEditor(unit);
if (editor) {
editor->setInProject(false);
mEditorList->closeEditor(editor);
}
}
if (removeFile) {
@ -450,8 +476,8 @@ void Project::saveLayout()
SimpleIni layIni;
QStringList sl;
// Write list of open project files
for (int i=0;i<pMainWindow->editorList()->pageCount();i++) {
Editor* e= (*(pMainWindow->editorList()))[i];
for (int i=0;i<mEditorList->pageCount();i++) {
Editor* e= (*mEditorList)[i];
if (e && e->inProject())
sl.append(QString("%1").arg(indexInUnits(e)));
}
@ -459,14 +485,14 @@ void Project::saveLayout()
Editor *e, *e2;
// Remember what files were visible
pMainWindow->editorList()->getVisibleEditors(e, e2);
mEditorList->getVisibleEditors(e, e2);
if (e)
layIni.SetLongValue("Editors","Focused", indexInUnits(e));
// save editor info
for (int i=0;i<mUnits.count();i++) {
QByteArray groupName = QString("Editor_%1").arg(i).toUtf8();
PProjectUnit unit = mUnits[i];
Editor* editor = unit->editor();
Editor* editor = unitEditor(unit);
if (editor) {
layIni.SetLongValue(groupName,"CursorCol", editor->caretX());
layIni.SetLongValue(groupName,"CursorRow", editor->caretY());
@ -496,9 +522,10 @@ void Project::saveUnitAs(int i, const QString &sFileName, bool syncEditor)
if (fileExists(unit->fileName())) {
unit->setNew(false);
}
if (unit->editor() && syncEditor) {
Editor * editor=unitEditor(unit);
if (editor && syncEditor) {
//prevent recurse
unit->editor()->saveAs(sFileName,true);
editor->saveAs(sFileName,true);
}
unit->setNew(false);
unit->setFileName(sFileName);
@ -548,7 +575,7 @@ bool Project::saveUnits()
if (unit->modified() && fileExists(unit->fileName())
&& isReadOnly(unit->fileName())) {
// file is read-only
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("Can't save file"),
tr("Can't save file '%1'").arg(unit->fileName()),
QMessageBox::Ok
@ -618,11 +645,10 @@ void Project::associateEditorToUnit(Editor *editor, PProjectUnit unit)
if (!unit)
return;
if (editor) {
unit->setEditor(editor);
unit->setEncoding(editor->encodingOption());
editor->setInProject(true);
} else {
unit->setEditor(nullptr);
editor->setInProject(false);
}
}
@ -730,8 +756,8 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
unit = newUnit(mRootNode,templateUnit->CName);
}
Editor * editor = pMainWindow->editorList()->newEditor(
QDir(directory()).absoluteFilePath(unit->fileName()),
Editor * editor = mEditorList->newEditor(
unitFullPath(unit),
unit->encoding(),
true,
true);
@ -741,7 +767,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
try {
editor->loadFile(s2);
} catch(FileError& e) {
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("Error Load File"),
e.reason());
}
@ -749,7 +775,6 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
s.replace("#13#10","\r\n");
editor->insertString(s,false);
}
unit->setEditor(editor);
editor->save(true,false);
editor->activate();
}
@ -853,7 +878,7 @@ PProjectUnit Project::addUnit(const QString &inFileName, PProjectModelNode paren
PProjectUnit newUnit;
// Don't add if it already exists
if (fileAlreadyExists(inFileName)) {
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("File Exists"),
tr("File '%1' is already in the project"),
QMessageBox::Ok);
@ -864,13 +889,11 @@ PProjectUnit Project::addUnit(const QString &inFileName, PProjectModelNode paren
// Set all properties
newUnit->setFileName(QDir(directory()).filePath(inFileName));
newUnit->setNew(false);
Editor * e= pMainWindow->editorList()->getOpenedEditorByFilename(newUnit->fileName());
Editor * e= unitEditor(newUnit);
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));
@ -1228,7 +1251,7 @@ void Project::checkProjectFileForUpdate(SimpleIni &ini)
if (cnvt)
QMessageBox::information(
pMainWindow,
nullptr,
tr("Project Updated"),
tr("Your project was succesfully updated to a newer file format!")
+"<br />"
@ -1240,11 +1263,11 @@ void Project::checkProjectFileForUpdate(SimpleIni &ini)
void Project::closeUnit(int index)
{
PProjectUnit unit = mUnits[index];
if (unit->editor()) {
saveUnitLayout(unit->editor(),index);
unit->editor()->setInProject(false);
pMainWindow->editorList()->forceCloseEditor(unit->editor());
unit->setEditor(nullptr);
Editor * editor =unitEditor(unit);
if (editor) {
saveUnitLayout(editor,index);
editor->setInProject(false);
mEditorList->forceCloseEditor(editor);
}
}
@ -1432,8 +1455,9 @@ void Project::loadLayout()
openUnit(currIdx);
}
}
if (topLeft>=0 && topLeft<mUnits.count() && mUnits[topLeft]->editor()) {
mUnits[topLeft]->editor()->activate();
if (topLeft>=0 && topLeft<mUnits.count()) {
Editor * editor = unitEditor(mUnits[topLeft]);
editor->activate();
}
}
@ -1450,7 +1474,7 @@ void Project::loadOptions(SimpleIni& ini)
if (mOptions.version > 0) { // ver > 0 is at least a v5 project
if (mOptions.version < 2) {
mOptions.version = 2;
QMessageBox::information(pMainWindow,
QMessageBox::information(nullptr,
tr("Settings need update"),
tr("The compiler settings format of Red Panda C++ has changed.")
+"<BR /><BR />"
@ -1490,7 +1514,7 @@ void Project::loadOptions(SimpleIni& ini)
if (mOptions.compilerSet >= pSettings->compilerSets().size()
|| mOptions.compilerSet < 0) { // TODO: change from indices to names
QMessageBox::critical(
pMainWindow,
nullptr,
tr("Compiler not found"),
tr("The compiler set you have selected for this project, no longer exists.")
+"<BR />"
@ -1655,6 +1679,16 @@ void Project::updateCompilerSetType()
}
}
QFileSystemWatcher *Project::fileSystemWatcher() const
{
return mFileSystemWatcher;
}
EditorList *Project::editorList() const
{
return mEditorList;
}
const QList<PProjectUnit> &Project::units() const
{
return mUnits;
@ -1709,7 +1743,6 @@ const QString &Project::filename() const
ProjectUnit::ProjectUnit(Project* parent)
{
mEditor = nullptr;
mNode = nullptr;
mParent = parent;
}
@ -1724,16 +1757,6 @@ void ProjectUnit::setParent(Project* newParent)
mParent = newParent;
}
Editor *ProjectUnit::editor() const
{
return mEditor;
}
void ProjectUnit::setEditor(Editor *newEditor)
{
mEditor = newEditor;
}
const QString &ProjectUnit::fileName() const
{
return mFileName;
@ -1842,8 +1865,9 @@ const QByteArray &ProjectUnit::encoding() const
void ProjectUnit::setEncoding(const QByteArray &newEncoding)
{
if (mEncoding != newEncoding) {
if (mEditor) {
mEditor->setEncodingOption(newEncoding);
Editor * editor=mParent->unitEditor(this);
if (editor) {
editor->setEncodingOption(newEncoding);
}
mEncoding = newEncoding;
}
@ -1851,8 +1875,9 @@ void ProjectUnit::setEncoding(const QByteArray &newEncoding)
bool ProjectUnit::modified() const
{
if (mEditor) {
return mEditor->modified();
Editor * editor=mParent->unitEditor(this);
if (editor) {
return editor->modified();
} else {
return false;
}
@ -1860,9 +1885,10 @@ bool ProjectUnit::modified() const
void ProjectUnit::setModified(bool value)
{
Editor * editor=mParent->unitEditor(this);
// Mark the change in the coupled editor
if (mEditor) {
return mEditor->setModified(value);
if (editor) {
return editor->setModified(value);
}
// If modified is set to true, mark project as modified too
@ -1873,17 +1899,18 @@ void ProjectUnit::setModified(bool value)
bool ProjectUnit::save()
{
bool previous=pMainWindow->fileSystemWatcher()->blockSignals(true);
auto action = finally([&previous](){
pMainWindow->fileSystemWatcher()->blockSignals(previous);
bool previous=mParent->fileSystemWatcher()->blockSignals(true);
auto action = finally([&previous,this](){
mParent->fileSystemWatcher()->blockSignals(previous);
});
bool result=true;
if (!mEditor && !fileExists(mFileName)) {
Editor * editor=mParent->unitEditor(this);
if (!editor && !fileExists(mFileName)) {
// file is neither open, nor saved
QStringList temp;
stringsToFile(temp,mFileName);
} else if (mEditor && mEditor->modified()) {
result = mEditor->save();
} else if (editor && editor->modified()) {
result = editor->save();
}
if (mNode) {
mNode->text = extractFileName(mFileName);
@ -2083,16 +2110,16 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
// Only continue if the user says so...
if (fileExists(newName) && newName.compare(oldName, PATH_SENSITIVITY)!=0) {
// don't remove when changing case for example
if (QMessageBox::question(pMainWindow,
if (QMessageBox::question(nullptr,
tr("File exists"),
tr("File '%1' already exists. Delete it now?")
.arg(newName),
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No) == QMessageBox::Yes) {
// Close the target file...
Editor * e= pMainWindow->editorList()->getOpenedEditorByFilename(newName);
Editor * e=mProject->editorList()->getOpenedEditorByFilename(newName);
if (e)
pMainWindow->editorList()->closeEditor(e);
mProject->editorList()->closeEditor(e);
// Remove it from the current project...
int projindex = mProject->indexInUnits(newName);
@ -2102,7 +2129,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
// All references to the file are removed. Delete the file from disk
if (!QFile::remove(newName)) {
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("Remove failed"),
tr("Failed to remove file '%1'")
.arg(newName),
@ -2117,10 +2144,10 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
// change name in project file first (no actual file renaming on disk)
//save old file, if it is openned;
// remove old file from monitor list
pMainWindow->fileSystemWatcher()->removePath(oldName);
mProject->fileSystemWatcher()->removePath(oldName);
if (!QFile::rename(oldName,newName)) {
QMessageBox::critical(pMainWindow,
QMessageBox::critical(nullptr,
tr("Rename failed"),
tr("Failed to rename file '%1' to '%2'")
.arg(oldName,newName),
@ -2130,7 +2157,7 @@ bool ProjectModel::setData(const QModelIndex &index, const QVariant &value, int
mProject->saveUnitAs(idx,newName);
// Add new filename to file minitor
pMainWindow->fileSystemWatcher()->addPath(newName);
mProject->fileSystemWatcher()->addPath(newName);
//suffix changed
if (mProject && mProject->modelType() == ProjectModelType::FileSystem

View File

@ -26,6 +26,8 @@
class Project;
class Editor;
class CppParser;
class EditorList;
class QFileSystemWatcher;
enum ProjectSpecialFolderNode {
@ -54,8 +56,6 @@ public:
explicit ProjectUnit(Project* parent);
Project* parent() const;
void setParent(Project* newParent);
Editor *editor() const;
void setEditor(Editor *newEditor);
const QString &fileName() const;
void setFileName(QString newFileName);
bool isNew() const;
@ -85,7 +85,6 @@ public:
private:
Project* mParent;
Editor* mEditor;
QString mFileName;
bool mNew;
QString mFolder;
@ -154,7 +153,10 @@ class Project : public QObject
{
Q_OBJECT
public:
explicit Project(const QString& filename, const QString& name,QObject *parent = nullptr);
explicit Project(const QString& filename, const QString& name,
EditorList* editorList,
QFileSystemWatcher* fileSystemWatcher,
QObject *parent = nullptr);
~Project();
QString directory() const;
QString executable() const;
@ -181,6 +183,15 @@ public:
PProjectUnit newUnit(PProjectModelNode parentNode,
const QString& customFileName="");
Editor* openUnit(int index);
QString unitFullPath(const PProjectUnit& unit) const;
QString unitFullPath(const ProjectUnit* unit) const;
Editor* unitEditor(const PProjectUnit& unit) const;
Editor* unitEditor(const ProjectUnit* unit) const;
Editor* unitEditor(int index) const {
if (index<0 || index>=mUnits.count())
return nullptr;
return unitEditor(mUnits[index]);
}
PProjectModelNode pointerToNode(ProjectModelNode * p, PProjectModelNode parent=PProjectModelNode());
void rebuildNodes();
bool removeUnit(int index, bool doClose, bool removeFile = false);
@ -220,6 +231,10 @@ public:
ProjectModelType modelType() const;
void setModelType(ProjectModelType type);
EditorList *editorList() const;
QFileSystemWatcher *fileSystemWatcher() const;
signals:
void nodesChanged();
void modifyChanged(bool value);
@ -256,6 +271,8 @@ private:
QHash<ProjectSpecialFolderNode, PProjectModelNode> mSpecialNodes;
QHash<QString, PProjectModelNode> mFileSystemFolderNodes;
ProjectModel mModel;
EditorList *mEditorList;
QFileSystemWatcher* mFileSystemWatcher;
};
#endif // PROJECT_H

View File

@ -362,7 +362,7 @@ void SearchDialog::on_btnExecute_clicked()
SearchFileScope::wholeProject
);
for (int i=0;i<pMainWindow->project()->units().count();i++) {
Editor * e = pMainWindow->project()->units()[i]->editor();
Editor * e = pMainWindow->project()->unitEditor(i);
QString curFilename = pMainWindow->project()->units()[i]->fileName();
if (e) {
fileSearched++;