feat: ISSUE #I67K8Y 新增 spk://search/keyword 链接格式解析

支持打开该链接跳转搜索页面(禁止直接搜索 %,搜索结果过多会导致搜索页面 QtWebEngine 进程崩溃,无法继续搜索)

Log: 支持链接跳转搜索结果页面;暂不支持直接跳转到应用详情页
This commit is contained in:
zty199 2023-01-30 16:15:07 +08:00
parent 1a89c2a1a6
commit 4b40e3caca
5 changed files with 35 additions and 17 deletions

@ -136,7 +136,7 @@ int main(int argc, char *argv[])
QString arg1 = argv[1]; QString arg1 = argv[1];
if (arg1.trimmed().startsWith("spk://")) if (arg1.trimmed().startsWith("spk://"))
{ {
w.openUrl(QUrl(argv[1])); w.openUrl(arg1);
} }
} }
w.show(); w.show();

@ -200,11 +200,18 @@ MainWindow::MainWindow(QWidget *parent)
QString searchtext = searchEdit->text(); QString searchtext = searchEdit->text();
if (!searchtext.isEmpty()) { if (!searchtext.isEmpty()) {
if (searchtext.startsWith("spk://")) { if (searchtext.startsWith("spk://")) {
openUrl(QUrl(searchtext)); openUrl(searchtext);
searchEdit->clearEdit(); searchEdit->clearEdit();
} else { } else {
ui->applistpage_1->getSearchList(searchtext); if (searchtext == "%")
switchPage(AppPageSearchlist); {
qWarning() << "keyword '%' matches too many results, which will cause QtWebEngine crash.";
}
else
{
ui->applistpage_1->getSearchList(searchtext);
switchPage(AppPageSearchlist);
}
} }
} }
this->setFocus(); }); this->setFocus(); });
@ -213,11 +220,11 @@ MainWindow::MainWindow(QWidget *parent)
{ downloadButton->setProgress(i); }); { downloadButton->setProgress(i); });
// 列表点击事件 // 列表点击事件
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk) connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk) connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk) connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
{ openUrl(spk); }); { openUrl(spk.toString()); });
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType()); emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance); connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
@ -246,7 +253,7 @@ void MainWindow::onGetUrl(const QString &url)
{ {
if (url.trimmed().startsWith("spk://")) if (url.trimmed().startsWith("spk://"))
{ {
openUrl(QUrl(url)); openUrl(url);
} }
activateWindow(); activateWindow();
} }
@ -261,16 +268,27 @@ void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
} }
} }
void MainWindow::openUrl(QUrl url) void MainWindow::openUrl(const QString &url)
{ {
if (url.toString().startsWith("spk://")) if (url.startsWith("spk://search/"))
{ {
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B"))); QString keyword = url.mid(13);
if (keyword == "%")
{
qWarning() << "keyword '%' is not valid, which will cause QtWebEngine crash.";
return;
}
ui->applistpage_1->getSearchList(keyword);
switchPage(AppPageSearchlist);
}
else if (url.startsWith("spk://"))
{
ui->appintopage->openUrl(QUrl::fromUserInput(url));
switchPage(AppPageAppdetail); switchPage(AppPageAppdetail);
} }
else else
{ {
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B"))); QDesktopServices::openUrl(QUrl::fromUserInput(url));
} }
} }
@ -355,5 +373,5 @@ void MainWindow::on_pushButton_14_clicked()
upgradeP->waitForFinished(-1); upgradeP->waitForFinished(-1);
upgradeP->deleteLater(); }); upgradeP->deleteLater(); });
} }
} }
} }

@ -31,7 +31,7 @@ public:
explicit MainWindow(QWidget *parent = nullptr); explicit MainWindow(QWidget *parent = nullptr);
~MainWindow(); ~MainWindow();
void openUrl(QUrl); void openUrl(const QString &url);
private: private:
void initDbus(); void initDbus();

@ -56,7 +56,7 @@ void AppListPage::getAppList(QString type)
delete api; delete api;
} }
void AppListPage::getSearchList(QString keyword) void AppListPage::getSearchList(const QString &keyword)
{ {
isSearch = true; isSearch = true;
nowType = keyword; nowType = keyword;
@ -71,7 +71,7 @@ void AppListPage::getSearchList(QString keyword)
{ {
theme = "theme=light"; theme = "theme=light";
} }
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + keyword + "&" + theme; url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme;
ui->webEngineView->setUrl(url); ui->webEngineView->setUrl(url);
delete api; delete api;
} }

@ -14,7 +14,7 @@ class AppListPage : public QWidget
public: public:
void setTheme(bool dark); void setTheme(bool dark);
void getSearchList(QString keyword); void getSearchList(const QString &keyword);
void getAppList(QString type); void getAppList(QString type);
explicit AppListPage(QWidget *parent = nullptr); explicit AppListPage(QWidget *parent = nullptr);
~AppListPage(); ~AppListPage();