X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8d0e873f670cab8e7bc8df902abed6ebc17dd09d..093efca22dfd247f06e2a669ad968300e71ef08d:/src/dolphindetailsview.cpp diff --git a/src/dolphindetailsview.cpp b/src/dolphindetailsview.cpp index 2bb145cc4..39783c9a9 100644 --- a/src/dolphindetailsview.cpp +++ b/src/dolphindetailsview.cpp @@ -20,6 +20,7 @@ #include "dolphindetailsview.h" +#include "dolphinmodel.h" #include "dolphincontroller.h" #include "dolphinsettings.h" #include "dolphinsortfilterproxymodel.h" @@ -27,18 +28,19 @@ #include "dolphin_detailsmodesettings.h" -#include -#include - +#include #include #include +#include #include DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* controller) : QTreeView(parent), m_controller(controller), - m_rubberBand(0), - m_origin() + m_dragging(false), + m_showElasticBand(false), + m_elasticBandOrigin(), + m_elasticBandDestination() { Q_ASSERT(controller != 0); @@ -49,6 +51,9 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr setSelectionBehavior(SelectItems); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); + setAlternatingRowColors(true); + setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); setMouseTracking(true); viewport()->setAttribute(Qt::WA_Hover); @@ -65,15 +70,17 @@ DolphinDetailsView::DolphinDetailsView(QWidget* parent, DolphinController* contr connect(parent, SIGNAL(sortOrderChanged(Qt::SortOrder)), this, SLOT(setSortIndicatorOrder(Qt::SortOrder))); + // TODO: Connecting to the signal 'activated()' is not possible, as kstyle + // does not forward the single vs. doubleclick to it yet (KDE 4.1?). Hence it is + // necessary connecting the signal 'singleClick()' or 'doubleClick' and to handle the + // RETURN-key in keyPressEvent(). if (KGlobalSettings::singleClick()) { connect(this, SIGNAL(clicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + this, SLOT(slotItemActivated(const QModelIndex&))); } else { connect(this, SIGNAL(doubleClicked(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); + this, SLOT(slotItemActivated(const QModelIndex&))); } - connect(this, SIGNAL(activated(const QModelIndex&)), - controller, SLOT(triggerItem(const QModelIndex&))); connect(this, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); connect(this, SIGNAL(viewportEntered()), @@ -116,24 +123,27 @@ bool DolphinDetailsView::event(QEvent* event) const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); Q_ASSERT(settings != 0); if (!settings->showDate()) { - hideColumn(KDirModel::ModifiedTime); + hideColumn(DolphinModel::ModifiedTime); } if (!settings->showPermissions()) { - hideColumn(KDirModel::Permissions); + hideColumn(DolphinModel::Permissions); } if (!settings->showOwner()) { - hideColumn(KDirModel::Owner); + hideColumn(DolphinModel::Owner); } if (!settings->showGroup()) { - hideColumn(KDirModel::Group); + hideColumn(DolphinModel::Group); } if (!settings->showType()) { - hideColumn(KDirModel::Type); + hideColumn(DolphinModel::Type); } + + hideColumn(DolphinModel::Rating); + hideColumn(DolphinModel::Tags); } return QTreeView::event(event); @@ -152,38 +162,44 @@ void DolphinDetailsView::contextMenuEvent(QContextMenuEvent* event) void DolphinDetailsView::mousePressEvent(QMouseEvent* event) { + m_controller->triggerActivation(); + QTreeView::mousePressEvent(event); - if (event->button() == Qt::LeftButton) { - // initialize rubberband for the selection - if (m_rubberBand == 0) { - m_rubberBand = new QRubberBand(QRubberBand::Rectangle, viewport()); + const QModelIndex index = indexAt(event->pos()); + if (!index.isValid() || (index.column() != DolphinModel::Name)) { + const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); + if (!(modifier & Qt::ShiftModifier) && !(modifier & Qt::ControlModifier)) { + clearSelection(); } + } + + if (event->button() == Qt::LeftButton) { + m_showElasticBand = true; const QPoint pos(contentsPos()); - m_origin = event->pos(); - m_origin.setX(m_origin.x() + pos.x()); - m_origin.setY(m_origin.y() + pos.y()); - updateRubberBandGeometry(); - m_rubberBand->show(); + 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_rubberBand != 0) { - updateRubberBandGeometry(); + if (m_showElasticBand) { + updateElasticBand(); } } void DolphinDetailsView::mouseReleaseEvent(QMouseEvent* event) { QTreeView::mouseReleaseEvent(event); - if (m_rubberBand != 0) { - m_rubberBand->hide(); + if (m_showElasticBand) { + updateElasticBand(); + m_showElasticBand = false; } - m_controller->triggerActivation(); } void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) @@ -191,8 +207,36 @@ void DolphinDetailsView::dragEnterEvent(QDragEnterEvent* event) if (event->mimeData()->hasUrls()) { event->acceptProposedAction(); } - if (m_rubberBand != 0) { - m_rubberBand->hide(); + + 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() != DolphinModel::Name)) { + m_dragging = false; + } else { + m_dragging = true; + m_dropRect = visualRect(index); + setDirtyRegion(m_dropRect); } } @@ -202,10 +246,85 @@ void DolphinDetailsView::dropEvent(QDropEvent* event) if (!urls.isEmpty()) { event->acceptProposedAction(); m_controller->indicateDroppedUrls(urls, + m_controller->url(), indexAt(event->pos()), event->source()); } QTreeView::dropEvent(event); + m_dragging = false; +} + +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(); + + 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); + } +} + +void DolphinDetailsView::keyPressEvent(QKeyEvent* event) +{ + QTreeView::keyPressEvent(event); + + const QItemSelectionModel* selModel = selectionModel(); + const QModelIndex currentIndex = selModel->currentIndex(); + const bool triggerItem = currentIndex.isValid() + && (event->key() == Qt::Key_Return) + && (selModel->selectedIndexes().count() <= 1); + if (triggerItem) { + m_controller->triggerItem(currentIndex); + } +} + +void DolphinDetailsView::resizeEvent(QResizeEvent* event) +{ + QTreeView::resizeEvent(event); + + // assure that the width of the name-column does not get too small + const int minWidth = 120; + QHeaderView* headerView = header(); + bool useFixedWidth = (headerView->sectionSize(KDirModel::Name) <= minWidth) + && (headerView->resizeMode(0) != QHeaderView::Fixed); + if (useFixedWidth) { + // the current width of the name-column is too small, hence + // use a fixed size + headerView->setResizeMode(QHeaderView::Fixed); + headerView->setResizeMode(0, QHeaderView::Fixed); + headerView->resizeSection(KDirModel::Name, minWidth); + } else if (headerView->resizeMode(0) != QHeaderView::Stretch) { + // check whether there is enough available viewport width + // to automatically resize the columns + const int availableWidth = viewport()->width(); + + int headerWidth = 0; + const int count = headerView->count(); + for (int i = 0; i < count; ++i) { + headerWidth += headerView->sectionSize(i); + } + + if (headerWidth < availableWidth) { + headerView->setResizeMode(QHeaderView::ResizeToContents); + headerView->setResizeMode(0, QHeaderView::Stretch); + } + } } void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting) @@ -233,7 +352,7 @@ void DolphinDetailsView::synchronizeSortingState(int column) void DolphinDetailsView::slotEntered(const QModelIndex& index) { const QPoint pos = viewport()->mapFromGlobal(QCursor::pos()); - const int nameColumnWidth = header()->sectionSize(KDirModel::Name); + const int nameColumnWidth = header()->sectionSize(DolphinModel::Name); if (pos.x() < nameColumnWidth) { m_controller->emitItemEntered(index); } @@ -242,14 +361,13 @@ void DolphinDetailsView::slotEntered(const QModelIndex& index) } } -void DolphinDetailsView::updateRubberBandGeometry() +void DolphinDetailsView::updateElasticBand() { - if (m_rubberBand != 0) { - const QPoint pos(contentsPos()); - const QPoint origin(m_origin.x() - pos.x(), m_origin.y() - pos.y()); - const QPoint dest(viewport()->mapFromGlobal(QCursor::pos())); - m_rubberBand->setGeometry(QRect(origin, dest).normalized()); - } + Q_ASSERT(m_showElasticBand); + QRect dirtyRegion(elasticBandRect()); + m_elasticBandDestination = viewport()->mapFromGlobal(QCursor::pos()); + dirtyRegion = dirtyRegion.united(elasticBandRect()); + setDirtyRegion(dirtyRegion); } void DolphinDetailsView::zoomIn() @@ -280,6 +398,16 @@ void DolphinDetailsView::zoomOut() } } +void DolphinDetailsView::slotItemActivated(const QModelIndex& index) +{ + if (index.isValid() && (index.column() == KDirModel::Name)) { + m_controller->triggerItem(index); + } else { + clearSelection(); + m_controller->emitItemEntered(index); + } +} + bool DolphinDetailsView::isZoomInPossible() const { DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings(); @@ -322,4 +450,16 @@ QPoint DolphinDetailsView::contentsPos() const 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(); +} + +static bool isValidNameIndex(const QModelIndex& index) +{ + return index.isValid() && (index.column() == KDirModel::Name); +} + #include "dolphindetailsview.moc"