mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 22:09:52 +08:00
282 lines
7.0 KiB
C++
282 lines
7.0 KiB
C++
#include <QtWidgets>
|
|
#include <QFileInfo>
|
|
#include "vhtmltab.h"
|
|
#include "vedit.h"
|
|
#include "utils/vutils.h"
|
|
#include "vconfigmanager.h"
|
|
#include "vnotebook.h"
|
|
#include "dialog/vfindreplacedialog.h"
|
|
#include "veditarea.h"
|
|
#include "vconstants.h"
|
|
|
|
extern VConfigManager *g_config;
|
|
|
|
VHtmlTab::VHtmlTab(VFile *p_file, VEditArea *p_editArea,
|
|
OpenFileMode p_mode, QWidget *p_parent)
|
|
: VEditTab(p_file, p_editArea, p_parent)
|
|
{
|
|
V_ASSERT(m_file->getDocType() == DocType::Html);
|
|
|
|
m_file->open();
|
|
|
|
setupUI();
|
|
|
|
if (p_mode == OpenFileMode::Edit) {
|
|
showFileEditMode();
|
|
} else {
|
|
showFileReadMode();
|
|
}
|
|
}
|
|
|
|
void VHtmlTab::setupUI()
|
|
{
|
|
m_editor = new VEdit(m_file, this);
|
|
connect(m_editor, &VEdit::textChanged,
|
|
this, &VHtmlTab::updateStatus);
|
|
connect(m_editor, &VEdit::saveAndRead,
|
|
this, &VHtmlTab::saveAndRead);
|
|
connect(m_editor, &VEdit::discardAndRead,
|
|
this, &VHtmlTab::discardAndRead);
|
|
connect(m_editor, &VEdit::editNote,
|
|
this, &VHtmlTab::editFile);
|
|
connect(m_editor, &VEdit::statusMessage,
|
|
this, &VEditTab::statusMessage);
|
|
connect(m_editor, &VEdit::vimStatusUpdated,
|
|
this, &VEditTab::vimStatusUpdated);
|
|
|
|
m_editor->reloadFile();
|
|
|
|
QVBoxLayout *mainLayout = new QVBoxLayout();
|
|
mainLayout->addWidget(m_editor);
|
|
mainLayout->setContentsMargins(0, 0, 0, 0);
|
|
setLayout(mainLayout);
|
|
}
|
|
|
|
void VHtmlTab::showFileReadMode()
|
|
{
|
|
m_isEditMode = false;
|
|
|
|
m_editor->setReadOnly(true);
|
|
|
|
updateStatus();
|
|
}
|
|
|
|
void VHtmlTab::showFileEditMode()
|
|
{
|
|
m_isEditMode = true;
|
|
|
|
m_editor->beginEdit();
|
|
m_editor->setFocus();
|
|
|
|
updateStatus();
|
|
}
|
|
|
|
bool VHtmlTab::closeFile(bool p_forced)
|
|
{
|
|
if (p_forced && m_isEditMode) {
|
|
// Discard buffer content
|
|
m_editor->reloadFile();
|
|
m_editor->endEdit();
|
|
|
|
showFileReadMode();
|
|
} else {
|
|
readFile();
|
|
}
|
|
|
|
return !m_isEditMode;
|
|
}
|
|
|
|
void VHtmlTab::editFile()
|
|
{
|
|
if (m_isEditMode) {
|
|
return;
|
|
}
|
|
|
|
showFileEditMode();
|
|
}
|
|
|
|
void VHtmlTab::readFile(bool p_discard)
|
|
{
|
|
if (!m_isEditMode) {
|
|
return;
|
|
}
|
|
|
|
if (m_editor && isModified()) {
|
|
// Prompt to save the changes.
|
|
bool modifiable = m_file->isModifiable();
|
|
int ret = VUtils::showMessage(QMessageBox::Information,
|
|
tr("Information"),
|
|
tr("Note <span style=\"%1\">%2</span> has been modified.")
|
|
.arg(g_config->c_dataTextStyle).arg(m_file->getName()),
|
|
tr("Do you want to save your changes?"),
|
|
modifiable ? (QMessageBox::Save
|
|
| QMessageBox::Discard
|
|
| QMessageBox::Cancel)
|
|
: (QMessageBox::Discard
|
|
| QMessageBox::Cancel),
|
|
modifiable ? (p_discard ? QMessageBox::Discard : QMessageBox::Save)
|
|
: QMessageBox::Cancel,
|
|
this);
|
|
switch (ret) {
|
|
case QMessageBox::Save:
|
|
if (!saveFile()) {
|
|
return;
|
|
}
|
|
|
|
V_FALLTHROUGH;
|
|
|
|
case QMessageBox::Discard:
|
|
m_editor->reloadFile();
|
|
break;
|
|
|
|
case QMessageBox::Cancel:
|
|
// Nothing to do if user cancel this action
|
|
return;
|
|
|
|
default:
|
|
Q_ASSERT(false);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (m_editor) {
|
|
m_editor->endEdit();
|
|
}
|
|
|
|
showFileReadMode();
|
|
}
|
|
|
|
bool VHtmlTab::saveFile()
|
|
{
|
|
if (!m_isEditMode || !isModified()) {
|
|
return true;
|
|
}
|
|
|
|
QString filePath = m_file->fetchPath();
|
|
|
|
if (!m_file->isModifiable()) {
|
|
VUtils::showMessage(QMessageBox::Warning,
|
|
tr("Warning"),
|
|
tr("Could not modify a read-only note <span style=\"%1\">%2</span>.")
|
|
.arg(g_config->c_dataTextStyle).arg(filePath),
|
|
tr("Please save your changes to other notes manually."),
|
|
QMessageBox::Ok,
|
|
QMessageBox::Ok,
|
|
this);
|
|
return false;
|
|
}
|
|
|
|
// Make sure the file already exists. Temporary deal with cases when user delete or move
|
|
// a file.
|
|
if (!QFileInfo::exists(filePath)) {
|
|
qWarning() << filePath << "being written has been removed";
|
|
VUtils::showMessage(QMessageBox::Warning, tr("Warning"), tr("Fail to save note."),
|
|
tr("File <span style=\"%1\">%2</span> being written has been removed.")
|
|
.arg(g_config->c_dataTextStyle).arg(filePath),
|
|
QMessageBox::Ok, QMessageBox::Ok, this);
|
|
return false;
|
|
}
|
|
|
|
m_editor->saveFile();
|
|
bool ret = m_file->save();
|
|
if (!ret) {
|
|
VUtils::showMessage(QMessageBox::Warning, tr("Warning"), tr("Fail to save note."),
|
|
tr("Fail to write to disk when saving a note. Please try it again."),
|
|
QMessageBox::Ok, QMessageBox::Ok, this);
|
|
m_editor->setModified(true);
|
|
} else {
|
|
m_fileDiverged = false;
|
|
m_checkFileChange = true;
|
|
}
|
|
|
|
updateStatus();
|
|
|
|
return ret;
|
|
}
|
|
|
|
bool VHtmlTab::isModified() const
|
|
{
|
|
return m_editor->isModified() || m_fileDiverged;
|
|
}
|
|
|
|
void VHtmlTab::saveAndRead()
|
|
{
|
|
saveFile();
|
|
readFile();
|
|
}
|
|
|
|
void VHtmlTab::discardAndRead()
|
|
{
|
|
readFile();
|
|
}
|
|
|
|
void VHtmlTab::insertImage()
|
|
{
|
|
}
|
|
|
|
void VHtmlTab::findText(const QString &p_text, uint p_options, bool p_peek,
|
|
bool p_forward)
|
|
{
|
|
if (p_peek) {
|
|
m_editor->peekText(p_text, p_options);
|
|
} else {
|
|
m_editor->findText(p_text, p_options, p_forward);
|
|
}
|
|
}
|
|
|
|
void VHtmlTab::replaceText(const QString &p_text, uint p_options,
|
|
const QString &p_replaceText, bool p_findNext)
|
|
{
|
|
if (m_isEditMode) {
|
|
m_editor->replaceText(p_text, p_options, p_replaceText, p_findNext);
|
|
}
|
|
}
|
|
|
|
void VHtmlTab::replaceTextAll(const QString &p_text, uint p_options,
|
|
const QString &p_replaceText)
|
|
{
|
|
if (m_isEditMode) {
|
|
m_editor->replaceTextAll(p_text, p_options, p_replaceText);
|
|
}
|
|
}
|
|
|
|
QString VHtmlTab::getSelectedText() const
|
|
{
|
|
QTextCursor cursor = m_editor->textCursor();
|
|
return cursor.selectedText();
|
|
}
|
|
|
|
void VHtmlTab::clearSearchedWordHighlight()
|
|
{
|
|
m_editor->clearSearchedWordHighlight();
|
|
}
|
|
|
|
void VHtmlTab::zoom(bool /* p_zoomIn */, qreal /* p_step */)
|
|
{
|
|
}
|
|
|
|
void VHtmlTab::focusChild()
|
|
{
|
|
m_editor->setFocus();
|
|
}
|
|
|
|
void VHtmlTab::requestUpdateVimStatus()
|
|
{
|
|
m_editor->requestUpdateVimStatus();
|
|
}
|
|
|
|
bool VHtmlTab::restoreFromTabInfo(const VEditTabInfo &p_info)
|
|
{
|
|
if (p_info.m_editTab != this) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void VHtmlTab::reload()
|
|
{
|
|
m_editor->reloadFile();
|
|
updateStatus();
|
|
}
|