#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 "dolphin_columnmodesettings.h"
+#include "viewmodecontroller.h"
#include <QPoint>
#include <QScrollBar>
#include <QTimeLine>
+#include <QTimer>
DolphinColumnViewContainer::DolphinColumnViewContainer(QWidget* parent,
- DolphinController* controller) :
+ 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_animation(0),
+ 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(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()
{
+ delete m_dragSource;
+ m_dragSource = 0;
}
KUrl DolphinColumnViewContainer::rootUrl() const
columnIndex++;
DolphinColumnView* column = new DolphinColumnView(viewport(), this, childUrl);
- column->setActive(false);
-
m_columns.append(column);
// Before invoking layoutColumns() the column must be set visible temporary.
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::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->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();
}
}