2021-05-22 21:29:43 +08:00
|
|
|
#include "result-view.h"
|
|
|
|
#define MAIN_MARGINS 0,0,0,0
|
|
|
|
#define MAIN_SPACING 0
|
|
|
|
#define TITLE_HEIGHT 30
|
2021-05-27 10:25:15 +08:00
|
|
|
#define UNFOLD_LABEL_HEIGHT 30
|
2021-05-22 21:29:43 +08:00
|
|
|
|
|
|
|
using namespace Zeeker;
|
|
|
|
ResultWidget::ResultWidget(const QString &plugin_id, QWidget *parent) : QWidget(parent)
|
|
|
|
{
|
|
|
|
m_plugin_id = plugin_id;
|
|
|
|
this->initUi();
|
|
|
|
initConnections();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ResultWidget::pluginId()
|
|
|
|
{
|
|
|
|
return m_plugin_id;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultWidget::setEnabled(const bool &enabled)
|
|
|
|
{
|
|
|
|
m_enabled = enabled;
|
|
|
|
}
|
|
|
|
|
2021-08-12 14:57:25 +08:00
|
|
|
void ResultWidget::clearResult()
|
|
|
|
{
|
|
|
|
this->setVisible(false);
|
|
|
|
this->setFixedHeight(0);
|
|
|
|
}
|
|
|
|
|
2021-08-18 14:23:14 +08:00
|
|
|
int ResultWidget::getResultNum()
|
|
|
|
{
|
|
|
|
return m_resultView->getResultNum();
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultWidget::setResultSelection(const QModelIndex &index)
|
|
|
|
{
|
2021-08-24 17:10:28 +08:00
|
|
|
//this->m_resultView->selectionModel()->clearSelection();
|
|
|
|
//this->m_resultView->setCurrentIndex(QModelIndex());
|
|
|
|
this->m_resultView->setCurrentIndex(index);
|
2021-08-18 14:23:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ResultWidget::clearResultSelection()
|
|
|
|
{
|
2021-08-24 17:10:28 +08:00
|
|
|
//this->m_resultView->selectionModel()->clearSelection();
|
|
|
|
this->m_resultView->setCurrentIndex(QModelIndex());
|
2021-08-18 14:23:14 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
QModelIndex ResultWidget::getModlIndex(int row, int column)
|
|
|
|
{
|
|
|
|
return this->m_resultView->getModlIndex(row, column);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultWidget::activateIndex()
|
|
|
|
{
|
|
|
|
this->m_resultView->onRowDoubleClickedSlot(this->m_resultView->currentIndex());
|
|
|
|
}
|
|
|
|
|
|
|
|
QModelIndex ResultWidget::getCurrentSelection()
|
|
|
|
{
|
|
|
|
return this->m_resultView->currentIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ResultWidget::getExpandState()
|
|
|
|
{
|
|
|
|
return m_resultView->isExpanded();
|
|
|
|
}
|
|
|
|
|
|
|
|
SearchPluginIface::ResultInfo ResultWidget::getIndexResultInfo(QModelIndex &index)
|
|
|
|
{
|
|
|
|
return m_resultView->getIndexResultInfo(index);
|
|
|
|
}
|
|
|
|
|
2021-05-25 19:42:40 +08:00
|
|
|
/**
|
|
|
|
* @brief ResultWidget::expandListSlot 展开列表的槽函数
|
|
|
|
*/
|
|
|
|
void ResultWidget::expandListSlot()
|
|
|
|
{
|
|
|
|
qWarning()<<"List will be expanded!";
|
2021-05-27 10:25:15 +08:00
|
|
|
m_resultView->setExpanded(true);
|
2021-05-25 19:42:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief ResultWidget::reduceListSlot 收起列表的槽函数
|
|
|
|
*/
|
|
|
|
void ResultWidget::reduceListSlot()
|
|
|
|
{
|
|
|
|
qWarning()<<"List will be reduced!";
|
2021-05-27 10:25:15 +08:00
|
|
|
m_resultView->setExpanded(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief ResultWidget::onListLengthChanged 响应列表长度改变的槽函数
|
|
|
|
*/
|
|
|
|
void ResultWidget::onListLengthChanged(const int &length)
|
|
|
|
{
|
|
|
|
this->setVisible(length > 0);
|
2021-08-05 15:37:58 +08:00
|
|
|
int whole_height = this->isVisible() ? m_resultView->showHeight() + TITLE_HEIGHT : 0;
|
2021-05-27 10:25:15 +08:00
|
|
|
this->setFixedHeight(whole_height);
|
|
|
|
Q_EMIT this->sizeChanged();
|
2021-05-25 19:42:40 +08:00
|
|
|
}
|
|
|
|
|
2021-05-22 21:29:43 +08:00
|
|
|
void ResultWidget::initUi()
|
|
|
|
{
|
|
|
|
m_mainLyt = new QVBoxLayout(this);
|
|
|
|
this->setLayout(m_mainLyt);
|
|
|
|
m_mainLyt->setContentsMargins(MAIN_MARGINS);
|
|
|
|
m_mainLyt->setSpacing(MAIN_SPACING);
|
|
|
|
|
|
|
|
m_titleLabel = new TitleLabel(this);
|
|
|
|
m_titleLabel->setText(m_plugin_id);
|
|
|
|
m_titleLabel->setFixedHeight(TITLE_HEIGHT);
|
|
|
|
|
|
|
|
m_resultView = new ResultView(m_plugin_id, this);
|
|
|
|
|
|
|
|
m_mainLyt->addWidget(m_titleLabel);
|
|
|
|
m_mainLyt->addWidget(m_resultView);
|
2021-05-27 10:25:15 +08:00
|
|
|
this->setFixedHeight(m_resultView->height() + TITLE_HEIGHT);
|
2021-08-12 14:57:25 +08:00
|
|
|
this->setFixedWidth(656);
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void ResultWidget::initConnections()
|
|
|
|
{
|
|
|
|
connect(this, &ResultWidget::startSearch, m_resultView, &ResultView::startSearch);
|
2021-08-05 15:37:58 +08:00
|
|
|
connect(this, &ResultWidget::startSearch, m_titleLabel, &TitleLabel::startSearch);
|
2021-05-22 21:29:43 +08:00
|
|
|
connect(this, &ResultWidget::stopSearch, m_resultView, &ResultView::stopSearch);
|
2021-08-05 15:37:58 +08:00
|
|
|
connect(this, &ResultWidget::stopSearch, m_titleLabel, &TitleLabel::stopSearch);
|
2021-05-22 21:29:43 +08:00
|
|
|
connect(m_resultView, &ResultView::currentRowChanged, this, &ResultWidget::currentRowChanged);
|
|
|
|
connect(this, &ResultWidget::clearSelectedRow, m_resultView, &ResultView::clearSelectedRow);
|
2021-08-05 15:37:58 +08:00
|
|
|
connect(m_titleLabel, &TitleLabel::showMoreClicked, this, &ResultWidget::expandListSlot);
|
|
|
|
connect(m_titleLabel, &TitleLabel::retractClicked, this, &ResultWidget::reduceListSlot);
|
2021-05-27 10:25:15 +08:00
|
|
|
connect(m_resultView, &ResultView::listLengthChanged, this, &ResultWidget::onListLengthChanged);
|
2021-08-05 15:37:58 +08:00
|
|
|
connect(m_resultView, &ResultView::listLengthChanged, m_titleLabel, &TitleLabel::onListLengthChanged);
|
2021-08-18 14:23:14 +08:00
|
|
|
connect(m_resultView, &ResultView::clicked, this, &ResultWidget::rowClicked);
|
2021-05-27 10:25:15 +08:00
|
|
|
connect(qApp, &QApplication::paletteChanged, this, [ = ]() {
|
2021-08-05 15:37:58 +08:00
|
|
|
int whole_height = this->isVisible() ? m_resultView->showHeight() + TITLE_HEIGHT : 0;
|
2021-05-27 10:25:15 +08:00
|
|
|
this->setFixedHeight(whole_height);
|
|
|
|
Q_EMIT this->sizeChanged();
|
|
|
|
});
|
2021-08-02 13:46:59 +08:00
|
|
|
connect(m_resultView, &ResultView::sendBestListData, this, &ResultWidget::sendBestListData);
|
2021-08-12 14:57:25 +08:00
|
|
|
connect(m_resultView, &ResultView::lableReset, m_titleLabel, &TitleLabel::lableReset);
|
|
|
|
connect(this, &ResultWidget::resizeWidth, this, [=] (const int &size) {
|
|
|
|
this->setFixedWidth(size);
|
|
|
|
});
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
ResultView::ResultView(const QString &plugin_id, QWidget *parent) : QTreeView(parent)
|
|
|
|
{
|
|
|
|
this->setFrameShape(QFrame::NoFrame);
|
|
|
|
this->viewport()->setAutoFillBackground(false);
|
|
|
|
this->setRootIsDecorated(false);
|
|
|
|
this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
|
|
|
this->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
this->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
|
this->setHeaderHidden(true);
|
|
|
|
m_model = new SearchResultModel(plugin_id);
|
|
|
|
this->setModel(m_model);
|
|
|
|
initConnections();
|
|
|
|
m_plugin_id = plugin_id;
|
2021-05-25 19:42:40 +08:00
|
|
|
m_style_delegate = new ResultViewDelegate(this);
|
|
|
|
this->setItemDelegate(m_style_delegate);
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
bool ResultView::isSelected()
|
|
|
|
{
|
|
|
|
return m_is_selected;
|
|
|
|
}
|
|
|
|
|
2021-05-27 10:25:15 +08:00
|
|
|
int ResultView::showHeight()
|
|
|
|
{
|
|
|
|
int height;
|
2021-08-26 20:15:32 +08:00
|
|
|
int rowheight = this->rowHeight(this->model()->index(0, 0, QModelIndex()));
|
2021-05-27 10:25:15 +08:00
|
|
|
if (this->isExpanded()) {
|
|
|
|
height = m_count * rowheight;
|
|
|
|
} else {
|
|
|
|
int show_count = m_count > NUM_LIMIT_SHOWN_DEFAULT ? NUM_LIMIT_SHOWN_DEFAULT : m_count;
|
|
|
|
height = show_count * rowheight;
|
|
|
|
}
|
|
|
|
return height;
|
|
|
|
}
|
|
|
|
|
2021-08-18 14:23:14 +08:00
|
|
|
int ResultView::getResultNum()
|
|
|
|
{
|
|
|
|
return m_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
QModelIndex ResultView::getModlIndex(int row, int column)
|
|
|
|
{
|
|
|
|
return this->m_model->index(row, column);
|
|
|
|
}
|
|
|
|
|
|
|
|
SearchPluginIface::ResultInfo ResultView::getIndexResultInfo(QModelIndex &index)
|
|
|
|
{
|
|
|
|
return this->m_model->getInfo(index);
|
|
|
|
}
|
|
|
|
|
2021-05-22 21:29:43 +08:00
|
|
|
void ResultView::clearSelectedRow()
|
|
|
|
{
|
|
|
|
if (!m_is_selected) {
|
|
|
|
this->blockSignals(true);
|
2021-09-22 10:29:10 +08:00
|
|
|
//this->clearSelection();
|
|
|
|
this->setCurrentIndex(QModelIndex());
|
2021-05-22 21:29:43 +08:00
|
|
|
this->blockSignals(false);
|
2021-07-31 16:12:04 +08:00
|
|
|
} else {
|
|
|
|
m_is_selected = false;
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-25 19:42:40 +08:00
|
|
|
/**
|
|
|
|
* @brief ResultView::onRowDoubleClickedSlot 处理列表中的双击打开事件
|
|
|
|
* @param index 点击的条目
|
|
|
|
*/
|
|
|
|
void ResultView::onRowDoubleClickedSlot(const QModelIndex &index)
|
2021-05-22 21:29:43 +08:00
|
|
|
{
|
2021-05-25 19:42:40 +08:00
|
|
|
const SearchPluginIface::ResultInfo &info = m_model->getInfo(index);
|
|
|
|
SearchPluginIface *plugin = SearchPluginManager::getInstance()->getPlugin(m_plugin_id);
|
|
|
|
try {
|
|
|
|
if (plugin) {
|
2021-08-06 10:04:36 +08:00
|
|
|
if (!info.actionKey.isEmpty()) {
|
|
|
|
plugin->openAction(0, info.actionKey, info.type);
|
|
|
|
} else {
|
|
|
|
throw -2;
|
|
|
|
}
|
2021-05-25 19:42:40 +08:00
|
|
|
} else {
|
|
|
|
throw -1;
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|
2021-05-25 19:42:40 +08:00
|
|
|
} catch(int e) {
|
|
|
|
qWarning()<<"Open failed, reason="<<e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief ResultView::onRowSelectedSlot 处理列表项选中事件
|
|
|
|
* @param selected
|
|
|
|
* @param deselected
|
|
|
|
*/
|
2021-08-18 14:23:14 +08:00
|
|
|
void ResultView::onRowSelectedSlot(const QModelIndex &index)
|
2021-05-25 19:42:40 +08:00
|
|
|
{
|
|
|
|
//NEW_TODO
|
|
|
|
m_is_selected = true;
|
2021-09-09 11:23:59 +08:00
|
|
|
if(index.isValid()) {
|
|
|
|
Q_EMIT this->currentRowChanged(m_plugin_id, m_model->getInfo(index));
|
|
|
|
}
|
|
|
|
// if(!selected.isEmpty()) {
|
2021-08-18 14:23:14 +08:00
|
|
|
// QRegion region = visualRegionForSelection(selected);
|
|
|
|
// QRect rect = region.boundingRect();
|
|
|
|
//// Q_EMIT this->currentSelectPos(mapToParent(rect.topLeft()));
|
|
|
|
// }
|
2021-05-25 19:42:40 +08:00
|
|
|
}
|
2021-05-22 21:29:43 +08:00
|
|
|
|
2021-05-27 10:25:15 +08:00
|
|
|
void ResultView::onItemListChanged(const int &count)
|
|
|
|
{
|
|
|
|
m_count = count;
|
|
|
|
Q_EMIT this->listLengthChanged(count);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultView::setExpanded(const bool &is_expanded)
|
|
|
|
{
|
2021-08-20 10:07:53 +08:00
|
|
|
QModelIndex index = this->currentIndex();
|
2021-05-27 10:25:15 +08:00
|
|
|
m_model->setExpanded(is_expanded);
|
2021-08-20 10:07:53 +08:00
|
|
|
this->setCurrentIndex(index);
|
2021-05-27 10:25:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
const bool &ResultView::isExpanded()
|
|
|
|
{
|
|
|
|
return m_model->isExpanded();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief ResultView::onMenuTriggered 点击右键菜单的槽函数
|
|
|
|
* @param action
|
|
|
|
*/
|
|
|
|
void ResultView::onMenuTriggered(QAction *action)
|
|
|
|
{
|
|
|
|
//NEW_TODO 接口调整后需要修改
|
|
|
|
SearchPluginIface *plugin = SearchPluginManager::getInstance()->getPlugin(m_plugin_id);
|
|
|
|
if (plugin) {
|
2021-05-27 21:10:11 +08:00
|
|
|
// plugin->openAction(action->text(), m_model->getKey(this->currentIndex()));
|
2021-05-27 10:25:15 +08:00
|
|
|
} else {
|
|
|
|
qWarning()<<"Get plugin failed!";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-08 15:41:28 +08:00
|
|
|
void ResultView::mousePressEvent(QMouseEvent *event)
|
|
|
|
{
|
2021-09-08 16:34:32 +08:00
|
|
|
m_tmpCurrentIndex = this->currentIndex();
|
|
|
|
m_tmpMousePressIndex = indexAt(event->pos());
|
2021-09-09 11:23:59 +08:00
|
|
|
if (m_tmpMousePressIndex.isValid() and m_tmpCurrentIndex != m_tmpMousePressIndex) {
|
|
|
|
Q_EMIT this->clicked(m_tmpMousePressIndex);
|
|
|
|
}
|
|
|
|
|
2021-09-08 15:41:28 +08:00
|
|
|
return QTreeView::mousePressEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultView::mouseReleaseEvent(QMouseEvent *event)
|
|
|
|
{
|
|
|
|
QModelIndex index = indexAt(event->pos());
|
2021-09-09 11:23:59 +08:00
|
|
|
if (index.isValid()) {
|
|
|
|
Q_EMIT this->clicked(index);
|
|
|
|
} else {
|
|
|
|
Q_EMIT this->clicked(this->currentIndex());
|
2021-09-08 15:41:28 +08:00
|
|
|
}
|
|
|
|
return QTreeView::mouseReleaseEvent(event);
|
|
|
|
}
|
|
|
|
|
2021-09-09 11:23:59 +08:00
|
|
|
void ResultView::mouseMoveEvent(QMouseEvent *event)
|
|
|
|
{
|
|
|
|
m_tmpCurrentIndex = this->currentIndex();
|
|
|
|
m_tmpMousePressIndex = indexAt(event->pos());
|
|
|
|
if (m_tmpMousePressIndex.isValid() and m_tmpCurrentIndex != m_tmpMousePressIndex) {
|
|
|
|
Q_EMIT this->clicked(m_tmpMousePressIndex);
|
|
|
|
}
|
|
|
|
return QTreeView::mouseMoveEvent(event);
|
|
|
|
}
|
|
|
|
|
2021-05-25 19:42:40 +08:00
|
|
|
void ResultView::initConnections()
|
|
|
|
{
|
|
|
|
connect(this, &ResultView::startSearch, [ = ](const QString &keyword) {
|
2021-08-12 14:57:25 +08:00
|
|
|
setExpanded(false);
|
|
|
|
Q_EMIT this->lableReset();
|
2021-05-25 19:42:40 +08:00
|
|
|
m_style_delegate->setSearchKeyword(keyword);
|
|
|
|
m_model->startSearch(keyword);
|
2021-05-22 21:29:43 +08:00
|
|
|
});
|
2021-05-25 19:42:40 +08:00
|
|
|
connect(this, &ResultView::stopSearch, m_model, &SearchResultModel::stopSearch);
|
2021-08-18 14:23:14 +08:00
|
|
|
//connect(this->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ResultView::onRowSelectedSlot);
|
|
|
|
connect(this, &ResultView::clicked, this, &ResultView::onRowSelectedSlot);
|
2021-05-25 19:42:40 +08:00
|
|
|
connect(this, &ResultView::activated, this, &ResultView::onRowDoubleClickedSlot);
|
2021-05-27 10:25:15 +08:00
|
|
|
connect(m_model, &SearchResultModel::itemListChanged, this, &ResultView::onItemListChanged);
|
2021-08-02 13:46:59 +08:00
|
|
|
connect(m_model, &SearchResultModel::sendBestListData, this, &ResultView::sendBestListData);
|
2021-05-22 21:29:43 +08:00
|
|
|
}
|