559 lines
16 KiB
C++
559 lines
16 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2006-2009 fullmetalcoder <fullmetalcoder@hotmail.fr>
|
|
**
|
|
** This file is part of the Edyuk project <http://edyuk.org>
|
|
**
|
|
** This file may be used under the terms of the GNU General Public License
|
|
** version 3 as published by the Free Software Foundation and appearing in the
|
|
** file GPL.txt included in the packaging of this file.
|
|
**
|
|
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "qeditconfig.h"
|
|
|
|
/*!
|
|
\file qeditconfig.cpp
|
|
\brief Implementation of the QEditConfig class.
|
|
|
|
\see QEditConfig
|
|
*/
|
|
|
|
#include "qdocument.h"
|
|
#include "qdocument_p.h"
|
|
#include "qeditor.h"
|
|
|
|
#include <QDebug>
|
|
|
|
/*!
|
|
\ingroup dialogs
|
|
@{
|
|
|
|
\class QEditConfig
|
|
\brief A minimalistic, easy to embed, settings widget.
|
|
|
|
*/
|
|
|
|
QEditConfig::QEditConfig(QWidget *w) : QWidget(w), m_direct(false) {
|
|
setupUi(this);
|
|
|
|
cbEncoding->clear();
|
|
cbEncoding->addItems(QCE::getEncodings());
|
|
|
|
restore();
|
|
}
|
|
|
|
/*!
|
|
\brief run-time translation entry point
|
|
*/
|
|
void QEditConfig::retranslate() { retranslateUi(this); }
|
|
|
|
/*!
|
|
\brief
|
|
*/
|
|
bool QEditConfig::hasUnsavedChanges() const {
|
|
if (m_direct)
|
|
return false;
|
|
|
|
QFont font = cbFont->currentFont();
|
|
// font.setPointSize(spnFontSize->value());
|
|
|
|
const QFont &docFont = QDocument::font();
|
|
|
|
if (font.family() != docFont.family() ||
|
|
spnFontSize->value() != docFont.pointSize()) {
|
|
// qDebug("font!");
|
|
return true;
|
|
}
|
|
|
|
if (spnTabWidth->value() != QDocument::tabStop()) {
|
|
// qDebug("tab stop!");
|
|
return true;
|
|
}
|
|
|
|
QDocument::LineEnding le = QDocument::defaultLineEnding();
|
|
|
|
if (chkDetectLE->isChecked()) {
|
|
if (le != QDocument::Conservative) {
|
|
// qDebug("conservative line endings! : %i", le);
|
|
return true;
|
|
}
|
|
} else {
|
|
if (le != QDocument::LineEnding(cbLineEndings->currentIndex() + 1)) {
|
|
// qDebug("line endings!");
|
|
return true;
|
|
}
|
|
}
|
|
|
|
QDocument::WhiteSpaceMode ws = QDocument::ShowNone;
|
|
|
|
if (chkShowLeadingWhitespace->isChecked())
|
|
ws |= QDocument::ShowLeading;
|
|
|
|
if (chkShowTrailingWhitespace->isChecked())
|
|
ws |= QDocument::ShowTrailing;
|
|
|
|
if (chkShowTabsInText->isChecked())
|
|
ws |= QDocument::ShowTabs;
|
|
|
|
if (ws != QDocument::showSpaces()) {
|
|
// qDebug("spaces!");
|
|
return true;
|
|
}
|
|
|
|
auto c = QEditor::defaultCodecName();
|
|
|
|
if (cbEncoding->currentText() == "System") {
|
|
if (c != "System") {
|
|
// qDebug("system codec!");
|
|
return true;
|
|
}
|
|
} else {
|
|
if (c != cbEncoding->currentText().toLatin1()) {
|
|
// qDebug("codec!");
|
|
return true;
|
|
}
|
|
}
|
|
|
|
int flags = QEditor::defaultFlags();
|
|
|
|
if (chkReplaceTabs->isChecked())
|
|
flags |= QEditor::ReplaceTabs;
|
|
else
|
|
flags &= ~QEditor::ReplaceTabs;
|
|
|
|
if (chkAutoRemoveTrailingWhitespace->isChecked())
|
|
flags |= QEditor::RemoveTrailing;
|
|
else
|
|
flags &= ~QEditor::RemoveTrailing;
|
|
|
|
if (chkPreserveTrailingIndent->isChecked())
|
|
flags |= QEditor::PreserveTrailingIndent;
|
|
else
|
|
flags &= ~QEditor::PreserveTrailingIndent;
|
|
|
|
if (flags != QEditor::defaultFlags()) {
|
|
// qDebug("flags!");
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/*!
|
|
\return whether user changes are immediately applied
|
|
*/
|
|
bool QEditConfig::applyImmediately() const { return m_direct; }
|
|
|
|
/*!
|
|
\brief Set whether user changes are immediately applied
|
|
*/
|
|
void QEditConfig::setApplyImmediately(bool y) { m_direct = y; }
|
|
|
|
/*!
|
|
\brief Apply changes
|
|
*/
|
|
void QEditConfig::apply() {
|
|
QFont font = cbFont->currentFont();
|
|
font.setPointSize(spnFontSize->value());
|
|
|
|
QDocument::setFont(font);
|
|
QDocument::setTabStop(spnTabWidth->value());
|
|
|
|
if (chkDetectLE->isChecked())
|
|
QDocument::setDefaultLineEnding(QDocument::Conservative);
|
|
else
|
|
QDocument::setDefaultLineEnding(
|
|
QDocument::LineEnding(cbLineEndings->currentIndex() + 1));
|
|
|
|
QDocument::WhiteSpaceMode ws = QDocument::ShowNone;
|
|
|
|
if (chkShowLeadingWhitespace->isChecked())
|
|
ws |= QDocument::ShowLeading;
|
|
|
|
if (chkShowTrailingWhitespace->isChecked())
|
|
ws |= QDocument::ShowTrailing;
|
|
|
|
if (chkShowTabsInText->isChecked())
|
|
ws |= QDocument::ShowTabs;
|
|
|
|
QDocument::setShowSpaces(ws);
|
|
|
|
QEditor::setDefaultCodec(cbEncoding->currentText().toUtf8(),
|
|
QEditor::UpdateAll);
|
|
|
|
int flags = QEditor::defaultFlags();
|
|
|
|
if (chkReplaceTabs->isChecked())
|
|
flags |= QEditor::ReplaceTabs;
|
|
else
|
|
flags &= ~QEditor::ReplaceTabs;
|
|
|
|
if (chkAutoRemoveTrailingWhitespace->isChecked())
|
|
flags |= QEditor::RemoveTrailing;
|
|
else
|
|
flags &= ~QEditor::RemoveTrailing;
|
|
|
|
if (chkPreserveTrailingIndent->isChecked())
|
|
flags |= QEditor::PreserveTrailingIndent;
|
|
else
|
|
flags &= ~QEditor::PreserveTrailingIndent;
|
|
|
|
QEditor::setDefaultFlags(flags);
|
|
}
|
|
|
|
/*!
|
|
\brief Reset the subcontrols to reflect the current settings
|
|
|
|
The name can be a bit misleading at first, it has been chosen
|
|
because it directly maps to the effect a "cancel" button would
|
|
have on the widget
|
|
*/
|
|
void QEditConfig::cancel() {
|
|
// reload the current config
|
|
|
|
bool oldDir = m_direct;
|
|
|
|
m_direct = false;
|
|
|
|
cbFont->setFont(QDocument::font());
|
|
spnFontSize->setValue(QDocument::font().pointSize());
|
|
|
|
spnTabWidth->setValue(QDocument::tabStop());
|
|
|
|
QDocument::WhiteSpaceMode ws = QDocument::showSpaces();
|
|
chkShowTabsInText->setChecked(ws & QDocument::ShowTabs);
|
|
chkShowLeadingWhitespace->setChecked(ws & QDocument::ShowLeading);
|
|
chkShowTrailingWhitespace->setChecked(ws & QDocument::ShowTrailing);
|
|
|
|
QDocument::LineEnding le = QDocument::defaultLineEnding();
|
|
chkDetectLE->setChecked(le == QDocument::Conservative);
|
|
cbLineEndings->setCurrentIndex(le ? le - 1 : 0);
|
|
|
|
int flags = QEditor::defaultFlags();
|
|
chkReplaceTabs->setChecked(flags & QEditor::ReplaceTabs);
|
|
chkAutoRemoveTrailingWhitespace->setChecked(flags &
|
|
QEditor::RemoveTrailing);
|
|
chkPreserveTrailingIndent->setChecked(flags &
|
|
QEditor::PreserveTrailingIndent);
|
|
|
|
auto c = QEditor::defaultCodecName();
|
|
cbEncoding->setCurrentIndex(qMax(cbEncoding->findText(c), 0));
|
|
|
|
m_direct = oldDir;
|
|
}
|
|
|
|
/*!
|
|
\brief Restore default values for all subcontrols
|
|
|
|
\note The widgets are changed but these changes are NOT applied.
|
|
*/
|
|
void QEditConfig::restore() {
|
|
// restore default configuration
|
|
|
|
bool oldDir = m_direct;
|
|
|
|
m_direct = false;
|
|
|
|
QFont font("Monospace", 10);
|
|
font.setStyleHint(QFont::Courier);
|
|
|
|
cbFont->setFont(font);
|
|
spnFontSize->setValue(10);
|
|
|
|
spnTabWidth->setValue(4);
|
|
|
|
chkShowTabsInText->setChecked(true);
|
|
chkShowLeadingWhitespace->setChecked(true);
|
|
chkShowTrailingWhitespace->setChecked(true);
|
|
|
|
chkDetectLE->setChecked(true);
|
|
cbLineEndings->setCurrentIndex(0);
|
|
|
|
chkReplaceTabs->setChecked(false);
|
|
chkAutoRemoveTrailingWhitespace->setChecked(false);
|
|
chkPreserveTrailingIndent->setChecked(true);
|
|
|
|
cbEncoding->setCurrentIndex(0);
|
|
|
|
m_direct = oldDir;
|
|
}
|
|
|
|
/*!
|
|
\brief Fills a settings map from the state of the subcontrols
|
|
*/
|
|
QMap<QString, QVariant> QEditConfig::dumpKeys() const {
|
|
QMap<QString, QVariant> m;
|
|
|
|
QFont font = cbFont->currentFont();
|
|
font.setPointSize(spnFontSize->value());
|
|
|
|
m.insert("font", font);
|
|
m.insert("tab_width", spnTabWidth->value());
|
|
|
|
m.insert("show_leading_whitespace", chkShowLeadingWhitespace->isChecked());
|
|
m.insert("show_trailing_whitespace",
|
|
chkShowTrailingWhitespace->isChecked());
|
|
m.insert("show_tabs_in_text", chkShowTabsInText->isChecked());
|
|
|
|
m.insert("replace_tabs", chkReplaceTabs->isChecked());
|
|
m.insert("remove_trailing", chkAutoRemoveTrailingWhitespace->isChecked());
|
|
m.insert("preserve_trailing_indent",
|
|
chkPreserveTrailingIndent->isChecked());
|
|
|
|
m.insert("encoding", cbEncoding->currentText());
|
|
|
|
if (chkDetectLE->isChecked())
|
|
m.insert("line_endings", (int)QDocument::Conservative);
|
|
else
|
|
m.insert("line_endings", cbLineEndings->currentIndex() + 1);
|
|
|
|
return m;
|
|
}
|
|
|
|
/*!
|
|
\brief Fills the widget subcontrols from a settings map
|
|
|
|
\param keys a key/value map that can be obtained from QSettings
|
|
*/
|
|
void QEditConfig::loadKeys(const QMap<QString, QVariant> &keys) {
|
|
// qDebug("loading %i keys", keys.count());
|
|
|
|
// load
|
|
QMap<QString, QVariant>::const_iterator it = keys.constBegin();
|
|
|
|
while (it != keys.constEnd()) {
|
|
if (it.key() == "font") {
|
|
QFont f = qvariant_cast<QFont>(*it);
|
|
|
|
cbFont->setCurrentFont(f);
|
|
spnFontSize->setValue(f.pointSize());
|
|
|
|
if (m_direct)
|
|
QDocument::setFont(f);
|
|
|
|
lblSampleText->setFont(f);
|
|
|
|
} else if (it.key() == "tab_width") {
|
|
spnTabWidth->setValue(it->toInt());
|
|
|
|
if (m_direct)
|
|
on_spnTabWidth_valueChanged(it->toInt());
|
|
} else if (it.key() == "replace_tabs") {
|
|
chkReplaceTabs->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkReplaceTabs_toggled(it->toBool());
|
|
} else if (it.key() == "remove_trailing") {
|
|
chkAutoRemoveTrailingWhitespace->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkAutoRemoveTrailingWhitespace_toggled(it->toBool());
|
|
} else if (it.key() == "preserve_trailing_indent") {
|
|
chkPreserveTrailingIndent->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkPreserveTrailingIndent_toggled(it->toBool());
|
|
} else if (it.key() == "show_tabs_in_text") {
|
|
chkShowTabsInText->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkShowTabsInText_toggled(it->toBool());
|
|
} else if (it.key() == "show_leading_whitespace") {
|
|
chkShowLeadingWhitespace->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkShowLeadingWhitespace_toggled(it->toBool());
|
|
} else if (it.key() == "show_trailing_whitespace") {
|
|
chkShowTrailingWhitespace->setChecked(it->toBool());
|
|
if (m_direct)
|
|
on_chkShowTrailingWhitespace_toggled(it->toBool());
|
|
} else if (it.key() == "encoding") {
|
|
cbEncoding->setCurrentIndex(cbEncoding->findText(it->toString()));
|
|
if (m_direct)
|
|
on_cbEncoding_currentIndexChanged(it->toString());
|
|
} else if (it.key() == "line_endings") {
|
|
int le = it->toInt();
|
|
|
|
if (le) {
|
|
chkDetectLE->setChecked(false);
|
|
cbLineEndings->setCurrentIndex(le - 1);
|
|
} else {
|
|
cbLineEndings->setCurrentIndex(0);
|
|
chkDetectLE->setChecked(true);
|
|
}
|
|
} else {
|
|
/*
|
|
qWarning("QEditConfig::loadKeys() fed with unsupported settings key
|
|
: \"%s\" ", qPrintable(it.key())
|
|
);
|
|
*/
|
|
}
|
|
|
|
++it;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply font size settings
|
|
*/
|
|
void QEditConfig::on_spnFontSize_valueChanged(int size) {
|
|
QFont font = cbFont->currentFont();
|
|
font.setPointSize(size);
|
|
|
|
lblSampleText->setFont(font);
|
|
|
|
if (m_direct) {
|
|
QDocument::setFont(font);
|
|
emit keyChanged("font", font);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply font family settings
|
|
*/
|
|
void QEditConfig::on_cbFont_currentFontChanged(QFont font) {
|
|
font.setPointSize(spnFontSize->value());
|
|
lblSampleText->setFont(font);
|
|
|
|
if (m_direct) {
|
|
QDocument::setFont(font);
|
|
emit keyChanged("font", font);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply tab width settings
|
|
*/
|
|
void QEditConfig::on_spnTabWidth_valueChanged(int n) {
|
|
if (m_direct) {
|
|
QDocument::setTabStop(n);
|
|
emit keyChanged("tab_width", n);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply tabs replacement settings
|
|
*/
|
|
void QEditConfig::on_chkReplaceTabs_toggled(bool y) {
|
|
if (m_direct) {
|
|
// FIXME
|
|
foreach (QEditor *e, QEditor::m_editors) {
|
|
e->setFlag(QEditor::ReplaceTabs, y);
|
|
}
|
|
emit keyChanged("replace_tabs", y);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply tabs display settings
|
|
*/
|
|
void QEditConfig::on_chkShowTabsInText_toggled(bool y) {
|
|
if (m_direct) {
|
|
if (y)
|
|
QDocument::setShowSpaces(QDocument::showSpaces() |
|
|
QDocument::ShowTabs);
|
|
else
|
|
QDocument::setShowSpaces(QDocument::showSpaces() &
|
|
~QDocument::ShowTabs);
|
|
|
|
emit keyChanged("show_tabs_in_text", y);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply trailing whitespace display settings
|
|
*/
|
|
void QEditConfig::on_chkShowLeadingWhitespace_toggled(bool y) {
|
|
if (m_direct) {
|
|
if (y)
|
|
QDocument::setShowSpaces(QDocument::showSpaces() |
|
|
QDocument::ShowLeading);
|
|
else
|
|
QDocument::setShowSpaces(QDocument::showSpaces() &
|
|
~QDocument::ShowLeading);
|
|
|
|
emit keyChanged("show_leading_whitespace", y);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply leading whitespace display settings
|
|
*/
|
|
void QEditConfig::on_chkShowTrailingWhitespace_toggled(bool y) {
|
|
if (m_direct) {
|
|
if (y)
|
|
QDocument::setShowSpaces(QDocument::showSpaces() |
|
|
QDocument::ShowTrailing);
|
|
else
|
|
QDocument::setShowSpaces(QDocument::showSpaces() &
|
|
~QDocument::ShowTrailing);
|
|
|
|
emit keyChanged("show_trailing_whitespace", y);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply encodings settings
|
|
*/
|
|
void QEditConfig::on_cbEncoding_currentIndexChanged(const QString &name) {
|
|
if (m_direct) {
|
|
QEditor::setDefaultCodec(name.toLatin1(), QEditor::UpdateAll);
|
|
emit keyChanged("encoding", name);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply line endings settings
|
|
*/
|
|
void QEditConfig::on_cbLineEndings_currentIndexChanged(int idx) {
|
|
QDocument::LineEnding le = QDocument::LineEnding(idx + 1);
|
|
|
|
if (m_direct) {
|
|
QDocument::setDefaultLineEnding(le);
|
|
emit keyChanged("line_endings", (int)le);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply line endings auto detectionl settings
|
|
*/
|
|
void QEditConfig::on_chkDetectLE_toggled(bool y) {
|
|
QDocument::LineEnding le = QDocument::Conservative;
|
|
|
|
if (!y) {
|
|
le = QDocument::LineEnding(cbLineEndings->currentIndex() + 1);
|
|
}
|
|
|
|
if (m_direct) {
|
|
QDocument::setDefaultLineEnding(le);
|
|
emit keyChanged("line_endings", (int)le);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to apply trailing space removal settings
|
|
*/
|
|
void QEditConfig::on_chkAutoRemoveTrailingWhitespace_toggled(bool y) {
|
|
if (m_direct) {
|
|
// FIXME
|
|
foreach (QEditor *e, QEditor::m_editors) {
|
|
e->setFlag(QEditor::RemoveTrailing, y);
|
|
}
|
|
emit keyChanged("remove_trailing", y);
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\brief Slot used to indent preservation settings
|
|
*/
|
|
void QEditConfig::on_chkPreserveTrailingIndent_toggled(bool y) {
|
|
if (m_direct) {
|
|
// FIXME
|
|
foreach (QEditor *e, QEditor::m_editors) {
|
|
e->setFlag(QEditor::PreserveTrailingIndent, y);
|
|
}
|
|
emit keyChanged("preserve_trailing_indent", y);
|
|
}
|
|
}
|
|
|
|
/*! @} */
|