fix(frontend):结果列表中未被截断的项不再显示tooltip
This commit is contained in:
parent
e4658f5772
commit
ac473a8175
|
@ -42,6 +42,7 @@ set(UKUI_SEARCH_SRC
|
||||||
model/best-list-model.cpp model/best-list-model.h
|
model/best-list-model.cpp model/best-list-model.h
|
||||||
model/search-result-manager.cpp model/search-result-manager.h
|
model/search-result-manager.cpp model/search-result-manager.h
|
||||||
model/search-result-model.cpp model/search-result-model.h
|
model/search-result-model.cpp model/search-result-model.h
|
||||||
|
model/one-result.cpp model/one-result.h
|
||||||
search-app-widget-plugin/search.cpp search-app-widget-plugin/search.h
|
search-app-widget-plugin/search.cpp search-app-widget-plugin/search.h
|
||||||
ukui-search-dbus-service.cpp ukui-search-dbus-service.h
|
ukui-search-dbus-service.cpp ukui-search-dbus-service.h
|
||||||
ukui-search-gui.cpp ukui-search-gui.h
|
ukui-search-gui.cpp ukui-search-gui.h
|
||||||
|
|
|
@ -25,7 +25,6 @@ using namespace UkuiSearch;
|
||||||
BestListModel::BestListModel(QObject *parent)
|
BestListModel::BestListModel(QObject *parent)
|
||||||
: QAbstractItemModel(parent)
|
: QAbstractItemModel(parent)
|
||||||
{
|
{
|
||||||
initConnections();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QModelIndex BestListModel::index(int row, int column, const QModelIndex &parent) const
|
QModelIndex BestListModel::index(int row, int column, const QModelIndex &parent) const
|
||||||
|
@ -55,29 +54,32 @@ int BestListModel::columnCount(const QModelIndex &parent) const
|
||||||
QVariant BestListModel::data(const QModelIndex &index, int role) const
|
QVariant BestListModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
switch(role) {
|
switch(role) {
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
return m_items.at(index.row()).icon;
|
return m_items.at(index.row())->info().icon;
|
||||||
|
}
|
||||||
|
case Qt::DisplayRole: {
|
||||||
|
return m_items.at(index.row())->info().name;
|
||||||
|
}
|
||||||
|
case Qt::ToolTipRole: {
|
||||||
|
return m_items.at(index.row())->info().toolTip;
|
||||||
|
}
|
||||||
|
case AdditionalRoles::ShowToolTip: {
|
||||||
|
return m_items.at(index.row())->showToolTip();
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
case Qt::DisplayRole: {
|
|
||||||
return m_items.at(index.row()).name;
|
|
||||||
}
|
|
||||||
case Qt::ToolTipRole: {
|
|
||||||
return m_items.at(index.row()).toolTip;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return QVariant();
|
|
||||||
}
|
|
||||||
return QVariant();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const SearchPluginIface::ResultInfo &BestListModel::getInfo(const QModelIndex &index)
|
const SearchPluginIface::ResultInfo &BestListModel::getInfo(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
return m_items.at(index.row());
|
return m_items.at(index.row())->info();
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString &BestListModel::getPluginInfo(const QModelIndex &index)
|
const QString &BestListModel::getPluginInfo(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
return m_plugin_id_list.at(index.row());
|
return m_pluginIdList.at(index.row());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BestListModel::setExpanded(const bool &is_expanded)
|
void BestListModel::setExpanded(const bool &is_expanded)
|
||||||
|
@ -93,47 +95,25 @@ const bool &BestListModel::isExpanded()
|
||||||
return m_isExpanded;
|
return m_isExpanded;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList BestListModel::getActions(const QModelIndex &index)
|
|
||||||
{
|
|
||||||
// if (m_item->m_result_info_list.length() > index.row() && index.row() >= 0)
|
|
||||||
// return m_item->m_result_info_list.at(index.row()).actionList;
|
|
||||||
Q_UNUSED(index)
|
|
||||||
return QStringList();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString BestListModel::getKey(const QModelIndex &index)
|
|
||||||
{
|
|
||||||
if (m_items.length() > index.row() && index.row() >= 0)
|
|
||||||
return m_items.at(index.row()).actionKey;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BestListModel::appendInfo(const QString &pluginId, const SearchPluginIface::ResultInfo &info)
|
void BestListModel::appendInfo(const QString &pluginId, const SearchPluginIface::ResultInfo &info)
|
||||||
{
|
{
|
||||||
if (m_plugin_action_key_list.contains(info.actionKey)) {
|
if (m_pluginIdList.contains(pluginId)) {
|
||||||
// qDebug() << "plugin ID:" << pluginId << "name:" << info.name << "action key:" << info.actionKey << "is same with pre-result!";
|
if (info.actionKey == m_items.at(m_pluginIdList.lastIndexOf(pluginId))->info().actionKey) {
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
m_plugin_action_key_list.append(info.actionKey);
|
|
||||||
}
|
|
||||||
if (m_plugin_id_list.contains(pluginId)) {
|
|
||||||
if (info.name == m_items.at(m_plugin_id_list.lastIndexOf(pluginId)).name) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// qDebug()<<"plugin ID:"<<pluginId<<"Repalce result. name ="<<info.name;
|
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
m_items.replace(m_plugin_id_list.lastIndexOf(pluginId), info);
|
delete m_items.takeAt(m_pluginIdList.lastIndexOf(pluginId));
|
||||||
|
m_items.insert(m_pluginIdList.lastIndexOf(pluginId), new OneResult(info));
|
||||||
this->endResetModel();
|
this->endResetModel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
// qDebug()<<"plugin ID:"<<pluginId<<"Got a result. name ="<<info.name;
|
// qDebug()<<"plugin ID:"<<pluginId<<"Got a result. name ="<<info.name;
|
||||||
m_plugin_id_list.append(pluginId);
|
m_pluginIdList.append(pluginId);
|
||||||
m_items.append(info);
|
m_items.append(new OneResult(info));
|
||||||
QVector<SearchPluginIface::ResultInfo> result_info_list_tmp;
|
QVector<OneResult *> result_info_list_tmp;
|
||||||
QVector<QString> plugin_id_list_tmp;
|
QVector<QString> plugin_id_list_tmp;
|
||||||
|
|
||||||
|
|
||||||
QList<PluginInfo> infoList = SearchPluginManager::getInstance()->getPluginIds();
|
QList<PluginInfo> infoList = SearchPluginManager::getInstance()->getPluginIds();
|
||||||
QVector<QString> orders(infoList.length());
|
QVector<QString> orders(infoList.length());
|
||||||
for (const PluginInfo& info : infoList) {
|
for (const PluginInfo& info : infoList) {
|
||||||
|
@ -148,15 +128,15 @@ void BestListModel::appendInfo(const QString &pluginId, const SearchPluginIface:
|
||||||
orders.removeAll("");
|
orders.removeAll("");
|
||||||
|
|
||||||
Q_FOREACH (const QString& plugin, orders) {
|
Q_FOREACH (const QString& plugin, orders) {
|
||||||
if (m_plugin_id_list.contains(plugin)) {
|
if (m_pluginIdList.contains(plugin)) {
|
||||||
result_info_list_tmp.append(m_items.at(m_plugin_id_list.lastIndexOf(plugin)));
|
result_info_list_tmp.append(m_items.at(m_pluginIdList.lastIndexOf(plugin)));
|
||||||
plugin_id_list_tmp.append(plugin);
|
plugin_id_list_tmp.append(plugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
m_items.swap(result_info_list_tmp);
|
m_items.swap(result_info_list_tmp);
|
||||||
m_plugin_id_list.clear();
|
m_pluginIdList.clear();
|
||||||
m_plugin_id_list.swap(plugin_id_list_tmp);
|
m_pluginIdList.swap(plugin_id_list_tmp);
|
||||||
this->endResetModel();
|
this->endResetModel();
|
||||||
Q_EMIT this->itemListChanged(m_items.length());
|
Q_EMIT this->itemListChanged(m_items.length());
|
||||||
|
|
||||||
|
@ -165,12 +145,12 @@ void BestListModel::appendInfo(const QString &pluginId, const SearchPluginIface:
|
||||||
void BestListModel::removeInfo(const QString &pluginId)
|
void BestListModel::removeInfo(const QString &pluginId)
|
||||||
{
|
{
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
int index = m_plugin_id_list.lastIndexOf(pluginId);
|
int index = m_pluginIdList.lastIndexOf(pluginId);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_items.removeAt(index);
|
m_items.removeAt(index);
|
||||||
m_plugin_id_list.removeAll(pluginId);
|
m_pluginIdList.removeAll(pluginId);
|
||||||
this->endResetModel();
|
this->endResetModel();
|
||||||
Q_EMIT this->itemListChanged(m_items.length());
|
Q_EMIT this->itemListChanged(m_items.length());
|
||||||
}
|
}
|
||||||
|
@ -178,19 +158,19 @@ void BestListModel::removeInfo(const QString &pluginId)
|
||||||
void BestListModel::moveInfo(const QString &pluginName, const int pos)
|
void BestListModel::moveInfo(const QString &pluginName, const int pos)
|
||||||
{
|
{
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
int index = m_plugin_id_list.lastIndexOf(pluginName);
|
int index = m_pluginIdList.lastIndexOf(pluginName);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_plugin_id_list.removeAll(pluginName);
|
m_pluginIdList.removeAll(pluginName);
|
||||||
if (pos > m_plugin_id_list.size()) {
|
if (pos > m_pluginIdList.size()) {
|
||||||
m_plugin_id_list.append(pluginName);
|
m_pluginIdList.append(pluginName);
|
||||||
} else {
|
} else {
|
||||||
m_plugin_id_list.insert(pos - 1, pluginName);
|
m_pluginIdList.insert(pos - 1, pluginName);
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchPluginIface::ResultInfo info = m_items.at(index);
|
OneResult *info = m_items.at(index);
|
||||||
m_items.removeAt(index);
|
m_items.removeAt(index);
|
||||||
if (pos > m_items.size()) {
|
if (pos > m_items.size()) {
|
||||||
m_items.append(info);
|
m_items.append(info);
|
||||||
|
@ -205,21 +185,30 @@ void BestListModel::startSearch(const QString &keyword)
|
||||||
Q_UNUSED(keyword)
|
Q_UNUSED(keyword)
|
||||||
if (!m_items.isEmpty()) {
|
if (!m_items.isEmpty()) {
|
||||||
this->beginResetModel();
|
this->beginResetModel();
|
||||||
m_plugin_id_list.clear();
|
m_pluginIdList.clear();
|
||||||
m_plugin_action_key_list.clear();
|
m_pluginActionKeyList.clear();
|
||||||
|
qDeleteAll(m_items);
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
this->endResetModel();
|
this->endResetModel();
|
||||||
Q_EMIT this->itemListChanged(m_items.length());
|
Q_EMIT this->itemListChanged(m_items.length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BestListModel::initConnections()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
BestListModel::~BestListModel()
|
BestListModel::~BestListModel()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(m_items);
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
m_items.squeeze();
|
m_items.squeeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BestListModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
{
|
||||||
|
if(!index.isValid() || index.row() >= m_items.length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(role == ShowToolTip) {
|
||||||
|
m_items.at(index.row())->setShowToolTip(value.toBool());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,7 @@ public:
|
||||||
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||||
|
|
||||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||||
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||||
|
|
||||||
const SearchPluginIface::ResultInfo & getInfo(const QModelIndex&);
|
const SearchPluginIface::ResultInfo & getInfo(const QModelIndex&);
|
||||||
const QString & getPluginInfo(const QModelIndex&);
|
const QString & getPluginInfo(const QModelIndex&);
|
||||||
|
@ -47,13 +48,10 @@ public:
|
||||||
void setExpanded(const bool&);
|
void setExpanded(const bool&);
|
||||||
const bool &isExpanded();
|
const bool &isExpanded();
|
||||||
|
|
||||||
QStringList getActions(const QModelIndex &);
|
|
||||||
QString getKey(const QModelIndex &);
|
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void appendInfo(const QString &, const SearchPluginIface::ResultInfo &);
|
void appendInfo(const QString &, const SearchPluginIface::ResultInfo &);
|
||||||
void removeInfo(const QString &);
|
void removeInfo(const QString &);
|
||||||
void moveInfo(const QString &pluginName, const int pos);
|
void moveInfo(const QString &pluginName, int pos);
|
||||||
void startSearch(const QString &);
|
void startSearch(const QString &);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
|
@ -61,10 +59,9 @@ Q_SIGNALS:
|
||||||
void itemListChanged(const int&);
|
void itemListChanged(const int&);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initConnections();
|
QVector<OneResult *> m_items;
|
||||||
QVector<SearchPluginIface::ResultInfo> m_items;
|
QVector<QString> m_pluginIdList;
|
||||||
QVector<QString> m_plugin_id_list;
|
QVector<QString> m_pluginActionKeyList;
|
||||||
QVector<QString> m_plugin_action_key_list;
|
|
||||||
bool m_isExpanded = false;
|
bool m_isExpanded = false;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024, 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "one-result.h"
|
||||||
|
|
||||||
|
using namespace UkuiSearch;
|
||||||
|
|
||||||
|
UkuiSearch::OneResult::OneResult(const UkuiSearch::SearchPluginIface::ResultInfo &ri) : m_info(ri)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void OneResult::setShowToolTip(bool show)
|
||||||
|
{
|
||||||
|
m_showToolTip = show;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OneResult::showToolTip() const
|
||||||
|
{
|
||||||
|
return m_showToolTip;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SearchPluginIface::ResultInfo &OneResult::info() const
|
||||||
|
{
|
||||||
|
return m_info;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024, 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Authors: iaom <zhangpengfei@kylinos.cn>
|
||||||
|
*/
|
||||||
|
#ifndef UKUI_SEARCH_ONE_RESULT_H
|
||||||
|
#define UKUI_SEARCH_ONE_RESULT_H
|
||||||
|
|
||||||
|
#include "search-plugin-iface.h"
|
||||||
|
namespace UkuiSearch {
|
||||||
|
Q_NAMESPACE
|
||||||
|
enum AdditionalRoles {
|
||||||
|
ShowToolTip = Qt::UserRole + 1,
|
||||||
|
};
|
||||||
|
Q_ENUM_NS(AdditionalRoles)
|
||||||
|
|
||||||
|
class OneResult {
|
||||||
|
public:
|
||||||
|
explicit OneResult(const SearchPluginIface::ResultInfo &ri);
|
||||||
|
|
||||||
|
void setShowToolTip(bool show);
|
||||||
|
[[nodiscard]] bool showToolTip() const;
|
||||||
|
[[nodiscard]] const SearchPluginIface::ResultInfo &info() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SearchPluginIface::ResultInfo m_info;
|
||||||
|
bool m_showToolTip = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif //UKUI_SEARCH_ONE_RESULT_H
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (C) 2020, KylinSoft Co., Ltd.
|
* Copyright (C) 2020, KylinSoft Co., Ltd.
|
||||||
*
|
*
|
||||||
|
@ -18,6 +18,7 @@
|
||||||
* Authors: zhangjiaping <zhangjiaping@kylinos.cn>
|
* Authors: zhangjiaping <zhangjiaping@kylinos.cn>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#include <QMetaEnum>
|
||||||
#include "search-result-model.h"
|
#include "search-result-model.h"
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
|
|
||||||
|
@ -63,30 +64,32 @@ QVariant SearchResultModel::data(const QModelIndex &index, int role) const
|
||||||
}
|
}
|
||||||
switch(role) {
|
switch(role) {
|
||||||
case Qt::DecorationRole: {
|
case Qt::DecorationRole: {
|
||||||
return m_items.at(index.row()).icon;
|
return m_items.at(index.row())->info().icon;
|
||||||
}
|
}
|
||||||
case Qt::DisplayRole: {
|
case Qt::DisplayRole: {
|
||||||
return m_items.at(index.row()).name;
|
return m_items.at(index.row())->info().name;
|
||||||
}
|
}
|
||||||
case Qt::ToolTipRole: {
|
case Qt::ToolTipRole: {
|
||||||
return m_items.at(index.row()).toolTip;
|
return m_items.at(index.row())->info().toolTip;
|
||||||
|
}
|
||||||
|
case AdditionalRoles::ShowToolTip: {
|
||||||
|
return m_items.at(index.row())->showToolTip();
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return {};
|
||||||
}
|
}
|
||||||
return QVariant();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchResultModel::appendInfo(const SearchPluginIface::ResultInfo &info)//TODO 代码逻辑可尝试梳理优化
|
void SearchResultModel::appendInfo(const SearchPluginIface::ResultInfo &info)//TODO 代码逻辑可尝试梳理优化
|
||||||
{
|
{
|
||||||
if (m_items.length() > 5 //搜索结果大于5个并且搜索结果处于收起状态时只存储数据无需刷新UI
|
if (m_items.length() > 5 //搜索结果大于5个并且搜索结果处于收起状态时只存储数据无需刷新UI
|
||||||
and !m_isExpanded) {
|
and !m_isExpanded) {
|
||||||
m_items.append(info);
|
m_items.append(new OneResult(info));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (m_items.length() > 50
|
if (m_items.length() > 50
|
||||||
and m_isExpanded) {//搜索结果大于50个并且搜索结果处于展开状态时只存储数据并启动定时,500ms刷新一次UI
|
and m_isExpanded) {//搜索结果大于50个并且搜索结果处于展开状态时只存储数据并启动定时,500ms刷新一次UI
|
||||||
m_items.append(info);
|
m_items.append(new OneResult(info));
|
||||||
if (!m_timer->isActive()) {
|
if (!m_timer->isActive()) {
|
||||||
m_timer->start();
|
m_timer->start();
|
||||||
}
|
}
|
||||||
|
@ -94,12 +97,12 @@ void SearchResultModel::appendInfo(const SearchPluginIface::ResultInfo &info)//T
|
||||||
}
|
}
|
||||||
// this->beginResetModel();
|
// this->beginResetModel();
|
||||||
beginInsertRows(QModelIndex(), m_items.length(), m_items.length());
|
beginInsertRows(QModelIndex(), m_items.length(), m_items.length());
|
||||||
m_items.append(info);
|
m_items.append(new OneResult(info));
|
||||||
// this->endResetModel();
|
// this->endResetModel();
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
Q_EMIT this->itemListChanged(m_items.length());
|
Q_EMIT this->itemListChanged(m_items.length());
|
||||||
if (m_plugin_id != "Web Page") {
|
if (m_plugin_id != "Web Page") {
|
||||||
Q_EMIT this->sendBestListData(m_plugin_id, m_items.at(0));
|
Q_EMIT this->sendBestListData(m_plugin_id, m_items.at(0)->info());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +129,7 @@ void SearchResultModel::initConnections()
|
||||||
|
|
||||||
const SearchPluginIface::ResultInfo &SearchResultModel::getInfo(const QModelIndex &index)
|
const SearchPluginIface::ResultInfo &SearchResultModel::getInfo(const QModelIndex &index)
|
||||||
{
|
{
|
||||||
return m_items.at(index.row());
|
return m_items.at(index.row())->info();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchResultModel::setExpanded(const bool &is_expanded)
|
void SearchResultModel::setExpanded(const bool &is_expanded)
|
||||||
|
@ -151,6 +154,7 @@ void SearchResultModel::refresh()
|
||||||
void SearchResultModel::stopSearchSlot()
|
void SearchResultModel::stopSearchSlot()
|
||||||
{
|
{
|
||||||
beginResetModel();
|
beginResetModel();
|
||||||
|
qDeleteAll(m_items);
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
m_items.squeeze();
|
m_items.squeeze();
|
||||||
endResetModel();
|
endResetModel();
|
||||||
|
@ -159,6 +163,30 @@ void SearchResultModel::stopSearchSlot()
|
||||||
|
|
||||||
SearchResultModel::~SearchResultModel()
|
SearchResultModel::~SearchResultModel()
|
||||||
{
|
{
|
||||||
|
qDeleteAll(m_items);
|
||||||
m_items.clear();
|
m_items.clear();
|
||||||
m_items.squeeze();
|
m_items.squeeze();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHash<int, QByteArray> SearchResultModel::roleNames() const
|
||||||
|
{
|
||||||
|
QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
|
||||||
|
QMetaEnum e = metaObject()->enumerator(metaObject()->indexOfEnumerator("AdditionalRoles"));
|
||||||
|
|
||||||
|
for (int i = 0; i < e.keyCount(); ++i) {
|
||||||
|
roles.insert(e.value(i), e.key(i));
|
||||||
|
}
|
||||||
|
return roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SearchResultModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
|
{
|
||||||
|
if(!index.isValid() || index.row() >= m_items.length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(role == ShowToolTip) {
|
||||||
|
m_items.at(index.row())->setShowToolTip(value.toBool());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#define SEARCHRESULTMODEL_H
|
#define SEARCHRESULTMODEL_H
|
||||||
#include <QAbstractItemModel>
|
#include <QAbstractItemModel>
|
||||||
#include "search-result-manager.h"
|
#include "search-result-manager.h"
|
||||||
|
#include "one-result.h"
|
||||||
|
|
||||||
#define NUM_LIMIT_SHOWN_DEFAULT 5
|
#define NUM_LIMIT_SHOWN_DEFAULT 5
|
||||||
|
|
||||||
|
@ -31,14 +32,16 @@ class SearchResultModel : public QAbstractItemModel
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
SearchResultModel(const QString &plugin_id);
|
explicit SearchResultModel(const QString &plugin_id);
|
||||||
~SearchResultModel();
|
~SearchResultModel() override;
|
||||||
|
QHash<int, QByteArray> roleNames() const override;
|
||||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
|
||||||
QModelIndex parent(const QModelIndex &child) const override;
|
QModelIndex parent(const QModelIndex &child) const override;
|
||||||
int rowCount(const QModelIndex &parent) const override;
|
int rowCount(const QModelIndex &parent) const override;
|
||||||
int columnCount(const QModelIndex &parent) const override;
|
int columnCount(const QModelIndex &parent) const override;
|
||||||
QVariant data(const QModelIndex &index, int role) const override;
|
QVariant data(const QModelIndex &index, int role) const override;
|
||||||
// bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex())override;
|
bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||||
|
|
||||||
const SearchPluginIface::ResultInfo & getInfo(const QModelIndex&);
|
const SearchPluginIface::ResultInfo & getInfo(const QModelIndex&);
|
||||||
void setExpanded(const bool&);
|
void setExpanded(const bool&);
|
||||||
const bool &isExpanded();
|
const bool &isExpanded();
|
||||||
|
@ -56,7 +59,7 @@ Q_SIGNALS:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initConnections();
|
void initConnections();
|
||||||
QVector<SearchPluginIface::ResultInfo> m_items;
|
QVector<OneResult*> m_items;
|
||||||
QString m_plugin_id;
|
QString m_plugin_id;
|
||||||
SearchResultManager * m_search_manager = nullptr;
|
SearchResultManager * m_search_manager = nullptr;
|
||||||
bool m_isExpanded = false;
|
bool m_isExpanded = false;
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#include <QToolTip>
|
||||||
#include "best-list-view.h"
|
#include "best-list-view.h"
|
||||||
#define MAIN_MARGINS 0,0,0,0
|
#define MAIN_MARGINS 0,0,0,0
|
||||||
#define MAIN_SPACING 0
|
#define MAIN_SPACING 0
|
||||||
|
@ -247,6 +248,20 @@ bool BestListView::viewportEvent(QEvent *event)
|
||||||
QApplication::sendEvent(parent(), &me);
|
QApplication::sendEvent(parent(), &me);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if(event->type() == QEvent::ToolTip) {
|
||||||
|
auto* helpEvent = dynamic_cast<QHelpEvent*>(event);
|
||||||
|
QModelIndex index = indexAt(helpEvent->pos());
|
||||||
|
if (!index.isValid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index.data(AdditionalRoles::ShowToolTip).toBool()) {
|
||||||
|
QToolTip::showText(helpEvent->globalPos(), index.data(Qt::ToolTipRole).toString(), this, visualRect(index));
|
||||||
|
} else {
|
||||||
|
QToolTip::hideText();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return QTreeView::viewportEvent(event);
|
return QTreeView::viewportEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,10 +55,10 @@ public Q_SLOTS:
|
||||||
const bool &isExpanded();
|
const bool &isExpanded();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent *event);
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
void mouseReleaseEvent(QMouseEvent * event);
|
void mouseReleaseEvent(QMouseEvent * event) override;
|
||||||
void mouseMoveEvent(QMouseEvent *event);
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
bool viewportEvent(QEvent *event);
|
bool viewportEvent(QEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initConnections();
|
void initConnections();
|
||||||
|
|
|
@ -22,6 +22,8 @@
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QPen>
|
#include <QPen>
|
||||||
#include <QStyleFactory>
|
#include <QStyleFactory>
|
||||||
|
#include <QTreeView>
|
||||||
|
#include "search-result-model.h"
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
static ResultItemStyle *global_instance_of_item_style = nullptr;
|
static ResultItemStyle *global_instance_of_item_style = nullptr;
|
||||||
|
|
||||||
|
@ -44,7 +46,7 @@ void ResultViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
|
||||||
initStyleOption(&opt, index);
|
initStyleOption(&opt, index);
|
||||||
opt.displayAlignment = Qt::Alignment(Qt::AlignLeft|Qt::AlignVCenter);
|
opt.displayAlignment = Qt::Alignment(Qt::AlignLeft|Qt::AlignVCenter);
|
||||||
|
|
||||||
QString text = opt.text;
|
QString originalText = opt.text;
|
||||||
opt.text = QString();
|
opt.text = QString();
|
||||||
|
|
||||||
QStyle *style = opt.widget->style();
|
QStyle *style = opt.widget->style();
|
||||||
|
@ -52,9 +54,22 @@ void ResultViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
|
||||||
|
|
||||||
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, opt.widget);
|
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, opt.widget);
|
||||||
QFontMetrics fontMetrics(opt.font);
|
QFontMetrics fontMetrics(opt.font);
|
||||||
text = fontMetrics.elidedText(text, Qt::ElideRight, textRect.width() - m_textDoc->documentMargin() - 1); //富余5px的宽度
|
QString text = fontMetrics.elidedText(originalText, Qt::ElideRight, textRect.width() - m_textDoc->documentMargin() - 1); //富余5px的宽度
|
||||||
|
|
||||||
|
//无需显示tooltip时,将状态位写回model
|
||||||
|
auto view = qobject_cast<QTreeView *>(this->parent());
|
||||||
|
if(text == originalText && originalText == index.data(Qt::ToolTipRole).toString()) {
|
||||||
|
if(view) {
|
||||||
|
view->model()->setData(index, false, AdditionalRoles::ShowToolTip);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(view) {
|
||||||
|
view->model()->setData(index, true, AdditionalRoles::ShowToolTip);
|
||||||
|
}
|
||||||
|
}
|
||||||
opt.text = text;
|
opt.text = text;
|
||||||
|
|
||||||
|
|
||||||
painter->save();
|
painter->save();
|
||||||
|
|
||||||
if(opt.state & QStyle::State_Selected) {
|
if(opt.state & QStyle::State_Selected) {
|
||||||
|
|
|
@ -54,6 +54,7 @@ public:
|
||||||
explicit ResultViewDelegate(QObject *parent = nullptr);
|
explicit ResultViewDelegate(QObject *parent = nullptr);
|
||||||
~ResultViewDelegate() = default;
|
~ResultViewDelegate() = default;
|
||||||
void setSearchKeyword(const QString &);
|
void setSearchKeyword(const QString &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
|
void paint(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const override;
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
#include <QToolTip>
|
||||||
#include "result-view.h"
|
#include "result-view.h"
|
||||||
#define MAIN_MARGINS 0,0,0,0
|
#define MAIN_MARGINS 0,0,0,0
|
||||||
#define MAIN_SPACING 0
|
#define MAIN_SPACING 0
|
||||||
|
@ -416,6 +417,20 @@ bool ResultView::viewportEvent(QEvent *event)
|
||||||
QApplication::sendEvent(parent(), &me);
|
QApplication::sendEvent(parent(), &me);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if(event->type() == QEvent::ToolTip) {
|
||||||
|
auto* helpEvent = dynamic_cast<QHelpEvent*>(event);
|
||||||
|
QModelIndex index = indexAt(helpEvent->pos());
|
||||||
|
if (!index.isValid()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index.data(AdditionalRoles::ShowToolTip).toBool()) {
|
||||||
|
QToolTip::showText(helpEvent->globalPos(), index.data(Qt::ToolTipRole).toString(), this, visualRect(index));
|
||||||
|
} else {
|
||||||
|
QToolTip::hideText();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return QTreeView::viewportEvent(event);
|
return QTreeView::viewportEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue