notepad--/doctypelistview.cpp

356 lines
10 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "doctypelistview.h"
#include <QInputDialog>
#include <QLineEdit>
#include <QtDebug>
#include <QThread>
#include "jsondeploy.h"
//已知的文档类型
QMap<QString, bool>* DocTypeListView::s_supportFileExts = nullptr;
QStringList DocTypeListView::s_supportFileExt = (QStringList ()<< "common" << "ms int/inf" << "c,c++,objc,go" << "java,c#,pascal" \
<< "web script" << "public script" << "property script" << "fortran,Tex,SQL" << "misc" \
<< "Qt" << "customize");
QMap<QString, bool>* DocTypeListView::s_binFileExts = nullptr;
QStringList DocTypeListView::s_extBindFileType;
#if 0
= (QStringList() << ".txt:.log" << ".ini:.inf" << ".h:.hh:.hpp:.hxx:.c:.cpp:.cxx:.cc:.m:.mm:.vcxproj:.vcproj:.props:vsprops:mainfest:.go:.mod" \
<< ".java:.cs:.pas:.pp:.inc" << ".html:.htm:.shtml:.shtm:.hta:.asp:.aspx:.css:.js:.json:.jsm:.jsp:.php:.php3:.php4:.php5:.phps:.phpt:.phtml:.xml:.xhtml:.xht:.xul:.kml:.xaml:.xsml" \
<< ".sh:.bsh:.bash:.bat:.cmd:.nsi:.nsh:.lua:.pl:.pm:.py" << ".rc:.as:.mx:.vb:.vbs" << ".f:.for:.f90:.f95:.f2k:.tex:.sql" \
<< ".nfo:.mak" << ".ui:.pro:.pri:.qrc" << "");
#endif
QStringList HEX_FILE_EXTS_LIST = (QStringList() << "exe" << "dll" << "png" << "jpg" << "doc" << "docx" << "ppt" << "pptx" \
<< "zip" << "gz" << "rar" << "pdf" << "7z" << "lib" << "so" << "db" << "obj" << "pdb" << "bmp" << "ico" << "qm" << "icns" << "jpeg" << "res" << "exp" << "ilk" << "deb");
//20220402发现bug:在1.11中引入深入对比后会在子线程中调用这个初始化函数。引发了后续的sqlite错误。
//务必要保证这些实例和数据库对象,是在主线程中创建的。
void DocTypeListView::initSupportFileTypes()
{
assert(QThread::currentThread() == qApp->thread());
if (s_supportFileExts == nullptr)
{
s_supportFileExts = new QMap<QString, bool>;
s_binFileExts = new QMap<QString, bool>;
for (int i = 0; i < HEX_FILE_EXTS_LIST.size(); ++i)
{
s_binFileExts->insert(HEX_FILE_EXTS_LIST.at(i),true);
}
}
else
{
//已经初始化过了。避免多次
return;
}
//如果数据库不存在,则使用默认值来进行初始化
if (!JsonDeploy::isDbExist())
{
QStringList types;
types << ".txt:.log" << ".ini:.inf" << ".h:.hh:.hpp:.hxx:.c:.cpp:.cxx:.cc:.m:.mm:.vcxproj:.vcproj:.props:vsprops:mainfest:.go:.mod" \
<< ".java:.cs:.pas:.pp:.inc" << ".html:.htm:.shtml:.shtm:.hta:.asp:.aspx:.css:js:.json:.jsm:.jsp:.php:.php3:.php4:.php5:.phps:.phpt:.phtml:.xml:.xhtml:.xht:.xul:.kml:.xaml:.xsml" \
<< ".sh:.bsh:.bash:.bat:.cmd:.nsi:.nsh:.lua:.pl:.pm:.py" << ".rc:.as:.mx:.vb:.vbs" << ".f:.for:.f90:.f95:.f2k:.tex:.sql" \
<< "nfo:.mak" << ".ui:.pro:.pri:.qrc";
QString typeStr = types.join(":");
QStringList typeList = typeStr.split(":");
for (QString var : typeList)
{
if (!var.isEmpty())
{
s_supportFileExts->insert(var.mid(1), true);
}
}
s_extBindFileType << ".txt:.log" << ".ini:.inf" << ".h:.hh:.hpp:.hxx:.c:.cpp:.cxx:.cc:.m:.mm:.vcxproj:.vcproj:.props:vsprops:mainfest:.go:.mod" \
<< ".java:.cs:.pas:.pp:.inc" << ".html:.htm:.shtml:.shtm:.hta:.asp:.aspx:.css:js:.json:.jsm:.jsp:.php:.php3:.php4:.php5:.phps:.phpt:.phtml:.xml:.xhtml:.xht:.xul:.kml:.xaml:.xsml" \
<< ".sh:.bsh:.bash:.bat:.cmd:.nsi:.nsh:.lua:.pl:.pm:.py" << ".rc:.as:.mx:.vb:.vbs" << ".f:.for:.f90:.f95:.f2k:.tex:.sql" \
<< ".nfo:.mak" << ".ui:.pro:.pri:.qrc" << "";
}
else
{
//从数据库动态读取配置
QString key("typelist");
QString typeList = JsonDeploy::getKeyValueFromLongSets(key);
if (typeList.isEmpty())
{
//没有读取到,这是第一次启动软件,没有写入导致。在这里进行第一次的写入
QStringList types;
types << ".txt:.log" << ".ini:.inf" << ".h:.hh:.hpp:.hxx:.c:.cpp:.cxx:.cc:.m:.mm:.vcxproj:.vcproj:.props:vsprops:mainfest:.go:.mod" \
<< ".java:.cs:.pas:.pp:.inc" << ".html:.htm:.shtml:.shtm:.hta:.asp:.aspx:.css:js:.json:.jsm:.jsp:.php:.php3:.php4:.php5:.phps:.phpt:.phtml:.xml:.xhtml:.xht:.xul:.kml:.xaml:.xsml" \
<< ".sh:.bsh:.bash:.bat:.cmd:.nsi:.nsh:.lua:.pl:.pm:.py" << ".rc:.as:.mx:.vb:.vbs" << ".f:.for:.f90:.f95:.f2k:.tex:.sql" \
<< ".nfo:.mak" << ".ui:.pro:.pri:.qrc" << "";
s_extBindFileType = types;
QString typeStr = types.join("|");
JsonDeploy::addKeyValueToLongSets(key, typeStr);
typeStr.replace('|',':');
QStringList list = typeStr.split(":");
for (QString var : list)
{
if (!var.isEmpty())
{
s_supportFileExts->insert(var.mid(1), true);
}
}
}
else
{
//从数据库中读取的内容进行动态配置
s_extBindFileType = typeList.split("|");
typeList.replace('|', ':');
QStringList list = typeList.split(":");
for (QString var : list)
{
if (!var.isEmpty())
{
s_supportFileExts->insert(var.mid(1), true);
}
}
}
}
}
//是否支持文件后缀名,注意ext必须要带.xxx格式
bool DocTypeListView::isSupportExt(QString ext)
{
if (s_supportFileExts == nullptr)
{
initSupportFileTypes();
}
return s_supportFileExts->contains(ext);
}
//是否是二进制格式的后缀文件
bool DocTypeListView::isHexExt(QString ext)
{
if (s_binFileExts == nullptr)
{
initSupportFileTypes();
}
return s_binFileExts->contains(ext);
}
DocTypeListView::DocTypeListView(QWidget *parent)
: QWidget(parent),m_isDirty(false)
{
ui.setupUi(this);
if (s_supportFileExt.isEmpty())
{
s_supportFileExt << "common" << "ms int/inf" << "c,c++,objc,go" << "java,c#,pascal" \
<< "web script" << "public script" << "property script" << "fortran,Tex,SQL" << "misc" \
<< "Qt" << "customize";
}
initSupportFileTypes();
#if 0
if (s_extBindFileType.isEmpty())
{
s_extBindFileType << ".txt:.log" << ".ini:.inf" << ".h:.hh:.hpp:.hxx:.c:.cpp:.cxx:.cc:.m:.mm:.vcxproj:.vcproj:.props:vsprops:mainfest:.go:.mod" \
<< ".java:.cs:.pas:.pp:.inc" << ".html:.htm:.shtml:.shtm:.hta:.asp:.aspx:.css:js:.json:.jsm:.jsp:.php:.php3:.php4:.php5:.phps:.phpt:.phtml:.xml:.xhtml:.xht:.xul:.kml:.xaml:.xsml" \
<< ".sh:.bsh:.bash:.bat:.cmd:.nsi:.nsh:.lua:.pl:.pm:.py" << ".rc:.as:.mx:.vb:.vbs" << ".f:.for:.f90:.f95:.f2k:.tex:.sql" \
<< ".nfo:.mak" << ".ui:.pro:.pri:.qrc" << "";
}
#endif
ui.extListWidget->addItems(s_supportFileExt);
connect(ui.extListWidget, &QListWidget::currentRowChanged, this, &DocTypeListView::slot_curRowChanged);
setContextMenuPolicy(Qt::CustomContextMenu);
m_menu = new QMenu(this);
connect(this, &QWidget::customContextMenuRequested, this, &DocTypeListView::slot_customContextMenuRequested);
m_menu->addAction("add Custom extension", this, &DocTypeListView::slot_addCustomType);
connect(ui.customListWidget, &QListWidget::itemClicked, this, &DocTypeListView::slot_customListItemClicked);
connect(ui.typListWidget, &QListWidget::itemClicked, this, &DocTypeListView::slot_typListItemClicked);
}
DocTypeListView::~DocTypeListView()
{
save();
}
void DocTypeListView::save()
{
if (m_isDirty)
{
QString key("typelist");
QString typeStr = s_extBindFileType.join("|");
JsonDeploy::updataKeyValueFromLongSets(key, typeStr);
m_isDirty = false;
}
}
void DocTypeListView::slot_curRowChanged(int row)
{
ui.typListWidget->clear();
if (row < s_extBindFileType.count())
{
QString typeStr = s_extBindFileType.at(row);
if (typeStr.isEmpty())
{
return;
}
QStringList typeList = typeStr.split(":");
if (typeList.size() > 0)
{
ui.typListWidget->addItems(typeList);
}
}
}
void DocTypeListView::slot_customContextMenuRequested(const QPoint& /*pos*/)
{
m_menu->exec(QCursor::pos());
}
void DocTypeListView::slot_addCustomType()
{
bool ok = false;
QString text = QInputDialog::getText(this, tr("input file ext()"), tr("ext (Split With :)"), QLineEdit::Normal, QString(".h:.cpp"), &ok);
if (ok && !text.isEmpty())
{
text = text.trimmed();
QStringList extList = text.split(":");
ui.customListWidget->addItems(extList);
}
}
void DocTypeListView::slot_add()
{
int row = ui.customListWidget->currentRow();
if (row < 0)
{
return;
}
QListWidgetItem* item = ui.customListWidget->takeItem(row);
ui.typListWidget->addItem(item);
int index = ui.extListWidget->currentRow();
if (index < s_extBindFileType.size())
{
if (!s_extBindFileType[index].isEmpty())
{
QString curText = QString(":%1").arg(item->text());
s_extBindFileType[index].append(curText);
}
else
{
s_extBindFileType[index].append(item->text());
}
QString var = item->text();
if (!var.isEmpty())
{
s_supportFileExts->insert(var.mid(1), true);
m_isDirty = true;
}
}
}
void DocTypeListView::slot_sub()
{
int row = ui.typListWidget->currentRow();
if (row < 0)
{
return;
}
QListWidgetItem* item = ui.typListWidget->takeItem(row);
ui.customListWidget->addItem(item);
int index = ui.extListWidget->currentRow();
if (index < s_extBindFileType.size())
{
QString curText = QString("%1:").arg(item->text());
if (s_extBindFileType[index].contains(curText))
{
s_extBindFileType[index].remove(curText);
}
else if (s_extBindFileType[index].endsWith(item->text()))
{
int lens = s_extBindFileType[index].size();
int delLens = item->text().size();
if (lens > delLens)
{
//删除:xxx
s_extBindFileType[index].remove(lens - delLens -1, delLens + 1);
}
else
{
s_extBindFileType[index].clear();
}
}
QString var = item->text();
if (!var.isEmpty())
{
s_supportFileExts->remove(var.mid(1));
m_isDirty = true;
}
}
}
void DocTypeListView::slot_customListItemClicked(QListWidgetItem* /*item*/)
{
//qDebug() << "custom list item click";
ui.subToolButton->setEnabled(false);
ui.addToolButton->setEnabled(true);
}
void DocTypeListView::slot_typListItemClicked(QListWidgetItem* /*item*/)
{
//qDebug() << "type list item click";
ui.subToolButton->setEnabled(true);
ui.addToolButton->setEnabled(false);
}