#include "dolphiniconsview.h"
#include "dolphincategorydrawer.h"
-#include "dolphincontroller.h"
+#include "dolphinviewcontroller.h"
#include "settings/dolphinsettings.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphin_iconsmodesettings.h"
#include "draganddrophelper.h"
#include "selectionmanager.h"
#include "viewextensionsfactory.h"
+#include "viewmodecontroller.h"
#include "zoomlevelinfo.h"
#include <kcategorizedsortfilterproxymodel.h>
#include <QScrollBar>
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(),
m_itemSize(),
m_dropRect()
{
- Q_ASSERT(controller != 0);
+ Q_ASSERT(dolphinViewController != 0);
+ Q_ASSERT(viewModeController != 0);
+
setModel(proxyModel);
setLayoutDirection(Qt::LeftToRight);
setViewMode(QListView::IconMode);
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()),
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);
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();
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)
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
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);
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)
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 {
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
}
void DolphinIconsView::keyPressEvent(QKeyEvent* event)
{
KCategorizedView::keyPressEvent(event);
- m_controller->handleKeyPressEvent(event);
+ m_dolphinViewController->handleKeyPressEvent(event);
}
void DolphinIconsView::wheelEvent(QWheelEvent* 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)
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());
}
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);
void DolphinIconsView::requestActivation()
{
- m_controller->requestActivation();
+ m_dolphinViewController->requestActivation();
}
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<const QSortFilterProxyModel*>(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;
}
}
}
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).
int DolphinIconsView::additionalInfoCount() const
{
- const DolphinView* view = m_controller->dolphinView();
+ const DolphinView* view = m_dolphinViewController->view();
return view->additionalInfo().count();
}