diff --git a/IDE-todo.xlsx b/IDE-todo.xlsx new file mode 100644 index 00000000..6c95383a Binary files /dev/null and b/IDE-todo.xlsx differ diff --git a/RedPandaIDE/editor.cpp b/RedPandaIDE/editor.cpp index 54ced689..f3bd8d39 100644 --- a/RedPandaIDE/editor.cpp +++ b/RedPandaIDE/editor.cpp @@ -95,7 +95,7 @@ void Editor::saveFile(const QString &filename) { file.close(); } -bool Editor::save() { +bool Editor::save(bool force, bool reparse) { return true; } diff --git a/RedPandaIDE/editor.h b/RedPandaIDE/editor.h index e04354e7..4e79575c 100644 --- a/RedPandaIDE/editor.h +++ b/RedPandaIDE/editor.h @@ -26,9 +26,10 @@ public: void loadFile(); void saveFile(const QString& filename); - bool save(); + bool save(bool force=false, bool reparse=true); QsciScintilla* textEdit(); + QTabWidget* pageControl(); signals: private: diff --git a/RedPandaIDE/editorlist.cpp b/RedPandaIDE/editorlist.cpp index 4b2ab09c..09e5b858 100644 --- a/RedPandaIDE/editorlist.cpp +++ b/RedPandaIDE/editorlist.cpp @@ -1,7 +1,19 @@ #include "editorlist.h" #include "editor.h" +#include #include +#include +#include +EditorList::UpdateLocker::UpdateLocker(EditorList* editorList): mEditorList(editorList){ + mEditorList->beginUpdate(); +} + +EditorList::UpdateLocker::~UpdateLocker() { + mEditorList->endUpdate(); +} + +} EditorList::EditorList(QTabWidget* leftPageWidget, QTabWidget* rightPageWidget, QSplitter* splitter, @@ -27,30 +39,77 @@ Editor* EditorList::newEditor(const QString& filename, const QByteArray& encodin //UpdateLayout; } -QTabWidget* EditorList::getNewEditorPageControl() { +QTabWidget* EditorList::getNewEditorPageControl() const { //todo: return widget depends on layout return mLeftPageWidget; } +QTabWidget* EditorList::getFocusedPageControl() const { + //todo: + return mLeftPageWidget; +} + Editor* EditorList::getEditor(int index, QTabWidget* tabsWidget) const { QTabWidget* selectedWidget; if (tabsWidget == NULL) { - selectedWidget = mLeftPageWidget; // todo: get focused widget + selectedWidget = getFocusedPageControl(); // todo: get focused widget } else { selectedWidget = tabsWidget; } - QWidget* textEdit; if (index == -1) { - textEdit = selectedWidget->currentWidget(); - } else { - textEdit =selectedWidget->widget(index); + index = selectedWidget->currentIndex(); } + if (index<0 || index >= selectedWidget->count()) { + return NULL; + } + QWidget* textEdit = selectedWidget->widget(index); QVariant pop = textEdit->property("editor"); Editor *editor = (Editor*)pop.value(); return editor; } bool EditorList::closeEditor(Editor* editor, bool transferFocus, bool force) { + UpdateLocker locker(this); // use RAII to correctly pause/resume update of the panel widget + if (editor == NULL) + return false; + if (force) { + editor->save(true,false); + } else if ( (editor->textEdit()->isModified()) && (!editor->textEdit()->text().isEmpty())) { + // ask user if he wants to save + QMessageBox::StandardButton reply; + reply = QMessageBox::question(pMainWindow,QObject::tr("Save"),QObject::tr("Save changes to %s?"), + QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel); + if (reply == QMessageBox::Cancel) { + return false; + } else if (reply == QMessageBox::Yes) { + if (!editor->save(false,false)) { + return false; + } + } + } + + if (transferFocus && editor-) + delete editor; return true; } + +void EditorList::beginUpdate() { + if (mUpdateCount==0) { + mPanel->setUpdatesEnabled(false); + } + mUpdateCount++; +} + +void EditorList::endUpdate() { + mUpdateCount--; + if (mUpdateCount==0) { + mPanel->setUpdatesEnabled(true); + mPanel->update(); + } +} + +bool EditorList::closeAll(bool force) { + UpdateLocker locker(this); + +} diff --git a/RedPandaIDE/editorlist.h b/RedPandaIDE/editorlist.h index 69c2c072..b38beb8c 100644 --- a/RedPandaIDE/editorlist.h +++ b/RedPandaIDE/editorlist.h @@ -17,6 +17,14 @@ public: lstBoth }; + class UpdateLocker { + public: + UpdateLocker(EditorList* editorList); + ~UpdateLocker(); + private: + EditorList* mEditorList; + }; + explicit EditorList(QTabWidget* leftPageWidget, QTabWidget* rightPageWidget, QSplitter* splitter, @@ -30,8 +38,14 @@ public: bool closeEditor(Editor* editor, bool transferFocus=true, bool force=false); + bool closeAll(bool force = false); + + void beginUpdate(); + void endUpdate(); + private: - QTabWidget* getNewEditorPageControl(); + QTabWidget* getNewEditorPageControl() const; + QTabWidget* getFocusedPageControl() const; private: diff --git a/RedPandaIDE/mainwindow.cpp b/RedPandaIDE/mainwindow.cpp index 442ea86d..eb9dfaaf 100644 --- a/RedPandaIDE/mainwindow.cpp +++ b/RedPandaIDE/mainwindow.cpp @@ -47,7 +47,6 @@ void MainWindow::setupActions() { void MainWindow::on_actionNew_triggered() { Editor * editor=mEditorList->newEditor("",ENCODING_AUTO_DETECT,false,true); - editor->textEdit()->setFocus(); updateStatusBarForEncoding(); }