2021-04-06 23:10:57 +08:00
|
|
|
#include "editorlist.h"
|
2021-04-07 21:13:15 +08:00
|
|
|
#include "editor.h"
|
2021-04-09 10:08:05 +08:00
|
|
|
#include <QMessageBox>
|
2021-04-07 22:44:08 +08:00
|
|
|
#include <QVariant>
|
2021-04-09 10:08:05 +08:00
|
|
|
#include <mainwindow.h>
|
|
|
|
#include <iconv.h>
|
2021-04-06 23:10:57 +08:00
|
|
|
|
2021-04-09 10:08:05 +08:00
|
|
|
EditorList::UpdateLocker::UpdateLocker(EditorList* editorList): mEditorList(editorList){
|
|
|
|
mEditorList->beginUpdate();
|
|
|
|
}
|
|
|
|
|
|
|
|
EditorList::UpdateLocker::~UpdateLocker() {
|
|
|
|
mEditorList->endUpdate();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2021-04-07 21:13:15 +08:00
|
|
|
EditorList::EditorList(QTabWidget* leftPageWidget,
|
|
|
|
QTabWidget* rightPageWidget,
|
|
|
|
QSplitter* splitter,
|
|
|
|
QWidget* panel):
|
|
|
|
mLeftPageWidget(leftPageWidget),
|
|
|
|
mRightPageWidget(rightPageWidget),
|
|
|
|
mSplitter(splitter),
|
|
|
|
mPanel(panel),
|
|
|
|
mUpdateCount(0)
|
2021-04-06 23:10:57 +08:00
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2021-04-07 21:13:15 +08:00
|
|
|
|
2021-04-08 10:29:21 +08:00
|
|
|
Editor* EditorList::newEditor(const QString& filename, const QByteArray& encoding,
|
2021-04-07 21:13:15 +08:00
|
|
|
bool inProject, bool newFile,
|
|
|
|
QTabWidget* page) {
|
|
|
|
QTabWidget * parentPageControl = NULL;
|
|
|
|
if (page == NULL)
|
2021-04-08 10:29:21 +08:00
|
|
|
parentPageControl = getNewEditorPageControl();
|
2021-04-07 21:13:15 +08:00
|
|
|
else
|
|
|
|
parentPageControl = page;
|
|
|
|
return new Editor(parentPageControl,filename,encoding,inProject,newFile,parentPageControl);
|
|
|
|
//UpdateLayout;
|
|
|
|
}
|
|
|
|
|
2021-04-09 10:08:05 +08:00
|
|
|
QTabWidget* EditorList::getNewEditorPageControl() const {
|
2021-04-07 21:13:15 +08:00
|
|
|
//todo: return widget depends on layout
|
|
|
|
return mLeftPageWidget;
|
|
|
|
}
|
|
|
|
|
2021-04-09 10:08:05 +08:00
|
|
|
QTabWidget* EditorList::getFocusedPageControl() const {
|
|
|
|
//todo:
|
|
|
|
return mLeftPageWidget;
|
|
|
|
}
|
|
|
|
|
2021-04-08 10:29:21 +08:00
|
|
|
Editor* EditorList::getEditor(int index, QTabWidget* tabsWidget) const {
|
2021-04-07 22:44:08 +08:00
|
|
|
QTabWidget* selectedWidget;
|
|
|
|
if (tabsWidget == NULL) {
|
2021-04-09 10:08:05 +08:00
|
|
|
selectedWidget = getFocusedPageControl(); // todo: get focused widget
|
2021-04-07 22:44:08 +08:00
|
|
|
} else {
|
|
|
|
selectedWidget = tabsWidget;
|
|
|
|
}
|
|
|
|
if (index == -1) {
|
2021-04-09 10:08:05 +08:00
|
|
|
index = selectedWidget->currentIndex();
|
2021-04-07 22:44:08 +08:00
|
|
|
}
|
2021-04-09 10:08:05 +08:00
|
|
|
if (index<0 || index >= selectedWidget->count()) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
QWidget* textEdit = selectedWidget->widget(index);
|
2021-04-07 22:44:08 +08:00
|
|
|
QVariant pop = textEdit->property("editor");
|
|
|
|
Editor *editor = (Editor*)pop.value<intptr_t>();
|
|
|
|
return editor;
|
|
|
|
}
|
|
|
|
|
2021-04-08 10:29:21 +08:00
|
|
|
bool EditorList::closeEditor(Editor* editor, bool transferFocus, bool force) {
|
2021-04-09 10:08:05 +08:00
|
|
|
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-)
|
|
|
|
|
2021-04-07 22:44:08 +08:00
|
|
|
delete editor;
|
|
|
|
return true;
|
|
|
|
}
|
2021-04-09 10:08:05 +08:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
}
|