forked from openkylin/ukui-search
Align the icon and the title in search list by overriding the drawControl method.
This commit is contained in:
parent
67c134bc17
commit
5fb81dd1d9
|
@ -8,6 +8,7 @@
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
BestListView::BestListView(QWidget *parent) : QTreeView(parent)
|
BestListView::BestListView(QWidget *parent) : QTreeView(parent)
|
||||||
{
|
{
|
||||||
|
setStyle(ResultItemStyle::getStyle());
|
||||||
this->setFrameShape(QFrame::NoFrame);
|
this->setFrameShape(QFrame::NoFrame);
|
||||||
this->viewport()->setAutoFillBackground(false);
|
this->viewport()->setAutoFillBackground(false);
|
||||||
this->setIconSize(QSize(VIEW_ICON_SIZE, VIEW_ICON_SIZE));
|
this->setIconSize(QSize(VIEW_ICON_SIZE, VIEW_ICON_SIZE));
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "result-view-delegate.h"
|
#include "result-view-delegate.h"
|
||||||
using namespace UkuiSearch;
|
using namespace UkuiSearch;
|
||||||
|
static ResultItemStyle *global_instance_of_item_style = nullptr;
|
||||||
|
|
||||||
ResultViewDelegate::ResultViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
|
ResultViewDelegate::ResultViewDelegate(QObject *parent) : QStyledItemDelegate(parent)
|
||||||
{
|
{
|
||||||
|
@ -38,7 +39,8 @@ void ResultViewDelegate::paint(QPainter * painter, const QStyleOptionViewItem &
|
||||||
ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
|
ctx.palette.setColor(QPalette::Text, optionV4.palette.color(QPalette::Active, QPalette::HighlightedText));
|
||||||
|
|
||||||
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
|
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &optionV4);
|
||||||
textRect.adjust(0, 0, 0, 0);
|
//使图标和文本间隔与原来保持一致,故文本区域右移4
|
||||||
|
textRect.adjust(4, 0, 0, 0);
|
||||||
painter->save();
|
painter->save();
|
||||||
painter->translate(textRect.topLeft());
|
painter->translate(textRect.topLeft());
|
||||||
painter->setClipRect(textRect.translated(-textRect.topLeft()));
|
painter->setClipRect(textRect.translated(-textRect.topLeft()));
|
||||||
|
@ -87,3 +89,71 @@ QString ResultViewDelegate::escapeHtml(const QString &str) const
|
||||||
temp.replace(">", ">");
|
temp.replace(">", ">");
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResultItemStyle *ResultItemStyle::getStyle()
|
||||||
|
{
|
||||||
|
if (!global_instance_of_item_style) {
|
||||||
|
global_instance_of_item_style = new ResultItemStyle;
|
||||||
|
}
|
||||||
|
return global_instance_of_item_style;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ResultItemStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
|
||||||
|
{
|
||||||
|
switch (element) {
|
||||||
|
case CE_ItemViewItem: {
|
||||||
|
if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
|
||||||
|
painter->save();
|
||||||
|
if (painter->clipPath().isEmpty()) {
|
||||||
|
painter->setClipRect(option->rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect checkRect = proxy()->subElementRect(SE_ItemViewItemCheckIndicator, vopt, widget);
|
||||||
|
QRect iconRect = proxy()->subElementRect(SE_ItemViewItemDecoration, vopt, widget);
|
||||||
|
|
||||||
|
// draw the background
|
||||||
|
proxy()->drawPrimitive(PE_PanelItemViewItem, option, painter, widget);
|
||||||
|
|
||||||
|
// draw the check mark
|
||||||
|
if (vopt->features & QStyleOptionViewItem::HasCheckIndicator) {
|
||||||
|
QStyleOptionViewItem option(*vopt);
|
||||||
|
option.rect = checkRect;
|
||||||
|
option.state = option.state & ~QStyle::State_HasFocus;
|
||||||
|
|
||||||
|
switch (vopt->checkState) {
|
||||||
|
case Qt::Unchecked:
|
||||||
|
option.state |= QStyle::State_Off;
|
||||||
|
break;
|
||||||
|
case Qt::PartiallyChecked:
|
||||||
|
option.state |= QStyle::State_NoChange;
|
||||||
|
break;
|
||||||
|
case Qt::Checked:
|
||||||
|
option.state |= QStyle::State_On;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
proxy()->drawPrimitive(QStyle::PE_IndicatorViewItemCheck, &option, painter, widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw the icon
|
||||||
|
QIcon::Mode mode = QIcon::Normal;
|
||||||
|
if (!(vopt->state & QStyle::State_Enabled)) {
|
||||||
|
mode = QIcon::Disabled;
|
||||||
|
} else if (vopt->state & QStyle::State_Selected) {
|
||||||
|
mode = QIcon::Selected;
|
||||||
|
}
|
||||||
|
QIcon::State state = vopt->state & QStyle::State_Open ? QIcon::On : QIcon::Off;
|
||||||
|
auto pixmap = vopt->icon.pixmap(vopt->decorationSize, mode, state);
|
||||||
|
|
||||||
|
iconRect.moveLeft(8);
|
||||||
|
QStyle::drawItemPixmap(painter, iconRect, vopt->decorationAlignment, pixmap);
|
||||||
|
painter->restore();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#include <QStyle>
|
#include <QStyle>
|
||||||
#include <QTextDocument>
|
#include <QTextDocument>
|
||||||
#include <QAbstractTextDocumentLayout>
|
#include <QAbstractTextDocumentLayout>
|
||||||
|
#include <QProxyStyle>
|
||||||
#include "global-settings.h"
|
#include "global-settings.h"
|
||||||
|
|
||||||
namespace UkuiSearch {
|
namespace UkuiSearch {
|
||||||
|
@ -43,6 +44,16 @@ private:
|
||||||
QString getHtmlText(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const;
|
QString getHtmlText(QPainter *, const QStyleOptionViewItem &, const QModelIndex &) const;
|
||||||
QString escapeHtml(const QString&) const;
|
QString escapeHtml(const QString&) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ResultItemStyle : public QProxyStyle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static ResultItemStyle *getStyle();
|
||||||
|
void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const override;
|
||||||
|
private:
|
||||||
|
explicit ResultItemStyle() {}
|
||||||
|
~ResultItemStyle() = default;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // RESULTVIEWDELEGATE_H
|
#endif // RESULTVIEWDELEGATE_H
|
||||||
|
|
|
@ -160,6 +160,7 @@ void ResultWidget::initConnections()
|
||||||
|
|
||||||
ResultView::ResultView(const QString &plugin_id, QWidget *parent) : QTreeView(parent)
|
ResultView::ResultView(const QString &plugin_id, QWidget *parent) : QTreeView(parent)
|
||||||
{
|
{
|
||||||
|
setStyle(ResultItemStyle::getStyle());
|
||||||
this->setFrameShape(QFrame::NoFrame);
|
this->setFrameShape(QFrame::NoFrame);
|
||||||
this->viewport()->setAutoFillBackground(false);
|
this->viewport()->setAutoFillBackground(false);
|
||||||
this->setIconSize(QSize(VIEW_ICON_SIZE, VIEW_ICON_SIZE));
|
this->setIconSize(QSize(VIEW_ICON_SIZE, VIEW_ICON_SIZE));
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#define NOMORL_LINE_STYLE "QFrame{background: rgba(0,0,0,0.1);}"
|
#define NOMORL_LINE_STYLE "QFrame{background: rgba(0,0,0,0.1);}"
|
||||||
#define DARK_LINE_STYLE "QFrame{background: rgba(255, 255, 255, 0.16);}"
|
#define DARK_LINE_STYLE "QFrame{background: rgba(255, 255, 255, 0.16);}"
|
||||||
|
|
||||||
using namespace Zeeker;
|
using namespace UkuiSearch;
|
||||||
SeparationLine::SeparationLine(QWidget *parent) : QFrame(parent)
|
SeparationLine::SeparationLine(QWidget *parent) : QFrame(parent)
|
||||||
{
|
{
|
||||||
this->setLineWidth(0);
|
this->setLineWidth(0);
|
||||||
|
|
Loading…
Reference in New Issue