#include "dolphincolumnviewcontainer.h"
#include "dolphinviewcontroller.h"
#include "dolphindirlister.h"
+#include "dolphinfileitemdelegate.h"
#include "dolphinsortfilterproxymodel.h"
#include "settings/dolphinsettings.h"
#include "dolphinviewautoscroller.h"
#include <kdirlister.h>
#include <kfileitem.h>
#include <kio/previewjob.h>
+#include <kicon.h>
#include <kiconeffect.h>
#include <kjob.h>
+#include <klocale.h>
#include <konqmimedata.h>
#include <QApplication>
#include <QClipboard>
+#include <QHeaderView>
+#include <QLabel>
#include <QPainter>
#include <QPoint>
#include <QScrollBar>
DolphinColumnView::DolphinColumnView(QWidget* parent,
DolphinColumnViewContainer* container,
const KUrl& url) :
- QListView(parent),
+ DolphinTreeView(parent),
m_active(false),
m_container(container),
m_extensionsFactory(0),
m_dirLister(0),
m_dolphinModel(0),
m_proxyModel(0),
- m_dropRect()
+ m_resizeWidget(0),
+ m_resizeXOrigin(-1)
{
setMouseTracking(true);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ setAcceptDrops(true);
+ setUniformRowHeights(true);
setSelectionBehavior(SelectItems);
setSelectionMode(QAbstractItemView::ExtendedSelection);
setDragDropMode(QAbstractItemView::DragDrop);
setDropIndicatorShown(false);
- setSelectionRectVisible(true);
+ setRootIsDecorated(false);
+ setItemsExpandable(false);
setEditTriggers(QAbstractItemView::NoEditTriggers);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
- setVerticalScrollMode(QListView::ScrollPerPixel);
- setHorizontalScrollMode(QListView::ScrollPerPixel);
+ m_resizeWidget = new QLabel(this);
+ m_resizeWidget->setPixmap(KIcon("transform-move").pixmap(KIconLoader::SizeSmall));
+ m_resizeWidget->setToolTip(i18nc("@info:tooltip", "Resize column"));
+ setCornerWidget(m_resizeWidget);
+ m_resizeWidget->installEventFilter(this);
- // apply the column mode settings to the widget
const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
Q_ASSERT(settings != 0);
m_font.setPointSizeF(settings->fontSize());
}
+ setMinimumWidth(settings->fontSize() * 10);
+ setMaximumWidth(settings->columnWidth());
+
connect(this, SIGNAL(viewportEntered()),
m_container->m_dolphinViewController, SLOT(emitViewportEntered()));
connect(this, SIGNAL(entered(const QModelIndex&)),
m_dirLister->setDelayedMimeTypes(true);
const bool showHiddenFiles = m_container->m_dolphinViewController->view()->showHiddenFiles();
m_dirLister->setShowingDotFiles(showHiddenFiles);
+ connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotDirListerCompleted()));
m_dolphinModel = new DolphinModel(this);
m_dolphinModel->setDirLister(m_dirLister);
DolphinViewController* dolphinViewController = m_container->m_dolphinViewController;
m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController);
+ m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true);
m_dirLister->openUrl(url, KDirLister::NoFlags);
}
this, SLOT(requestActivation()));
}
- QListView::setSelectionModel(model);
+ DolphinTreeView::setSelectionModel(model);
connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(requestActivation()));
QStyleOptionViewItem DolphinColumnView::viewOptions() const
{
- QStyleOptionViewItem viewOptions = QListView::viewOptions();
+ QStyleOptionViewItem viewOptions = DolphinTreeView::viewOptions();
viewOptions.font = m_font;
viewOptions.fontMetrics = QFontMetrics(m_font);
viewOptions.decorationSize = m_decorationSize;
return viewOptions;
}
+bool DolphinColumnView::event(QEvent* event)
+{
+ if (event->type() == QEvent::Polish) {
+ // Hide all columns except of the 'Name' column
+ for (int i = DolphinModel::Name + 1; i < DolphinModel::ExtraColumnCount; ++i) {
+ hideColumn(i);
+ }
+ header()->hide();
+ }
+
+ return DolphinTreeView::event(event);
+}
+
void DolphinColumnView::startDrag(Qt::DropActions supportedActions)
{
DragAndDropHelper::instance().startDrag(this, supportedActions, m_container->m_dolphinViewController);
+ DolphinTreeView::startDrag(supportedActions);
}
void DolphinColumnView::dragEnterEvent(QDragEnterEvent* event)
event->acceptProposedAction();
requestActivation();
}
-}
-
-void DolphinColumnView::dragLeaveEvent(QDragLeaveEvent* event)
-{
- QListView::dragLeaveEvent(event);
- setDirtyRegion(m_dropRect);
+ DolphinTreeView::dragEnterEvent(event);
}
void DolphinColumnView::dragMoveEvent(QDragMoveEvent* event)
{
- QListView::dragMoveEvent(event);
-
- // TODO: remove this code when the issue #160611 is solved in Qt 4.4
- const QModelIndex index = indexAt(event->pos());
- setDirtyRegion(m_dropRect);
-
- m_dropRect.setSize(QSize()); // set as invalid
- if (index.isValid()) {
- m_container->m_dolphinViewController->setItemView(this);
- const KFileItem item = m_container->m_dolphinViewController->itemForIndex(index);
- if (!item.isNull() && item.isDir()) {
- m_dropRect = visualRect(index);
- }
- }
- setDirtyRegion(m_dropRect);
+ DolphinTreeView::dragMoveEvent(event);
if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) {
// accept url drops, independently from the destination item
{
const QModelIndex index = indexAt(event->pos());
m_container->m_dolphinViewController->setItemView(this);
- const KFileItem item = m_container->m_dolphinViewController->itemForIndex(index);
+ const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
+ const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex);
m_container->m_dolphinViewController->indicateDroppedUrls(item, url(), event);
- QListView::dropEvent(event);
+ DolphinTreeView::dropEvent(event);
}
void DolphinColumnView::paintEvent(QPaintEvent* event)
{
if (!m_childUrl.isEmpty()) {
- // indicate the shown URL of the next column by highlighting the shown folder item
+ // Indicate the shown URL of the next column by highlighting the shown folder item
const QModelIndex dirIndex = m_dolphinModel->indexForUrl(m_childUrl);
const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex);
if (proxyIndex.isValid() && !selectionModel()->isSelected(proxyIndex)) {
- const QRect itemRect = visualRect(proxyIndex);
QPainter painter(viewport());
- QColor color = KColorScheme(QPalette::Active, KColorScheme::View).foreground().color();
- color.setAlpha(32);
- painter.setPen(Qt::NoPen);
- painter.setBrush(color);
- painter.drawRect(itemRect);
+
+ QStyleOptionViewItemV4 option;
+ option.initFrom(this);
+ option.rect = visualRect(proxyIndex);
+ option.state = QStyle::State_Enabled | QStyle::State_HasFocus;
+ option.viewItemPosition = QStyleOptionViewItemV4::OnlyOne;
+ style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this);
}
}
- QListView::paintEvent(event);
+ DolphinTreeView::paintEvent(event);
}
void DolphinColumnView::mousePressEvent(QMouseEvent* event)
{
requestActivation();
- if (!indexAt(event->pos()).isValid()) {
- if (QApplication::mouseButtons() & Qt::MidButton) {
- m_container->m_dolphinViewController->replaceUrlByClipboard();
- }
- } else if (event->button() == Qt::LeftButton) {
- // TODO: see comment in DolphinIconsView::mousePressEvent()
- setState(QAbstractItemView::DraggingState);
+ if (!indexAt(event->pos()).isValid() && (QApplication::mouseButtons() & Qt::MidButton)) {
+ m_container->m_dolphinViewController->replaceUrlByClipboard();
}
- QListView::mousePressEvent(event);
+
+ DolphinTreeView::mousePressEvent(event);
}
void DolphinColumnView::keyPressEvent(QKeyEvent* event)
{
- QListView::keyPressEvent(event);
+ DolphinTreeView::keyPressEvent(event);
DolphinViewController* controller = m_container->m_dolphinViewController;
controller->handleKeyPressEvent(event);
case Qt::Key_Right: {
// Special key handling for the column: A Key_Right should
// open a new column for the currently selected folder.
- const QModelIndex index = currentIndex();
- const KFileItem item = controller->itemForIndex(index);
+ const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(currentIndex());
+ const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex);
if (!item.isNull() && item.isDir()) {
controller->emitItemTriggered(item);
}
void DolphinColumnView::contextMenuEvent(QContextMenuEvent* event)
{
requestActivation();
- QListView::contextMenuEvent(event);
+ DolphinTreeView::contextMenuEvent(event);
m_container->m_dolphinViewController->triggerContextMenuRequest(event->pos());
}
{
const int step = m_decorationSize.height();
verticalScrollBar()->setSingleStep(step);
- QListView::wheelEvent(event);
+ DolphinTreeView::wheelEvent(event);
}
void DolphinColumnView::leaveEvent(QEvent* event)
{
- QListView::leaveEvent(event);
+ DolphinTreeView::leaveEvent(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
void DolphinColumnView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
- QListView::currentChanged(current, previous);
+ DolphinTreeView::currentChanged(current, previous);
m_extensionsFactory->handleCurrentIndexChange(current, previous);
}
+QRect DolphinColumnView::visualRect(const QModelIndex& index) const
+{
+ QRect rect = DolphinTreeView::visualRect(index);
+
+ const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
+ const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex);
+ if (!item.isNull()) {
+ const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions());
+ rect.setWidth(width);
+ }
+
+ return rect;
+}
+
+bool DolphinColumnView::acceptsDrop(const QModelIndex& index) const
+{
+ if (index.isValid() && (index.column() == DolphinModel::Name)) {
+ // Accept drops above directories
+ const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
+ const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex);
+ return !item.isNull() && item.isDir();
+ }
+
+ return false;
+}
+
+bool DolphinColumnView::eventFilter(QObject* watched, QEvent* event)
+{
+ if (watched == m_resizeWidget) {
+ switch (event->type()) {
+ case QEvent::MouseButtonPress: {
+ // Initiate the resizing of the column
+ QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
+ m_resizeXOrigin = mouseEvent->globalX();
+ m_resizeWidget->setMouseTracking(true);
+ event->accept();
+ return true;
+ }
+
+ case QEvent::MouseButtonDblClick: {
+ // Reset the column width to the default value
+ const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
+ setMaximumWidth(settings->columnWidth());
+ m_container->layoutColumns();
+ m_resizeWidget->setMouseTracking(false);
+ m_resizeXOrigin = -1;
+ event->accept();
+ return true;
+ }
+
+ case QEvent::MouseMove: {
+ // Resize the column and trigger a relayout of the container
+ QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
+ int requestedWidth = maximumWidth() - m_resizeXOrigin + mouseEvent->globalX();;
+ if (requestedWidth < minimumWidth()) {
+ requestedWidth = minimumWidth();
+ }
+ setMaximumWidth(requestedWidth);
+
+ m_container->layoutColumns();
+
+ m_resizeXOrigin = mouseEvent->globalX();
+
+ event->accept();
+ return true;
+ }
+
+ case QEvent::MouseButtonRelease: {
+ // The resizing has been finished
+ m_resizeWidget->setMouseTracking(false);
+ m_resizeXOrigin = -1;
+ event->accept();
+ return true;
+ }
+
+ default:
+ break;
+ }
+ }
+ return DolphinTreeView::eventFilter(watched, event);
+}
void DolphinColumnView::setZoomLevel(int level)
{
const int size = ZoomLevelInfo::iconSizeForZoomLevel(level);
updateDecorationSize(view->showPreview());
}
+void DolphinColumnView::slotDirListerCompleted()
+{
+ if (!m_childUrl.isEmpty()) {
+ return;
+ }
+
+ // Try to optimize the width of the column, so that no name gets clipped
+ const int requiredWidth = sizeHintForColumn(DolphinModel::Name);
+
+ const ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
+ if (requiredWidth > settings->columnWidth()) {
+ int frameAroundContents = 0;
+ if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents)) {
+ // TODO: Using 2 PM_DefaultFrameWidths are not sufficient. Check Qt-code
+ // for other pixelmetrics that should be added...
+ frameAroundContents = style()->pixelMetric(QStyle::PM_DefaultFrameWidth) * 4;
+ }
+
+ const int scrollBarWidth = style()->pixelMetric(QStyle::PM_ScrollBarExtent, 0, verticalScrollBar());
+
+ setMaximumWidth(requiredWidth + frameAroundContents + scrollBarWidth);
+ m_container->layoutColumns();
+ if (m_active) {
+ m_container->assureVisibleActiveColumn();
+ }
+ }
+}
+
void DolphinColumnView::activate()
{
setFocus(Qt::OtherFocusReason);