1 Star 0 Fork 1.5K

lineCodeJm / ndd

forked from 爬山虎 / ndd 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
qtlangset.cpp 10.96 KB
一键复制 编辑 原始数据 按行查看 历史
#include "qtlangset.h"
#include "scintillaeditview.h"
#include "jsondeploy.h"
#include <qscilexer.h>
#include <QSettings>
#include <QColorDialog>
#include <QMessageBox>
#include <QSpinBox>
#include <qDebug>
#if 0
//要注意与common.h的保持一致。
enum LangType {
L_TEXT = -1, L_PHP, L_C, L_CPP, L_CS, L_OBJC, L_JAVA, L_RC, \
L_HTML, L_XML, L_MAKEFILE, L_PASCAL, L_BATCH, L_INI, L_ASCII, L_USER, \
L_ASP, L_SQL, L_VB, L_JS, L_CSS, L_PERL, L_PYTHON, L_LUA, \
L_TEX, L_FORTRAN, L_BASH, L_FLASH, L_NSIS, L_TCL, L_LISP, L_SCHEME, \
L_ASM, L_DIFF, L_PROPS, L_PS, L_RUBY, L_SMALLTALK, L_VHDL, L_KIX, L_AU3, \
L_CAML, L_ADA, L_VERILOG, L_MATLAB, L_HASKELL, L_INNO, L_SEARCHRESULT, \
L_CMAKE, L_YAML, L_COBOL, L_GUI4CLI, L_D, L_POWERSHELL, L_R, L_JSP, \
L_COFFEESCRIPT, L_JSON, L_JAVASCRIPT, L_FORTRAN_77, L_BAANC, L_SREC, \
L_IHEX, L_TEHEX, L_SWIFT, \
L_ASN1, L_AVS, L_BLITZBASIC, L_PUREBASIC, L_FREEBASIC, \
L_CSOUND, L_ERLANG, L_ESCRIPT, L_FORTH, L_LATEX, \
L_MMIXAL, L_NIM, L_NNCRONTAB, L_OSCRIPT, L_REBOL, \
L_REGISTRY, L_RUST, L_SPICE, L_TXT2TAGS, L_VISUALPROLOG, L_TYPESCRIPT, \
L_EDIFACT, L_MARKDOWN, L_OCTAVE, L_PO, L_POV, L_IDL, L_GO, L_TXT, \
// Don't use L_JS, use L_JAVASCRIPT instead
// The end of enumated language type, so it should be always at the end
L_EXTERNAL = 100,
};
#endif
QtLangSet::QtLangSet(QString initTag, QWidget *parent)
: QMainWindow(parent), m_selectLexer(nullptr), m_selectStyleId(0), m_isStyleChange(false),m_isStyleChildChange(false), m_initShowLexerTag(initTag), m_first(true)
{
ui.setupUi(this);
initLangList();
startSignSlot();
}
QtLangSet::~QtLangSet()
{
if (nullptr != m_selectLexer)
{
delete m_selectLexer;
m_selectLexer = nullptr;
}
}
//本来是放在构造函数中,发现show后会导致初始信号乱。干脆在外面等show完毕后再开启信号,避免初始乱
void QtLangSet::startSignSlot()
{
connect(ui.langListWidget, &QListWidget::currentItemChanged, this, &QtLangSet::slot_itemSelect);
connect(ui.styleListWidget, &QListWidget::currentItemChanged, this, &QtLangSet::slot_styleItemSelect);
connect(ui.boldCheckBox, &QCheckBox::stateChanged, this, &QtLangSet::slot_fontBoldChange);
connect(ui.italicCheckBox, &QCheckBox::stateChanged, this, &QtLangSet::slot_fontItalicChange);
connect(ui.underlineCheckBox, &QCheckBox::stateChanged, this, &QtLangSet::slot_fontUnderlineChange);
connect(ui.fontSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slot_fontSizeChange(int)));
connect(ui.fontComboBox, &QFontComboBox::currentFontChanged, this, &QtLangSet::slot_fontChange);
}
void QtLangSet::slot_fontBoldChange(int state)
{
//即时设置风格
if (m_selectLexer != nullptr)
{
if (m_curStyleData.font.bold() != ((state == Qt::Unchecked) ? false : true))
{
m_curStyleData.font.setBold((state == Qt::Unchecked) ? false : true);
m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
m_isStyleChange = true;
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
}
}
}
void QtLangSet::slot_fontItalicChange(int state)
{
//即时设置风格
if (m_selectLexer != nullptr)
{
if (m_curStyleData.font.italic() != ((state == Qt::Unchecked) ? false : true))
{
m_curStyleData.font.setItalic((state == Qt::Unchecked) ? false : true);
m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
m_isStyleChange = true;
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
}
}
}
void QtLangSet::slot_fontUnderlineChange(int state)
{
//即时设置风格
if (m_selectLexer != nullptr)
{
if (m_curStyleData.font.underline() != ((state == Qt::Unchecked) ? false : true))
{
m_curStyleData.font.setUnderline((state == Qt::Unchecked) ? false : true);
m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
m_isStyleChange = true;
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
}
}
}
void QtLangSet::slot_fontSizeChange(int v)
{
//即时设置风格
if (m_selectLexer != nullptr)
{
if (m_curStyleData.font.pointSize() != v)
{
m_curStyleData.font.setPointSize(v);
m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
m_isStyleChange = true;
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
}
}
}
void QtLangSet::slot_fontChange(const QFont &font)
{
//即时设置风格
if (m_selectLexer != nullptr)
{
if (m_curStyleData.font != font)
{
QFont oldf = m_curStyleData.font;
m_curStyleData.font = font;
m_curStyleData.font.setBold(oldf.bold());
m_curStyleData.font.setItalic(oldf.italic());
m_curStyleData.font.setUnderline(oldf.underline());
m_selectLexer->setFont(m_curStyleData.font, m_selectStyleId);
m_isStyleChange = true;
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, m_curStyleData.color, m_curStyleData.paper, m_curStyleData.font, true);
}
}
}
void QtLangSet::initLangList()
{
for (int i = 0; i <= L_TXT; ++i)
{
QsciLexer *pLexer = ScintillaEditView::createLexer(i);
if (nullptr != pLexer)
{
QString langName = pLexer->lexerTag();
//qDebug() << langName << pLexer->lexer();
QListWidgetItem *item = new QListWidgetItem(langName);
item->setData(Qt::UserRole,i);
ui.langListWidget->addItem(item);
delete pLexer;
}
}
//怀疑这个是队列链接的,会延迟执行。故总是导致选择的选不中,而是第一个asp。
ui.langListWidget->sortItems(Qt::AscendingOrder);
}
//点击当前的语言item
void QtLangSet::slot_itemSelect(QListWidgetItem *item, QListWidgetItem *previous)
{
//第一次必须以初始化lexid显示。这样做实在是因为初始化list启动后,会自动把第一个设置为当前。
//丑陋的使用替换来实现。让打开时务必呈现当前edit的语法类型
if (m_first && !m_initShowLexerTag.isEmpty())
{
m_first = false;
QList<QListWidgetItem*> destItems = ui.langListWidget->findItems(m_initShowLexerTag,Qt::MatchExactly);
if (!destItems.isEmpty())
{
item = destItems.first();
ui.langListWidget->setCurrentItem(item);
}
}
//保存前一个已经修改的。询问用户是否保存
if (m_isStyleChange && previous != nullptr && m_selectLexer !=nullptr)
{
if (QMessageBox::Yes == QMessageBox::question(this, tr("Save Change"), tr("%1 style configuration has been modified. Do you want to save it?").arg(previous->text())))
{
saveCurLangSettings();
}
}
if (item == nullptr)
{
return;
}
if (!item->isSelected())
{
item->setSelected(true);
}
int lexId = item->data(Qt::UserRole).toInt();
ui.styleListWidget->clear();
if (m_selectLexer != nullptr)
{
delete m_selectLexer;
m_selectLexer = nullptr;
}
QsciLexer *pLexer = ScintillaEditView::createLexer(lexId);
if (nullptr != pLexer)
{
m_selectLexer = pLexer;
for (int i = 0; i <= 255; ++i)
{
QString desc = pLexer->description(i);
if (!desc.isEmpty())
{
QListWidgetItem *itemtemp = new QListWidgetItem(desc);
itemtemp->setData(Qt::UserRole, i);
ui.styleListWidget->addItem(itemtemp);
}
}
}
//自动显示第一条的结果
QListWidgetItem *itemtemp = ui.styleListWidget->item(0);
if (itemtemp != nullptr)
{
itemtemp->setSelected(true);
slot_styleItemSelect(itemtemp, nullptr);
}
m_isStyleChange = false;
}
//获取当前ui上的字体
void QtLangSet::getCurUiFont(QFont& font)
{
font = ui.fontComboBox->currentFont();
font.setBold(ui.boldCheckBox->isChecked());
font.setItalic(ui.italicCheckBox->isChecked());
font.setUnderline(ui.underlineCheckBox->isChecked());
font.setPointSize(ui.fontSpinBox->value());
}
void QtLangSet::closeEvent(QCloseEvent * e)
{
saveCurLangSettings();
}
//点击当前的风格item
void QtLangSet::slot_styleItemSelect(QListWidgetItem *current, QListWidgetItem *previous)
{
if (current != nullptr && m_selectLexer != nullptr)
{
int styleId = current->data(Qt::UserRole).toInt();
m_selectStyleId = styleId;
QsciLexer::StyleData & sd = m_selectLexer->styleData(styleId);
m_curStyleData = sd;
setStyleShow(sd.font, sd.color, sd.paper);
m_isStyleChange = false;
}
}
void QtLangSet::fillForegroundColor(QColor& fcColor)
{
QPixmap f(32, 32);
f.fill(fcColor);
ui.label_fc->setPixmap(f);
}
void QtLangSet::fillBackgroundColor(QColor &bkColor)
{
QPixmap b(32, 32);
b.fill(bkColor);
ui.label_bc->setPixmap(b);
}
void QtLangSet::setStyleShow(QFont& font, QColor& fcColor, QColor &bkColor)
{
ui.fontComboBox->setCurrentFont(font);
ui.fontSpinBox->setValue(font.pointSize());
ui.boldCheckBox->setChecked(font.bold());
ui.italicCheckBox->setChecked(font.italic());
ui.underlineCheckBox->setChecked(font.underline());
fillForegroundColor(fcColor);
fillBackgroundColor(bkColor);
}
//读取特定语言的设置
bool QtLangSet::readLangSettings(QsciLexer *lexer, QString tag)
{
QString cfgPath = QString("notepad/%1").arg(tag);
QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
return lexer->readSettings(qs);
}
#if 0
void QtLangSet::setCurSelectLang(QString tag)
{
QList<QListWidgetItem*> destItem = ui.langListWidget->findItems(tag, Qt::MatchExactly);
if (!destItem.isEmpty())
{
QListWidgetItem* itemtemp = destItem.first();
itemtemp->setSelected(true);
//slot_itemSelect(itemtemp, nullptr);
}
}
#endif
bool QtLangSet::saveCurLangSettings()
{
if (m_isStyleChange && m_selectLexer != nullptr)
{
QString tag = m_selectLexer->lexerTag();
QString cfgPath = QString("notepad/%1").arg(tag);
QSettings qs(QSettings::IniFormat, QSettings::UserScope, cfgPath);
m_selectLexer->writeSettings(qs);
m_isStyleChange = false;
return true;
}
return false;
}
//修改前景色
void QtLangSet::slot_changeFgColor()
{
QColor color = QColorDialog::getColor(Qt::white, this, tr("Style Foreground Color"));
if (color.isValid())
{
//当前前景色是否变化
if (m_curStyleData.color != color)
{
m_curStyleData.color = color;
fillForegroundColor(color);
m_isStyleChange = true;
//即时设置风格
if (m_selectLexer != nullptr)
{
m_selectLexer->setColor(color,m_selectStyleId);
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, color, m_curStyleData.paper, m_curStyleData.font,false);
}
}
}
}
//修改背景色
void QtLangSet::slot_changeBkColor()
{
QColor color = QColorDialog::getColor(Qt::white, this, tr("Style Background Color"));
if (color.isValid())
{
//当前前景色是否变化
if (m_curStyleData.paper != color)
{
m_curStyleData.paper = color;
fillBackgroundColor(color);
m_isStyleChange = true;
//即时设置风格
if (m_selectLexer != nullptr)
{
m_selectLexer->setPaper(color, m_selectStyleId);
emit viewStyleChange(m_selectLexer->lexerId(), m_selectStyleId, color, m_curStyleData.paper, m_curStyleData.font, false);
}
}
}
}
void QtLangSet::slot_saveClick()
{
saveCurLangSettings();
}
C++
1
https://gitee.com/lineCodeJm/notepad--.git
git@gitee.com:lineCodeJm/notepad--.git
lineCodeJm
notepad--
ndd
master

搜索帮助