#include "dolphinmodel.h"
#include "dolphincontroller.h"
#include "dolphinfileitemdelegate.h"
-#include "dolphinsettings.h"
+#include "settings/dolphinsettings.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphinviewautoscroller.h"
#include "draganddrophelper.h"
m_ignoreScrollTo(false),
m_controller(controller),
m_selectionManager(0),
+ m_autoScroller(0),
m_font(),
m_decorationSize(),
m_band()
setEditTriggers(QAbstractItemView::NoEditTriggers);
setMouseTracking(true);
- new DolphinViewAutoScroller(this);
+ m_autoScroller = new DolphinViewAutoScroller(this);
const ViewProperties props(controller->url());
setSortIndicatorSection(props.sorting());
setState(QAbstractItemView::DraggingState);
} else {
m_expandingTogglePressed = true;
- kDebug() << "m_expandingTogglePressed " << m_expandingTogglePressed;
}
}
m_band.show = true;
// Incremental update data will not be useful - start from scratch.
m_band.ignoreOldInfo = true;
- const QPoint pos = contentsPos();
const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
- m_band.origin = event->pos() + pos + scrollPos;
+ m_band.origin = event->pos() + scrollPos;
m_band.destination = m_band.origin;
m_band.originalSelection = selectionModel()->selection();
}
void DolphinDetailsView::currentChanged(const QModelIndex& current, const QModelIndex& previous)
{
QTreeView::currentChanged(current, previous);
- if (current.isValid()) {
+ if (current.isValid() && !m_autoScroller->isActive()) {
scrollTo(current);
}
return isAboveEmptySpace ? QModelIndex() : index;
}
-void DolphinDetailsView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command)
+void DolphinDetailsView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command)
{
// We must override setSelection() as Qt calls it internally and when this happens
// we must ensure that the default indexAt() is used.
QTreeView::setSelection(rect, command);
m_useDefaultIndexAt = false;
} else {
-
// Use our own elastic band selection algorithm
updateElasticBandSelection();
}
void DolphinDetailsView::scrollTo(const QModelIndex & index, ScrollHint hint)
{
- if (m_ignoreScrollTo)
- return;
- QTreeView::scrollTo(index, hint);
+ if (!m_ignoreScrollTo) {
+ QTreeView::scrollTo(index, hint);
+ }
}
void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting)
{
- QHeaderView* headerView = header();
- headerView->setSortIndicator(sorting, headerView->sortIndicatorOrder());
+ header()->setSortIndicator(sorting, header()->sortIndicatorOrder());
}
void DolphinDetailsView::setSortIndicatorOrder(Qt::SortOrder sortOrder)
{
- QHeaderView* headerView = header();
- headerView->setSortIndicator(headerView->sortIndicatorSection(), sortOrder);
+ header()->setSortIndicator(header()->sortIndicatorSection(), sortOrder);
}
void DolphinDetailsView::synchronizeSortingState(int column)
m_band.destination = viewport()->mapFromGlobal(QCursor::pos()) + scrollPos;
// Going above the (logical) top-left of the view causes complications during selection;
// we may as well prevent it.
- if (m_band.destination.y() < 0)
+ if (m_band.destination.y() < 0) {
m_band.destination.setY(0);
- if (m_band.destination.x() < 0)
+ }
+ if (m_band.destination.x() < 0) {
m_band.destination.setX(0);
-
+ }
dirtyRegion = dirtyRegion.united(elasticBandRect());
setDirtyRegion(dirtyRegion);
}
QRect DolphinDetailsView::elasticBandRect() const
{
- const QPoint pos(contentsPos());
const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
- const QPoint topLeft = m_band.origin - pos - scrollPos;
- const QPoint bottomRight = m_band.destination - pos - scrollPos;
+ const QPoint topLeft = m_band.origin - scrollPos;
+ const QPoint bottomRight = m_band.destination - scrollPos;
return QRect(topLeft, bottomRight).normalized();
}
Q_UNUSED(newSize);
// If the user changes the size of the headers, the autoresize feature should be
// turned off. As there is no dedicated interface to find out whether the header
- // section has been resized by the user or by a resize event, the following approach is used:
- if ((QApplication::mouseButtons() & Qt::LeftButton) && isVisible()) {
+ // section has been resized by the user or by a resize event, another approach is used.
+ // Attention: Take care when changing the if-condition to verify that there is no
+ // regression in combination with bug 178630 (see fix in comment #8).
+ if ((QApplication::mouseButtons() & Qt::LeftButton) && header()->underMouse()) {
disableAutoResizing();
}
}
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);
-}
-
KFileItemDelegate::Information DolphinDetailsView::infoForColumn(int columnIndex) const
{
KFileItemDelegate::Information info = KFileItemDelegate::NoInformation;
// resize the name column in a way that the whole available width is used
columnWidth[KDirModel::Name] = viewport()->width() - requiredWidth;
- if (columnWidth[KDirModel::Name] < 120) {
- columnWidth[KDirModel::Name] = 120;
+
+ const int minNameWidth = 300;
+ if (columnWidth[KDirModel::Name] < minNameWidth) {
+ columnWidth[KDirModel::Name] = minNameWidth;
+
+ // It might be possible that the name column width can be
+ // decreased without clipping any text. For performance
+ // reasons the exact necessary width for full visible names is
+ // only checked for up to 200 items:
+ const int rowCount = model()->rowCount();
+ if (rowCount < 200) {
+ const int nameWidth = sizeHintForColumn(DolphinModel::Name);
+ if (nameWidth + requiredWidth <= viewport()->width()) {
+ columnWidth[KDirModel::Name] = viewport()->width() - requiredWidth;
+ } else if (nameWidth < minNameWidth) {
+ columnWidth[KDirModel::Name] = nameWidth;
+ }
+ }
}
+
headerView->resizeSection(KDirModel::Name, columnWidth[KDirModel::Name]);
}