X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/f0e54ea52b3934bbb64b4d43a8c7dcdfd6b50de7..87cd992e85effd14938f67c0671ef2e7cb93a8a7:/src/dolphiniconsview.cpp diff --git a/src/dolphiniconsview.cpp b/src/dolphiniconsview.cpp index a8188d971..636bdd66c 100644 --- a/src/dolphiniconsview.cpp +++ b/src/dolphiniconsview.cpp @@ -20,7 +20,7 @@ #include "dolphiniconsview.h" #include "dolphincategorydrawer.h" -#include "dolphincontroller.h" +#include "dolphinviewcontroller.h" #include "settings/dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" #include "dolphin_iconsmodesettings.h" @@ -28,6 +28,7 @@ #include "draganddrophelper.h" #include "selectionmanager.h" #include "viewextensionsfactory.h" +#include "viewmodecontroller.h" #include "zoomlevelinfo.h" #include @@ -39,11 +40,13 @@ #include DolphinIconsView::DolphinIconsView(QWidget* parent, - DolphinController* controller, + DolphinViewController* dolphinViewController, + const ViewModeController* viewModeController, DolphinSortFilterProxyModel* proxyModel) : KCategorizedView(parent), - m_controller(controller), - m_categoryDrawer(0), + m_dolphinViewController(dolphinViewController), + m_viewModeController(viewModeController), + m_categoryDrawer(new DolphinCategoryDrawer(this)), m_extensionsFactory(0), m_font(), m_decorationSize(), @@ -52,7 +55,9 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, m_itemSize(), m_dropRect() { - Q_ASSERT(controller != 0); + Q_ASSERT(dolphinViewController != 0); + Q_ASSERT(viewModeController != 0); + setModel(proxyModel); setLayoutDirection(Qt::LeftToRight); setViewMode(QListView::IconMode); @@ -65,23 +70,23 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, setMouseTracking(true); connect(this, SIGNAL(clicked(const QModelIndex&)), - controller, SLOT(requestTab(const QModelIndex&))); + dolphinViewController, SLOT(requestTab(const QModelIndex&))); if (KGlobalSettings::singleClick()) { connect(this, SIGNAL(clicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + dolphinViewController, SLOT(triggerItem(const QModelIndex&))); } else { connect(this, SIGNAL(doubleClicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + dolphinViewController, SLOT(triggerItem(const QModelIndex&))); } connect(this, SIGNAL(entered(const QModelIndex&)), - controller, SLOT(emitItemEntered(const QModelIndex&))); + dolphinViewController, SLOT(emitItemEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), - controller, SLOT(emitViewportEntered())); - connect(controller, SIGNAL(zoomLevelChanged(int)), + dolphinViewController, SLOT(emitViewportEntered())); + connect(viewModeController, SIGNAL(zoomLevelChanged(int)), this, SLOT(setZoomLevel(int))); - const DolphinView* view = controller->dolphinView(); + const DolphinView* view = dolphinViewController->view(); connect(view, SIGNAL(showPreviewChanged()), this, SLOT(slotShowPreviewChanged())); connect(view, SIGNAL(additionalInfoChanged()), @@ -95,9 +100,10 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, m_font = KGlobalSettings::generalFont(); } else { m_font = QFont(settings->fontFamily(), - settings->fontSize(), + qRound(settings->fontSize()), settings->fontWeight(), settings->italicFont()); + m_font.setPointSizeF(settings->fontSize()); } setWordWrap(settings->numberOfTextlines() > 1); @@ -112,7 +118,7 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, m_displayAlignment = Qt::AlignLeft | Qt::AlignVCenter; } - m_categoryDrawer = new DolphinCategoryDrawer(); + connect(m_categoryDrawer, SIGNAL(actionRequested(int,QModelIndex)), this, SLOT(categoryDrawerActionRequested(int,QModelIndex))); setCategoryDrawer(m_categoryDrawer); setFocus(); @@ -121,13 +127,11 @@ DolphinIconsView::DolphinIconsView(QWidget* parent, this, SLOT(slotGlobalSettingsChanged(int))); updateGridSize(view->showPreview(), 0); - m_extensionsFactory = new ViewExtensionsFactory(this, controller); + m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController); } DolphinIconsView::~DolphinIconsView() { - delete m_categoryDrawer; - m_categoryDrawer = 0; } void DolphinIconsView::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) @@ -157,12 +161,12 @@ QStyleOptionViewItem DolphinIconsView::viewOptions() const void DolphinIconsView::contextMenuEvent(QContextMenuEvent* event) { KCategorizedView::contextMenuEvent(event); - m_controller->triggerContextMenuRequest(event->pos()); + m_dolphinViewController->triggerContextMenuRequest(event->pos()); } void DolphinIconsView::mousePressEvent(QMouseEvent* event) { - m_controller->requestActivation(); + m_dolphinViewController->requestActivation(); const QModelIndex index = indexAt(event->pos()); if (index.isValid() && (event->button() == Qt::LeftButton)) { // TODO: It should not be necessary to manually set the dragging state, but I could @@ -173,14 +177,8 @@ void DolphinIconsView::mousePressEvent(QMouseEvent* event) setState(QAbstractItemView::DraggingState); } - 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(); - } + if (!index.isValid() && (QApplication::mouseButtons() & Qt::MidButton)) { + m_dolphinViewController->replaceUrlByClipboard(); } KCategorizedView::mousePressEvent(event); @@ -188,7 +186,7 @@ void DolphinIconsView::mousePressEvent(QMouseEvent* event) void DolphinIconsView::startDrag(Qt::DropActions supportedActions) { - DragAndDropHelper::instance().startDrag(this, supportedActions, m_controller); + DragAndDropHelper::instance().startDrag(this, supportedActions, m_dolphinViewController); } void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event) @@ -214,7 +212,7 @@ void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event) m_dropRect.setSize(QSize()); // set as invalid if (index.isValid()) { - const KFileItem item = m_controller->itemForIndex(index); + const KFileItem item = m_dolphinViewController->itemForIndex(index); if (!item.isNull() && item.isDir()) { m_dropRect = visualRect(index); } else { @@ -232,8 +230,8 @@ void DolphinIconsView::dragMoveEvent(QDragMoveEvent* event) void DolphinIconsView::dropEvent(QDropEvent* event) { const QModelIndex index = indexAt(event->pos()); - const KFileItem item = m_controller->itemForIndex(index); - m_controller->indicateDroppedUrls(item, m_controller->url(), event); + const KFileItem item = m_dolphinViewController->itemForIndex(index); + m_dolphinViewController->indicateDroppedUrls(item, m_viewModeController->url(), event); // don't call KCategorizedView::dropEvent(event), as it moves // the items which is not wanted } @@ -314,7 +312,7 @@ QModelIndex DolphinIconsView::moveCursor(CursorAction cursorAction, Qt::Keyboard void DolphinIconsView::keyPressEvent(QKeyEvent* event) { KCategorizedView::keyPressEvent(event); - m_controller->handleKeyPressEvent(event); + m_dolphinViewController->handleKeyPressEvent(event); } void DolphinIconsView::wheelEvent(QWheelEvent* event) @@ -352,7 +350,7 @@ void DolphinIconsView::leaveEvent(QEvent* event) // if the mouse is above an item and moved very fast outside the widget, // no viewportEntered() signal might be emitted although the mouse has been moved // above the viewport - m_controller->emitViewportEntered(); + m_dolphinViewController->emitViewportEntered(); } void DolphinIconsView::currentChanged(const QModelIndex& current, const QModelIndex& previous) @@ -364,19 +362,19 @@ void DolphinIconsView::currentChanged(const QModelIndex& current, const QModelIn void DolphinIconsView::resizeEvent(QResizeEvent* event) { KCategorizedView::resizeEvent(event); - const DolphinView* view = m_controller->dolphinView(); + const DolphinView* view = m_dolphinViewController->view(); updateGridSize(view->showPreview(), view->additionalInfo().count()); } void DolphinIconsView::slotShowPreviewChanged() { - const DolphinView* view = m_controller->dolphinView(); + const DolphinView* view = m_dolphinViewController->view(); updateGridSize(view->showPreview(), additionalInfoCount()); } void DolphinIconsView::slotAdditionalInfoChanged() { - const DolphinView* view = m_controller->dolphinView(); + const DolphinView* view = m_dolphinViewController->view(); const bool showPreview = view->showPreview(); updateGridSize(showPreview, view->additionalInfo().count()); } @@ -388,7 +386,7 @@ void DolphinIconsView::setZoomLevel(int level) const int oldIconSize = settings->iconSize(); int newIconSize = oldIconSize; - const bool showPreview = m_controller->dolphinView()->showPreview(); + const bool showPreview = m_dolphinViewController->view()->showPreview(); if (showPreview) { const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level); settings->setPreviewSize(previewSize); @@ -407,7 +405,7 @@ void DolphinIconsView::setZoomLevel(int level) void DolphinIconsView::requestActivation() { - m_controller->requestActivation(); + m_dolphinViewController->requestActivation(); } void DolphinIconsView::slotGlobalSettingsChanged(int category) @@ -420,12 +418,39 @@ void DolphinIconsView::slotGlobalSettingsChanged(int category) m_font = KGlobalSettings::generalFont(); } - disconnect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); - disconnect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + disconnect(this, SIGNAL(clicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); + disconnect(this, SIGNAL(doubleClicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); if (KGlobalSettings::singleClick()) { - connect(this, SIGNAL(clicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + connect(this, SIGNAL(clicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); } else { - connect(this, SIGNAL(doubleClicked(QModelIndex)), m_controller, SLOT(triggerItem(QModelIndex))); + connect(this, SIGNAL(doubleClicked(QModelIndex)), m_dolphinViewController, SLOT(triggerItem(QModelIndex))); + } +} + +void DolphinIconsView::categoryDrawerActionRequested(int action, const QModelIndex &index) +{ + const QSortFilterProxyModel *model = dynamic_cast(index.model()); + const QModelIndex topLeft = model->index(index.row(), modelColumn()); + QModelIndex bottomRight = topLeft; + const QString category = model->data(index, KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString(); + QModelIndex current = topLeft; + while (true) { + current = model->index(current.row() + 1, modelColumn()); + const QString curCategory = model->data(model->index(current.row(), index.column()), KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString(); + if (!current.isValid() || category != curCategory) { + break; + } + bottomRight = current; + } + switch (action) { + case DolphinCategoryDrawer::SelectAll: + selectionModel()->select(QItemSelection(topLeft, bottomRight), QItemSelectionModel::Select); + break; + case DolphinCategoryDrawer::UnselectAll: + selectionModel()->select(QItemSelection(topLeft, bottomRight), QItemSelectionModel::Deselect); + break; + default: + break; } } @@ -448,7 +473,7 @@ void DolphinIconsView::updateGridSize(bool showPreview, int additionalInfoCount) } Q_ASSERT(additionalInfoCount >= 0); - itemHeight += additionalInfoCount * m_font.pointSize() * 2; + itemHeight += additionalInfoCount * QFontMetrics(m_font).height(); // Optimize the item size of the grid in a way to prevent large gaps on the // right border (= row arrangement) or the bottom border (= column arrangement). @@ -500,7 +525,7 @@ void DolphinIconsView::updateGridSize(bool showPreview, int additionalInfoCount) int DolphinIconsView::additionalInfoCount() const { - const DolphinView* view = m_controller->dolphinView(); + const DolphinView* view = m_dolphinViewController->view(); return view->additionalInfo().count(); }