QWidget(parent),
m_active(true),
m_loadingDirectory(false),
- m_initializeColumnView(false),
m_storedCategorizedSorting(false),
m_mode(DolphinView::IconsView),
m_topLayout(0),
connect(m_dirLister, SIGNAL(completed()),
this, SLOT(updateCutItems()));
- connect(m_dirLister, SIGNAL(newItems(const QList<KFileItem>&)),
- this, SLOT(generatePreviews(const QList<KFileItem>&)));
+ connect(m_dirLister, SIGNAL(newItems(const KFileItemList&)),
+ this, SLOT(generatePreviews(const KFileItemList&)));
m_controller = new DolphinController(this);
m_controller->setUrl(url);
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 QModelIndex&)),
- this, SLOT(showHoverInformation(const QModelIndex&)));
+ connect(m_controller, SIGNAL(itemEntered(const KFileItem&)),
+ this, SLOT(showHoverInformation(const KFileItem&)));
connect(m_controller, SIGNAL(viewportEntered()),
this, SLOT(clearHoverInformation()));
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();
emit categorizedSortingChanged();
}
- startDirLister(viewPropsUrl);
+ loadDirectory(viewPropsUrl);
emit modeChanged();
}
m_controller->setShowPreview(show);
emit showPreviewChanged();
- startDirLister(viewPropsUrl, true);
+ loadDirectory(viewPropsUrl, true);
}
bool DolphinView::showPreview() const
props.setShowHiddenFiles(show);
m_dirLister->setShowingDotFiles(show);
+ m_controller->setShowHiddenFiles(show);
emit showHiddenFilesChanged();
- startDirLister(viewPropsUrl, true);
+ loadDirectory(viewPropsUrl, true);
}
bool DolphinView::showHiddenFiles() const
// QAbstractItemView does not offer a virtual method invertSelection()
// as counterpart to QAbstractItemView::selectAll(). This makes it
// necessary to delegate the inverting of the selection to the
- // column view, as only the selection of the active column should get
- // inverted.
+ // column view, as only the selection of the active column should
+ // get inverted.
m_columnView->invertSelection();
} else {
QItemSelectionModel* selectionModel = itemView()->selectionModel();
itemView()->selectionModel()->clear();
}
-QList<KFileItem> DolphinView::selectedItems() const
+KFileItemList DolphinView::selectedItems() const
{
const QAbstractItemView* view = itemView();
Q_ASSERT((view != 0) && (view->selectionModel() != 0));
const QItemSelection selection = m_proxyModel->mapSelectionToSource(view->selectionModel()->selection());
- QList<KFileItem> itemList;
+ KFileItemList itemList;
const QModelIndexList indexList = selection.indexes();
foreach (QModelIndex index, indexList) {
KUrl::List DolphinView::selectedUrls() const
{
KUrl::List urls;
- const QList<KFileItem> list = selectedItems();
- for ( QList<KFileItem>::const_iterator it = list.begin(), end = list.end();
- it != end; ++it ) {
- urls.append((*it).url());
+ const KFileItemList list = selectedItems();
+ foreach (KFileItem item, list) {
+ urls.append(item.url());
}
return urls;
}
ViewProperties props(viewPropsUrl);
props.setAdditionalInfo(info);
- m_controller->setShowAdditionalInfo(!info.isEmpty());
+ m_controller->setAdditionalInfoCount(info.count());
m_fileItemDelegate->setShowInformation(info);
emit additionalInfoChanged(info);
- startDirLister(viewPropsUrl, true);
-}
-
-void DolphinView::setAdditionalInfo(KFileItemDelegate::Information info)
-{
- KFileItemDelegate::InformationList list;
- if (info != KFileItemDelegate::NoInformation)
- list << info;
-
- setAdditionalInfo(list);
+ loadDirectory(viewPropsUrl, true);
}
KFileItemDelegate::InformationList DolphinView::additionalInfo() const
void DolphinView::reload()
{
setUrl(url());
- startDirLister(url(), true);
+ loadDirectory(url(), true);
}
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)
if (restoreColumnView) {
applyViewProperties(rootUrl);
- Q_ASSERT(itemView() == m_columnView);
- startDirLister(rootUrl);
- m_columnView->showColumn(url);
+ 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 {
applyViewProperties(url);
- startDirLister(url);
+ loadDirectory(url);
}
itemView()->setFocus();
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;
}
emit itemTriggered(item); // caught by DolphinViewContainer or DolphinPart
}
-void DolphinView::generatePreviews(const QList<KFileItem>& items)
+void DolphinView::generatePreviews(const KFileItemList& items)
{
if (m_controller->showPreview()) {
KIO::PreviewJob* job = KIO::filePreview(items, 128);
emit selectionChanged(DolphinView::selectedItems());
}
-void DolphinView::startDirLister(const KUrl& url, bool reload)
+void DolphinView::loadDirectory(const KUrl& url, bool reload)
{
if (!url.isValid()) {
const QString location(url.pathOrUrl());
m_loadingDirectory = true;
m_dirLister->stop();
+ m_dirLister->openUrl(url, reload ? KDirLister::Reload : KDirLister::NoFlags);
- bool keepOldDirs = isColumnViewActive() && !m_initializeColumnView;
- m_initializeColumnView = false;
-
- if (keepOldDirs) {
- // keeping old directories is only necessary for hierarchical views
- // like the column view
+ 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...
if (reload) {
- // for the column view it is not enough to reload the directory lister,
- // so this task is delegated to the column view directly
m_columnView->reload();
- } else if (m_dirLister->directories().contains(url)) {
- // The dir lister contains the directory already, so
- // KDirLister::openUrl() may not get invoked twice.
- m_dirLister->updateDirectory(url);
} else {
- const KUrl& dirListerUrl = m_dirLister->url();
- if ((dirListerUrl == url) || !m_dirLister->url().isParentOf(url)) {
- // The current URL is not a child of the dir lister
- // URL. This may happen when e. g. a place has been selected
- // and hence the view must be reset.
- m_dirLister->openUrl(url, false, false);
- }
+ m_columnView->showColumn(url);
}
- } else {
- m_dirLister->openUrl(url, false, reload);
}
}
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.
m_mode = mode;
createView();
emit modeChanged();
-
- if (m_mode == ColumnView) {
- // The mode has been changed to the Column View. When starting the dir
- // lister with DolphinView::startDirLister() it is important to give a
- // hint that the dir lister may not keep the current directory
- // although this is the default for showing a hierarchy.
- m_initializeColumnView = true;
- }
}
if (itemView() == 0) {
createView();
const bool showHiddenFiles = props.showHiddenFiles();
if (showHiddenFiles != m_dirLister->showingDotFiles()) {
m_dirLister->setShowingDotFiles(showHiddenFiles);
+ m_controller->setShowHiddenFiles(showHiddenFiles);
emit showHiddenFilesChanged();
}
KFileItemDelegate::InformationList info = props.additionalInfo();
if (info != m_fileItemDelegate->showInformation()) {
- m_controller->setShowAdditionalInfo(!info.isEmpty());
+ m_controller->setAdditionalInfoCount(info.count());
m_fileItemDelegate->setShowInformation(info);
emit additionalInfoChanged(info);
}
}
}
-void DolphinView::changeSelection(const QList<KFileItem>& selection)
+void DolphinView::changeSelection(const KFileItemList& selection)
{
clearSelection();
if (selection.isEmpty()) {
applyCutItemEffect();
}
-void DolphinView::showHoverInformation(const QModelIndex& index)
+void DolphinView::showHoverInformation(const KFileItem& item)
{
if (hasSelection()) {
return;
}
- const KFileItem item = fileItem(index);
- if (!item.isNull()) {
- emit requestItemInfo(item);
- }
+ emit requestItemInfo(item);
}
void DolphinView::clearHoverInformation()
void DolphinView::createView()
{
+ KFileItemDelegate::InformationList infoList;
+ if (m_fileItemDelegate != 0) {
+ infoList = m_fileItemDelegate->showInformation();
+ }
+
// delete current view
QAbstractItemView* view = itemView();
if (view != 0) {
Q_ASSERT(view != 0);
m_fileItemDelegate = new KFileItemDelegate(view);
+ m_fileItemDelegate->setShowInformation(infoList);
view->setItemDelegate(m_fileItemDelegate);
view->setModel(m_proxyModel);
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()
-{
- 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);
- }
-
- QWidget* viewport = itemView()->viewport();
- QPalette palette;
- palette.setColor(viewport->backgroundRole(), color);
- viewport->setPalette(palette);
-}
-
#include "dolphinview.moc"