Skip to content

Commit 87c7dad

Browse files
committed
Plugins::WebBrowser: add custom command
1 parent 1164f4d commit 87c7dad

4 files changed

Lines changed: 111 additions & 55 deletions

File tree

Plugins/WebBrowser/AddressCompleter.cpp

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
#include <QSqlError>
1010
#include <QScrollBar>
1111
#include <QLoggingCategory>
12-
12+
#include <algorithm>
1313
#include "AddressCompleter.h"
1414
#include "AutoCompleteLineEdit.h"
15+
#include "HistoryDatabase.h"
1516

1617
static Q_LOGGING_CATEGORY(log, "WebBrowser.Address")
1718
CAddressCompleterItem::CAddressCompleterItem(const QString &title,
@@ -60,7 +61,8 @@ CAddressCompleter::CAddressCompleter(QWidget *parent)
6061
, m_maxVisibleItems(8)
6162
, m_isCompleterVisible(false)
6263
{
63-
m_szEnter = tr("Enter a website URL or search content ......");
64+
m_szEnter = tr("Enter a website URL or search content ......") + "\n" +
65+
tr("Enter '@' show commands");
6466
m_szLineEditToolTip = m_szEnter + "\n\n"
6567
+ tr("Enter ↲ key: Apply current url");
6668

@@ -264,18 +266,40 @@ void CAddressCompleter::performSearch()
264266
m_pListWidget->clear();
265267
m_currentSelectedIndex = -1;
266268

267-
// TODO: 增加 “@” 命令
269+
// 增加 “@” 命令
268270
if(keyword.startsWith('@')) {
269-
QListWidgetItem *item = new QListWidgetItem(m_pListWidget);
270-
item->setSizeHint(QSize(0, 40));
271-
item->setData(Qt::UserRole, "@search:");
272-
CAddressCompleterItem *pCompleterItem = new CAddressCompleterItem(
273-
tr("Use default search engine"),
274-
"@search:",
275-
QIcon(":/icons/search.png")
276-
);
277-
if(pCompleterItem)
278-
m_pListWidget->setItemWidget(item, pCompleterItem);
271+
QList<Command> lstCommonds;
272+
lstCommonds << Command{tr("Search"), "@search:", QIcon::fromTheme("system-search")};
273+
lstCommonds << Command{tr("Setting"), "@setting", QIcon::fromTheme("system-settings")};
274+
lstCommonds << Command{tr("History"), "@history", QIcon()};
275+
lstCommonds << Command{tr("Bookmarks"), "@bookmarks", QIcon::fromTheme("user-bookmarks")};
276+
277+
// 根据 keyword 进行排序
278+
std::sort(lstCommonds.begin(), lstCommonds.end(), [keyword](Command a, Command b){
279+
// 1. 完全匹配的排在最前面
280+
if (a.cmd.startsWith(keyword) && !b.cmd.startsWith(keyword))
281+
return true;
282+
if (!a.cmd.startsWith(keyword) && b.cmd.startsWith(keyword))
283+
return false;
284+
285+
// 2. 包含关键字的排在前面
286+
bool aContains = a.cmd.contains(keyword, Qt::CaseInsensitive);
287+
bool bContains = b.cmd.contains(keyword, Qt::CaseInsensitive);
288+
if (aContains && !bContains) return true;
289+
if (!aContains && bContains) return false;
290+
291+
// 3. 否则按字母顺序排序
292+
return a.cmd < b.cmd;
293+
});
294+
foreach(auto cmd, lstCommonds) {
295+
QListWidgetItem *item = new QListWidgetItem(m_pListWidget);
296+
item->setSizeHint(QSize(0, 40));
297+
item->setData(Qt::UserRole, cmd.cmd);
298+
CAddressCompleterItem *pCompleterItem = new CAddressCompleterItem(
299+
cmd.title, cmd.cmd, cmd.icon);
300+
if(pCompleterItem)
301+
m_pListWidget->setItemWidget(item, pCompleterItem);
302+
}
279303
}
280304

281305
// 搜索历史记录
@@ -402,10 +426,12 @@ void CAddressCompleter::onItemClicked(QListWidgetItem *item)
402426
// 处理搜索请求
403427
if (url.startsWith("@search:", Qt::CaseInsensitive)) {
404428
QString keyword = url.mid(8);
405-
qDebug(log) << "emit searchRequested:" << keyword;
429+
//qDebug(log) << "emit searchRequested:" << keyword;
406430
emit searchRequested(keyword);
407-
} else {
408-
qDebug(log) << "emit urlSelected:" << url;
431+
} if(url.startsWith("@")) {
432+
emit sigCommand(url);
433+
}else {
434+
//qDebug(log) << "emit urlSelected:" << url;
409435
emit urlSelected(url);
410436
}
411437

@@ -561,7 +587,7 @@ QIcon CAddressCompleter::getIconForUrl(const QString &url)
561587
static QIcon defaultIcon;
562588
static QIcon httpIcon;
563589
static QIcon httpsIcon;
564-
static QIcon searchIcon; // = QIcon::fromTheme(QIcon::ThemeIcon::SystemSearch);
590+
static QIcon searchIcon = QIcon::fromTheme("system-search");
565591

566592
if (url.startsWith("https://")) {
567593
return httpsIcon;

Plugins/WebBrowser/AddressCompleter.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include <QVBoxLayout>
99
#include <QTimer>
1010
#include <QSqlDatabase>
11+
#include <QIcon>
1112
#include <QPropertyAnimation>
12-
#include "History/HistoryDatabase.h"
1313

1414
/*!
1515
* \~chinese 浏览器的地址栏自动完成功能
@@ -48,6 +48,7 @@ class CAddressCompleter : public QWidget
4848
signals:
4949
void urlSelected(const QString &url);
5050
void searchRequested(const QString &keyword);
51+
void sigCommand(const QString& szCmd);
5152

5253
protected:
5354
bool eventFilter(QObject *watched, QEvent *event) override;
@@ -70,6 +71,13 @@ private Q_SLOTS:
7071
QIcon getIconForUrl(const QString &url);
7172
void addSearchSuggestions(const QString &keyword);
7273

74+
struct Command
75+
{
76+
QString title;
77+
QString cmd;
78+
QIcon icon;
79+
};
80+
7381
private:
7482
QLineEdit *m_pLineEdit;
7583
QString m_szEnter;

Plugins/WebBrowser/FrmWebBrowser.cpp

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#include <QWebEngineProfileBuilder>
2525
#endif
2626
#include <QLoggingCategory>
27-
#include "FrmWebBrowser.h"
27+
2828
#include "RabbitCommonDir.h"
2929
#include "RabbitCommonTools.h"
3030
#include "FrmPopup.h"
@@ -34,6 +34,8 @@
3434
#include "AutoCompleteLineEdit.h"
3535
#include "FrmBookmark.h"
3636
#include "FrmAddBookmark.h"
37+
#include "DlgSettings.h"
38+
#include "FrmWebBrowser.h"
3739

3840
static Q_LOGGING_CATEGORY(log, "WebBrowser.Browser")
3941
CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidget *parent)
@@ -181,6 +183,18 @@ CFrmWebBrowser::CFrmWebBrowser(CParameterWebBrowser *pPara, bool bMenuBar, QWidg
181183
}
182184
});
183185
Q_ASSERT(check);
186+
check = connect(pAddressCompleter, &CAddressCompleter::sigCommand,
187+
this, [&](const QString& cmd) {
188+
if(cmd.startsWith("@setting")) {
189+
CDlgSettings dlg(m_pPara);
190+
RC_SHOW_WINDOW(&dlg);
191+
} else if(cmd.startsWith("@history")) {
192+
slotHistory();
193+
} else if(cmd.startsWith("@bookmark")) {
194+
slotBookmark();
195+
}
196+
});
197+
Q_ASSERT(check);
184198

185199
m_pAddBookmark = m_pToolBar->addAction(
186200
QIcon::fromTheme("user-bookmarks"),
@@ -773,42 +787,8 @@ int CFrmWebBrowser::InitMenu(QMenu *pMenu)
773787
pMenuBookmark->setIcon(QIcon::fromTheme("user-bookmarks"));
774788
pMenu->addMenu(pMenuBookmark);
775789
pMenuBookmark->addAction(m_pAddBookmark);
776-
pMenuBookmark->addAction(tr("Manage Bookmark "), this, [&]{
777-
CFrmBookmark* pBookmark = new CFrmBookmark(m_pPara);
778-
if(!pBookmark) return;
779-
pBookmark->setAttribute(Qt::WA_DeleteOnClose);
780-
connect(this, &CFrmWebBrowser::destroyed, pBookmark, &CFrmBookmark::close);
781-
connect(pBookmark, &CFrmBookmark::openUrlRequested, this, [&](const QString& url) {
782-
CFrmWebView* pWeb = CurrentView();
783-
if(!pWeb) {
784-
pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
785-
}
786-
if(pWeb)
787-
pWeb->load(url);
788-
});
789-
RC_SHOW_WINDOW(pBookmark);
790-
});
791-
pMenu->addAction(tr("History"), this, [&]() {
792-
CFrmHistory* pHistory = new CFrmHistory(m_pPara);
793-
if(!pHistory) return;
794-
pHistory->setAttribute(Qt::WA_DeleteOnClose);
795-
connect(this, &CFrmWebBrowser::destroyed, pHistory, &CFrmHistory::close);
796-
connect(pHistory, &CFrmHistory::sigOpenUrl, this, [&](const QString& url) {
797-
CFrmWebView* pWeb = CurrentView();
798-
if(!pWeb) {
799-
pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
800-
}
801-
if(pWeb)
802-
pWeb->load(url);
803-
});
804-
connect(pHistory, &CFrmHistory::sigOpenUrlInNewTab,
805-
this, [&](const QString& url) {
806-
auto pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
807-
if(pWeb)
808-
pWeb->load(url);
809-
});
810-
RC_SHOW_WINDOW(pHistory);
811-
});
790+
pMenuBookmark->addAction(tr("Manage Bookmark "), this, &CFrmWebBrowser::slotBookmark);
791+
pMenu->addAction(tr("History"), this, &CFrmWebBrowser::slotHistory);
812792

813793
pMenu->addSeparator();
814794
m_pCapturePage = pMenu->addAction(
@@ -1300,3 +1280,43 @@ void CFrmWebBrowser::slotAddBookmark()
13001280
Q_ASSERT(check);
13011281
RC_SHOW_WINDOW(pAdd);
13021282
}
1283+
1284+
void CFrmWebBrowser::slotBookmark()
1285+
{
1286+
CFrmBookmark* pBookmark = new CFrmBookmark(m_pPara);
1287+
if(!pBookmark) return;
1288+
pBookmark->setAttribute(Qt::WA_DeleteOnClose);
1289+
connect(this, &CFrmWebBrowser::destroyed, pBookmark, &CFrmBookmark::close);
1290+
connect(pBookmark, &CFrmBookmark::openUrlRequested, this, [&](const QString& url) {
1291+
CFrmWebView* pWeb = CurrentView();
1292+
if(!pWeb) {
1293+
pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
1294+
}
1295+
if(pWeb)
1296+
pWeb->load(url);
1297+
});
1298+
RC_SHOW_WINDOW(pBookmark);
1299+
}
1300+
1301+
void CFrmWebBrowser::slotHistory()
1302+
{
1303+
CFrmHistory* pHistory = new CFrmHistory(m_pPara);
1304+
if(!pHistory) return;
1305+
pHistory->setAttribute(Qt::WA_DeleteOnClose);
1306+
connect(this, &CFrmWebBrowser::destroyed, pHistory, &CFrmHistory::close);
1307+
connect(pHistory, &CFrmHistory::sigOpenUrl, this, [&](const QString& url) {
1308+
CFrmWebView* pWeb = CurrentView();
1309+
if(!pWeb) {
1310+
pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
1311+
}
1312+
if(pWeb)
1313+
pWeb->load(url);
1314+
});
1315+
connect(pHistory, &CFrmHistory::sigOpenUrlInNewTab,
1316+
this, [&](const QString& url) {
1317+
auto pWeb = qobject_cast<CFrmWebView*>(CreateWindow(QWebEnginePage::WebBrowserTab));
1318+
if(pWeb)
1319+
pWeb->load(url);
1320+
});
1321+
RC_SHOW_WINDOW(pHistory);
1322+
}

Plugins/WebBrowser/FrmWebBrowser.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ private Q_SLOTS:
6969
void slotRecordTimeout();
7070

7171
void slotAddBookmark();
72+
void slotBookmark();
73+
void slotHistory();
7274

7375
public Q_SLOTS:
7476
void slotFullScreen(bool bFullScreen);

0 commit comments

Comments
 (0)