notepad--/doctypelistview.cpp

356 lines
10 KiB
C++
Raw Normal View History

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