/***************************************************************************
- * Copyright (C) 2007-2009 by Peter Penz <peter.penz@gmx.at> *
+ * Copyright (C) 2007-2009 by Peter Penz <peter.penz19@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
#include "viewmodecontroller.h"
#include "zoomlevelinfo.h"
-#include <kcolorscheme.h>
-#include <kdirlister.h>
-#include <kfileitem.h>
-#include <kio/previewjob.h>
-#include <kiconeffect.h>
-#include <kjob.h>
+#include <KColorScheme>
+#include <KDirLister>
+#include <KFileItem>
+#include <KIO/PreviewJob>
+#include <KIcon>
+#include <KIconEffect>
+#include <KJob>
+#include <KLocale>
#include <konqmimedata.h>
#include <QApplication>
#include <QClipboard>
#include <QHeaderView>
+#include <QLabel>
#include <QPainter>
#include <QPoint>
#include <QScrollBar>
m_decorationSize(),
m_dirLister(0),
m_dolphinModel(0),
- m_proxyModel(0)
+ m_proxyModel(0),
+ m_resizeWidget(0),
+ m_resizeXOrigin(-1)
{
setMouseTracking(true);
setAcceptDrops(true);
setRootIsDecorated(false);
setItemsExpandable(false);
setEditTriggers(QAbstractItemView::NoEditTriggers);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+
+ 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);
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);
updateDecorationSize(dolphinView->showPreview());
updateBackground();
-
+
DolphinViewController* dolphinViewController = m_container->m_dolphinViewController;
m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController);
m_extensionsFactory->fileItemDelegate()->setMinimizedNameColumn(true);
m_dirLister = 0; // deleted by m_dolphinModel
}
+
void DolphinColumnView::setActive(bool active)
{
if (m_active != active) {
}
}
+bool DolphinColumnView::isActive() const
+{
+ return m_active;
+}
+
+void DolphinColumnView::setChildUrl(const KUrl& url)
+{
+ m_childUrl = url;
+}
+
+KUrl DolphinColumnView::childUrl() const
+{
+ return m_childUrl;
+}
+
+void DolphinColumnView::setUrl(const KUrl& url)
+{
+ if (url != m_url) {
+ m_url = url;
+ m_dirLister->openUrl(url, KDirLister::NoFlags);
+ }
+}
+
+KUrl DolphinColumnView::url() const
+{
+ return m_url;
+}
+
void DolphinColumnView::updateBackground()
{
// TODO: The alpha-value 150 is copied from DolphinView::setActive(). When
void DolphinColumnView::dragEnterEvent(QDragEnterEvent* event)
{
- if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) {
- event->acceptProposedAction();
- requestActivation();
- }
+ event->acceptProposedAction();
+ requestActivation();
DolphinTreeView::dragEnterEvent(event);
}
void DolphinColumnView::dragMoveEvent(QDragMoveEvent* event)
{
DolphinTreeView::dragMoveEvent(event);
-
- if (DragAndDropHelper::instance().isMimeDataSupported(event->mimeData())) {
- // accept url drops, independently from the destination item
- event->acceptProposedAction();
- }
+ event->acceptProposedAction();
}
void DolphinColumnView::dropEvent(QDropEvent* event)
m_container->m_dolphinViewController->setItemView(this);
const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index);
const KFileItem item = m_dolphinModel->itemForIndex(dolphinModelIndex);
- m_container->m_dolphinViewController->indicateDroppedUrls(item, url(), event);
+ m_container->m_dolphinViewController->indicateDroppedUrls(item, 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);
}
}
}
void DolphinColumnView::keyPressEvent(QKeyEvent* event)
-{
+{
DolphinTreeView::keyPressEvent(event);
DolphinViewController* controller = m_container->m_dolphinViewController;
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);
selectionModel()->setCurrentIndex(current, QItemSelectionModel::NoUpdate);
connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)),
this, SLOT(requestActivation()));
-
+
updateBackground();
}