X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/abf8f1917d1ef044cf732eb873ce28bf805f27af..643a7a8d19458ff3577b83baa658001c528472cd:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 24692b5a8..613b7769b 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -20,27 +20,43 @@ #include "dolphindetailsview.h" -#include "dolphinmainwindow.h" +#include "dolphincontroller.h" +#include "dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" -#include "dolphinview.h" #include "viewproperties.h" -#include +#include "dolphin_detailsmodesettings.h" + #include + +#include #include +#include +#include +#include -DolphinDetailsView::DolphinDetailsView(DolphinView* parent) : +DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) : QTreeView(parent), - m_dolphinView(parent) + m_controller(controller), + m_dragging(false), + m_showElasticBand(false), + m_elasticBandOrigin(), + m_elasticBandDestination() { - assert(parent != 0); + Q_ASSERT(controller != 0); setAcceptDrops(true); setRootIsDecorated(false); setSortingEnabled(true); setUniformRowHeights(true); + setSelectionBehavior(SelectItems); + setDragDropMode(QAbstractItemView::DragDrop); + setDropIndicatorShown(false); + + setMouseTracking(true); + viewport()->setAttribute(Qt::WA_Hover); - const ViewProperties props(parent->url()); + const ViewProperties props(controller->url()); setSortIndicatorSection(props.sorting()); setSortIndicatorOrder(props.sortOrder()); @@ -51,6 +67,35 @@ DolphinDetailsView::DolphinDetailsView(DolphinView* parent) : this, SLOT(setSortIndicatorSection(DolphinView::Sorting))); connect(parent, SIGNAL(sortOrderChanged(Qt::SortOrder)), this, SLOT(setSortIndicatorOrder(Qt::SortOrder))); + + if (KGlobalSettings::singleClick()) { + connect(this, SIGNAL(clicked(const QModelIndex&)), + controller, SLOT(triggerItem(const QModelIndex&))); + } else { + connect(this, SIGNAL(doubleClicked(const QModelIndex&)), + controller, SLOT(triggerItem(const QModelIndex&))); + } + connect(this, SIGNAL(entered(const QModelIndex&)), + this, SLOT(slotEntered(const QModelIndex&))); + connect(this, SIGNAL(viewportEntered()), + controller, SLOT(emitViewportEntered())); + connect(controller, SIGNAL(zoomIn()), + this, SLOT(zoomIn())); + connect(controller, SIGNAL(zoomOut()), + this, SLOT(zoomOut())); + + // apply the details mode settings to the widget + const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + Q_ASSERT(settings != 0); + + m_viewOptions = QTreeView::viewOptions(); + + QFont font(settings->fontFamily(), settings->fontSize()); + font.setItalic(settings->italicFont()); + font.setBold(settings->boldFont()); + m_viewOptions.font = font; + + updateDecorationSize(); } DolphinDetailsView::~DolphinDetailsView() @@ -67,43 +112,85 @@ bool DolphinDetailsView::event(QEvent* event) headerView->setStretchLastSection(false); headerView->setResizeMode(QHeaderView::ResizeToContents); headerView->setResizeMode(0, QHeaderView::Stretch); + + // hide columns if this is indicated by the settings + const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + Q_ASSERT(settings != 0); + if (!settings->showDate()) { + hideColumn(KDirModel::ModifiedTime); + } + + if (!settings->showPermissions()) { + hideColumn(KDirModel::Permissions); + } + + if (!settings->showOwner()) { + hideColumn(KDirModel::Owner); + } + + if (!settings->showGroup()) { + hideColumn(KDirModel::Group); + } + + if (!settings->showType()) { + hideColumn(KDirModel::Type); + } } return QTreeView::event(event); } + QStyleOptionViewItem DolphinDetailsView::viewOptions() const { - return QTreeView::viewOptions(); - - // TODO: the view options should been read from the settings; - // the following code is just for testing... - //QStyleOptionViewItem options = QTreeView::viewOptions(); - //options.decorationAlignment = Qt::AlignRight; - //options.decorationPosition = QStyleOptionViewItem::Right; - //options.decorationSize = QSize(100, 100); - //options.showDecorationSelected = true; - //options.state = QStyle::State_MouseOver; - //return options; + return m_viewOptions; } void DolphinDetailsView::contextMenuEvent(QContextMenuEvent* event) { QTreeView::contextMenuEvent(event); + m_controller->triggerContextMenuRequest(event->pos()); +} - KFileItem* item = 0; +void DolphinDetailsView::mousePressEvent(QMouseEvent* event) +{ + m_controller->triggerActivation(); + + QTreeView::mousePressEvent(event); const QModelIndex index = indexAt(event->pos()); - if (index.isValid()) { - item = m_dolphinView->fileItem(index); + if (!index.isValid() || (index.column() != KDirModel::Name)) { + const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); + if (!(modifier & Qt::ShiftModifier) && !(modifier & Qt::ControlModifier)) { + clearSelection(); + } } - m_dolphinView->openContextMenu(item, event->globalPos()); + if (event->button() == Qt::LeftButton) { + m_showElasticBand = true; + + const QPoint pos(contentsPos()); + m_elasticBandOrigin = event->pos(); + m_elasticBandOrigin.setX(m_elasticBandOrigin.x() + pos.x()); + m_elasticBandOrigin.setY(m_elasticBandOrigin.y() + pos.y()); + m_elasticBandDestination = event->pos(); + } +} + +void DolphinDetailsView::mouseMoveEvent(QMouseEvent* event) +{ + QTreeView::mouseMoveEvent(event); + if (m_showElasticBand) { + updateElasticBand(); + } } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) { QTreeView::mouseReleaseEvent(event); - m_dolphinView->declareViewActive(); + if (m_showElasticBand) { + updateElasticBand(); + m_showElasticBand = false; + } } void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) @@ -111,6 +198,37 @@ void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } + + if (m_showElasticBand) { + updateElasticBand(); + m_showElasticBand = false; + } + m_dragging = true; +} + +void DolphinDetailsView::dragLeaveEvent(QDragLeaveEvent* event) +{ + QTreeView::dragLeaveEvent(event); + + // TODO: remove this code when the issue #160611 is solved in Qt 4.4 + m_dragging = false; + setDirtyRegion(m_dropRect); +} + +void DolphinDetailsView::dragMoveEvent(QDragMoveEvent* event) +{ + QTreeView::dragMoveEvent(event); + + // TODO: remove this code when the issue #160611 is solved in Qt 4.4 + setDirtyRegion(m_dropRect); + const QModelIndex index = indexAt(event->pos()); + if (!index.isValid() || (index.column() != KDirModel::Name)) { + m_dragging = false; + } else { + m_dragging = true; + m_dropRect = visualRect(index); + setDirtyRegion(m_dropRect); + } } void DolphinDetailsView::dropEvent(QDropEvent* event) @@ -118,11 +236,37 @@ void DolphinDetailsView::dropEvent(QDropEvent* event) const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); if (!urls.isEmpty()) { event->acceptProposedAction(); + m_controller->indicateDroppedUrls(urls, + indexAt(event->pos()), + event->source()); + } + QTreeView::dropEvent(event); + m_dragging = false; +} - // TODO: handle dropping above a directory +void DolphinDetailsView::paintEvent(QPaintEvent* event) +{ + QTreeView::paintEvent(event); + if (m_showElasticBand) { + // The following code has been taken from QListView + // and adapted to DolphinDetailsView. + // (C) 1992-2007 Trolltech ASA + QStyleOptionRubberBand opt; + opt.initFrom(this); + opt.shape = QRubberBand::Rectangle; + opt.opaque = false; + opt.rect = elasticBandRect(); - const KUrl& destination = m_dolphinView->url(); - m_dolphinView->mainWindow()->dropUrls(urls, destination); + QPainter painter(viewport()); + painter.save(); + style()->drawControl(QStyle::CE_RubberBand, &opt, &painter); + painter.restore(); + } + + // TODO: remove this code when the issue #160611 is solved in Qt 4.4 + if (m_dragging) { + const QBrush& brush = m_viewOptions.palette.brush(QPalette::Normal, QPalette::Highlight); + DolphinController::drawHoverIndication(viewport(), m_dropRect, brush); } } @@ -141,23 +285,109 @@ void DolphinDetailsView::setSortIndicatorOrder(Qt::SortOrder sortOrder) void DolphinDetailsView::synchronizeSortingState(int column) { // The sorting has already been changed in QTreeView if this slot is - // invoked, but Dolphin was not informed about this. This is bypassed by changing - // the sorting and sort order to a temporary other value and readjust it again. + // invoked, but Dolphin is not informed about this. DolphinView::Sorting sorting = DolphinSortFilterProxyModel::sortingForColumn(column); const Qt::SortOrder sortOrder = header()->sortIndicatorOrder(); + m_controller->indicateSortingChange(sorting); + m_controller->indicateSortOrderChange(sortOrder); +} + +void DolphinDetailsView::slotEntered(const QModelIndex& index) +{ + const QPoint pos = viewport()->mapFromGlobal(QCursor::pos()); + const int nameColumnWidth = header()->sectionSize(KDirModel::Name); + if (pos.x() < nameColumnWidth) { + m_controller->emitItemEntered(index); + } + else { + m_controller->emitViewportEntered(); + } +} - // temporary adjust the sorting and sort order to different values... - const DolphinView::Sorting tempSorting = (sorting == DolphinView::SortByName) ? - DolphinView::SortBySize : - DolphinView::SortByName; - m_dolphinView->setSorting(tempSorting); - const Qt::SortOrder tempSortOrder = (sortOrder == Qt::Ascending) ? - Qt::Descending : Qt::Ascending; - m_dolphinView->setSortOrder(tempSortOrder); - - // ... so that setting them again results in storing the new setting. - m_dolphinView->setSorting(sorting); - m_dolphinView->setSortOrder(sortOrder); +void DolphinDetailsView::updateElasticBand() +{ + Q_ASSERT(m_showElasticBand); + QRect dirtyRegion(elasticBandRect()); + m_elasticBandDestination = viewport()->mapFromGlobal(QCursor::pos()); + dirtyRegion = dirtyRegion.united(elasticBandRect()); + setDirtyRegion(dirtyRegion); +} + +void DolphinDetailsView::zoomIn() +{ + if (isZoomInPossible()) { + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + // TODO: get rid of K3Icon sizes + switch (settings->iconSize()) { + case K3Icon::SizeSmall: settings->setIconSize(K3Icon::SizeMedium); break; + case K3Icon::SizeMedium: settings->setIconSize(K3Icon::SizeLarge); break; + default: Q_ASSERT(false); break; + } + updateDecorationSize(); + } +} + +void DolphinDetailsView::zoomOut() +{ + if (isZoomOutPossible()) { + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + // TODO: get rid of K3Icon sizes + switch (settings->iconSize()) { + case K3Icon::SizeLarge: settings->setIconSize(K3Icon::SizeMedium); break; + case K3Icon::SizeMedium: settings->setIconSize(K3Icon::SizeSmall); break; + default: Q_ASSERT(false); break; + } + updateDecorationSize(); + } +} + +bool DolphinDetailsView::isZoomInPossible() const +{ + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + return settings->iconSize() < K3Icon::SizeLarge; +} + +bool DolphinDetailsView::isZoomOutPossible() const +{ + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + return settings->iconSize() > K3Icon::SizeSmall; +} + +void DolphinDetailsView::updateDecorationSize() +{ + DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); + const int iconSize = settings->iconSize(); + m_viewOptions.decorationSize = QSize(iconSize, iconSize); + + m_controller->setZoomInPossible(isZoomInPossible()); + m_controller->setZoomOutPossible(isZoomOutPossible()); + + doItemsLayout(); +} + +QPoint DolphinDetailsView::contentsPos() const +{ + // implementation note: the horizonal position is ignored currently, as no + // horizontal scrolling is done anyway during a selection + const QScrollBar* scrollbar = verticalScrollBar(); + Q_ASSERT(scrollbar != 0); + + const int maxHeight = maximumViewportSize().height(); + const int height = scrollbar->maximum() - scrollbar->minimum() + 1; + const int visibleHeight = model()->rowCount() + 1 - height; + if (visibleHeight <= 0) { + return QPoint(0, 0); + } + + const int y = scrollbar->sliderPosition() * maxHeight / visibleHeight; + return QPoint(0, y); +} + +QRect DolphinDetailsView::elasticBandRect() const +{ + const QPoint pos(contentsPos()); + const QPoint topLeft(m_elasticBandOrigin.x() - pos.x(), m_elasticBandOrigin.y() - pos.y()); + return QRect(topLeft, m_elasticBandDestination).normalized(); } #include "dolphindetailsview.moc"