/* * * Copyright (C) 2023, KylinSoft Co., Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * */ #include "mail-search-plugin.h" #include #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 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 *searchResult) { m_mutex.lock(); ++uniqueSymbol; m_mutex.unlock(); m_keyword = keyword; MailSearch *mailSearch = new MailSearch(searchResult, keyword, uniqueSymbol); m_pool.start(mailSearch); } void MailSearchPlugin::stopSearch() { m_mutex.lock(); ++uniqueSymbol; m_mutex.unlock(); } QList 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("

%1

").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); } else { m_nameLabel->setToolTip(""); } 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 SeparationLine(m_detailPage); 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 SeparationLine(m_detailPage); 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(sender()); if (!document) { return; } QTextEdit *editor=qobject_cast(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 *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 reply = mailDataInterface.call("keywordMatch",m_keyword); if (reply.isValid()) { if (m_uniqueSymbol == MailSearchPlugin::uniqueSymbol) { for (std::pair result : reply.value().toStdMap()) { const QDBusArgument &dbusArgs = result.second.value(); 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{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(""); 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); */ }