#include "dolphincategorydrawer.h"
#include "dolphincontroller.h"
#include "dolphinsettings.h"
+#include "dolphinviewautoscroller.h"
#include "dolphin_iconsmodesettings.h"
#include "dolphin_generalsettings.h"
#include "draganddrophelper.h"
#include "selectionmanager.h"
+#include "zoomlevelinfo.h"
#include <kcategorizedsortfilterproxymodel.h>
#include <kdialog.h>
#include <QAbstractProxyModel>
#include <QApplication>
-#include <QPainter>
-#include <QPoint>
#include <QScrollBar>
DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controller) :
m_dropRect()
{
Q_ASSERT(controller != 0);
+ setLayoutDirection(Qt::LeftToRight);
setViewMode(QListView::IconMode);
setResizeMode(QListView::Adjust);
setSpacing(KDialog::spacingHint());
viewport()->setAcceptDrops(true);
setMouseTracking(true);
+ new DolphinViewAutoScroller(this);
- // TODO: Connecting to the signal 'activated()' is not possible, as kstyle
- // does not forward the single vs. doubleclick to it yet (KDE 4.1?). Hence it is
- // necessary connecting the signal 'singleClick()' or 'doubleClick' and to handle the
- // RETURN-key in keyPressEvent().
+ connect(this, SIGNAL(clicked(const QModelIndex&)),
+ controller, SLOT(requestTab(const QModelIndex&)));
if (KGlobalSettings::singleClick()) {
connect(this, SIGNAL(clicked(const QModelIndex&)),
controller, SLOT(triggerItem(const QModelIndex&)));
- if (DolphinSettings::instance().generalSettings()->showSelectionToggle()) {
- m_selectionManager = new SelectionManager(this);
- connect(m_selectionManager, SIGNAL(selectionChanged()),
- this, SLOT(requestActivation()));
- connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
- m_selectionManager, SLOT(reset()));
- }
} else {
connect(this, SIGNAL(doubleClicked(const QModelIndex&)),
controller, SLOT(triggerItem(const QModelIndex&)));
}
+
+ if (DolphinSettings::instance().generalSettings()->showSelectionToggle()) {
+ m_selectionManager = new SelectionManager(this);
+ connect(m_selectionManager, SIGNAL(selectionChanged()),
+ this, SLOT(requestActivation()));
+ connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
+ m_selectionManager, SLOT(reset()));
+ }
+
connect(this, SIGNAL(entered(const QModelIndex&)),
controller, SLOT(emitItemEntered(const QModelIndex&)));
connect(this, SIGNAL(viewportEntered()),
controller, SLOT(emitViewportEntered()));
- connect(controller, SIGNAL(zoomIn()),
- this, SLOT(zoomIn()));
- connect(controller, SIGNAL(zoomOut()),
- this, SLOT(zoomOut()));
+ connect(controller, SIGNAL(zoomLevelChanged(int)),
+ this, SLOT(setZoomLevel(int)));
const DolphinView* view = controller->dolphinView();
connect(view, SIGNAL(showPreviewChanged()),
KCategorizedView::dataChanged(topLeft, bottomRight);
KCategorizedSortFilterProxyModel* proxyModel = dynamic_cast<KCategorizedSortFilterProxyModel*>(model());
- if ((flow() == QListView::LeftToRight) && !proxyModel->isCategorizedModel()) {
+ if (!proxyModel->isCategorizedModel()) {
// bypass a QListView issue that items are not layout correctly if the decoration size of
// an index changes
scheduleDelayedItemsLayout();
}
if (!index.isValid()) {
+ if (QApplication::mouseButtons() & Qt::MidButton) {
+ m_controller->replaceUrlByClipboard();
+ }
const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();
if (!(modifier & Qt::ShiftModifier) && !(modifier & Qt::ControlModifier)) {
clearSelection();
// TODO: invoking KCategorizedView::startDrag() should not be necessary, we'll
// fix this in KDE 4.1
KCategorizedView::startDrag(supportedActions);
- DragAndDropHelper::startDrag(this, supportedActions);
+ DragAndDropHelper::instance().startDrag(this, supportedActions, m_controller);
}
void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event)
{
- if (event->mimeData()->hasUrls()) {
+ if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) {
event->acceptProposedAction();
}
}
m_dropRect.setSize(QSize()); // set as invalid
}
}
- if (event->mimeData()->hasUrls()) {
+ if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) {
// accept url drops, independently from the destination item
event->acceptProposedAction();
}
void DolphinIconsView::dropEvent(QDropEvent* event)
{
- if (!selectionModel()->isSelected(indexAt(event->pos()))) {
- const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
- if (!urls.isEmpty()) {
- const QModelIndex index = indexAt(event->pos());
- const KFileItem item = m_controller->itemForIndex(index);
- m_controller->indicateDroppedUrls(urls,
- m_controller->url(),
- item);
- event->acceptProposedAction();
- }
- }
+ const QModelIndex index = indexAt(event->pos());
+ const KFileItem item = m_controller->itemForIndex(index);
+ m_controller->indicateDroppedUrls(item, m_controller->url(), event);
KCategorizedView::dropEvent(event);
}
event->ignore();
return;
}
+
+ horizontalScrollBar()->setSingleStep(m_itemSize.width() / 10);
+ verticalScrollBar()->setSingleStep(m_itemSize.height() / 10);
+
KCategorizedView::wheelEvent(event);
// if the icons are aligned left to right, the vertical wheel event should
// be applied to the horizontal scrollbar
updateGridSize(showPreview, view->additionalInfo().count());
}
-void DolphinIconsView::zoomIn()
+void DolphinIconsView::setZoomLevel(int level)
{
- if (isZoomInPossible()) {
- IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
-
- const int oldIconSize = settings->iconSize();
- int newIconSize = oldIconSize;
-
- const bool showPreview = m_controller->dolphinView()->showPreview();
- if (showPreview) {
- const int previewSize = increasedIconSize(settings->previewSize());
- settings->setPreviewSize(previewSize);
- } else {
- newIconSize = increasedIconSize(oldIconSize);
- settings->setIconSize(newIconSize);
- }
+ IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
- // increase also the grid size
- const int diff = newIconSize - oldIconSize;
- settings->setItemWidth(settings->itemWidth() + diff);
- settings->setItemHeight(settings->itemHeight() + diff);
+ const int oldIconSize = settings->iconSize();
+ int newIconSize = oldIconSize;
- updateGridSize(showPreview, additionalInfoCount());
+ const bool showPreview = m_controller->dolphinView()->showPreview();
+ if (showPreview) {
+ const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
+ settings->setPreviewSize(previewSize);
+ } else {
+ newIconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
+ settings->setIconSize(newIconSize);
}
-}
-void DolphinIconsView::zoomOut()
-{
- if (isZoomOutPossible()) {
- IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
-
- const int oldIconSize = settings->iconSize();
- int newIconSize = oldIconSize;
-
- const bool showPreview = m_controller->dolphinView()->showPreview();
- if (showPreview) {
- const int previewSize = decreasedIconSize(settings->previewSize());
- settings->setPreviewSize(previewSize);
- } else {
- newIconSize = decreasedIconSize(settings->iconSize());
- settings->setIconSize(newIconSize);
- }
+ // increase also the grid size
+ const int diff = newIconSize - oldIconSize;
+ settings->setItemWidth(settings->itemWidth() + diff);
+ settings->setItemHeight(settings->itemHeight() + diff);
- // decrease also the grid size
- const int diff = oldIconSize - newIconSize;
- settings->setItemWidth(settings->itemWidth() - diff);
- settings->setItemHeight(settings->itemHeight() - diff);
-
- updateGridSize(showPreview, additionalInfoCount());
- }
+ updateGridSize(showPreview, additionalInfoCount());
}
void DolphinIconsView::requestActivation()
}
}
-bool DolphinIconsView::isZoomInPossible() const
-{
- IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
- const bool showPreview = m_controller->dolphinView()->showPreview();
- const int size = showPreview ? settings->previewSize() : settings->iconSize();
- return size < KIconLoader::SizeEnormous;
-}
-
-bool DolphinIconsView::isZoomOutPossible() const
-{
- IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
- const bool showPreview = m_controller->dolphinView()->showPreview();
- const int size = showPreview ? settings->previewSize() : settings->iconSize();
- return size > KIconLoader::SizeSmall;
-}
-
-int DolphinIconsView::increasedIconSize(int size) const
-{
- int incSize = 0;
- switch (size) {
- case KIconLoader::SizeSmall: incSize = KIconLoader::SizeSmallMedium; break;
- case KIconLoader::SizeSmallMedium: incSize = KIconLoader::SizeMedium; break;
- case KIconLoader::SizeMedium: incSize = KIconLoader::SizeLarge; break;
- case KIconLoader::SizeLarge: incSize = KIconLoader::SizeHuge; break;
- case KIconLoader::SizeHuge: incSize = KIconLoader::SizeEnormous; break;
- default: Q_ASSERT(false); break;
- }
- return incSize;
-}
-
-int DolphinIconsView::decreasedIconSize(int size) const
-{
- int decSize = 0;
- switch (size) {
- case KIconLoader::SizeSmallMedium: decSize = KIconLoader::SizeSmall; break;
- case KIconLoader::SizeMedium: decSize = KIconLoader::SizeSmallMedium; break;
- case KIconLoader::SizeLarge: decSize = KIconLoader::SizeMedium; break;
- case KIconLoader::SizeHuge: decSize = KIconLoader::SizeLarge; break;
- case KIconLoader::SizeEnormous: decSize = KIconLoader::SizeHuge; break;
- default: Q_ASSERT(false); break;
- }
- return decSize;
-}
-
void DolphinIconsView::updateGridSize(bool showPreview, int additionalInfoCount)
{
const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
const int spacing = settings->gridSpacing();
setGridSize(QSize(itemWidth + spacing * 2, itemHeight + spacing));
- m_controller->setZoomInPossible(isZoomInPossible());
- m_controller->setZoomOutPossible(isZoomOutPossible());
-
KFileItemDelegate* delegate = dynamic_cast<KFileItemDelegate*>(itemDelegate());
if (delegate != 0) {
delegate->setMaximumSize(m_itemSize);