Commit ca4be197 authored by Jarek Kobus's avatar Jarek Kobus

Revert "Replace virtual isModified method with a getter/setter/notifier"

This doesn't fix the issue with cleaning the clear state of undo stack.
This introduced the issue when ui file is opened it's marked as modified.
It reverts 59c90e00
and d0c537ca

Change-Id: Ifd4ff8483d6c297461632de500a4502b1fd0871f
Reviewed-by: Tobias Hunger's avatarTobias Hunger <tobias.hunger@qt.io>
parent a25a855b
......@@ -76,20 +76,17 @@ DocumentController::DocumentController(QObject *parent) :
{
// project controller
connect(m_projectController, &ProjectController::changed, this, &DocumentController::changed);
connect(m_projectController, &ProjectController::modificationChanged, this, &DocumentController::modificationChanged);
// model controller
m_modelController->setUndoController(m_undoController);
connect(m_modelController, &ModelController::modified, [this](){
m_projectController->setModified(true);
});
connect(m_modelController, &ModelController::modified,
m_projectController, &ProjectController::setModified);
// diagram controller
m_diagramController->setModelController(m_modelController);
m_diagramController->setUndoController(m_undoController);
connect(m_diagramController, &DiagramController::modified, [this](){
m_projectController->setModified(true);
});
connect(m_diagramController, &DiagramController::modified,
m_projectController, &ProjectController::setModified);
// diagram scene controller
m_diagramSceneController->setModelController(m_modelController);
......
......@@ -61,7 +61,6 @@ public:
signals:
void changed();
void modificationChanged(bool modified);
void modelClipboardChanged(bool isEmpty);
void diagramClipboardChanged(bool isEmpty);
......
......@@ -43,7 +43,8 @@ ProjectIsModifiedException::ProjectIsModifiedException()
}
ProjectController::ProjectController(QObject *parent)
: QObject(parent)
: QObject(parent),
m_isModified(false)
{
}
......@@ -58,7 +59,7 @@ void ProjectController::newProject(const QString &fileName)
rootPackage->setName(tr("Model"));
m_project->setRootPackage(rootPackage);
m_project->setFileName(fileName);
setModified(false);
m_isModified = false;
emit fileNameChanged(m_project->fileName());
emit changed();
}
......@@ -67,18 +68,17 @@ void ProjectController::setFileName(const QString &fileName)
{
if (fileName != m_project->fileName()) {
m_project->setFileName(fileName);
setModified(true);
setModified();
emit fileNameChanged(m_project->fileName());
}
}
void ProjectController::setModified(bool modified)
void ProjectController::setModified()
{
if (m_isModified == modified)
return;
m_isModified = modified;
emit modificationChanged(modified);
if (!m_isModified) {
m_isModified = true;
emit changed();
}
}
void ProjectController::load()
......@@ -89,7 +89,7 @@ void ProjectController::load()
throw NoFileNameException();
ProjectSerializer serializer;
serializer.load(m_project->fileName(), m_project.data());
setModified(false);
m_isModified = false;
emit changed();
}
......@@ -99,7 +99,7 @@ void ProjectController::save()
throw NoFileNameException();
ProjectSerializer serializer;
serializer.save(m_project->fileName(), m_project.data());
setModified(false);
m_isModified = false;
emit changed();
}
......
......@@ -58,7 +58,6 @@ public:
signals:
void changed();
void fileNameChanged(const QString &fileName);
void modificationChanged(bool modified);
public:
Project *project() const { return m_project.data(); }
......@@ -66,7 +65,7 @@ public:
void newProject(const QString &fileName);
void setFileName(const QString &fileName);
void setModified(bool modified);
void setModified();
void load();
void save();
......@@ -74,7 +73,7 @@ public:
private:
QScopedPointer<Project> m_project;
bool m_isModified = false;
bool m_isModified;
};
} // namespace qmt
......@@ -43,12 +43,8 @@ AndroidManifestDocument::AndroidManifestDocument(AndroidManifestEditorWidget *ed
setId(Constants::ANDROID_MANIFEST_EDITOR_ID);
setMimeType(QLatin1String(Constants::ANDROID_MANIFEST_MIME_TYPE));
setSuspendAllowed(false);
connect(editorWidget, &AndroidManifestEditorWidget::modificationChanged,
this, &Core::IDocument::setModified);
connect(this, &Core::IDocument::modificationChanged,
editorWidget, &AndroidManifestEditorWidget::setModified);
setModified(editorWidget->isModified());
connect(editorWidget, &AndroidManifestEditorWidget::guiChanged,
this, &Core::IDocument::changed);
}
bool AndroidManifestDocument::save(QString *errorString, const QString &fileName, bool autoSave)
......@@ -59,6 +55,11 @@ bool AndroidManifestDocument::save(QString *errorString, const QString &fileName
return result;
}
bool AndroidManifestDocument::isModified() const
{
return TextDocument::isModified() || m_editorWidget->isModified();
}
bool AndroidManifestDocument::isSaveAsAllowed() const
{
return false;
......
......@@ -39,6 +39,7 @@ public:
bool save(QString *errorString, const QString &fileName = QString(),
bool autoSave = false) override;
bool isModified() const override;
bool isSaveAsAllowed() const override;
private:
......
......@@ -101,7 +101,7 @@ Project *androidProject(const Utils::FileName &fileName)
AndroidManifestEditorWidget::AndroidManifestEditorWidget()
: QStackedWidget(),
m_modified(false),
m_dirty(false),
m_stayClean(false)
{
m_textEditorWidget = new AndroidManifestTextEditorWidget(this);
......@@ -138,7 +138,7 @@ void AndroidManifestEditorWidget::initializePage()
QGroupBox *packageGroupBox = new QGroupBox(mainWidget);
topLayout->addWidget(packageGroupBox);
auto setDirtyFunc = [this] { setModified(); };
auto setDirtyFunc = [this] { setDirty(); };
packageGroupBox->setTitle(tr("Package"));
{
QFormLayout *formLayout = new QFormLayout();
......@@ -206,7 +206,7 @@ void AndroidManifestEditorWidget::initializePage()
connect(m_packageNameLineEdit, &QLineEdit::textEdited,
this, &AndroidManifestEditorWidget::setPackageName);
connect(m_versionCode, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
this, &AndroidManifestEditorWidget::setModified);
this, &AndroidManifestEditorWidget::setDirty);
connect(m_versionNameLinedit, &QLineEdit::textEdited,
this, setDirtyFunc);
connect(m_androidMinSdkVersion,
......@@ -524,17 +524,17 @@ void AndroidManifestEditorWidget::updateAfterFileLoad()
setActivePage(Source);
}
void AndroidManifestEditorWidget::setModified(bool modified)
void AndroidManifestEditorWidget::setDirty(bool dirty)
{
if (m_stayClean || modified == m_modified)
if (m_stayClean || dirty == m_dirty)
return;
m_modified = modified;
emit modificationChanged(modified);
m_dirty = dirty;
emit guiChanged();
}
bool AndroidManifestEditorWidget::isModified() const
{
return m_modified
return m_dirty
|| !m_hIconPath.isEmpty()
|| !m_mIconPath.isEmpty()
|| !m_lIconPath.isEmpty();
......@@ -819,7 +819,7 @@ void AndroidManifestEditorWidget::syncToWidgets(const QDomDocument &doc)
updateAddRemovePermissionButtons();
m_stayClean = false;
m_modified = false;
m_dirty = false;
}
int extractVersion(const QString &string)
......@@ -862,7 +862,7 @@ void AndroidManifestEditorWidget::syncToEditor()
m_textEditorWidget->setPlainText(result);
m_textEditorWidget->document()->setModified(true);
m_modified = false;
m_dirty = false;
}
namespace {
......@@ -1253,7 +1253,7 @@ void AndroidManifestEditorWidget::setLDPIIcon()
return;
m_lIconPath = file;
m_lIconButton->setIcon(QIcon(file));
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::setMDPIIcon()
......@@ -1263,7 +1263,7 @@ void AndroidManifestEditorWidget::setMDPIIcon()
return;
m_mIconPath = file;
m_mIconButton->setIcon(QIcon(file));
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::setHDPIIcon()
......@@ -1273,12 +1273,12 @@ void AndroidManifestEditorWidget::setHDPIIcon()
return;
m_hIconPath = file;
m_hIconButton->setIcon(QIcon(file));
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::defaultPermissionOrFeatureCheckBoxClicked()
{
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::updateAddRemovePermissionButtons()
......@@ -1293,7 +1293,7 @@ void AndroidManifestEditorWidget::addPermission()
{
m_permissionsModel->addPermission(m_permissionsComboBox->currentText());
updateAddRemovePermissionButtons();
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::removePermission()
......@@ -1302,7 +1302,7 @@ void AndroidManifestEditorWidget::removePermission()
if (idx.isValid())
m_permissionsModel->removePermission(idx.row());
updateAddRemovePermissionButtons();
setModified(true);
setDirty(true);
}
void AndroidManifestEditorWidget::setPackageName()
......@@ -1312,7 +1312,7 @@ void AndroidManifestEditorWidget::setPackageName()
bool valid = checkPackageName(packageName);
m_packageNameWarning->setVisible(!valid);
m_packageNameWarningIcon->setVisible(!valid);
setModified(true);
setDirty(true);
}
......
......@@ -101,10 +101,10 @@ public:
Core::IEditor *editor() const;
TextEditor::TextEditorWidget *textEditorWidget() const;
void setModified(bool modified = true);
void setDirty(bool dirty = true);
signals:
void modificationChanged(bool modified);
void guiChanged();
protected:
bool eventFilter(QObject *obj, QEvent *event);
......@@ -150,7 +150,7 @@ private:
QString parseComment(QXmlStreamReader &reader, QXmlStreamWriter &writer);
void parseUnknownElement(QXmlStreamReader &reader, QXmlStreamWriter &writer);
bool m_modified; // indicates that we need to call syncToEditor()
bool m_dirty; // indicates that we need to call syncToEditor()
bool m_stayClean;
int m_errorLine;
int m_errorColumn;
......
......@@ -320,6 +320,12 @@ public:
}
public:
bool isModified() const override
{
return isTemporary()/*e.g. memory view*/ ? false
: m_widget->isModified();
}
bool isFileReadOnly() const override {
const FileName fn = filePath();
if (fn.isEmpty())
......@@ -385,12 +391,7 @@ public:
connect(m_addressEdit, &QLineEdit::editingFinished,
this, &BinEditor::jumpToAddress);
connect(widget, &BinEditorWidget::modificationChanged,
m_file, &IDocument::setModified);
connect(m_file, &IDocument::modificationChanged,
widget, &BinEditorWidget::setModified);
m_file->setModified(widget->isModified());
m_file, &IDocument::changed);
updateCursorPosition(widget->cursorPosition());
}
......
......@@ -1052,7 +1052,6 @@ void DocumentManager::checkForReload()
documentsToClose << document;
} else if (defaultBehavior == IDocument::IgnoreAll) {
// content change or removed, but settings say ignore
document->setModified(true);
success = document->reload(&errorString, IDocument::FlagIgnore, type);
// either the default behavior is to always ask,
// or the ReloadUnmodified default behavior didn't kick in,
......@@ -1070,7 +1069,6 @@ void DocumentManager::checkForReload()
// content change, IDocument wants to ask user
if (previousReloadAnswer == ReloadNone) {
// answer already given, ignore
document->setModified(true);
success = document->reload(&errorString, IDocument::FlagIgnore, IDocument::TypeContents);
} else if (previousReloadAnswer == ReloadAll) {
// answer already given, reload
......@@ -1086,7 +1084,6 @@ void DocumentManager::checkForReload()
break;
case ReloadSkipCurrent:
case ReloadNone:
document->setModified(true);
success = document->reload(&errorString, IDocument::FlagIgnore, IDocument::TypeContents);
break;
case CloseCurrent:
......
......@@ -79,7 +79,6 @@ public:
bool hasWriteWarning = false;
bool restored = false;
bool isSuspendAllowed = false;
bool isModified = false;
};
} // namespace Internal
......@@ -201,17 +200,7 @@ bool IDocument::shouldAutoSave() const
bool IDocument::isModified() const
{
return d->isModified;
}
void IDocument::setModified(bool modified)
{
if (d->isModified == modified)
return;
d->isModified = modified;
emit modificationChanged(modified);
emit changed();
return false;
}
bool IDocument::isSaveAsAllowed() const
......
......@@ -106,9 +106,6 @@ public:
bool isTemporary() const;
void setTemporary(bool temporary);
bool isModified() const;
void setModified(bool modified);
virtual QString fallbackSaveAsPath() const;
virtual QString fallbackSaveAsFileName() const;
......@@ -116,6 +113,7 @@ public:
void setMimeType(const QString &mimeType);
virtual bool shouldAutoSave() const;
virtual bool isModified() const;
virtual bool isSaveAsAllowed() const;
bool isSuspendAllowed() const;
void setSuspendAllowed(bool value);
......@@ -138,8 +136,6 @@ signals:
// For meta data changes: file name, modified state, ...
void changed();
void modificationChanged(bool modified);
// For changes in the contents of the document
void contentsChanged();
......
......@@ -59,9 +59,6 @@ FormWindowFile::FormWindowFile(QDesignerFormWindowInterface *form, QObject *pare
connect(m_formWindow->commandHistory(), &QUndoStack::indexChanged,
this, &FormWindowFile::setShouldAutoSave);
connect(m_formWindow.data(), &QDesignerFormWindowInterface::changed, this, &FormWindowFile::updateIsModified);
connect(this, &IDocument::modificationChanged, m_formWindow.data(), &QDesignerFormWindowInterface::setDirty);
setModified(m_formWindow->isDirty());
m_resourceHandler = new ResourceHandler(form);
connect(this, &FormWindowFile::filePathChanged,
......@@ -189,7 +186,10 @@ void FormWindowFile::updateIsModified()
bool value = m_formWindow && m_formWindow->isDirty();
if (value)
emit contentsChanged();
setModified(value);
if (value == m_isModified)
return;
m_isModified = value;
emit changed();
}
bool FormWindowFile::shouldAutoSave() const
......@@ -197,6 +197,11 @@ bool FormWindowFile::shouldAutoSave() const
return m_shouldAutoSave;
}
bool FormWindowFile::isModified() const
{
return m_formWindow && m_formWindow->isDirty();
}
bool FormWindowFile::isSaveAsAllowed() const
{
return true;
......
......@@ -53,6 +53,7 @@ public:
QByteArray contents() const override;
bool setContents(const QByteArray &contents) override;
bool shouldAutoSave() const override;
bool isModified() const override;
bool isSaveAsAllowed() const override;
bool reload(QString *errorString, ReloadFlag flag, ChangeType type) override;
QString fallbackSaveAsFileName() const override;
......@@ -81,6 +82,7 @@ private:
// Might actually go out of scope before the IEditor due
// to deleting the WidgetHost which owns it.
QPointer<QDesignerFormWindowInterface> m_formWindow;
bool m_isModified = false;
ResourceHandler *m_resourceHandler = nullptr;
};
......
......@@ -92,7 +92,7 @@ void ExtPropertiesMView::onConfigPathChanged(const QString &path)
if (path.isEmpty()) {
if (!project->configPath().isEmpty()) {
project->setConfigPath(QString());
m_projectController->setModified(true);
m_projectController->setModified();
modified = true;
}
} else {
......@@ -103,7 +103,7 @@ void ExtPropertiesMView::onConfigPathChanged(const QString &path)
QString configPath = projectDir.relativeFilePath(absConfigPath.filePath());
if (configPath != project->configPath()) {
project->setConfigPath(configPath);
m_projectController->setModified(true);
m_projectController->setModified();
modified = true;
}
}
......
......@@ -94,7 +94,7 @@ bool ModelDocument::save(QString *errorString, const QString &name, bool autoSav
}
if (autoSave) {
d->documentController->projectController()->setModified(true);
d->documentController->projectController()->setModified();
} else {
setFilePath(Utils::FileName::fromString(d->documentController->projectController()->project()->fileName()));
emit changed();
......@@ -108,6 +108,11 @@ bool ModelDocument::shouldAutoSave() const
return isModified();
}
bool ModelDocument::isModified() const
{
return d->documentController ? d->documentController->projectController()->isModified() : false;
}
bool ModelDocument::isSaveAsAllowed() const
{
return true;
......@@ -135,10 +140,6 @@ Core::IDocument::OpenResult ModelDocument::load(QString *errorString, const QStr
{
d->documentController = ModelEditorPlugin::modelsManager()->createModel(this);
connect(d->documentController, &qmt::DocumentController::changed, this, &IDocument::changed);
connect(d->documentController, &qmt::DocumentController::modificationChanged, this, &IDocument::setModified);
connect(this, &IDocument::modificationChanged,
d->documentController->projectController(), &qmt::ProjectController::setModified);
setModified(d->documentController->projectController()->isModified());
try {
d->documentController->loadProject(fileName);
......
......@@ -52,6 +52,7 @@ public:
const QString &realFileName) override;
bool save(QString *errorString, const QString &fileName, bool autoSave) override;
bool shouldAutoSave() const override;
bool isModified() const override;
bool isSaveAsAllowed() const override;
bool reload(QString *errorString, ReloadFlag flag, ChangeType type) override;
......
......@@ -63,14 +63,10 @@ ResourceEditorDocument::ResourceEditorDocument(QObject *parent) :
setId(ResourceEditor::Constants::RESOURCEEDITOR_ID);
setMimeType(QLatin1String(ResourceEditor::Constants::C_RESOURCE_MIMETYPE));
connect(m_model, &RelativeResourceModel::dirtyChanged,
this, &ResourceEditorDocument::setModified);
connect(this, &IDocument::modificationChanged,
m_model, &RelativeResourceModel::setDirty);
this, &ResourceEditorDocument::dirtyChanged);
connect(m_model, &ResourceModel::contentsChanged,
this, &IDocument::contentsChanged);
setModified(m_model->dirty());
if (debugResourceEditorW)
qDebug() << "ResourceEditorFile::ResourceEditorFile()";
}
......@@ -128,16 +124,20 @@ Core::IDocument::OpenResult ResourceEditorDocument::open(QString *errorString,
if (debugResourceEditorW)
qDebug() << "ResourceEditorW::open: " << fileName;
setBlockDirtyChanged(true);
m_model->setFileName(realFileName);
OpenResult openResult = m_model->reload();
if (openResult != OpenResult::Success) {
*errorString = m_model->errorMessage();
setBlockDirtyChanged(false);
emit loaded(false);
return openResult;
}
setFilePath(FileName::fromString(fileName));
setBlockDirtyChanged(false);
m_model->setDirty(fileName != realFileName);
m_shouldAutoSave = false;
......@@ -155,10 +155,12 @@ bool ResourceEditorDocument::save(QString *errorString, const QString &name, boo
if (actualName.isEmpty())
return false;
m_blockDirtyChanged = true;
m_model->setFileName(actualName.toString());
if (!m_model->save()) {
*errorString = m_model->errorMessage();
m_model->setFileName(oldFileName.toString());
m_blockDirtyChanged = false;
return false;
}
......@@ -166,10 +168,12 @@ bool ResourceEditorDocument::save(QString *errorString, const QString &name, boo
if (autoSave) {
m_model->setFileName(oldFileName.toString());
m_model->setDirty(true);
m_blockDirtyChanged = false;
return true;
}
setFilePath(actualName);
m_blockDirtyChanged = false;
emit changed();
return true;
......@@ -209,6 +213,11 @@ void ResourceEditorDocument::setFilePath(const FileName &newName)
IDocument::setFilePath(newName);
}
void ResourceEditorDocument::setBlockDirtyChanged(bool value)
{
m_blockDirtyChanged = value;
}
RelativeResourceModel *ResourceEditorDocument::model() const
{
return m_model;
......@@ -229,6 +238,11 @@ bool ResourceEditorDocument::shouldAutoSave() const
return m_shouldAutoSave;
}
bool ResourceEditorDocument::isModified() const
{
return m_model->dirty();
}
bool ResourceEditorDocument::isSaveAsAllowed() const
{
return true;
......@@ -250,6 +264,16 @@ bool ResourceEditorDocument::reload(QString *errorString, ReloadFlag flag, Chang
return true;
}
void ResourceEditorDocument::dirtyChanged(bool dirty)
{
if (m_blockDirtyChanged)
return; // We emit changed() afterwards, unless it was an autosave
if (debugResourceEditorW)
qDebug() << " ResourceEditorW::dirtyChanged" << dirty;
emit changed();
}
void ResourceEditorW::onUndoStackChanged(bool canUndo, bool canRedo)
{
m_plugin->onUndoStackChanged(this, canUndo, canRedo);
......
......@@ -58,9 +58,11 @@ public:
QByteArray contents() const override;
bool setContents(const QByteArray &contents) override;
bool shouldAutoSave() const override;
bool isModified() const override;
bool isSaveAsAllowed() const override;
bool reload(QString *errorString, ReloadFlag flag, ChangeType type) override;
void setFilePath(const Utils::FileName &newName) override;
void setBlockDirtyChanged(bool value);
RelativeResourceModel *model() const;
void setShouldAutoSave(bool save);
......@@ -69,8 +71,10 @@ signals:
void loaded(bool success);
private:
void dirtyChanged(bool);
RelativeResourceModel *m_model;
bool m_blockDirtyChanged = false;
bool m_shouldAutoSave = false;
};
......
......@@ -789,11 +789,6 @@ bool MainWidget::isDirty() const
return m_document->changed();
}
void MainWidget::setDirty(bool dirty)
{
m_document->setChanged(dirty);
}
void MainWidget::fitToView()
{
StateView *view = m_views.last();
......
......@@ -87,7 +87,6 @@ public:
QString contents() const;
QUndoStack *undoStack() const;
bool isDirty() const;
void setDirty(bool dirty);
void newDocument();
void refresh();
OutputPane::WarningModel *warningModel() const;
......
......@@ -643,14 +643,6 @@ bool ScxmlDocument::changed() const
return !m_undoStack->isClean();
}
void ScxmlDocument::setChanged(bool modified)
{
if (modified)
; // we lack a setDirty method in QUndoStack
else
m_undoStack->setClean();
}
ScxmlTag *ScxmlDocument::scxmlRootTag() const
{
ScxmlTag *tag = rootTag();
......
......@@ -156,7 +156,6 @@ public:
* @return - true if changed, false otherwise
*/
bool changed() const;
void setChanged(bool modified);
/**
* @brief rootTag - return rootTag of the document
......@@ -278,7 +277,6 @@ private:
ScxmlTag *createScxmlTag();
QString m_fileName;
QUndoStack *m_undoStack;
int m_cleanIndex;
QVector<ScxmlTag*> m_tags;
QHash<QString, int> m_nextIdHash;
QHash<QString, QString> m_idMap;
......