406 lines
15 KiB
C++
406 lines
15 KiB
C++
|
#include "mail-search-plugin.h"
|
||
|
#include "file-utils.h"
|
||
|
#include "chinese-segmentation.h"
|
||
|
using namespace UkuiSearch;
|
||
|
|
||
|
#define ICON_SIZE QSize(120,120)
|
||
|
#define DETAIL_WIDTH 360
|
||
|
#define DETAIL_MARGINS 8, 0, 16, 0
|
||
|
#define DETAIL_ICON_HEIGHT 128
|
||
|
#define NAME_LABEL_MARGINS 8, 0, 0, 0
|
||
|
#define NAME_LABEL_WIDTH 282
|
||
|
#define LINE_STYLE "QFrame{background: rgba(0, 0, 0, 0.2);}"
|
||
|
#define DETAIL_ACTION_MARGINS 8, 0, 0, 0
|
||
|
#define DESC_PAGE_WIDTH 316
|
||
|
#define DESC_LABEL_MARGINS 0, 0, 0, 0
|
||
|
#define DESC_LABEL_SIZE QSize(87, 34)
|
||
|
#define DESC_LABEL_SPACING 16
|
||
|
#define SCROLL_BAR_COLOR QColor(0, 0, 0, 0)
|
||
|
#define SCROLL_AREA_MARGINS 8, 0, 0, 0
|
||
|
#define SCROLL_AREA_MAX_HEIGHT 212
|
||
|
#define SCROLL_AREA_MAX_WIDTH 344
|
||
|
#define AREA_CONTENT_MARGINS 8, 0, 0, 0
|
||
|
|
||
|
size_t MailSearchPlugin::uniqueSymbol = 0;
|
||
|
QMutex MailSearchPlugin::m_mutex;
|
||
|
|
||
|
MailSearchPlugin::MailSearchPlugin(QObject *parent) : QObject(parent)
|
||
|
{
|
||
|
SearchPluginIface::Actioninfo open { 0, tr("open")};
|
||
|
m_actionInfo << open;
|
||
|
m_pool.setMaxThreadCount(1);
|
||
|
m_pool.setExpiryTimeout(1000);
|
||
|
initDetailPage();
|
||
|
}
|
||
|
|
||
|
const QString MailSearchPlugin::name()
|
||
|
{
|
||
|
return tr("Mail Search");
|
||
|
}
|
||
|
|
||
|
const QString MailSearchPlugin::description()
|
||
|
{
|
||
|
return tr("Mail Search");
|
||
|
}
|
||
|
|
||
|
QString MailSearchPlugin::getPluginName()
|
||
|
{
|
||
|
return tr("Mail Search");
|
||
|
}
|
||
|
|
||
|
void MailSearchPlugin::KeywordSearch(QString keyword, DataQueue<SearchPluginIface::ResultInfo> *searchResult)
|
||
|
{
|
||
|
m_mutex.lock();
|
||
|
++uniqueSymbol;
|
||
|
m_mutex.unlock();
|
||
|
m_keyword = keyword;
|
||
|
MailSearch *mailSearch = new MailSearch(searchResult, keyword, uniqueSymbol);
|
||
|
m_pool.start(mailSearch);
|
||
|
}
|
||
|
|
||
|
QList<SearchPluginIface::Actioninfo> MailSearchPlugin::getActioninfo(int type)
|
||
|
{
|
||
|
return m_actionInfo;
|
||
|
}
|
||
|
|
||
|
void MailSearchPlugin::openAction(int actionkey, QString key, int type)
|
||
|
{
|
||
|
QProcess process;
|
||
|
switch(actionkey) {
|
||
|
case 0:
|
||
|
process.startDetached(QString("evolution"));
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QWidget *MailSearchPlugin::detailPage(const SearchPluginIface::ResultInfo &ri)
|
||
|
{
|
||
|
m_currentActionKey = ri.actionKey;
|
||
|
m_iconLabel->setPixmap(ri.icon.pixmap(ICON_SIZE));
|
||
|
QFontMetrics fontMetrics = m_nameLabel->fontMetrics();
|
||
|
QString showname = fontMetrics.elidedText(ri.name, Qt::ElideRight, 215);//当字体长度超过215时显示为省略号
|
||
|
m_nameLabel->setText(QString("<h3 style=\"font-weight:normal;\">%1</h3>").arg(FileUtils::escapeHtml(showname)));
|
||
|
if (QString::compare(showname, ri.name)) {
|
||
|
m_nameLabel->setToolTip(ri.name);
|
||
|
}
|
||
|
m_pluginLabel->setText(tr("Mail"));
|
||
|
|
||
|
m_senderLabel->setText(ri.description.at(0).key);
|
||
|
QString senderName = fontMetrics.elidedText(ri.description.at(0).value, Qt::ElideRight, 246);//当字体长度超过246时显示为省略号
|
||
|
m_senderFieldsLabel->setText(FileUtils::escapeHtml(senderName));
|
||
|
if (QString::compare(senderName, ri.description.at(0).value)) {
|
||
|
m_senderFieldsLabel->setToolTip(ri.description.at(0).value);
|
||
|
}
|
||
|
|
||
|
m_timeLabel->setText(ri.description.at(1).key);
|
||
|
m_timeFieldsLabel->setText(ri.description.at(1).value);
|
||
|
|
||
|
m_recipientsLabel->setText(ri.description.at(2).key);
|
||
|
QString recipientsStr = ri.description.at(2).value;
|
||
|
// QString recipientsStr = fontMetrics.elidedText(ri.description.at(2).value, Qt::ElideRight, 200);
|
||
|
// recipientsStr.replace(QRegExp("\\, "), "\n");
|
||
|
m_recipientsFieldsLabel->setText(FileUtils::getHtmlText(recipientsStr, m_keyword));
|
||
|
resizeTextEdit(m_recipientsFieldsLabel);
|
||
|
|
||
|
|
||
|
m_ccLabel->setText(ri.description.at(3).key);
|
||
|
QString ccStr = ri.description.at(3).value;
|
||
|
// QString ccStr = fontMetrics.elidedText(ri.description.at(3).value, Qt::ElideRight, 200);
|
||
|
m_ccFieldsLabel->setText(FileUtils::getHtmlText(ccStr, m_keyword));
|
||
|
resizeTextEdit(m_ccFieldsLabel);
|
||
|
// if (QString::compare(ccStr, ri.description.at(3).value)) {
|
||
|
// m_ccFieldsLabel->setToolTip(ri.description.at(3).value);
|
||
|
// }
|
||
|
//重置滚动条位置
|
||
|
m_descListArea->verticalScrollBar()->setValue(0);
|
||
|
return m_detailPage;
|
||
|
}
|
||
|
|
||
|
void MailSearchPlugin::initDetailPage()
|
||
|
{
|
||
|
m_detailPage = new QWidget();
|
||
|
m_detailPage->setFixedWidth(DETAIL_WIDTH);
|
||
|
m_detailPage->setAttribute(Qt::WA_TranslucentBackground);
|
||
|
m_detailLyt = new QVBoxLayout(m_detailPage);
|
||
|
m_detailLyt->setContentsMargins(DETAIL_MARGINS);
|
||
|
|
||
|
m_iconLabel = new QLabel(m_detailPage);
|
||
|
m_iconLabel->setAlignment(Qt::AlignCenter);
|
||
|
m_iconLabel->setFixedHeight(DETAIL_ICON_HEIGHT);
|
||
|
|
||
|
m_nameFrame = new QFrame(m_detailPage);
|
||
|
m_nameFrameLyt = new QHBoxLayout(m_nameFrame);
|
||
|
m_nameFrame->setLayout(m_nameFrameLyt);
|
||
|
m_nameFrameLyt->setContentsMargins(NAME_LABEL_MARGINS);
|
||
|
m_nameLabel = new QLabel(m_nameFrame);
|
||
|
m_nameLabel->setMaximumWidth(NAME_LABEL_WIDTH);
|
||
|
m_pluginLabel = new QLabel(m_nameFrame);
|
||
|
m_pluginLabel->setEnabled(false);
|
||
|
m_nameFrameLyt->addWidget(m_nameLabel);
|
||
|
m_nameFrameLyt->addStretch();
|
||
|
m_nameFrameLyt->addWidget(m_pluginLabel);
|
||
|
|
||
|
m_line_1 = new QFrame(m_detailPage);
|
||
|
m_line_1->setLineWidth(0);
|
||
|
m_line_1->setFixedHeight(1);
|
||
|
m_line_1->setStyleSheet(LINE_STYLE);
|
||
|
|
||
|
m_descListArea = new MailDescArea(m_detailPage);
|
||
|
QPalette scroll_bar_pal = m_descListArea->verticalScrollBar()->palette();
|
||
|
scroll_bar_pal.setColor(QPalette::Base, SCROLL_BAR_COLOR);
|
||
|
m_descListArea->verticalScrollBar()->setPalette(scroll_bar_pal);
|
||
|
|
||
|
m_descPage = new QWidget(m_descListArea);
|
||
|
m_descListArea->setWidget(m_descPage);
|
||
|
|
||
|
m_descPageLyt = new QFormLayout(m_descPage);
|
||
|
m_descPage->setLayout(m_descPageLyt);
|
||
|
m_descPage->setContentsMargins(DESC_LABEL_MARGINS);
|
||
|
m_descPage->setFixedWidth(DESC_PAGE_WIDTH);
|
||
|
|
||
|
m_senderLabel = new QLabel(m_descPage);
|
||
|
m_senderFieldsLabel = new QLabel(m_descPage);
|
||
|
m_senderLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_senderFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_timeLabel = new QLabel(m_descPage);
|
||
|
m_timeFieldsLabel = new QLabel(m_descPage);
|
||
|
m_timeLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_timeFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_recipientsLabel = new QLabel(m_descPage);
|
||
|
// m_recipientsFieldsLabel = new QLabel(m_descPage);
|
||
|
m_recipientsFieldsLabel = new QTextBrowser(m_descPage);
|
||
|
m_recipientsLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
// m_recipientsLabel->setMaximumHeight(35);
|
||
|
// m_recipientsFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
// m_recipientsFieldsLabel->setFixedWidth(260);
|
||
|
// m_recipientsFieldsLabel->setWordWrap(true);
|
||
|
|
||
|
m_recipientsFieldsLabel->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
m_recipientsFieldsLabel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
m_recipientsFieldsLabel->setWordWrapMode(QTextOption::WrapAnywhere);
|
||
|
// m_recipientsFieldsLabel->setLineWrapMode(QTextEdit::FixedPixelWidth);
|
||
|
// m_recipientsFieldsLabel->setLineWrapColumnOrWidth(260);
|
||
|
m_recipientsFieldsLabel->setPalette(scroll_bar_pal);
|
||
|
m_recipientsFieldsLabel->setFrameShape(QFrame::Shape::NoFrame);
|
||
|
|
||
|
m_ccLabel = new QLabel(m_descPage);
|
||
|
// m_ccFieldsLabel = new QLabel(m_descPage);
|
||
|
m_ccFieldsLabel = new QTextBrowser(m_descPage);
|
||
|
m_ccLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
// m_ccFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
// m_ccFieldsLabel->setFixedWidth(262);
|
||
|
// m_ccFieldsLabel->setWordWrap(true);
|
||
|
|
||
|
m_ccFieldsLabel->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
m_ccFieldsLabel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
m_ccFieldsLabel->setWordWrapMode(QTextOption::WrapAnywhere);
|
||
|
m_ccFieldsLabel->setPalette(scroll_bar_pal);
|
||
|
m_ccFieldsLabel->setFrameShape(QFrame::Shape::NoFrame);
|
||
|
|
||
|
|
||
|
/*
|
||
|
m_attachmentLabel = new QLabel(m_descPage);
|
||
|
m_attachmentFieldsLabel = new QLabel(m_descPage);
|
||
|
m_attachmentLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_attachmentLabel->setText(QString(tr("Attachment")));
|
||
|
m_attachmentFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
*/
|
||
|
|
||
|
m_descPageLyt->setContentsMargins(DESC_LABEL_MARGINS);
|
||
|
m_descPageLyt->setVerticalSpacing(DESC_LABEL_SPACING);
|
||
|
m_descPageLyt->addRow(m_senderLabel, m_senderFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_timeLabel, m_timeFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_recipientsLabel, m_recipientsFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_ccLabel, m_ccFieldsLabel);
|
||
|
// m_descPageLyt->addRow(m_attachmentLabel, m_attachmentFieldsLabel);
|
||
|
|
||
|
m_line_2 = new QFrame(m_detailPage);
|
||
|
m_line_2->setLineWidth(0);
|
||
|
m_line_2->setFixedHeight(1);
|
||
|
m_line_2->setStyleSheet(LINE_STYLE);
|
||
|
|
||
|
m_actionFrame = new QFrame(m_detailPage);
|
||
|
m_actionFrameLyt = new QVBoxLayout(m_actionFrame);
|
||
|
m_actionFrameLyt->setContentsMargins(DETAIL_ACTION_MARGINS);
|
||
|
m_actionLabel1 = new ActionLabel(tr("Open"), m_currentActionKey, m_actionFrame);
|
||
|
m_actionFrameLyt->addWidget(m_actionLabel1);
|
||
|
m_actionFrame->setLayout(m_actionFrameLyt);
|
||
|
|
||
|
m_detailLyt->addSpacing(50);
|
||
|
m_detailLyt->addWidget(m_iconLabel);
|
||
|
m_detailLyt->addWidget(m_nameFrame);
|
||
|
m_detailLyt->addWidget(m_line_1);
|
||
|
m_detailLyt->addWidget(m_descListArea);
|
||
|
m_detailLyt->addWidget(m_line_2);
|
||
|
m_detailLyt->addWidget(m_actionFrame);
|
||
|
m_detailLyt->addStretch();
|
||
|
m_detailPage->setLayout(m_detailLyt);
|
||
|
|
||
|
connect(m_actionLabel1, &ActionLabel::actionTriggered, [ & ](){
|
||
|
openAction(m_actionInfo.at(0).actionkey, m_currentActionKey,0);
|
||
|
});
|
||
|
// connect(m_recipientsFieldsLabel->document(), &QTextDocument::contentsChanged, this, &MailSearchPlugin::resetHeight);
|
||
|
}
|
||
|
|
||
|
void MailSearchPlugin::resizeTextEdit(QTextEdit *textEdit)
|
||
|
{
|
||
|
QTextDocument *doc = textEdit->document();
|
||
|
int height = doc->size().height();
|
||
|
textEdit->setMinimumHeight(32);
|
||
|
int minheight = textEdit->minimumHeight();
|
||
|
if (height < minheight)
|
||
|
{
|
||
|
height = minheight;
|
||
|
}
|
||
|
textEdit->setFixedHeight(height);
|
||
|
}
|
||
|
|
||
|
void MailSearchPlugin::resetHeight()
|
||
|
{
|
||
|
QTextDocument *document=qobject_cast<QTextDocument*>(sender());
|
||
|
if (!document) {
|
||
|
return;
|
||
|
}
|
||
|
QTextEdit *editor=qobject_cast<QTextEdit*>(document->parent()->parent());
|
||
|
if (!editor) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int newheight = document->size().rheight();
|
||
|
if (newheight != editor->height()) {
|
||
|
editor->setFixedHeight(newheight);
|
||
|
} else {
|
||
|
return;
|
||
|
}
|
||
|
// m_recipientsFieldsLabel->setFixedHeight(m_recipientsFieldsLabel->document()->size().rheight());
|
||
|
}
|
||
|
|
||
|
MailSearch::MailSearch(DataQueue<SearchPluginIface::ResultInfo> *searchResult, const QString &keyword, size_t uniqueSymbol)
|
||
|
{
|
||
|
this->setAutoDelete(true);
|
||
|
this->m_searchResult = searchResult;
|
||
|
this->m_keyword = keyword;
|
||
|
this->m_uniqueSymbol = uniqueSymbol;
|
||
|
}
|
||
|
|
||
|
void MailSearch::run()
|
||
|
{
|
||
|
QDBusInterface mailDataInterface("org.gnome.EvolutionMailData", "/", "org.gnome.EvolutionMailData", QDBusConnection::sessionBus());
|
||
|
QDBusReply<QVariantMap> reply = mailDataInterface.call("keywordMatch",m_keyword);
|
||
|
if (reply.isValid()) {
|
||
|
if (m_uniqueSymbol == MailSearchPlugin::uniqueSymbol) {
|
||
|
for (std::pair<QString, QVariant> result : reply.value().toStdMap()) {
|
||
|
const QDBusArgument &dbusArgs = result.second.value<QDBusArgument>();
|
||
|
QStringList resultList;
|
||
|
dbusArgs.beginArray();
|
||
|
while (!dbusArgs.atEnd()) {
|
||
|
QVariant tmp;
|
||
|
dbusArgs >> tmp;
|
||
|
resultList.append(tmp.toString());
|
||
|
}
|
||
|
dbusArgs.endArray();
|
||
|
SearchPluginIface::ResultInfo ri;
|
||
|
createResultInfo(ri, resultList);
|
||
|
if (m_uniqueSymbol == MailSearchPlugin::uniqueSymbol) {
|
||
|
m_searchResult->enqueue(ri);
|
||
|
} else {
|
||
|
qDebug() << "uniqueSymbol don't match:" << m_uniqueSymbol << MailSearchPlugin::uniqueSymbol;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
qDebug() << "uniqueSymbol don't match:" << m_uniqueSymbol << MailSearchPlugin::uniqueSymbol;
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
qWarning() << "Error!Mail dbus call failed:" << mailDataInterface.lastError();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void MailSearch::createResultInfo(SearchPluginIface::ResultInfo &ri, QStringList &resultList)
|
||
|
{
|
||
|
QString recipientsStr = resultList.at(5);
|
||
|
recipientsStr.replace(QRegExp("\\, "), "\n");
|
||
|
// recipientsStr.toUtf8().data();
|
||
|
QString ccStr = resultList.at(6);
|
||
|
ccStr.replace(QRegExp("\\, "), "\n");
|
||
|
ri.icon = XdgIcon::fromTheme("evolution");
|
||
|
ri.name = resultList.at(3);
|
||
|
ri.description = QVector<SearchPluginIface::DescriptionInfo>() \
|
||
|
<< SearchPluginIface::DescriptionInfo{tr("From"), resultList.at(4)} \
|
||
|
<< SearchPluginIface::DescriptionInfo{tr("Time"), resultList.at(7)} \
|
||
|
<< SearchPluginIface::DescriptionInfo{tr("To"), recipientsStr/*resultList.at(5)*/} \
|
||
|
<< SearchPluginIface::DescriptionInfo{tr("Cc"), ccStr/*resultList.at(6)*/};
|
||
|
ri.type = 0;
|
||
|
}
|
||
|
|
||
|
MailDescArea::MailDescArea(QWidget *parent) : QScrollArea(parent)
|
||
|
{
|
||
|
initUi();
|
||
|
}
|
||
|
|
||
|
void MailDescArea::initUi()
|
||
|
{
|
||
|
this->setFrameShape(QFrame::Shape::NoFrame);
|
||
|
this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||
|
this->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||
|
this->setWidgetResizable(true);
|
||
|
this->setFixedWidth(SCROLL_AREA_MAX_WIDTH);
|
||
|
this->setMaximumHeight(SCROLL_AREA_MAX_HEIGHT);
|
||
|
this->setViewportMargins(AREA_CONTENT_MARGINS);
|
||
|
// this->setContentsMargins(SCROLL_AREA_MARGINS);
|
||
|
/*
|
||
|
m_descPage = new QWidget(this);
|
||
|
this->setWidget(m_descPage);
|
||
|
m_descPageLyt = new QFormLayout(m_descPage);
|
||
|
m_descPage->setLayout(m_descPageLyt);
|
||
|
m_descPage->setContentsMargins(8, 0, 8, 0);
|
||
|
|
||
|
m_senderLabel = new QLabel(m_descPage);
|
||
|
m_senderFieldsLabel = new QLabel(m_descPage);
|
||
|
m_senderLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_senderLabel->setText(QString(tr("From:")));
|
||
|
m_senderFieldsLabel->setText("<jianbingguozi@kylinos.cn>");
|
||
|
m_senderFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
m_senderFieldsLabel->setStyleSheet(LINE_STYLE);
|
||
|
|
||
|
m_timeLabel = new QLabel(m_descPage);
|
||
|
m_timeFieldsLabel = new QLabel(m_descPage);
|
||
|
m_timeLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_timeLabel->setText(QString(tr("Time:")));
|
||
|
m_timeFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_recipientsLabel = new QLabel(m_descPage);
|
||
|
m_recipientsFieldsLabel = new QLabel(m_descPage);
|
||
|
m_recipientsLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_recipientsLabel->setText(QString(tr("To:")));
|
||
|
m_recipientsFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_ccLabel = new QLabel(m_descPage);
|
||
|
m_ccFieldsLabel = new QLabel(m_descPage);
|
||
|
m_ccLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_ccLabel->setText(QString(tr("Cc:")));
|
||
|
m_ccFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_attachmentLabel = new QLabel(m_descPage);
|
||
|
m_attachmentFieldsLabel = new QLabel(m_descPage);
|
||
|
m_attachmentLabel->setMaximumSize(DESC_LABEL_SIZE);
|
||
|
m_attachmentLabel->setText(QString(tr("Attachment:")));
|
||
|
m_attachmentFieldsLabel->setAlignment(Qt::AlignRight);
|
||
|
|
||
|
m_descPageLyt->setContentsMargins(DESC_LABEL_MARGINS);
|
||
|
m_descPageLyt->setVerticalSpacing(DESC_LABEL_SPACING);
|
||
|
m_descPageLyt->addRow(m_senderLabel, m_senderFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_timeLabel, m_timeFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_recipientsLabel, m_recipientsFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_ccLabel, m_ccFieldsLabel);
|
||
|
m_descPageLyt->addRow(m_attachmentLabel, m_attachmentFieldsLabel);
|
||
|
*/
|
||
|
|
||
|
}
|