***************************************************************************/
#include "dolphincontroller.h"
+#include "zoomlevelinfo.h"
-#include <QPainter>
+#include <kdirmodel.h>
+#include <QAbstractProxyModel>
+#include <QApplication>
+#include <QClipboard>
+#include <QDir>
-DolphinController::DolphinController(QObject* parent) :
- QObject(parent),
- m_showHiddenFiles(false),
- m_showPreview(false),
- m_zoomInPossible(false),
- m_zoomOutPossible(false),
- m_additionalInfoCount(0),
- m_url()
+Qt::MouseButtons DolphinController::m_mouseButtons = Qt::NoButton;
+
+DolphinController::DolphinController(DolphinView* dolphinView) :
+ QObject(dolphinView),
+ m_zoomLevel(0),
+ m_nameFilter(),
+ m_url(),
+ m_dolphinView(dolphinView),
+ m_itemView(0),
+ m_versionControlActions()
{
}
{
if (m_url != url) {
m_url = url;
+ emit cancelPreviews();
emit urlChanged(url);
}
}
-void DolphinController::triggerContextMenuRequest(const QPoint& pos)
+void DolphinController::redirectToUrl(const KUrl& url)
+{
+ m_url = url;
+}
+
+void DolphinController::setItemView(QAbstractItemView* view)
+{
+ if (m_itemView != 0) {
+ disconnect(m_itemView, SIGNAL(pressed(const QModelIndex&)),
+ this, SLOT(updateMouseButtonState()));
+ }
+
+ m_itemView = view;
+
+ if (m_itemView != 0) {
+ m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(m_itemView->iconSize());
+
+ // TODO: this is a workaround until Qt-issue 176832 has been fixed
+ connect(m_itemView, SIGNAL(pressed(const QModelIndex&)),
+ this, SLOT(updateMouseButtonState()));
+ }
+}
+
+void DolphinController::triggerUrlChangeRequest(const KUrl& url)
+{
+ if (m_url != url) {
+ emit requestUrlChange(url);
+ }
+}
+
+void DolphinController::triggerContextMenuRequest(const QPoint& pos,
+ const QList<QAction*>& customActions)
{
emit activated();
- emit requestContextMenu(pos);
+ emit requestContextMenu(pos, customActions);
}
-void DolphinController::triggerActivation()
+void DolphinController::requestActivation()
{
emit activated();
}
-void DolphinController::indicateDroppedUrls(const KUrl::List& urls,
+void DolphinController::indicateDroppedUrls(const KFileItem& destItem,
const KUrl& destPath,
- const QModelIndex& destIndex,
- QWidget* source)
+ QDropEvent* event)
{
- emit urlsDropped(urls, destPath, destIndex, source);
+ emit urlsDropped(destItem, destPath, event);
}
emit sortOrderChanged(order);
}
-void DolphinController::setShowHiddenFiles(bool show)
+void DolphinController::indicateSortFoldersFirstChange(bool foldersFirst)
+{
+ emit sortFoldersFirstChanged(foldersFirst);
+}
+
+void DolphinController::indicateAdditionalInfoChange(const KFileItemDelegate::InformationList& info)
+{
+ emit additionalInfoChanged(info);
+}
+
+void DolphinController::indicateActivationChange(bool active)
+{
+ emit activationChanged(active);
+}
+
+void DolphinController::setNameFilter(const QString& nameFilter)
{
- if (m_showHiddenFiles != show) {
- m_showHiddenFiles = show;
- emit showHiddenFilesChanged(show);
+ if (nameFilter != m_nameFilter) {
+ m_nameFilter = nameFilter;
+ emit nameFilterChanged(nameFilter);
}
}
-void DolphinController::setShowPreview(bool show)
+QString DolphinController::nameFilter() const
{
- if (m_showPreview != show) {
- m_showPreview = show;
- emit showPreviewChanged(show);
+ return m_nameFilter;
+}
+
+void DolphinController::setZoomLevel(int level)
+{
+ Q_ASSERT(level >= ZoomLevelInfo::minimumLevel());
+ Q_ASSERT(level <= ZoomLevelInfo::maximumLevel());
+ if (level != m_zoomLevel) {
+ m_zoomLevel = level;
+ emit zoomLevelChanged(m_zoomLevel);
}
}
-void DolphinController::setAdditionalInfoCount(int count)
+void DolphinController::setVersionControlActions(QList<QAction*> actions)
{
- if (m_additionalInfoCount != count) {
- m_additionalInfoCount = count;
- emit additionalInfoCountChanged(count);
+ m_versionControlActions = actions;
+}
+
+QList<QAction*> DolphinController::versionControlActions(const KFileItemList& items)
+{
+ emit requestVersionControlActions(items);
+ // All view implementations are connected with the signal requestVersionControlActions()
+ // (see ViewExtensionFactory) and will invoke DolphinController::setVersionControlActions(),
+ // so that the context dependent actions can be returned.
+ return m_versionControlActions;
+}
+
+void DolphinController::handleKeyPressEvent(QKeyEvent* event)
+{
+ Q_ASSERT(m_itemView != 0);
+
+ const QItemSelectionModel* selModel = m_itemView->selectionModel();
+ const QModelIndex currentIndex = selModel->currentIndex();
+ const bool trigger = currentIndex.isValid()
+ && ((event->key() == Qt::Key_Return)
+ || (event->key() == Qt::Key_Enter))
+ && !selModel->selectedIndexes().isEmpty();
+ if (trigger) {
+ const QModelIndexList indexList = selModel->selectedIndexes();
+ foreach (const QModelIndex& index, indexList) {
+ emit itemTriggered(itemForIndex(index));
+ }
}
}
-void DolphinController::triggerZoomIn()
+void DolphinController::replaceUrlByClipboard()
{
- emit zoomIn();
+ const QClipboard* clipboard = QApplication::clipboard();
+ QString text;
+ if (clipboard->mimeData(QClipboard::Selection)->hasText()) {
+ text = clipboard->mimeData(QClipboard::Selection)->text();
+ } else if (clipboard->mimeData(QClipboard::Clipboard)->hasText()) {
+ text = clipboard->mimeData(QClipboard::Clipboard)->text();
+ }
+ if (!text.isEmpty() && QDir::isAbsolutePath(text)) {
+ m_dolphinView->setUrl(KUrl(text));
+ }
}
-void DolphinController::triggerZoomOut()
+void DolphinController::emitHideToolTip()
{
- emit zoomOut();
+ emit hideToolTip();
}
-void DolphinController::drawHoverIndication(QWidget* widget,
- const QRect& bounds,
- const QBrush& brush)
+void DolphinController::emitItemTriggered(const KFileItem& item)
{
- QPainter painter(widget);
- painter.save();
- QBrush blendedBrush(brush);
- QColor color = blendedBrush.color();
- color.setAlpha(64);
- blendedBrush.setColor(color);
+ emit itemTriggered(item);
+}
- const int radius = 10;
- QPainterPath path(QPointF(bounds.left(), bounds.top() + radius));
- path.quadTo(bounds.left(), bounds.top(), bounds.left() + radius, bounds.top());
- path.lineTo(bounds.right() - radius, bounds.top());
- path.quadTo(bounds.right(), bounds.top(), bounds.right(), bounds.top() + radius);
- path.lineTo(bounds.right(), bounds.bottom() - radius);
- path.quadTo(bounds.right(), bounds.bottom(), bounds.right() - radius, bounds.bottom());
- path.lineTo(bounds.left() + radius, bounds.bottom());
- path.quadTo(bounds.left(), bounds.bottom(), bounds.left(), bounds.bottom() - radius);
- path.closeSubpath();
+KFileItem DolphinController::itemForIndex(const QModelIndex& index) const
+{
+ Q_ASSERT(m_itemView != 0);
- painter.setRenderHint(QPainter::Antialiasing);
- painter.fillPath(path, blendedBrush);
- painter.restore();
+ QAbstractProxyModel* proxyModel = static_cast<QAbstractProxyModel*>(m_itemView->model());
+ KDirModel* dirModel = static_cast<KDirModel*>(proxyModel->sourceModel());
+ const QModelIndex dirIndex = proxyModel->mapToSource(index);
+ return dirModel->itemForIndex(dirIndex);
}
void DolphinController::triggerItem(const QModelIndex& index)
{
- emit itemTriggered(index);
+ if (m_mouseButtons & Qt::LeftButton) {
+ const KFileItem item = itemForIndex(index);
+ if (index.isValid() && (index.column() == KDirModel::Name)) {
+ emit itemTriggered(item);
+ } else {
+ m_itemView->clearSelection();
+ emit itemEntered(KFileItem());
+ }
+ }
}
-void DolphinController::emitItemEntered(const KFileItem& item)
+void DolphinController::requestTab(const QModelIndex& index)
{
- emit itemEntered(item);
+ if (m_mouseButtons & Qt::MidButton) {
+ const KFileItem item = itemForIndex(index);
+ const bool validRequest = index.isValid() &&
+ (index.column() == KDirModel::Name) &&
+ (item.isDir() || m_dolphinView->isTabsForFilesEnabled());
+ if (validRequest) {
+ emit tabRequested(item.url());
+ }
+ }
+}
+
+void DolphinController::emitItemEntered(const QModelIndex& index)
+{
+ KFileItem item = itemForIndex(index);
+ if (!item.isNull()) {
+ emit itemEntered(item);
+ }
}
void DolphinController::emitViewportEntered()
emit viewportEntered();
}
+void DolphinController::emitSelectionChanged()
+{
+ emit selectionChanged();
+}
+
+void DolphinController::updateMouseButtonState()
+{
+ m_mouseButtons = QApplication::mouseButtons();
+}
+
#include "dolphincontroller.moc"