| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- #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();
- }
|