2021-05-25 19:42:40 +08:00
|
|
|
#include "result-view-delegate.h"
|
2021-12-14 14:43:35 +08:00
|
|
|
using namespace UkuiSearch;
|
2021-05-25 19:42:40 +08:00
|
|
|
|
|
|
|
ResultViewDelegate::ResultViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void ResultViewDelegate::setSearchKeyword(const QString ®FindKeyWords)
|
|
|
|
{
|
|
|
|
m_regFindKeyWords.clear();
|
|
|
|
m_regFindKeyWords = regFindKeyWords;
|
|
|
|
}
|
|
|
|
|
2021-07-05 14:27:14 +08:00
|
|
|
QSize ResultViewDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
QSize size = QStyledItemDelegate::sizeHint(option,index);
|
|
|
|
size.setHeight(size.height() + 10);
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
2021-05-25 19:42:40 +08:00
|
|
|
void ResultViewDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const {
|
|
|
|
QStyleOptionViewItemV4 optionV4 = option;
|
|
|
|
initStyleOption(&optionV4, index);
|
|
|
|
|
|
|
|
QStyle *style = optionV4.widget ? optionV4.widget->style() : QApplication::style();
|
|
|
|
|
|
|
|
optionV4.text = QString();
|
|
|
|
style->drawControl(QStyle::CE_ItemViewItem, &optionV4, painter); //绘制非文本区域内容
|
|
|
|
if(index.model()->data(index, Qt::DisplayRole).toString().isEmpty()) return;
|
|
|
|
|
2021-09-27 17:25:06 +08:00
|
|
|
//fix me: for files which name begin with some ' ' , space will be hide...
|
2021-05-25 19:42:40 +08:00
|
|
|
QTextDocument doc;
|
|
|
|
doc.setHtml(getHtmlText(painter, option, index)); //提取富文本
|
|
|
|
QAbstractTextDocumentLayout::PaintContext ctx;
|
|
|
|
|
|
|
|
if(optionV4.state & QStyle::State_Selected)
|
|
|
|
ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
|
|
|
|
|
|
|
|
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
|
2021-07-05 14:27:14 +08:00
|
|
|
textRect.adjust(0, 0, 0, 0);
|
2021-05-25 19:42:40 +08:00
|
|
|
painter->save();
|
|
|
|
painter->translate(textRect.topLeft());
|
|
|
|
painter->setClipRect(textRect.translated(-textRect.topLeft()));
|
|
|
|
doc.documentLayout()->draw(painter, ctx); //绘制文本区域内容
|
|
|
|
painter->restore();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ResultViewDelegate::getHtmlText(QPainter *painter, const QStyleOptionViewItem &itemOption, const QModelIndex &index) const
|
|
|
|
{
|
|
|
|
int indexFindLeft = 0;
|
|
|
|
QString indexString = index.model()->data(index, Qt::DisplayRole).toString();
|
|
|
|
QFont ft(painter->font().family(), GlobalSettings::getInstance()->getValue(FONT_SIZE_KEY).toInt());
|
|
|
|
QFontMetrics fm(ft);
|
|
|
|
QString indexColString = fm.elidedText(indexString, Qt::ElideRight, itemOption.rect.width() - 30); //当字体超过Item的长度时显示为省略号
|
|
|
|
QString htmlString;
|
|
|
|
if((indexColString.toUpper()).contains((m_regFindKeyWords.toUpper()))) {
|
|
|
|
indexFindLeft = indexColString.toUpper().indexOf(m_regFindKeyWords.toUpper()); //得到查找字体在当前整个Item字体中的位置
|
|
|
|
htmlString = escapeHtml(indexColString.left(indexFindLeft)) + "<b>" + escapeHtml(indexColString.mid(indexFindLeft, m_regFindKeyWords.length())) + "</b>" + escapeHtml(indexColString.right(indexColString.length() - indexFindLeft - m_regFindKeyWords.length()));
|
|
|
|
} else {
|
|
|
|
bool boldOpenned = false;
|
|
|
|
for(int i = 0; i < indexColString.length(); i++) {
|
|
|
|
if((m_regFindKeyWords.toUpper()).contains(QString(indexColString.at(i)).toUpper())) {
|
|
|
|
if(! boldOpenned) {
|
|
|
|
boldOpenned = true;
|
|
|
|
htmlString.append(QString("<b>"));
|
|
|
|
}
|
|
|
|
htmlString.append(escapeHtml(QString(indexColString.at(i))));
|
|
|
|
} else {
|
|
|
|
if(boldOpenned) {
|
|
|
|
boldOpenned = false;
|
|
|
|
htmlString.append(QString("</b>"));
|
|
|
|
}
|
|
|
|
htmlString.append(escapeHtml(QString(indexColString.at(i))));
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// qDebug()<<indexColString<<"---->"<<htmlString;
|
|
|
|
return htmlString;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString ResultViewDelegate::escapeHtml(const QString &str) const
|
|
|
|
{
|
|
|
|
QString temp = str;
|
|
|
|
temp.replace("<", "<");
|
|
|
|
temp.replace(">", ">");
|
|
|
|
return temp;
|
|
|
|
}
|