#include <QItemSelectionModel>
#include <QMouseEvent>
#include <QVBoxLayout>
+#include <QTimer>
+#include <QScrollBar>
#include <kdirmodel.h>
#include <kfileitemdelegate.h>
+#include <kfileplacesmodel.h>
#include <klocale.h>
#include <kiconeffect.h>
#include <kio/netaccess.h>
#include <konq_operations.h>
#include <kurl.h>
+#include "dolphincolumnview.h"
#include "dolphincontroller.h"
#include "dolphinstatusbar.h"
#include "dolphinmainwindow.h"
#include "dolphincontextmenu.h"
#include "filterbar.h"
#include "renamedialog.h"
-#include "urlnavigator.h"
+#include "kurlnavigator.h"
#include "viewproperties.h"
+#include "dolphinsettings.h"
+#include "dolphin_generalsettings.h"
DolphinView::DolphinView(DolphinMainWindow* mainWindow,
QWidget* parent,
m_controller(0),
m_iconsView(0),
m_detailsView(0),
+ m_columnView(0),
m_fileItemDelegate(0),
m_filterBar(0),
m_statusBar(0),
connect(m_mainWindow, SIGNAL(activeViewChanged()),
this, SLOT(updateActivationState()));
- m_urlNavigator = new UrlNavigator(url, this);
+ QClipboard* clipboard = QApplication::clipboard();
+ connect(clipboard, SIGNAL(dataChanged()),
+ this, SLOT(updateCutItems()));
+
+ m_urlNavigator = new KUrlNavigator(new KFilePlacesModel(this), url, this);
+ m_urlNavigator->setUrlEditable(DolphinSettings::instance().generalSettings()->editableUrl());
+ m_urlNavigator->setHomeUrl(DolphinSettings::instance().generalSettings()->homeUrl());
m_urlNavigator->setShowHiddenFiles(showHiddenFiles);
connect(m_urlNavigator, SIGNAL(urlChanged(const KUrl&)),
this, SLOT(loadDirectory(const KUrl&)));
m_topLayout->addWidget(itemView());
m_topLayout->addWidget(m_filterBar);
m_topLayout->addWidget(m_statusBar);
-
- loadDirectory(m_urlNavigator->url());
}
DolphinView::~DolphinView()
name.replace(replaceIndex, 1, number);
if (oldUrl.fileName() != name) {
- KUrl newUrl(oldUrl.upUrl());
- newUrl.addPath(name);
+ KUrl newUrl = oldUrl;
+ newUrl.setFileName(name);
m_mainWindow->rename(oldUrl, newUrl);
}
++it;
}
else {
const KUrl& oldUrl = urls.first();
- KUrl newUrl = oldUrl.upUrl();
- newUrl.addPath(newName);
+ KUrl newUrl = oldUrl;
+ newUrl.setFileName(newName);
m_mainWindow->rename(oldUrl, newUrl);
}
}
int DolphinView::contentsX() const
{
-
return itemView()->horizontalScrollBar()->value();
}
return itemView()->verticalScrollBar()->value();
}
-void DolphinView::refreshSettings()
-{
- startDirLister(m_urlNavigator->url());
-}
-
void DolphinView::emitRequestItemInfo(const KUrl& url)
{
emit requestItemInfo(url);
void DolphinView::setUrlEditable(bool editable)
{
- m_urlNavigator->editUrl(editable);
-}
-
-const QLinkedList<UrlNavigator::HistoryElem> DolphinView::urlHistory(int& index) const
-{
- return m_urlNavigator->history(index);
+ m_urlNavigator->setUrlEditable(editable);
}
bool DolphinView::hasSelection() const
void DolphinView::loadDirectory(const KUrl& url)
{
+ if(!isActive()) {
+ requestActivation();
+ }
+
const ViewProperties props(url);
const Mode mode = props.viewMode();
- if (m_mode != mode) {
+ bool changeMode = (m_mode != mode);
+ if (changeMode && isColumnViewActive()) {
+ // The column view is active. Only change the
+ // mode if the current URL is no child of the column view.
+ if (m_dirLister->url().isParentOf(url)) {
+ changeMode = false;
+ }
+ }
+
+ if (changeMode) {
m_mode = mode;
createView();
emit modeChanged();
void DolphinView::restoreContentsPos()
{
- int index = 0;
- const QLinkedList<UrlNavigator::HistoryElem> history = urlHistory(index);
- if (!history.isEmpty()) {
+ KUrl currentUrl = m_urlNavigator->url();
+ if (!currentUrl.isEmpty()) {
QAbstractItemView* view = itemView();
- // TODO: view->setCurrentItem(history[index].currentFileName());
-
- QLinkedList<UrlNavigator::HistoryElem>::const_iterator it = history.begin();
- it += index;
- view->horizontalScrollBar()->setValue((*it).contentsX());
- view->verticalScrollBar()->setValue((*it).contentsY());
+ // TODO: view->setCurrentItem(m_urlNavigator->currentFileName());
+ QPoint pos = m_urlNavigator->savedPosition();
+ view->horizontalScrollBar()->setValue(pos.x());
+ view->verticalScrollBar()->setValue(pos.y());
}
}
void DolphinView::emitSelectionChangedSignal()
{
- emit selectionChanged();
+ emit selectionChanged(DolphinView::selectedItems());
}
void DolphinView::closeFilterBar()
m_statusBar->setProgress(0);
}
+ m_cutItemsCache.clear();
m_blockContentsMovedSignal = true;
m_dirLister->stop();
- m_dirLister->openUrl(url, false, reload);
+
+ bool openDir = true;
+ bool keepOldDirs = isColumnViewActive();
+ if (keepOldDirs) {
+ if (reload) {
+ keepOldDirs = false;
+
+ const KUrl& dirListerUrl = m_dirLister->url();
+ if (dirListerUrl.isValid()) {
+ const KUrl::List dirs = m_dirLister->directories();
+ KUrl url;
+ foreach (url, dirs) {
+ m_dirLister->updateDirectory(url);
+ }
+ openDir = false;
+ }
+ }
+ else if (m_dirLister->directories().contains(url)) {
+ // The dir lister contains the directory already, so
+ // KDirLister::openUrl() may not been invoked twice.
+ m_dirLister->updateDirectory(url);
+ openDir = false;
+ }
+ 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 bookmark has been selected
+ // and hence the view must be reset.
+ keepOldDirs = false;
+ }
+ }
+ }
+
+ if (openDir) {
+ m_dirLister->openUrl(url, keepOldDirs, reload);
+ }
}
QString DolphinView::defaultStatusBarText() const
m_mainWindow->setActiveView(this);
}
-void DolphinView::updateCutItems()
+void DolphinView::changeSelection(const KFileItemList& selection)
{
- const QMimeData* mimeData = QApplication::clipboard()->mimeData();
- if (!KonqMimeData::decodeIsCutSelection(mimeData)) {
+ clearSelection();
+ if (selection.isEmpty()) {
return;
}
-
- KFileItemList items(m_dirLister->items());
- KFileItemList::const_iterator it = items.begin();
- const KFileItemList::const_iterator end = items.end();
- while (it != end) {
- KFileItem* item = *it;
- if (isCutItem(*item)) {
- const QModelIndex idx = m_dirModel->indexForItem(*item);
- const QVariant value = m_dirModel->data(idx, Qt::DecorationRole);
- if (value.type() == QVariant::Icon) {
- const QIcon icon(qvariant_cast<QIcon>(value));
- KIconEffect iconEffect;
- const QPixmap pixmap = iconEffect.apply(icon.pixmap(128, 128),
- K3Icon::Desktop,
- K3Icon::DisabledState);
- m_dirModel->setData(idx, QIcon(pixmap), Qt::DecorationRole);
- }
+ KUrl baseUrl = url();
+ KUrl url;
+ QItemSelection new_selection;
+ foreach (KFileItem* item, selection) {
+ url = item->url().upUrl();
+ if (baseUrl.equals(url, KUrl::CompareWithoutTrailingSlash)) {
+ QModelIndex index = m_proxyModel->mapFromSource(m_dirModel->indexForItem(*item));
+ new_selection.select(index, index);
}
- ++it;
}
+ itemView()->selectionModel()->select(new_selection,
+ QItemSelectionModel::ClearAndSelect
+ | QItemSelectionModel::Current);
}
void DolphinView::changeNameFilter(const QString& nameFilter)
const KUrl& destination = (directory == 0) ? url() :
directory->url();
-
dropUrls(urls, destination);
}
m_mainWindow->dropUrls(urls, destination);
}
-
void DolphinView::updateSorting(DolphinView::Sorting sorting)
{
ViewProperties props(url());
void DolphinView::updateActivationState()
{
m_urlNavigator->setActive(isActive());
+ if(isActive()) {
+ emit urlChanged(url());
+ emit selectionChanged(selectedItems());
+ }
+}
+
+void DolphinView::updateCutItems()
+{
+ // restore the icons of all previously selected items to the
+ // original state...
+ QList<CutItem>::const_iterator it = m_cutItemsCache.begin();
+ QList<CutItem>::const_iterator end = m_cutItemsCache.end();
+ while (it != end) {
+ const QModelIndex index = m_dirModel->indexForUrl((*it).url);
+ if (index.isValid()) {
+ m_dirModel->setData(index, QIcon((*it).pixmap), Qt::DecorationRole);
+ }
+ ++it;
+ }
+ m_cutItemsCache.clear();
+
+ // ... and apply an item effect to all currently cut items
+ applyCutItemEffect();
}
void DolphinView::createView()
view = 0;
m_iconsView = 0;
m_detailsView = 0;
+ m_columnView = 0;
m_fileItemDelegate = 0;
}
Q_ASSERT(m_iconsView == 0);
Q_ASSERT(m_detailsView == 0);
+ Q_ASSERT(m_columnView == 0);
// ... and recreate it representing the current mode
switch (m_mode) {
m_detailsView = new DolphinDetailsView(this, m_controller);
view = m_detailsView;
break;
+
+ case ColumnView:
+ m_columnView = new DolphinColumnView(this, m_controller);
+ view = m_columnView;
+ break;
}
Q_ASSERT(view != 0);
QAbstractItemView* DolphinView::itemView() const
{
- Q_ASSERT((m_iconsView == 0) || (m_detailsView == 0));
if (m_detailsView != 0) {
return m_detailsView;
}
+ else if (m_columnView != 0) {
+ return m_columnView;
+ }
+
return m_iconsView;
}
return false;
}
+void DolphinView::applyCutItemEffect()
+{
+ const QMimeData* mimeData = QApplication::clipboard()->mimeData();
+ if (!KonqMimeData::decodeIsCutSelection(mimeData)) {
+ return;
+ }
+
+ KFileItemList items(m_dirLister->items());
+ KFileItemList::const_iterator it = items.begin();
+ const KFileItemList::const_iterator end = items.end();
+ while (it != end) {
+ KFileItem* item = *it;
+ if (isCutItem(*item)) {
+ const QModelIndex index = m_dirModel->indexForItem(*item);
+ const KFileItem* item = m_dirModel->itemForIndex(index);
+ const QVariant value = m_dirModel->data(index, Qt::DecorationRole);
+ if ((value.type() == QVariant::Icon) && (item != 0)) {
+ const QIcon icon(qvariant_cast<QIcon>(value));
+ QPixmap pixmap = icon.pixmap(128, 128);
+
+ // remember current pixmap for the item to be able
+ // to restore it when other items get cut
+ CutItem cutItem;
+ cutItem.url = item->url();
+ cutItem.pixmap = pixmap;
+ m_cutItemsCache.append(cutItem);
+
+ // apply icon effect to the cut item
+ KIconEffect iconEffect;
+ pixmap = iconEffect.apply(pixmap, K3Icon::Desktop, K3Icon::DisabledState);
+ m_dirModel->setData(index, QIcon(pixmap), Qt::DecorationRole);
+ }
+ }
+ ++it;
+ }
+}
+
#include "dolphinview.moc"