ukui-search/libsearch/websearch/web-search-plugin.cpp

191 lines
6.6 KiB
C++

#include "web-search-plugin.h"
#include "global-settings.h"
#include <QDBusReply>
#include <QDBusInterface>
#include <QDesktopServices>
#include <QDebug>
#include <QApplication>
#include "data-collecter.h"
#define UKUI_SEARCH_SCHEMAS "org.ukui.search.settings"
#define BROWSERTYPE "x-scheme-handler/http"
#define DESKTOPPATH "/usr/share/applications/"
#define WEB_ENGINE_KEY "webEngine"
using namespace UkuiSearch;
WebSearchPlugin::WebSearchPlugin(QObject *parent) : QObject(parent)
{
if (QGSettings::isSchemaInstalled(UKUI_SEARCH_SCHEMAS)) {
m_settings = new QGSettings(UKUI_SEARCH_SCHEMAS, QByteArray(), this);
if (m_settings->keys().contains(WEB_ENGINE_KEY)) {
m_webEngine = m_settings->get(WEB_ENGINE_KEY).toString();
}
connect(m_settings, &QGSettings::changed, this, [ & ] (const QString& key) {
if (key == WEB_ENGINE_KEY) {
m_webEngine = m_settings->get(WEB_ENGINE_KEY).toString();
}
});
}
SearchPluginIface::Actioninfo open { 0, tr("Start browser search")};
m_actionInfo << open;
initDetailPage();
}
const QString UkuiSearch::WebSearchPlugin::name()
{
return "Web Page";
}
const QString UkuiSearch::WebSearchPlugin::description()
{
return tr("Web Page");
}
QString UkuiSearch::WebSearchPlugin::getPluginName()
{
return tr("Web Page");
}
void UkuiSearch::WebSearchPlugin::KeywordSearch(QString keyword, DataQueue<UkuiSearch::SearchPluginIface::ResultInfo> *searchResult)
{
m_keyWord = keyword;
ResultInfo resultInfo;
resultInfo.name = m_keyWord.replace("\r", " ").replace("\n", " ");
resultInfo.name = m_keyWord;
resultInfo.type = 0;
QByteArray ba = QString(DESKTOPPATH + getDefaultAppId(BROWSERTYPE)).toUtf8();
GDesktopAppInfo * textinfo = g_desktop_app_info_new_from_filename(ba.constData());
char *iconname = g_icon_to_string(g_app_info_get_icon(G_APP_INFO(textinfo)));
QIcon appicon;
appicon = IconLoader::loadIconQt(QString(QLatin1String(iconname)),
QIcon(QString("/usr/share/pixmaps/"+QString(QLatin1String(iconname))
+".png")));
g_free(iconname);
resultInfo.icon = QIcon(appicon);
resultInfo.actionKey = m_keyWord;
searchResult->enqueue(resultInfo);
g_object_unref(textinfo);
}
void WebSearchPlugin::stopSearch()
{
}
QList<UkuiSearch::SearchPluginIface::Actioninfo> UkuiSearch::WebSearchPlugin::getActioninfo(int type)
{
Q_UNUSED(type)
return m_actionInfo;
}
void UkuiSearch::WebSearchPlugin::openAction(int actionkey, QString key, int type)
{
DataCollecter::collectLaunchEvent(QStringLiteral("webSearch"), QStringLiteral("open"));
Q_UNUSED(actionkey)
Q_UNUSED(key)
Q_UNUSED(type)
QString address;
if(!m_webEngine.isEmpty()) {
if(m_webEngine == "360") {
address = "https://so.com/s?q=" + m_keyWord; //360
} else if(m_webEngine == "sougou") {
address = "https://www.sogou.com/web?query=" + m_keyWord; //搜狗
} else {
address = "http://baidu.com/s?word=" + m_keyWord; //百度
}
} else { //默认值
address = "http://baidu.com/s?word=" + m_keyWord ; //百度
}
bool res(false);
QDBusInterface * appLaunchInterface = new QDBusInterface(QStringLiteral("com.kylin.ProcessManager"),
QStringLiteral("/com/kylin/ProcessManager/AppLauncher"),
QStringLiteral("com.kylin.ProcessManager.AppLauncher"),
QDBusConnection::sessionBus());
if(!appLaunchInterface->isValid()) {
qWarning() << qPrintable(QDBusConnection::sessionBus().lastError().message());
res = false;
} else {
appLaunchInterface->setTimeout(10000);
QDBusReply<void> reply = appLaunchInterface->call("LaunchDefaultAppWithUrl", address);
if(reply.isValid()) {
res = true;
} else {
qWarning() << "ProcessManager dbus called failed!" << reply.error();
res = false;
}
}
if (appLaunchInterface) {
delete appLaunchInterface;
}
appLaunchInterface = nullptr;
if (res)
return;
QDesktopServices::openUrl(address);
}
QWidget *UkuiSearch::WebSearchPlugin::detailPage(const UkuiSearch::SearchPluginIface::ResultInfo &ri)
{
Q_UNUSED(ri)
return m_detailPage;
}
void UkuiSearch::WebSearchPlugin::initDetailPage()
{
m_detailPage = new QWidget();
m_detailPage->setFixedWidth(360);
m_detailPage->setAttribute(Qt::WA_TranslucentBackground);
m_detailLyt = new QVBoxLayout(m_detailPage);
m_detailLyt->setContentsMargins(8, 0, 16, 0);
m_iconLabel = new QLabel(m_detailPage);
m_iconLabel->setAlignment(Qt::AlignCenter);
QString type = GlobalSettings::getInstance().getValue(STYLE_NAME_KEY).toString();
if (type == "ukui-dark") {
m_iconLabel->setPixmap(QIcon(":/res/icons/search-web-dark.svg").pixmap(128, 128));
} else {
m_iconLabel->setPixmap(QIcon(":/res/icons/search-web-default.svg").pixmap(128, 128));
}
connect(qApp, &QApplication::paletteChanged, this, [=] () {
QString type = GlobalSettings::getInstance().getValue(STYLE_NAME_KEY).toString();
if (type == "ukui-dark") {
m_iconLabel->setPixmap(QIcon(":/res/icons/search-web-dark.svg").pixmap(128, 128));
} else {
m_iconLabel->setPixmap(QIcon(":/res/icons/search-web-default.svg").pixmap(128, 128));
}
});
m_actionFrame = new QFrame(m_detailPage);
m_actionFrameLyt = new QVBoxLayout(m_actionFrame);
m_actionFrameLyt->setContentsMargins(0, 0, 0, 0);
m_actionFrameLyt->setAlignment(Qt::AlignCenter);
m_actionLabel1 = new ActionLabel(tr("Start browser search"), m_currentActionKey, m_actionFrame);
m_actionLabel1->adjustSize();
m_actionFrameLyt->addWidget(m_actionLabel1);
m_actionFrame->setLayout(m_actionFrameLyt);
m_detailLyt->addSpacing(146);
m_detailLyt->addWidget(m_iconLabel);
//m_detailLyt->addSpacing(6);
m_detailLyt->addWidget(m_actionFrame);
m_detailPage->setLayout(m_detailLyt);
m_detailLyt->addStretch();
connect(m_actionLabel1, &ActionLabel::actionTriggered, [ & ](){
openAction(0, m_currentActionKey, 0);
});
}
QString WebSearchPlugin::getDefaultAppId(const char *contentType)
{
GAppInfo * app = g_app_info_get_default_for_type(contentType, false);
if(app != NULL){
const char * id = g_app_info_get_id(app);
QString strId(id);
g_object_unref(app);
return strId;
} else {
return QString("");
}
}