X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/edabe0a7c8d047e8500fc3e8027fc3d19f346f77..148282e2d856b47ceb191eeef4c834118c8cdffd:/src/dolphiniconsview.cpp diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp index a7b256d2b..b95de351a 100644 --- a/src/dolphiniconsview.cpp +++ b/src/dolphiniconsview.cpp @@ -22,10 +22,12 @@ #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 #include @@ -34,8 +36,6 @@ #include #include -#include -#include #include DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controller) : @@ -52,6 +52,7 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controlle m_dropRect() { Q_ASSERT(controller != 0); + setLayoutDirection(Qt::LeftToRight); setViewMode(QListView::IconMode); setResizeMode(QListView::Adjust); setSpacing(KDialog::spacingHint()); @@ -61,33 +62,32 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controlle 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()), @@ -154,7 +154,7 @@ void DolphinIconsView::dataChanged(const QModelIndex& topLeft, const QModelIndex KCategorizedView::dataChanged(topLeft, bottomRight); KCategorizedSortFilterProxyModel* proxyModel = dynamic_cast(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(); @@ -192,6 +192,9 @@ void DolphinIconsView::mousePressEvent(QMouseEvent* event) } 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(); @@ -206,12 +209,12 @@ void DolphinIconsView::startDrag(Qt::DropActions supportedActions) // 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(); } } @@ -239,7 +242,7 @@ void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event) 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(); } @@ -249,17 +252,9 @@ void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event) 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); } @@ -282,6 +277,10 @@ void DolphinIconsView::wheelEvent(QWheelEvent* 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 @@ -328,56 +327,28 @@ void DolphinIconsView::slotAdditionalInfoChanged() 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() @@ -395,50 +366,6 @@ void DolphinIconsView::updateFont() } } -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(); @@ -476,9 +403,6 @@ void DolphinIconsView::updateGridSize(bool showPreview, int additionalInfoCount) const int spacing = settings->gridSpacing(); setGridSize(QSize(itemWidth + spacing * 2, itemHeight + spacing)); - m_controller->setZoomInPossible(isZoomInPossible()); - m_controller->setZoomOutPossible(isZoomOutPossible()); - KFileItemDelegate* delegate = dynamic_cast(itemDelegate()); if (delegate != 0) { delegate->setMaximumSize(m_itemSize);