Skip to content

Commit 51bdad6

Browse files
committed
listview: custom delegate wip #34
1 parent 66d12a2 commit 51bdad6

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

fm/src/actiontriggers.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,7 @@ void MainWindow::toggleIcons() {
743743
if (iconAct->isChecked()) {
744744
currentView = 1;
745745
list->setViewMode(QListView::IconMode);
746+
list->setItemDelegate(ivdelegate);
746747
int padding = 10;
747748
if (zoom<48) { padding = 20; }
748749
if (zoom<32) { padding = 40; }
@@ -762,6 +763,7 @@ void MainWindow::toggleIcons() {
762763
} else {
763764
currentView = 0;
764765
list->setViewMode(QListView::ListMode);
766+
list->setItemDelegate(ildelegate);
765767
list->setGridSize(QSize());
766768
list->setIconSize(QSize(zoomList, zoomList));
767769
list->setFlow(QListView::TopToBottom);

fm/src/mainwindow.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ MainWindow::MainWindow()
176176
list->setWrapping(true);
177177
list->setWordWrap(true);
178178
list->setModel(modelView);
179-
list->setItemDelegate(new Delegate());
179+
ivdelegate = new IconViewDelegate();
180+
ildelegate = new IconListDelegate();
180181
list->setTextElideMode(Qt::ElideNone);
181182
listSelectionModel = list->selectionModel();
182183

fm/src/mainwindow.h

+39-7
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <QComboBox>
3535
#include <QSignalMapper>
3636
#include <QToolBar>
37+
#include <QItemDelegate>
3738

3839
#include "mymodel.h"
3940
#include "bookmarkmodel.h"
@@ -65,28 +66,26 @@ class QAction;
6566
class QMenu;
6667
QT_END_NAMESPACE
6768

68-
69-
#include <QItemDelegate>
70-
71-
class Delegate : public QItemDelegate
69+
//---------------------------------------------------------------------------------
70+
class IconViewDelegate : public QItemDelegate
7271
{
7372
public:
7473
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
7574
{
7675
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
7776
QSize iconsize = icon.actualSize(option.decorationSize);
7877
QRect item = option.rect;
79-
QRect txtRect(item.left(), item.top()+(iconsize.height()/2), item.width()-10, item.height()-10);
78+
QRect txtRect(item.left(), item.top()+(iconsize.height()/2)+5, item.width()-5, item.height()-5);
8079
QSize txtsize = option.fontMetrics.boundingRect(txtRect, Qt::AlignCenter|Qt::TextWrapAnywhere, index.data().toString()).size();
81-
return QSize(txtsize.width(),txtsize.height()+iconsize.height());
80+
return QSize(txtsize.width()+10,txtsize.height()+iconsize.height()+10);
8281
}
8382
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
8483
{
8584
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
8685
QSize iconsize = icon.actualSize(option.decorationSize);
8786
QRect item = option.rect;
8887
QRect iconRect(item.left()+(item.width()/2)-(iconsize.width()/2), item.top()+3, iconsize.width(), iconsize.height());
89-
QRect txtRect(item.left(), item.top()+(iconsize.height()/2)+5, item.width(), item.height());
88+
QRect txtRect(item.left(), item.top()+(iconsize.height()/2)+5, item.width()-5, item.height()-10);
9089

9190
if (option.state & QStyle::State_Selected) {
9291
painter->fillRect(option.rect, option.palette.highlight());
@@ -99,7 +98,37 @@ class Delegate : public QItemDelegate
9998
painter->drawText(txtRect, Qt::AlignCenter|Qt::TextWrapAnywhere, index.data().toString());
10099
}
101100
};
101+
class IconListDelegate : public QItemDelegate
102+
{
103+
public:
104+
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
105+
{
106+
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
107+
QSize iconsize = icon.actualSize(option.decorationSize);
108+
QRect item = option.rect;
109+
QRect txtRect(item.left()+iconsize.width()+5, item.top(), item.width(), item.height());
110+
QSize txtsize = option.fontMetrics.boundingRect(txtRect, Qt::AlignLeft|Qt::AlignVCenter, index.data().toString()).size();
111+
return QSize(txtsize.width()+iconsize.width()+10,iconsize.height());
112+
}
113+
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
114+
{
115+
QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
116+
QSize iconsize = icon.actualSize(option.decorationSize);
117+
QRect item = option.rect;
118+
QRect iconRect(item.left(), item.top(), iconsize.width(), iconsize.height());
119+
QRect txtRect(item.left()+iconsize.width()+5, item.top(), item.width(), item.height());
120+
121+
if (option.state & QStyle::State_Selected) {
122+
painter->fillRect(option.rect, option.palette.highlight());
123+
painter->setPen(option.palette.highlightedText().color());
124+
} else {
125+
painter->setPen(option.palette.text().color());
126+
}
102127

128+
painter->drawPixmap(iconRect, icon.pixmap(iconsize.width(),iconsize.height()));
129+
painter->drawText(txtRect, Qt::AlignLeft|Qt::AlignVCenter, index.data().toString());
130+
}
131+
};
103132
//---------------------------------------------------------------------------------
104133

105134
/**
@@ -348,6 +377,9 @@ private slots:
348377

349378
bool pathHistory;
350379
bool showPathInWindowTitle;
380+
381+
IconViewDelegate *ivdelegate;
382+
IconListDelegate *ildelegate;
351383
};
352384

353385
//---------------------------------------------------------------------------------

0 commit comments

Comments
 (0)