#include "dolphincontroller.h"
#include "dolphinsettings.h"
+#include "dolphinitemcategorizer.h"
#include "dolphin_iconsmodesettings.h"
-#include <kdirmodel.h>
-#include <kfileitem.h>
-#include <kfileitemdelegate.h>
+#include <kdialog.h>
#include <QAbstractProxyModel>
+#include <QApplication>
+#include <QPainter>
#include <QPoint>
DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controller) :
- QListView(parent),
- m_controller(controller)
+ KListView(parent),
+ m_controller(controller),
+ m_dragging(false)
{
Q_ASSERT(controller != 0);
setViewMode(QListView::IconMode);
setResizeMode(QListView::Adjust);
-
+ setSpacing(KDialog::spacingHint());
+ setMouseTracking(true);
viewport()->setAttribute(Qt::WA_Hover);
- connect(this, SIGNAL(clicked(const QModelIndex&)),
- controller, SLOT(triggerItem(const QModelIndex&)));
+ if (KGlobalSettings::singleClick()) {
+ connect(this, SIGNAL(clicked(const QModelIndex&)),
+ controller, SLOT(triggerItem(const QModelIndex&)));
+ } else {
+ connect(this, SIGNAL(doubleClicked(const QModelIndex&)),
+ controller, SLOT(triggerItem(const QModelIndex&)));
+ }
connect(this, SIGNAL(activated(const QModelIndex&)),
controller, SLOT(triggerItem(const QModelIndex&)));
+ connect(this, SIGNAL(entered(const QModelIndex&)),
+ controller, SLOT(emitItemEntered(const QModelIndex&)));
+ connect(this, SIGNAL(viewportEntered()),
+ controller, SLOT(emitViewportEntered()));
connect(controller, SIGNAL(showPreviewChanged(bool)),
- this, SLOT(updateGridSize(bool)));
+ this, SLOT(slotShowPreviewChanged(bool)));
+ connect(controller, SIGNAL(showAdditionalInfoChanged(bool)),
+ this, SLOT(slotShowAdditionalInfoChanged(bool)));
connect(controller, SIGNAL(zoomIn()),
this, SLOT(zoomIn()));
connect(controller, SIGNAL(zoomOut()),
const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
Q_ASSERT(settings != 0);
- m_viewOptions = QListView::viewOptions();
- m_viewOptions.font = QFont(settings->fontFamily(), settings->fontSize());
+ m_viewOptions = KListView::viewOptions();
+ m_viewOptions.showDecorationSelected = true;
+
+ QFont font(settings->fontFamily(), settings->fontSize());
+ font.setItalic(settings->italicFont());
+ font.setBold(settings->boldFont());
+ m_viewOptions.font = font;
- updateGridSize(controller->showPreview());
+ setWordWrap(settings->numberOfTextlines() > 1);
+ updateGridSize(controller->showPreview(), controller->showAdditionalInfo());
if (settings->arrangement() == QListView::TopToBottom) {
setFlow(QListView::LeftToRight);
m_viewOptions.decorationPosition = QStyleOptionViewItem::Top;
- }
- else {
+ } else {
setFlow(QListView::TopToBottom);
m_viewOptions.decorationPosition = QStyleOptionViewItem::Left;
+ m_viewOptions.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
}
}
void DolphinIconsView::contextMenuEvent(QContextMenuEvent* event)
{
- QListView::contextMenuEvent(event);
+ KListView::contextMenuEvent(event);
m_controller->triggerContextMenuRequest(event->pos());
}
-void DolphinIconsView::mouseReleaseEvent(QMouseEvent* event)
+void DolphinIconsView::mousePressEvent(QMouseEvent* event)
{
- QListView::mouseReleaseEvent(event);
m_controller->triggerActivation();
+ if (!indexAt(event->pos()).isValid()) {
+ const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();
+ if (!(modifier & Qt::ShiftModifier) && !(modifier & Qt::ControlModifier)) {
+ clearSelection();
+ }
+ }
+
+ KListView::mousePressEvent(event);
}
void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event)
if (event->mimeData()->hasUrls()) {
event->acceptProposedAction();
}
+ m_dragging = true;
+}
+
+void DolphinIconsView::dragLeaveEvent(QDragLeaveEvent* event)
+{
+ KListView::dragLeaveEvent(event);
+
+ // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+ m_dragging = false;
+ setDirtyRegion(m_dropRect);
+}
+
+void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event)
+{
+ KListView::dragMoveEvent(event);
+
+ // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+ const QModelIndex index = indexAt(event->pos());
+ setDirtyRegion(m_dropRect);
+ m_dropRect = visualRect(index);
+ setDirtyRegion(m_dropRect);
}
void DolphinIconsView::dropEvent(QDropEvent* event)
event->source());
event->acceptProposedAction();
}
- QListView::dropEvent(event);
+ KListView::dropEvent(event);
+ m_dragging = false;
}
-void DolphinIconsView::updateGridSize(bool showPreview)
+void DolphinIconsView::paintEvent(QPaintEvent* event)
{
- const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
- Q_ASSERT(settings != 0);
-
- int gridWidth = settings->gridWidth();
- int gridHeight = settings->gridHeight();
- int size = settings->iconSize();
-
- if (showPreview) {
- const int previewSize = settings->previewSize();
- const int diff = previewSize - size;
- Q_ASSERT(diff >= 0);
- gridWidth += diff;
- gridHeight += diff;
-
- size = previewSize;
- }
+ KListView::paintEvent(event);
+ // TODO: remove this code when the issue #160611 is solved in Qt 4.4
+ if (m_dragging) {
+ const QBrush& brush = m_viewOptions.palette.brush(QPalette::Normal, QPalette::Highlight);
+ DolphinController::drawHoverIndication(viewport(), m_dropRect, brush);
+ }
+}
- m_viewOptions.decorationSize = QSize(size, size);
- setGridSize(QSize(gridWidth, gridHeight));
+void DolphinIconsView::slotShowPreviewChanged(bool showPreview)
+{
+ updateGridSize(showPreview, m_controller->showAdditionalInfo());
+}
- m_controller->setZoomInPossible(isZoomInPossible());
- m_controller->setZoomOutPossible(isZoomOutPossible());
+void DolphinIconsView::slotShowAdditionalInfoChanged(bool showAdditionalInfo)
+{
+ updateGridSize(m_controller->showPreview(), showAdditionalInfo);
}
void DolphinIconsView::zoomIn()
if (isZoomInPossible()) {
IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+ const int oldIconSize = settings->iconSize();
+ int newIconSize = oldIconSize;
+
const bool showPreview = m_controller->showPreview();
if (showPreview) {
const int previewSize = increasedIconSize(settings->previewSize());
settings->setPreviewSize(previewSize);
- }
- else {
- const int iconSize = increasedIconSize(settings->iconSize());
- settings->setIconSize(iconSize);
- if (settings->previewSize() < iconSize) {
+ } else {
+ newIconSize = increasedIconSize(oldIconSize);
+ settings->setIconSize(newIconSize);
+ if (settings->previewSize() < newIconSize) {
// assure that the preview size is always >= the icon size
- settings->setPreviewSize(iconSize);
+ settings->setPreviewSize(newIconSize);
}
}
- updateGridSize(showPreview);
+ // increase also the grid size
+ const int diff = newIconSize - oldIconSize;
+ settings->setItemWidth(settings->itemWidth() + diff);
+ settings->setItemHeight(settings->itemHeight() + diff);
+
+ updateGridSize(showPreview, m_controller->showAdditionalInfo());
}
}
if (isZoomOutPossible()) {
IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+ const int oldIconSize = settings->iconSize();
+ int newIconSize = oldIconSize;
+
const bool showPreview = m_controller->showPreview();
if (showPreview) {
const int previewSize = decreasedIconSize(settings->previewSize());
settings->setPreviewSize(previewSize);
if (settings->iconSize() > previewSize) {
// assure that the icon size is always <= the preview size
- settings->setIconSize(previewSize);
+ newIconSize = previewSize;
+ settings->setIconSize(newIconSize);
}
+ } else {
+ newIconSize = decreasedIconSize(settings->iconSize());
+ settings->setIconSize(newIconSize);
}
- else {
- const int iconSize = decreasedIconSize(settings->iconSize());
- settings->setIconSize(iconSize);
- }
- updateGridSize(showPreview);
+ // decrease also the grid size
+ const int diff = oldIconSize - newIconSize;
+ settings->setItemWidth(settings->itemWidth() - diff);
+ settings->setItemHeight(settings->itemHeight() - diff);
+
+ updateGridSize(showPreview, m_controller->showAdditionalInfo());
}
}
// TODO: get rid of K3Icon sizes
int incSize = 0;
switch (size) {
- case K3Icon::SizeSmall: incSize = K3Icon::SizeSmallMedium; break;
- case K3Icon::SizeSmallMedium: incSize = K3Icon::SizeMedium; break;
- case K3Icon::SizeMedium: incSize = K3Icon::SizeLarge; break;
- case K3Icon::SizeLarge: incSize = K3Icon::SizeHuge; break;
- case K3Icon::SizeHuge: incSize = K3Icon::SizeEnormous; break;
- default: Q_ASSERT(false); break;
+ case K3Icon::SizeSmall: incSize = K3Icon::SizeSmallMedium; break;
+ case K3Icon::SizeSmallMedium: incSize = K3Icon::SizeMedium; break;
+ case K3Icon::SizeMedium: incSize = K3Icon::SizeLarge; break;
+ case K3Icon::SizeLarge: incSize = K3Icon::SizeHuge; break;
+ case K3Icon::SizeHuge: incSize = K3Icon::SizeEnormous; break;
+ default: Q_ASSERT(false); break;
}
return incSize;
}
// TODO: get rid of K3Icon sizes
int decSize = 0;
switch (size) {
- case K3Icon::SizeSmallMedium: decSize = K3Icon::SizeSmall; break;
- case K3Icon::SizeMedium: decSize = K3Icon::SizeSmallMedium; break;
- case K3Icon::SizeLarge: decSize = K3Icon::SizeMedium; break;
- case K3Icon::SizeHuge: decSize = K3Icon::SizeLarge; break;
- case K3Icon::SizeEnormous: decSize = K3Icon::SizeHuge; break;
- default: Q_ASSERT(false); break;
+ case K3Icon::SizeSmallMedium: decSize = K3Icon::SizeSmall; break;
+ case K3Icon::SizeMedium: decSize = K3Icon::SizeSmallMedium; break;
+ case K3Icon::SizeLarge: decSize = K3Icon::SizeMedium; break;
+ case K3Icon::SizeHuge: decSize = K3Icon::SizeLarge; break;
+ case K3Icon::SizeEnormous: decSize = K3Icon::SizeHuge; break;
+ default: Q_ASSERT(false); break;
}
return decSize;
}
+void DolphinIconsView::updateGridSize(bool showPreview, bool showAdditionalInfo)
+{
+ const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
+ Q_ASSERT(settings != 0);
+
+ int itemWidth = settings->itemWidth();
+ int itemHeight = settings->itemHeight();
+ int size = settings->iconSize();
+
+ if (showPreview) {
+ const int previewSize = settings->previewSize();
+ const int diff = previewSize - size;
+ Q_ASSERT(diff >= 0);
+ itemWidth += diff;
+ itemHeight += diff;
+
+ size = previewSize;
+ }
+
+ if (showAdditionalInfo) {
+ itemHeight += m_viewOptions.font.pointSize() * 2;
+ }
+
+ if (settings->arrangement() == QListView::TopToBottom) {
+ // The decoration width indirectly defines the maximum
+ // width for the text wrapping. To use the maximum item width
+ // for text wrapping, it is used as decoration width.
+ m_viewOptions.decorationSize = QSize(itemWidth, size);
+ } else {
+ m_viewOptions.decorationSize = QSize(size, size);
+ }
+
+ const int spacing = settings->gridSpacing();
+ setGridSize(QSize(itemWidth + spacing, itemHeight + spacing));
+
+ m_controller->setZoomInPossible(isZoomInPossible());
+ m_controller->setZoomOutPossible(isZoomOutPossible());
+}
+
#include "dolphiniconsview.moc"