X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/29402a79bc09945ccd96201cbb42027b4c581a00..d6488887ecf69d7f192b94de8dce34fae0b7eb76:/src/dolphincolumnview.cpp diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index b8be24bf0..e0d48e5fa 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -43,13 +43,13 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* controller) : QAbstractItemView(parent), m_controller(controller), - m_restoreActiveColumnFocus(false), + m_active(false), m_index(-1), m_contentX(0), m_columns(), + m_emptyViewport(0), m_animation(0), - m_dolphinModel(0), - m_proxyModel(0) + m_nameFilter() { Q_ASSERT(controller != 0); @@ -57,21 +57,23 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* control setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); setSelectionMode(ExtendedSelection); + setFocusPolicy(Qt::NoFocus); + setFrameShape(QFrame::NoFrame); - connect(this, SIGNAL(entered(const QModelIndex&)), - controller, SLOT(emitItemEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), controller, SLOT(emitViewportEntered())); connect(controller, SIGNAL(zoomIn()), this, SLOT(zoomIn())); connect(controller, SIGNAL(zoomOut()), this, SLOT(zoomOut())); - connect(controller, SIGNAL(urlChanged(const KUrl&)), - this, SLOT(showColumn(const KUrl&))); - connect(controller, SIGNAL(showHiddenFilesChanged(bool)), - this, SLOT(slotShowHiddenFilesChanged(bool))); - connect(controller, SIGNAL(showPreviewChanged(bool)), - this, SLOT(slotShowPreviewChanged(bool))); + connect(controller, SIGNAL(activationChanged(bool)), + this, SLOT(updateColumnsBackground(bool))); + + const DolphinView* view = controller->dolphinView(); + connect(view, SIGNAL(showHiddenFilesChanged()), + this, SLOT(slotShowHiddenFilesChanged())); + connect(view, SIGNAL(showPreviewChanged()), + this, SLOT(slotShowPreviewChanged())); connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(moveContentHorizontally(int))); @@ -83,16 +85,11 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* control m_columns.append(column); setActiveColumnIndex(0); - updateDecorationSize(); - - // dim the background of the viewport - QColor bgColor = KColorScheme(QPalette::Active, KColorScheme::View).background().color(); - const QColor fgColor = KColorScheme(QPalette::Active, KColorScheme::View).foreground().color(); - bgColor = KColorUtils::mix(bgColor, fgColor, 0.04); + m_emptyViewport = new QFrame(viewport()); + m_emptyViewport->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); - QPalette palette = viewport()->palette(); - palette.setColor(viewport()->backgroundRole(), bgColor); - viewport()->setPalette(palette); + updateDecorationSize(); + updateColumnsBackground(true); } DolphinColumnView::~DolphinColumnView() @@ -123,13 +120,6 @@ QRect DolphinColumnView::visualRect(const QModelIndex& index) const return activeColumn()->visualRect(index); } -void DolphinColumnView::setModel(QAbstractItemModel* model) -{ - m_proxyModel = static_cast(model); - m_dolphinModel = static_cast(m_proxyModel->sourceModel()); - QAbstractItemView::setModel(model); -} - void DolphinColumnView::invertSelection() { QItemSelectionModel* selectionModel = activeColumn()->selectionModel(); @@ -150,32 +140,37 @@ void DolphinColumnView::reload() } } -void DolphinColumnView::showColumn(const KUrl& url) +void DolphinColumnView::setRootUrl(const KUrl& url) { - const KUrl& rootUrl = m_columns[0]->url(); - if (!rootUrl.isParentOf(url)) { - // the URL is no child URL of the column view, hence clear all columns - // and reset the root column - QList::iterator start = m_columns.begin() + 1; - QList::iterator end = m_columns.end(); - for (QList::iterator it = start; it != end; ++it) { - (*it)->deleteLater(); + removeAllColumns(); + m_columns[0]->setUrl(url); +} + +void DolphinColumnView::setNameFilter(const QString& nameFilter) +{ + if (nameFilter != m_nameFilter) { + m_nameFilter = nameFilter; + foreach (DolphinColumnWidget* column, m_columns) { + column->setNameFilter(nameFilter); } - m_columns.erase(start, end); - m_index = 0; - m_columns[0]->setActive(true); - m_columns[0]->setUrl(url); - assureVisibleActiveColumn(); - return; } +} + +QString DolphinColumnView::nameFilter() const +{ + return m_nameFilter; +} + +KUrl DolphinColumnView::rootUrl() const +{ + return m_columns[0]->url(); +} - KDirLister* dirLister = m_dolphinModel->dirLister(); - const KUrl dirListerUrl = dirLister->url(); - if (dirListerUrl != rootUrl) { - // It is possible that root URL of the directory lister is adjusted - // after creating the column widget (e. g. when restoring the history - // having a different root URL than the controller indicates). - m_columns[0]->setUrl(dirListerUrl); +void DolphinColumnView::showColumn(const KUrl& url) +{ + if (!rootUrl().isParentOf(url)) { + setRootUrl(url); + return; } int columnIndex = 0; @@ -183,6 +178,7 @@ void DolphinColumnView::showColumn(const KUrl& url) if (column->url() == url) { // the column represents already the requested URL, hence activate it requestActivation(column); + layoutColumns(); return; } else if (!column->url().isParentOf(url)) { // the column is no parent of the requested URL, hence @@ -231,13 +227,14 @@ void DolphinColumnView::showColumn(const KUrl& url) ++slashIndex; const KUrl childUrl = KUrl(path); - const QModelIndex dirIndex = m_dolphinModel->indexForUrl(KUrl(path)); - const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); - m_columns[columnIndex]->setChildUrl(childUrl); columnIndex++; DolphinColumnWidget* column = new DolphinColumnWidget(viewport(), this, childUrl); + const QString filter = nameFilter(); + if (!filter.isEmpty()) { + column->setNameFilter(filter); + } column->setActive(false); m_columns.append(column); @@ -248,10 +245,6 @@ void DolphinColumnView::showColumn(const KUrl& url) column->show(); layoutColumns(); updateScrollBar(); - - // the layout is finished, now let the column be invisible until it - // gets a valid root index due to expandToActiveUrl() - //column->hide(); } } @@ -297,12 +290,14 @@ QModelIndex DolphinColumnView::moveCursor(CursorAction cursorAction, Qt::Keyboar case MoveLeft: if (m_index > 0) { setActiveColumnIndex(m_index - 1); + m_controller->triggerUrlChangeRequest(activeColumn()->url()); } break; case MoveRight: if (m_index < m_columns.count() - 1) { setActiveColumnIndex(m_index + 1); + m_controller->triggerUrlChangeRequest(m_columns[m_index]->url()); } break; @@ -338,7 +333,7 @@ int DolphinColumnView::verticalOffset() const void DolphinColumnView::mousePressEvent(QMouseEvent* event) { - m_controller->triggerActivation(); + m_controller->requestActivation(); QAbstractItemView::mousePressEvent(event); } @@ -399,15 +394,35 @@ void DolphinColumnView::updateDecorationSize() doItemsLayout(); } -void DolphinColumnView::slotShowHiddenFilesChanged(bool show) +void DolphinColumnView::updateColumnsBackground(bool active) { + if (active == m_active) { + return; + } + + m_active = active; + + // dim the background of the viewport + QPalette palette; + palette.setColor(viewport()->backgroundRole(), QColor(0, 0, 0, 0)); + viewport()->setPalette(palette); + + foreach (DolphinColumnWidget* column, m_columns) { + column->updateBackground(); + } +} + +void DolphinColumnView::slotShowHiddenFilesChanged() +{ + const bool show = m_controller->dolphinView()->showHiddenFiles(); foreach (DolphinColumnWidget* column, m_columns) { column->setShowHiddenFiles(show); } } -void DolphinColumnView::slotShowPreviewChanged(bool show) +void DolphinColumnView::slotShowPreviewChanged() { + const bool show = m_controller->dolphinView()->showPreview(); foreach (DolphinColumnWidget* column, m_columns) { column->setShowPreview(show); } @@ -439,36 +454,45 @@ void DolphinColumnView::setActiveColumnIndex(int index) m_index = index; m_columns[m_index]->setActive(true); - m_controller->setUrl(m_columns[m_index]->url()); - assureVisibleActiveColumn(); } void DolphinColumnView::layoutColumns() { + const int gap = 4; + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); const int columnWidth = settings->columnWidth(); + + QRect emptyViewportRect; if (isRightToLeft()) { int x = viewport()->width() - columnWidth + m_contentX; foreach (DolphinColumnWidget* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth, viewport()->height())); + column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); x -= columnWidth; } + emptyViewportRect = QRect(0, 0, x + columnWidth - gap, viewport()->height()); } else { int x = m_contentX; foreach (DolphinColumnWidget* column, m_columns) { - column->setGeometry(QRect(x, 0, columnWidth, viewport()->height())); + column->setGeometry(QRect(x, 0, columnWidth - gap, viewport()->height())); x += columnWidth; } + emptyViewportRect = QRect(x, 0, viewport()->width() - x - gap, viewport()->height()); + } + + if (emptyViewportRect.isValid()) { + m_emptyViewport->show(); + m_emptyViewport->setGeometry(emptyViewportRect); + } else { + m_emptyViewport->hide(); } } void DolphinColumnView::updateScrollBar() { - int contentWidth = 0; - foreach (DolphinColumnWidget* column, m_columns) { - contentWidth += column->width(); - } + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + const int contentWidth = m_columns.count() * settings->columnWidth(); horizontalScrollBar()->setPageStep(contentWidth); horizontalScrollBar()->setRange(0, contentWidth - viewport()->width()); @@ -478,7 +502,10 @@ void DolphinColumnView::assureVisibleActiveColumn() { const int viewportWidth = viewport()->width(); const int x = activeColumn()->x(); - const int width = activeColumn()->width(); + + ColumnModeSettings* settings = DolphinSettings::instance().columnModeSettings(); + const int width = settings->columnWidth(); + if (x + width > viewportWidth) { const int newContentX = m_contentX - x - width + viewportWidth; if (isRightToLeft()) { @@ -514,4 +541,17 @@ void DolphinColumnView::requestActivation(DolphinColumnWidget* column) } } +void DolphinColumnView::removeAllColumns() +{ + QList::iterator start = m_columns.begin() + 1; + QList::iterator end = m_columns.end(); + for (QList::iterator it = start; it != end; ++it) { + (*it)->deleteLater(); + } + m_columns.erase(start, end); + m_index = 0; + m_columns[0]->setActive(true); + assureVisibleActiveColumn(); +} + #include "dolphincolumnview.moc"