***************************************************************************/
#include "dolphinview.h"
+#include <ktoggleaction.h>
+#include <kactioncollection.h>
#include <QApplication>
#include <QClipboard>
m_controller = new DolphinController(this);
m_controller->setUrl(url);
+
+ // Receiver of the DolphinView signal 'urlChanged()' don't need
+ // to care whether the internal controller changed the URL already or whether
+ // the controller just requested an URL change and will be updated later.
+ // In both cases the URL has been changed:
connect(m_controller, SIGNAL(urlChanged(const KUrl&)),
this, SIGNAL(urlChanged(const KUrl&)));
+ connect(m_controller, SIGNAL(requestUrlChange(const KUrl&)),
+ this, SIGNAL(urlChanged(const KUrl&)));
+
connect(m_controller, SIGNAL(requestContextMenu(const QPoint&)),
this, SLOT(openContextMenu(const QPoint&)));
connect(m_controller, SIGNAL(urlsDropped(const KUrl::List&, const KUrl&, const QModelIndex&, QWidget*)),
this, SLOT(updateSorting(DolphinView::Sorting)));
connect(m_controller, SIGNAL(sortOrderChanged(Qt::SortOrder)),
this, SLOT(updateSortOrder(Qt::SortOrder)));
- connect(m_controller, SIGNAL(itemTriggered(const QModelIndex&)),
- this, SLOT(triggerItem(const QModelIndex&)));
+ connect(m_controller, SIGNAL(itemTriggered(const KFileItem&)),
+ this, SLOT(triggerItem(const KFileItem&)));
connect(m_controller, SIGNAL(activated()),
this, SLOT(activate()));
connect(m_controller, SIGNAL(itemEntered(const KFileItem&)),
KUrl DolphinView::rootUrl() const
{
- return isColumnViewActive() ? m_dirLister->url() : url();
+ return isColumnViewActive() ? m_columnView->rootUrl() : url();
}
void DolphinView::setActive(bool active)
m_active = active;
- updateViewportColor();
+ QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
+ if (active) {
+ // TODO: emitting urlChanged() is a hack, as the URL hasn't really changed. It
+ // bypasses the problem when having a split view and changing the active view to
+ // update the some URL dependent states. A nicer approach should be no big deal...
+ emit urlChanged(url());
+ emit selectionChanged(selectedItems());
+ } else {
+ color.setAlpha(150);
+ }
+
+ QWidget* viewport = itemView()->viewport();
+ QPalette palette;
+ palette.setColor(viewport->backgroundRole(), color);
+ viewport->setPalette(palette);
+
update();
if (active) {
emit activated();
}
+
+ m_controller->indicateActivationChange(active);
}
bool DolphinView::isActive() const
// to go back to the root URL of the column view automatically.
// Otherwise there it would not be possible to turn off the column view
// without focusing the first column.
- setUrl(m_dirLister->url());
- m_controller->setUrl(m_dirLister->url());
+ const KUrl root = rootUrl();
+ setUrl(root);
+ m_controller->setUrl(root);
}
const KUrl viewPropsUrl = viewPropertiesUrl();
const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
if (categorized != m_proxyModel->isCategorizedModel()) {
m_proxyModel->setCategorizedModel(categorized);
- m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
emit categorizedSortingChanged();
}
m_storedCategorizedSorting = categorized;
m_proxyModel->setCategorizedModel(categorized);
- m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
emit categorizedSortingChanged();
}
void DolphinView::refresh()
{
+ const bool oldActivationState = m_active;
+ m_active = true;
+
createView();
applyViewProperties(m_controller->url());
reload();
- updateViewportColor();
+
+ setActive(oldActivationState);
}
void DolphinView::updateView(const KUrl& url, const KUrl& rootUrl)
return;
}
- const bool restoreColumnView = !rootUrl.isEmpty()
- && !rootUrl.equals(url, KUrl::CompareWithoutTrailingSlash)
- && rootUrl.isParentOf(url);
-
m_controller->setUrl(url); // emits urlChanged, which we forward
- if (restoreColumnView) {
+ if (!rootUrl.isEmpty() && rootUrl.isParentOf(url)) {
applyViewProperties(rootUrl);
loadDirectory(rootUrl);
- // Restoring the column view relies on the URL-history. It might be possible
- // that the view properties have been changed or deleted in the meantime, so
- // it cannot be asserted that really a column view has been created:
if (itemView() == m_columnView) {
+ m_columnView->setRootUrl(rootUrl);
m_columnView->showColumn(url);
}
} else {
loadDirectory(url);
}
- itemView()->setFocus();
-
emit startedPathLoading(url);
}
+void DolphinView::setNameFilter(const QString& nameFilter)
+{
+ // The name filter of KDirLister does a 'hard' filtering, which
+ // means that only the items are shown where the names match
+ // exactly the filter. This is non-transparent for the user, which
+ // just wants to have a 'soft' filtering: does the name contain
+ // the filter string?
+ QString adjustedFilter(nameFilter);
+ adjustedFilter.insert(0, '*');
+ adjustedFilter.append('*');
+
+ m_dirLister->setNameFilter(adjustedFilter);
+ m_dirLister->emitChanges();
+
+ if (isColumnViewActive()) {
+ // adjusting the directory lister is not enough in the case of the
+ // column view, as each column has its own directory lister internally...
+ m_columnView->setNameFilter(nameFilter);
+ }
+}
+
+void DolphinView::calculateItemCount(int& fileCount, int& folderCount)
+{
+ foreach (KFileItem item, m_dirLister->items()) {
+ if (item.isDir()) {
+ ++folderCount;
+ } else {
+ ++fileCount;
+ }
+ }
+}
+
void DolphinView::setUrl(const KUrl& url)
{
updateView(url, KUrl());
setActive(true);
}
-void DolphinView::triggerItem(const QModelIndex& index)
+void DolphinView::triggerItem(const KFileItem& item)
{
- Q_ASSERT(index.isValid());
-
const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();
if ((modifier & Qt::ShiftModifier) || (modifier & Qt::ControlModifier)) {
// items are selected by the user, hence don't trigger the
return;
}
- const KFileItem item = m_dolphinModel->itemForIndex(m_proxyModel->mapToSource(index));
-
if (item.isNull()) {
return;
}
m_dirLister->stop();
m_dirLister->openUrl(url, reload ? KDirLister::Reload : KDirLister::NoFlags);
- if (isColumnViewActive() && reload) {
- // reloading the directory lister is not enough in the case of the
+ if (isColumnViewActive()) {
+ // adjusting the directory lister is not enough in the case of the
// column view, as each column has its own directory lister internally...
- m_columnView->reload();
+ if (reload) {
+ m_columnView->reload();
+ } else {
+ m_columnView->showColumn(url);
+ }
}
}
void DolphinView::applyViewProperties(const KUrl& url)
{
- if (isColumnViewActive() && m_dirLister->url().isParentOf(url)) {
+ if (isColumnViewActive() && rootUrl().isParentOf(url)) {
// The column view is active, hence don't apply the view properties
// of sub directories (represented by columns) to the view. The
// view always represents the properties of the first column.
const bool categorized = m_storedCategorizedSorting && supportsCategorizedSorting();
if (categorized != m_proxyModel->isCategorizedModel()) {
m_proxyModel->setCategorizedModel(categorized);
- m_proxyModel->sort(m_proxyModel->sortColumn(), m_proxyModel->sortOrder());
emit categorizedSortingChanged();
}
this, SLOT(emitContentsMoved()));
connect(view->horizontalScrollBar(), SIGNAL(valueChanged(int)),
this, SLOT(emitContentsMoved()));
- view->setFocus();
}
QAbstractItemView* DolphinView::itemView() const
const KFileItem item = *it;
if (isCutItem(item)) {
const QModelIndex index = m_dolphinModel->indexForItem(item);
- // Huh? the item is already known
- //const KFileItem item = m_dolphinModel->itemForIndex(index);
const QVariant value = m_dolphinModel->data(index, Qt::DecorationRole);
if (value.type() == QVariant::Icon) {
const QIcon icon(qvariant_cast<QIcon>(value));
}
}
-void DolphinView::updateViewportColor()
+KToggleAction* DolphinView::iconsModeAction(KActionCollection* actionCollection)
{
- QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
- if (m_active) {
- emit urlChanged(url()); // Hmm, this is a hack; the url hasn't really changed.
- emit selectionChanged(selectedItems());
- } else {
- color.setAlpha(0);
- }
+ KToggleAction* iconsView = actionCollection->add<KToggleAction>("icons");
+ iconsView->setText(i18nc("@action:inmenu View Mode", "Icons"));
+ iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
+ iconsView->setIcon(KIcon("fileview-icon"));
+ iconsView->setData(QVariant::fromValue(IconsView));
+ return iconsView;
+}
- QWidget* viewport = itemView()->viewport();
- QPalette palette;
- palette.setColor(viewport->backgroundRole(), color);
- viewport->setPalette(palette);
+KToggleAction* DolphinView::detailsModeAction(KActionCollection* actionCollection)
+{
+ KToggleAction* detailsView = actionCollection->add<KToggleAction>("details");
+ detailsView->setText(i18nc("@action:inmenu View Mode", "Details"));
+ detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
+ detailsView->setIcon(KIcon("fileview-detailed"));
+ detailsView->setData(QVariant::fromValue(DetailsView));
+ return detailsView;
+}
+
+KToggleAction* DolphinView::columnsModeAction(KActionCollection* actionCollection)
+{
+ KToggleAction* columnView = actionCollection->add<KToggleAction>("columns");
+ columnView->setText(i18nc("@action:inmenu View Mode", "Columns"));
+ columnView->setShortcut(Qt::CTRL | Qt::Key_3);
+ columnView->setIcon(KIcon("fileview-column"));
+ columnView->setData(QVariant::fromValue(ColumnView));
+ return columnView;
+}
+
+QString DolphinView::currentViewModeActionName() const
+{
+ switch (m_mode) {
+ case DolphinView::IconsView:
+ return "icons";
+ case DolphinView::DetailsView:
+ return "details";
+ case DolphinView::ColumnView:
+ return "columns";
+ }
+ return QString(); // can't happen
}
#include "dolphinview.moc"