2010-11-07

QtCreator-XmlTree: обработка сохранения в TextEditor

Несомненно, использование готовой инфраструктуры TextEditor дает нам немало плюшек. Но, есть небольшая проблемка. Редактор TextEditor'а у нас является только одной из вкладок, на второй вкладке расположено дерево и вкладки синхронизируются только при переключении между ними. Стандартная функция сохранения в TextEditor'е сохраняет содержимое именно текстового редактора. Следовательно при внесении изменений в дерево и сохранении без переключения в текстовый редактор мы теряем эти изменения. Исправим это досадное недоразумение.

Как было сказано ранее вся работа с файлами в QtCreator ведется через наследник интерфейса IFile, который в TextEditor'е в свою очередь привязан к QTextDocument.Но, мы можем создать своего наследника класса TextEditor::BaseTextDocument (который в плагине TextEditor и является наследником IFile).

Нам надо переопределить всего один метод - save():
bool XmlSourceDocument::save(const QString &fileName)
{
    emit saveRequested();
    bool result = TextEditor::BaseTextDocument::save(fileName);
    emit saveFinished();
    return result;
}
Так как наш класс работы с файлом ничего не знает и знать не должен о редакторе, он просто кидает два сигнала, один перед сохранением, другой сразу после.

И теперь передадим его инстанс в TextEditor:
XmlSourceEditor::XmlSourceEditor(XmlEditorWidget *widget, QWidget *parent) :
    TextEditor::PlainTextEditor(parent), editorWidget(widget)
{
    XmlSourceDocument *doc = new XmlSourceDocument();
    connect(doc, SIGNAL(saveRequested()), 
            this, SLOT(performPreSave()), 
            Qt::DirectConnection);
    connect(doc, SIGNAL(saveFinished()), 
            editorWidget, SLOT(documentSaved()));
    doc->setMimeType(QLatin1String(XmlTreeEditor::Constants::XML_MIME_TYPE));
    setBaseTextDocument(doc);
    connect(file(), SIGNAL(changed()), this, SLOT(configure()));
}
Подключаем два сигнала к нужным слотам (перед сохранением нам нужно обновить содержимое текстового редактора, после сохранения нам нужно сбросить флаг модификации), задаем MIME-тип нашего файла, подставляем его как используемый BaseTextDocument и подключаем последний слот (для корректной внутренней работы TextEditor'а).

Собственно все :). Теперь сохранение файла работает корректно.

Комментариев нет:

Отправить комментарий