diff --git a/dialog.cpp b/dialog.cpp index bdef0fc992044e01ab60a43337c4a71a7368dc70..52efa077006acc6aed61494e1b94ac990f95551c 100644 --- a/dialog.cpp +++ b/dialog.cpp @@ -15,15 +15,19 @@ Dialog::~Dialog() delete ui; } - void Dialog::fillTable(const QVector& fileDirs , const QStringList & fileNames) + void Dialog::fillTable(const QVector& fileDirs , const QStringList & fileNames, const QVector& isChangedDoc) { + int tableIndex =0; for(int i =0; i < fileDirs.count() ; i++) { - ui->tableWidget->insertRow(i); - - ui->tableWidget->setItem(i,0,new QTableWidgetItem(fileNames[i],Qt::DisplayRole)); - ui->tableWidget->setItem(i,1,new QTableWidgetItem(fileDirs[i].path(),Qt::DisplayRole)); + if(isChangedDoc.at(i)) + { + ui->tableWidget->insertRow(tableIndex); + ui->tableWidget->setItem(tableIndex,0,new QTableWidgetItem(fileNames[i],Qt::DisplayRole)); + ui->tableWidget->setItem(tableIndex,1,new QTableWidgetItem(fileDirs[i].path(),Qt::DisplayRole)); + ++tableIndex; + } } diff --git a/dialog.h b/dialog.h index 9ff3d1a9b2575cf204306751299c8a9e42de28d7..b4486dc2c4567298ff947df8e395e1962f666503 100644 --- a/dialog.h +++ b/dialog.h @@ -20,7 +20,7 @@ public: explicit Dialog(QWidget *parent = nullptr); ~Dialog(); - void fillTable(const QVector& , const QStringList &); + void fillTable(const QVector& , const QStringList &,const QVector& isChangedDoc); private slots: diff --git a/mainwindow.cpp b/mainwindow.cpp index 15dd5d71e0cbe7cb58c9577438efffe3c7938b97..a2e79fca6597956992db0eff839549a71d5be3fd 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -67,18 +67,40 @@ void MainWindow::closeEvent(QCloseEvent* closeEvent) bool MainWindow::on_exitAct_triggered() { + bool isExistChangedDoc = false; + + for(auto changedDoc : isChangedDoc) + { + if(changedDoc) + { + isExistChangedDoc = true; + } + } + if(!isExistChangedDoc) + { + qApp->quit(); + return true; + } + Dialog* dial = new Dialog(this); dial->setWindowTitle("Хотите сохранить файлы перед выход ?"); - dial->fillTable(fileDirs,fileNames); + dial->fillTable(fileDirs,fileNames,isChangedDoc); int mode = dial->exec(); if(mode == QDialog::Accepted) { - on_saveAllAct_triggered(); + // on_saveAllAct_triggered(); + int count = ui->tabWidget->count(); + for(int index = 0 ; index < count ; index++) + { + ui->tabWidget->setCurrentIndex(index); + if(isChangedDoc.at(index)) + on_saveAct_triggered(); + } qApp->quit(); return true; } @@ -101,91 +123,91 @@ void MainWindow::on_tabWidget_tabCloseRequested(int index) on_closeAct_triggered(); } - -void MainWindow::on_newAct_triggered() +bool MainWindow::on_closeAct_triggered() { - QString countTabsStr ; - countTabsStr.setNum(++newFileName); - QString nameFile = "Новый документ"+ countTabsStr +".txt"; - fileNames.push_back(nameFile); - strList.setStringList(fileNames); - fileDirs.push_back(QDir::current()); - QPlainTextEdit* textEd = new QPlainTextEdit(this); - ui->tabWidget->addTab(textEd,nameFile); - if(ui->tabWidget->currentIndex() == -1) - { - ui->tabWidget->setCurrentIndex(0); - } - else { - ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1 ); - } - - connect(textEd,SIGNAL(textChanged()),this , SLOT(tabModification())); - - isExistDoc.push_back(false); - - -} + if(!isChangedDoc.at(ui->tabWidget->currentIndex())) + { + removeTab(); + return true; + } -void MainWindow::on_closeAct_triggered() -{ QMessageBox msgBox; msgBox.setText("Хотите сохранить изменения в файле "+ui->tabWidget->tabText(ui->tabWidget->currentIndex())+ " ?"); QPushButton *saveButton = msgBox.addButton(tr("Сохранить"), QMessageBox::ActionRole); QPushButton *closeButton = msgBox.addButton(tr("Закрыть"),QMessageBox::ActionRole); QPushButton *cancelButton = msgBox.addButton(tr("Отменить"),QMessageBox::ActionRole); - msgBox.exec(); if(msgBox.clickedButton() == cancelButton) { - return; + return false; } - - else { - - for(auto i = 0 ; i < fileNames.count() ; i++) - { - - if(fileNames.at(i) == ui->tabWidget->tabText(ui->tabWidget->currentIndex()) ) - { - fileNames.removeAt(i); - fileDirs.removeAt(i); - break; - } - - } - - strList.setStringList(fileNames); + else{ if (msgBox.clickedButton() == saveButton) { - on_saveAct_triggered(); - ui->tabWidget->removeTab(ui->tabWidget->currentIndex()); + on_saveAct_triggered(); } - else if(msgBox.clickedButton() == closeButton) - { + removeTab(); + } + + return true; - ui->tabWidget->removeTab(ui->tabWidget->currentIndex()); +} - } +void MainWindow::removeTab() +{ + int index = ui->tabWidget->currentIndex(); + fileDirs.removeAt(index); + fileNames.removeAt(index); + isExistDoc.removeAt(index); + isChangedDoc.removeAt(index); + strList.setStringList(fileNames); + ui->tabWidget->removeTab(ui->tabWidget->currentIndex()); +} + + +void MainWindow::on_newAct_triggered() +{ + QString countTabsStr ; + countTabsStr.setNum(++newFileName); + QString nameFile = "Новый документ"+ countTabsStr +".txt"; + fileNames.push_back(nameFile); + strList.setStringList(fileNames); + fileDirs.push_back(QDir("")); + QPlainTextEdit* textEd = new QPlainTextEdit(this); + ui->tabWidget->addTab(textEd,nameFile); + if(ui->tabWidget->currentIndex() == -1) + { + ui->tabWidget->setCurrentIndex(0); + } + else { + ui->tabWidget->setCurrentIndex(ui->tabWidget->count() - 1 ); } + connect(textEd,SIGNAL(textChanged()),this , SLOT(tabModification())); + + isExistDoc.push_back(false); + isChangedDoc.push_back(false); } + void MainWindow::on_closeAllAct_triggered() { - int count = ui->tabWidget->count(); - for(int index = 0 ; index < count ; index++) + int index = 0; + for(int i = 0 ; i < count ; i++) { - ui->tabWidget->setCurrentIndex(0); - on_closeAct_triggered(); + ui->tabWidget->setCurrentIndex(index); + if(!on_closeAct_triggered()) + { + ++index; + } } } @@ -193,8 +215,7 @@ void MainWindow::on_openAct_triggered() { //!!! А если пользователь python в файл добавит? Там свои расширения... - - + //! QString openFileName = QFileDialog::getOpenFileName(this,"Выбрать файл для открытия",QDir::rootPath()) ; loadFileData(openFileName); @@ -215,13 +236,22 @@ void MainWindow::on_saveAct_triggered() } int index = ui->tabWidget->currentIndex(); + if(!isExistDoc.at(index)) + { + on_saveAsAct_triggered(); + return; + } + QString filePath = fileDirs.at(index).absolutePath() + "//" + fileNames.at(index); QFile file(filePath); QTextStream text(&file); - if(file.open(QIODevice::WriteOnly )) + if(file.open(QIODevice::WriteOnly)) { text<toPlainText(); + ui->tabWidget->setTabText(index,ui->tabWidget->tabText(index).remove("*")); + connect(textEd,SIGNAL(textChanged()),this , SLOT(tabModification())); + isChangedDoc[index] = false; } else { @@ -251,7 +281,17 @@ void MainWindow::on_saveAsAct_triggered() QTextStream text(&file); if(file.open(QIODevice::WriteOnly)) { - text<toPlainText(); + text<toPlainText(); + int index = ui->tabWidget->currentIndex(); + QStringList list = saveFileName.split("/"); + fileNames[index] = list.back(); + saveFileName.chop(list.back().size()+1); + fileDirs[index] = QDir(saveFileName); + isExistDoc[index] = true; + ui->tabWidget->setTabText(index,list.back()); + + connect(textEd,SIGNAL(textChanged()),this , SLOT(tabModification())); + isChangedDoc[index] = false; } else { @@ -261,7 +301,6 @@ void MainWindow::on_saveAsAct_triggered() } - file.close(); } @@ -408,6 +447,7 @@ void MainWindow::on_highlightAct_triggered() if(! ui->tabWidget->tabText(index).contains("*")) { ui->tabWidget->setTabText(index, ui->tabWidget->tabText(index) + "*"); + isChangedDoc[index] = true ; } else { @@ -422,7 +462,6 @@ void MainWindow::on_highlightAct_triggered() } disconnect(textEd,SIGNAL(textChanged()),this , SLOT(tabModification())); - } @@ -504,6 +543,9 @@ void MainWindow::on_treeView_doubleClicked(const QModelIndex &index) file.close(); isExistDoc.push_back(true); + + isChangedDoc.push_back(false); + } diff --git a/mainwindow.h b/mainwindow.h index 76ab9aa33afbc9cd3e9b97cc403654858bc7c02e..ecdd8ec33562dcf8e9f67d7621f6a223ffeeb6f5 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -75,8 +75,12 @@ protected: QVector loadXmlFile(const QString &); + void removeTab(); + QVector isExistDoc; + QVector isChangedDoc; + public: MainWindow(QWidget *parent = nullptr); @@ -89,7 +93,7 @@ private: private slots: void on_newAct_triggered(); - void on_closeAct_triggered(); + bool on_closeAct_triggered(); void on_closeAllAct_triggered(); void on_openAct_triggered(); bool on_exitAct_triggered();