#include "dolphincolumnviewcontainer.h"
+#include "dolphin_columnmodesettings.h"
+
#include "dolphincolumnview.h"
-#include "dolphincontroller.h"
+#include "dolphinviewcontroller.h"
#include "dolphinsortfilterproxymodel.h"
+#include "draganddrophelper.h"
#include "settings/dolphinsettings.h"
-#include "zoomlevelinfo.h"
-
-#include "dolphin_columnmodesettings.h"
-
-#include <kfilepreviewgenerator.h>
+#include "viewmodecontroller.h"
#include <QPoint>
#include <QScrollBar>
#include <QTimeLine>
+#include <QTimer>
-DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent, DolphinController* controller) :
+DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
+ DolphinViewController* dolphinViewController,
+ const ViewModeController* viewModeController) :
QScrollArea(parent),
- m_controller(controller),
+ m_dolphinViewController(dolphinViewController),
+ m_viewModeController(viewModeController),
m_active(false),
m_index(-1),
m_contentX(0),
m_columns(),
m_emptyViewport(0),
m_animation(0),
- m_nameFilter()
+ m_dragSource(0),
+ m_activeUrlTimer(0)
{
- Q_ASSERT(controller != 0);
+ Q_ASSERT(dolphinViewController != 0);
+ Q_ASSERT(viewModeController != 0);
setAcceptDrops(true);
setFocusPolicy(Qt::NoFocus);
setFrameShape(QFrame::NoFrame);
setLayoutDirection(Qt::LeftToRight);
- connect(this, SIGNAL(viewportEntered()),
- controller, SLOT(emitViewportEntered()));
- connect(controller, SIGNAL(zoomLevelChanged(int)),
- this, SLOT(setZoomLevel(int)));
- connect(controller, SIGNAL(activationChanged(bool)),
+ connect(viewModeController, SIGNAL(activationChanged(bool)),
this, SLOT(updateColumnsBackground(bool)));
connect(horizontalScrollBar(), SIGNAL(valueChanged(int)),
m_animation = new QTimeLine(500, this);
connect(m_animation, SIGNAL(frameChanged(int)), horizontalScrollBar(), SLOT(setValue(int)));
- DolphinColumnView* column = new DolphinColumnView(viewport(), this, m_controller->url());
+ m_activeUrlTimer = new QTimer(this);
+ m_activeUrlTimer->setSingleShot(true);
+ m_activeUrlTimer->setInterval(200);
+ connect(m_activeUrlTimer, SIGNAL(timeout()),
+ this, SLOT(updateActiveUrl()));
+
+ DolphinColumnView* column = new DolphinColumnView(viewport(), this, viewModeController->url());
m_columns.append(column);
setActiveColumnIndex(0);
m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
updateColumnsBackground(true);
-}
-DolphinColumnViewContainer::~DolphinColumnViewContainer()
-{
}
-void DolphinColumnViewContainer::setNameFilter(const QString& nameFilter)
-{
- if (nameFilter != m_nameFilter) {
- m_nameFilter = nameFilter;
- foreach (DolphinColumnView* column, m_columns) {
- DolphinSortFilterProxyModel* proxyModel = static_cast<DolphinSortFilterProxyModel*>(column->model());
- proxyModel->setFilterRegExp(nameFilter);
- }
- }
-}
-
-QString DolphinColumnViewContainer::nameFilter() const
+DolphinColumnViewContainer::~DolphinColumnViewContainer()
{
- return m_nameFilter;
+ delete m_dragSource;
+ m_dragSource = 0;
}
KUrl DolphinColumnViewContainer::rootUrl() const
return m_columns[m_index];
}
-bool DolphinColumnViewContainer::showColumn(const KUrl& url)
+void DolphinColumnViewContainer::showColumn(const KUrl& url)
{
if (!rootUrl().isParentOf(url)) {
removeAllColumns();
m_columns[0]->setUrl(url);
- return false;
+ return;
}
int columnIndex = 0;
// the column represents already the requested URL, hence activate it
requestActivation(column);
layoutColumns();
- return false;
+ return;
} else if (!column->url().isParentOf(url)) {
// the column is no parent of the requested URL, hence
// just delete all remaining columns
columnIndex++;
DolphinColumnView* column = new DolphinColumnView(viewport(), this, childUrl);
- if (!m_nameFilter.isEmpty()) {
- DolphinSortFilterProxyModel* proxyModel = static_cast<DolphinSortFilterProxyModel*>(column->model());
- proxyModel->setFilterRegExp(m_nameFilter);
- }
- column->setActive(false);
-
m_columns.append(column);
// Before invoking layoutColumns() the column must be set visible temporary.
m_index = columnIndex;
m_columns[m_index]->setActive(true);
assureVisibleActiveColumn();
-
- return true;
}
void DolphinColumnViewContainer::mousePressEvent(QMouseEvent* event)
{
- m_controller->requestActivation();
+ m_dolphinViewController->requestActivation();
QScrollArea::mousePressEvent(event);
}
+void DolphinColumnViewContainer::keyPressEvent(QKeyEvent* event)
+{
+ if (event->key() == Qt::Key_Left) {
+ setActiveColumnIndex(m_index - 1);
+ } else {
+ QScrollArea::keyPressEvent(event);
+ }
+}
+
void DolphinColumnViewContainer::resizeEvent(QResizeEvent* event)
{
QScrollArea::resizeEvent(event);
}
}
-void DolphinColumnViewContainer::setZoomLevel(int level)
-{
- const int size = ZoomLevelInfo::iconSizeForZoomLevel(level);
- ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings();
-
- const bool showPreview = m_controller->dolphinView()->showPreview();
- if (showPreview) {
- settings->setPreviewSize(size);
- } else {
- settings->setIconSize(size);
- }
-}
-
void DolphinColumnViewContainer::moveContentHorizontally(int x)
{
m_contentX = isRightToLeft() ? +x : -x;
}
}
+void DolphinColumnViewContainer::updateActiveUrl()
+{
+ const KUrl activeUrl = m_columns[m_index]->url();
+ m_dolphinViewController->requestUrlChange(activeUrl);
+}
+
void DolphinColumnViewContainer::setActiveColumnIndex(int index)
{
- if (m_index == index) {
+ if ((m_index == index) || (index < 0) || (index >= m_columns.count())) {
return;
}
m_columns[m_index]->setActive(true);
assureVisibleActiveColumn();
+ m_activeUrlTimer->start(); // calls slot updateActiveUrl()
}
void DolphinColumnViewContainer::layoutColumns()
void DolphinColumnViewContainer::requestActivation(DolphinColumnView* column)
{
- m_controller->setItemView(column);
+ m_dolphinViewController->setItemView(column);
if (column->isActive()) {
assureVisibleActiveColumn();
} else {
void DolphinColumnViewContainer::deleteColumn(DolphinColumnView* column)
{
- if (column != 0) {
- if (m_controller->itemView() == column) {
- m_controller->setItemView(0);
+ if (column == 0) {
+ return;
+ }
+
+ if (m_dolphinViewController->itemView() == column) {
+ m_dolphinViewController->setItemView(0);
+ }
+ // deleteWhenNotDragSource(column) does not necessarily delete column,
+ // and we want its preview generator destroyed immediately.
+ column->hide();
+ // Prevent automatic destruction of column when this DolphinColumnViewContainer
+ // is destroyed.
+ column->setParent(0);
+ column->disconnect();
+
+ if (DragAndDropHelper::instance().isDragSource(column)) {
+ // The column is a drag source (the feature "Open folders
+ // during drag operations" is used). Deleting the view
+ // during an ongoing drag operation is not allowed, so
+ // this will postponed.
+ if (m_dragSource != 0) {
+ // the old stored view is obviously not the drag source anymore
+ m_dragSource->deleteLater();
+ m_dragSource = 0;
}
- // deleteWhenNotDragSource(column) does not necessarily delete column,
- // and we want its preview generator destroyed immediately.
- column->m_previewGenerator->deleteLater();
- column->m_previewGenerator = 0;
column->hide();
- // Prevent automatic destruction of column when this DolphinColumnViewContainer
- // is destroyed.
column->setParent(0);
column->disconnect();
- emit requestColumnDeletion(column);
+
+ m_dragSource = column;
+ } else {
+ column->deleteLater();
}
}