[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [digikam/development/3.0.0] utilities/cameragui/views: Removed unused classes
From: Islam Wazery <wazery () ubuntu ! com>
Date: 2012-07-31 23:11:45
Message-ID: 20120731231145.89E8DA60CD () git ! kde ! org
[Download RAW message or body]
Git commit 073424d253df080ca4dbe141adfa9f466c06d77b by Islam Wazery.
Committed on 01/08/2012 at 01:10.
Pushed by wazery into branch 'development/3.0.0'.
Removed unused classes
D +0 -947 utilities/cameragui/views/icategorizedview.cpp
D +0 -199 utilities/cameragui/views/icategorizedview.h
D +0 -1918 utilities/cameragui/views/importkcategorizedview.cpp
D +0 -125 utilities/cameragui/views/importkcategorizedview.h
D +0 -216 utilities/cameragui/views/importkcategorizedview_p.h
http://commits.kde.org/digikam/073424d253df080ca4dbe141adfa9f466c06d77b
diff --git a/utilities/cameragui/views/icategorizedview.cpp \
b/utilities/cameragui/views/icategorizedview.cpp deleted file mode 100644
index d6dc8d4..0000000
--- a/utilities/cameragui/views/icategorizedview.cpp
+++ /dev/null
@@ -1,947 +0,0 @@
-/* ============================================================
- *
- * This file is a part of digiKam project
- * http://www.digikam.org
- *
- * Date : 2012-07-08
- * Description : Item view to list import interface items.
- *
- * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
- *
- * This program is free software; you can redistribute it
- * and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation;
- * either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ============================================================ */
-
-#include "icategorizedview.moc"
-
-// Qt includes
-
-#include <QHelpEvent>
-#include <QScrollBar>
-#include <QSortFilterProxyModel>
-
-// KDE includes
-
-#include <KApplication>
-#include <KGlobalSettings>
-
-// Local includes
-
-#include "thememanager.h"
-
-namespace Digikam
-{
-
-class ICategorizedView::Private
-{
-public:
-
- Private(ICategorizedView* const q) :
- delegate(0),
- currentMouseEvent(0),
- usePointingHand(true),
- scrollStepFactor(10),
- toolTip(0),
- notificationToolTip(0),
- showToolTip(false),
- hintAtSelectionRow(-1),
- ensureOneSelectedItem(false),
- ensureInitialSelectedItem(false),
- q(q)
- {
- }
-
- QModelIndex scrollPositionHint() const;
-
-public:
-
- DItemDelegate* delegate;
- QMouseEvent* currentMouseEvent;
- bool usePointingHand;
- int scrollStepFactor;
- ItemViewToolTip* toolTip;
- ItemViewToolTip* notificationToolTip;
- bool showToolTip;
-
- QPersistentModelIndex hintAtSelectionIndex;
- QPersistentModelIndex hintAtScrollPosition;
- int hintAtSelectionRow;
- bool ensureOneSelectedItem;
- bool ensureInitialSelectedItem;
-
- ICategorizedView* const q;
-};
-
-QModelIndex ICategorizedView::Private::scrollPositionHint() const
-{
- if (q->verticalScrollBar()->value() == q->verticalScrollBar()->minimum())
- {
- return QModelIndex();
- }
-
- QModelIndex hint = q->currentIndex();
-
- // If the user scrolled, do not take current item, but first visible
- if (!hint.isValid() || !q->viewport()->rect().intersects(q->visualRect(hint)))
- {
- QList<QModelIndex> visibleIndexes = \
q->categorizedIndexesIn(q->viewport()->rect());
- if (!visibleIndexes.isEmpty())
- {
- hint = visibleIndexes.first();
- }
- }
-
- return hint;
-}
-
-ICategorizedView::ICategorizedView(QWidget* const parent)
- : ImportKCategorizedView(parent), d(new Private(this))
-{
- setViewMode(QListView::IconMode);
- setLayoutDirection(Qt::LeftToRight);
- setFlow(QListView::LeftToRight);
- setResizeMode(QListView::Adjust);
- setMovement(QListView::Static);
- setWrapping(true);
-
- // important optimization for layouting
- setUniformItemSizes(true);
- // disable "feature" from ImportKCategorizedView
- setDrawDraggedItems(false);
-
- setSelectionMode(QAbstractItemView::ExtendedSelection);
-
- setDragEnabled(true);
- setEditTriggers(QAbstractItemView::NoEditTriggers);
- viewport()->setAcceptDrops(true);
- setMouseTracking(true);
-
- connect(this, SIGNAL(activated(QModelIndex)),
- this, SLOT(slotActivated(QModelIndex)));
-
- connect(this, SIGNAL(clicked(QModelIndex)),
- this, SLOT(slotClicked(QModelIndex)));
-
- connect(this, SIGNAL(entered(QModelIndex)),
- this, SLOT(slotEntered(QModelIndex)));
-
- connect(ThemeManager::instance(), SIGNAL(signalThemeChanged()),
- this, SLOT(slotThemeChanged()));
-}
-
-ICategorizedView::~ICategorizedView()
-{
- delete d;
-}
-
-int ICategorizedView::numberOfSelectedIndexes() const
-{
- return selectedIndexes().size();
-}
-
-void ICategorizedView::toFirstIndex()
-{
- QModelIndex index = moveCursor(MoveHome, Qt::NoModifier);
- clearSelection();
- setCurrentIndex(index);
- scrollToTop();
-}
-
-void ICategorizedView::toLastIndex()
-{
- QModelIndex index = moveCursor(MoveEnd, Qt::NoModifier);
- clearSelection();
- setCurrentIndex(index);
- scrollToTop();
-}
-
-void ICategorizedView::toNextIndex()
-{
- toIndex(moveCursor(MoveNext, Qt::NoModifier));
-}
-
-void ICategorizedView::toPreviousIndex()
-{
- toIndex(moveCursor(MovePrevious, Qt::NoModifier));
-}
-
-void ICategorizedView::toIndex(const QModelIndex& index)
-{
- if (!index.isValid())
- {
- return;
- }
-
- clearSelection();
- setCurrentIndex(index);
- scrollTo(index);
-}
-
-void ICategorizedView::awayFromSelection()
-{
- QItemSelection selection = selectionModel()->selection();
-
- if (selection.isEmpty())
- {
- return;
- }
-
- const QModelIndex first = model()->index(0, 0);
- const QModelIndex last = model()->index(model()->rowCount() -1, 0);
-
- if (selection.contains(first) && selection.contains(last))
- {
- QItemSelection remaining(first, last);
- remaining.merge(selection, QItemSelectionModel::Toggle);
- QList<QModelIndex> indexes = remaining.indexes();
-
- if (indexes.isEmpty())
- {
- clearSelection();
- setCurrentIndex(QModelIndex());
- }
- else
- {
- toIndex(remaining.indexes().first());
- }
- }
- else if (selection.contains(last))
- {
- setCurrentIndex(selection.indexes().first());
- toPreviousIndex();
- }
- else
- {
- setCurrentIndex(selection.indexes().last());
- toNextIndex();
- }
-}
-
-void ICategorizedView::scrollToRelaxed(const QModelIndex& index, ScrollHint hint)
-{
- if (viewport()->rect().intersects(visualRect(index)))
- {
- return;
- }
-
- scrollTo(index, hint);
-}
-
-void ICategorizedView::setScrollStepGranularity(int factor)
-{
- d->scrollStepFactor = qMax(1, factor);
-}
-
-void ICategorizedView::setSelectedIndexes(const QList<QModelIndex>& indexes)
-{
- if (selectedIndexes() == indexes)
- {
- return;
- }
-
- QItemSelection mySelection;
-
- foreach (const QModelIndex& index, indexes)
- {
- mySelection.select(index, index);
- }
-
- selectionModel()->select(mySelection, QItemSelectionModel::ClearAndSelect);
-}
-
-void ICategorizedView::invertSelection()
-{
- const QModelIndex topLeft = model()->index(0, 0);
- const QModelIndex bottomRight = model()->index(model()->rowCount() -1, 0);
-
- const QItemSelection selection(topLeft, bottomRight);
- selectionModel()->select(selection, QItemSelectionModel::Toggle);
-}
-
-void ICategorizedView::setSpacing(int space)
-{
- d->delegate->setSpacing(space);
-}
-
-void ICategorizedView::setToolTipEnabled(bool enabled)
-{
- d->showToolTip;
-}
-
-bool ICategorizedView::isToolTipEnabled() const
-{
- return d->showToolTip;
-}
-
-void ICategorizedView::setUsePointingHandCursor(bool useCursor)
-{
- d->usePointingHand = useCursor;
-}
-
-void ICategorizedView::showIndexNotification(const QModelIndex& index, const \
QString& message)
-{
- hideIndexNotification();
- if (!index.isValid())
- {
- return;
- }
-
- if (!d->notificationToolTip)
- {
- d->notificationToolTip = new ItemViewToolTip(this);
- }
-
- d->notificationToolTip->setTipContents(message);
-
- QStyleOptionViewItem option = viewOptions();
- option.rect = visualRect(index);
- option.state |= (index == currentIndex() ? QStyle::State_HasFocus \
: QStyle::State_None);
- d->notificationToolTip->show(option, index);
-}
-
-void ICategorizedView::hideIndexNotification()
-{
- if (d->notificationToolTip)
- {
- d->notificationToolTip->hide();
- }
-}
-
-void ICategorizedView::slotActivated(const QModelIndex& index)
-{
- if (d->currentMouseEvent)
- {
- // ignore activation if Ctrl or Shift is pressed (for selection)
- Qt::KeyboardModifiers modifiers = d->currentMouseEvent->modifiers();
- const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
- const bool controlKeyPressed = modifiers & Qt::ControlModifier;
-
- if (shiftKeyPressed || controlKeyPressed)
- {
- return;
- }
-
- const bool rightClick = d->currentMouseEvent->button() & Qt::RightButton;
-
- if (rightClick)
- {
- return;
- }
-
- // if the activation is caused by mouse click (not keyboard)
- // we need to check the hot area
- if (!d->delegate->acceptsActivation(d->currentMouseEvent->pos(), \
visualRect(index), index))
- {
- return;
- }
- }
-
- indexActivated(index);
-}
-
-void ICategorizedView::slotClicked(const QModelIndex& index)
-{
- if (d->currentMouseEvent)
- {
- emit clicked(d->currentMouseEvent, index);
- }
-}
-
-void ICategorizedView::slotEntered(const QModelIndex& index)
-{
- if (d->currentMouseEvent)
- {
- emit entered(d->currentMouseEvent, index);
- }
-}
-
-
-void ICategorizedView::layoutAboutToBeChanged()
-{
- d->ensureOneSelectedItem = selectionModel()->hasSelection();
- QModelIndex current = currentIndex();
-
- // store some hints so that if all selected items were removed do not need to \
default to 0,0.
- if (d->ensureOneSelectedItem)
- {
- QItemSelection currentSelection = selectionModel()->selection();
- QModelIndex indexToAnchor;
-
- if (currentSelection.contains(current))
- {
- indexToAnchor = current;
- }
- else if (!currentSelection.isEmpty())
- {
- indexToAnchor = currentSelection.first().topLeft();
- }
-
- if (indexToAnchor.isValid())
- {
- d->hintAtSelectionRow = indexToAnchor.row();
- d->hintAtSelectionIndex = nextIndexHint(indexToAnchor, \
QItemSelectionRange(indexToAnchor));
- }
- }
-
- // some precautions to keep current scroll position
- d->hintAtScrollPosition = d->scrollPositionHint();
-}
-
-void ICategorizedView::layoutWasChanged()
-{
- // connected queued to layoutChanged()
- ensureSelectionAfterChanges();
- if (d->hintAtScrollPosition.isValid())
- {
- scrollToRelaxed(d->hintAtScrollPosition);
- d->hintAtScrollPosition = QModelIndex();
- }
- else
- {
- scrollToRelaxed(currentIndex());
- }
-}
-
-void ICategorizedView::slotThemeChanged()
-{
- viewport()->update();
-}
-
-void ICategorizedView::slotSetupChanged()
-{
- viewport()->update();
-}
-
-bool ICategorizedView::showToolTip(const QModelIndex& index, QStyleOptionViewItem& \
option, QHelpEvent* he)
-{
- QRect innerRect;
- QPoint pos;
-
- if (he)
- {
- pos = he->pos();
- }
- else
- {
- pos = option.rect.center();
- }
-
- if (d->delegate->acceptsToolTip(he->pos(), option.rect, index,& innerRect))
- {
- if (!innerRect.isNull())
- {
- option.rect = innerRect;
- }
-
- d->toolTip->show(option, index);
- return true;
- }
-
- return false;
-}
-
-void ICategorizedView::setItemDelegate(DItemDelegate* delegate)
-{
- if (d->delegate == delegate)
- {
- return;
- }
-
- if (d->delegate)
- {
- disconnect(d->delegate, SIGNAL(gridSizeChanged(QSize)), this, \
SLOT(slotGridSizeChanged(QSize)));
- }
-
- d->delegate = delegate;
- ImportKCategorizedView::setItemDelegate(d->delegate);
-
- connect(d->delegate, SIGNAL(gridSizeChanged(QSize)), this, \
SLOT(slotGridSizeChanged(QSize)));
-}
-
-void ICategorizedView::contextMenuEvent(QContextMenuEvent* event)
-{
- userInteraction();
- QModelIndex index = indexAt(event->pos());
-
- if (index.isValid())
- {
- showContextMenuOnIndex(event, index);
- }
- else
- {
- showContextMenu(event);
- }
-}
-
-void ICategorizedView::keyPressEvent(QKeyEvent* event)
-{
- userInteraction();
-
- if (event == QKeySequence::Copy)
- {
- copy();
- event->accept();
- return;
- }
- else if (event == QKeySequence::Paste)
- {
- paste();
- event->accept();
- return;
- }
-
- ImportKCategorizedView::keyPressEvent(event);
-
- emit keyPressed(event);
-}
-
-void ICategorizedView::mousePressEvent(QMouseEvent* event)
-{
- userInteraction();
- const QModelIndex index = indexAt(event->pos());
-
- // Clear selection on click on empty area. Standard behavior, but not done by \
QAbstractItemView for some reason.
- Qt::KeyboardModifiers modifiers = event->modifiers();
- const Qt::MouseButton button = event->button();
- const bool rightButtonPressed = button & Qt::RightButton;
- const bool shiftKeyPressed = modifiers & Qt::ShiftModifier;
- const bool controlKeyPressed = modifiers & Qt::ControlModifier;
-
- if (!index.isValid() && !rightButtonPressed && !shiftKeyPressed && \
!controlKeyPressed)
- {
- clearSelection();
- }
-
- // store event for entered(), clicked(), activated() signal handlers
- if (!rightButtonPressed)
- {
- d->currentMouseEvent = event;
- }
- else
- {
- d->currentMouseEvent = 0;
- }
-
- ImportKCategorizedView::mousePressEvent(event);
- if (!index.isValid())
- {
- emit viewportClicked(event);
- }
- d->currentMouseEvent = 0;
-}
-
-void ICategorizedView::mouseReleaseEvent(QMouseEvent* event)
-{
- userInteraction();
- d->currentMouseEvent = event;
- ImportKCategorizedView::mouseReleaseEvent(event);
- d->currentMouseEvent = 0;
-}
-
-void ICategorizedView::mouseMoveEvent(QMouseEvent* event)
-{
- QModelIndex index = indexAt(event->pos());
- QRect indexVisualRect;
-
- if (index.isValid())
- {
- indexVisualRect = visualRect(index);
-
- if (d->usePointingHand &&
- KGlobalSettings::changeCursorOverIcon() &&
- d->delegate->acceptsActivation(event->pos(), indexVisualRect, index))
- {
- setCursor(Qt::PointingHandCursor);
- }
- else
- {
- unsetCursor();
- }
- }
- else
- {
- unsetCursor();
- }
-
- d->currentMouseEvent = event;
- ImportKCategorizedView::mouseMoveEvent(event);
- d->currentMouseEvent = 0;
-
- d->delegate->mouseMoved(event, indexVisualRect, index);
-}
-
-void ICategorizedView::resizeEvent(QResizeEvent* e)
-{
- QModelIndex oldPosition = d->scrollPositionHint();
- ImportKCategorizedView::resizeEvent(e);
- updateDelegateSizes();
- scrollToRelaxed(oldPosition, QAbstractItemView::PositionAtTop);
-}
-
-void ICategorizedView::rowsAboutToBeRemoved(const QModelIndex& parent, int start, \
int end)
-{
- ImportKCategorizedView::rowsAboutToBeRemoved(parent, start, end);
-
- // Ensure one selected item
- int totalToRemove = end - start + 1;
- bool remainingRows = model()->rowCount(parent) > totalToRemove;
-
- if (!remainingRows)
- {
- return;
- }
-
- QItemSelection removed(model()->index(start, 0), model()->index(end, 0));
-
- if (selectionModel()->hasSelection())
- {
- // find out which selected indexes are left after rows are removed
- QItemSelection selected = selectionModel()->selection();
- QModelIndex current = currentIndex();
- QModelIndex indexToAnchor;
-
- if (selected.contains(current))
- {
- indexToAnchor = current;
- }
- else if (!selected.isEmpty())
- {
- indexToAnchor = selected.first().topLeft();
- }
-
- selected.merge(removed, QItemSelectionModel::Deselect);
-
- if (selected.isEmpty())
- {
- QModelIndex newCurrent = nextIndexHint(indexToAnchor, removed.first() \
/*a range*/);
- setCurrentIndex(newCurrent);
- }
- }
-
- QModelIndex hint = d->scrollPositionHint();
- if (removed.contains(hint))
- {
- d->hintAtScrollPosition = nextIndexHint(hint, removed.first() /*a range*/);
- }
-}
-
-void ICategorizedView::rowsInserted(const QModelIndex& parent, int start, int end)
-{
- ImportKCategorizedView::rowsInserted(parent, start, end);
-
- if (start == 0)
- {
- ensureSelectionAfterChanges();
- }
-}
-
-void ICategorizedView::reset()
-{
- ImportKCategorizedView::reset();
-
- emit selectionChanged();
- emit selectionCleared();
-
- d->ensureInitialSelectedItem = true;
- d->hintAtScrollPosition = QModelIndex();
- d->hintAtSelectionIndex = QModelIndex();
- d->hintAtSelectionRow = -1;
- verticalScrollBar()->setValue(verticalScrollBar()->minimum());
- horizontalScrollBar()->setValue(horizontalScrollBar()->minimum());
-}
-
-void ICategorizedView::selectionChanged(const QItemSelection& selectedItems, const \
QItemSelection& deselectedItems)
-{
- ImportKCategorizedView::selectionChanged(selectedItems, deselectedItems);
-
- emit selectionChanged();
-
- if (!selectionModel()->hasSelection())
- {
- emit selectionCleared();
- }
-
- userInteraction();
-}
-
-void ICategorizedView::wheelEvent(QWheelEvent* event)
-{
- // ImportKCategorizedView updates the single step at some occasions in a private \
method
- horizontalScrollBar()->setSingleStep(d->delegate->gridSize().height() / \
d->scrollStepFactor);
- verticalScrollBar()->setSingleStep(d->delegate->gridSize().width() / \
d->scrollStepFactor);
-
- if (event->modifiers() & Qt::ControlModifier)
- {
- const int delta = event->delta();
-
- if (delta > 0)
- {
- emit zoomInStep();
- }
- else if (delta < 0)
- {
- emit zoomOutStep();
- }
-
- event->accept();
- return;
- }
-
- if (verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOff && event->orientation() \
== Qt::Vertical)
- {
- QWheelEvent n(event->pos(), event->globalPos(), event->delta(),
- event->buttons(), event->modifiers(), Qt::Horizontal);
- QApplication::sendEvent(horizontalScrollBar(), &n);
- event->setAccepted(n.isAccepted());
- }
- else
- {
- ImportKCategorizedView::wheelEvent(event);
- }
-}
-
-bool ICategorizedView::viewportEvent(QEvent* event)
-{
- switch (event->type())
- {
- case QEvent::FontChange:
- {
- updateDelegateSizes();
- break;
- }
- case QEvent::ToolTip:
- {
- if (!d->showToolTip)
- {
- return true;
- }
-
- QHelpEvent* he = static_cast<QHelpEvent*>(event);
- const QModelIndex index = indexAt(he->pos());
-
- if (!index.isValid())
- {
- break;
- }
-
- QStyleOptionViewItem option = viewOptions();
- option.rect = visualRect(index);
- option.state |= (index == currentIndex() ? \
QStyle::State_HasFocus : QStyle::State_None);
- showToolTip(index, option, he);
- return true;
- }
- default:
- break;
- }
-
- return ImportKCategorizedView::viewportEvent(event);
-}
-
-QModelIndex ICategorizedView::moveCursor(CursorAction cursorAction, \
Qt::KeyboardModifiers modifiers)
-{
- QModelIndex current = currentIndex();
-
- if (!current.isValid())
- {
- return ImportKCategorizedView::moveCursor(cursorAction, modifiers);
- }
-
- // We want a simple wrapping navigation.
- // Default behavior we do not want: right/left does never change row; \
Next/Previous is equivalent to Down/Up
- switch (cursorAction)
- {
- case MoveNext:
- case MoveRight:
- {
- QModelIndex next = model()->index(current.row() + 1, 0);
-
- if (next.isValid())
- {
- return next;
- }
- else
- {
- return current;
- }
-
- break;
- }
- case MovePrevious:
- case MoveLeft:
- {
- QModelIndex previous = model()->index(current.row() - 1, 0);
-
- if (previous.isValid())
- {
- return previous;
- }
- else
- {
- return current;
- }
-
- break;
- }
- default:
- break;
- }
-
- return ImportKCategorizedView::moveCursor(cursorAction, modifiers);
-}
-
-
-void ICategorizedView::showContextMenuOnIndex(QContextMenuEvent*, const \
QModelIndex&)
-{
- // implemented in subclass
-}
-
-void ICategorizedView::showContextMenu(QContextMenuEvent*)
-{
- // implemented in subclass
-}
-
-void ICategorizedView::indexActivated(const QModelIndex&)
-{
-}
-
-QModelIndex ICategorizedView::mapIndexForDragDrop(const QModelIndex& index) const
-{
- return filterModel()->mapToSource(index);
-}
-
-QPixmap ICategorizedView::pixmapForDrag(const QList<QModelIndex>& indexes) const
-{
- QStyleOptionViewItem option = viewOptions();
- option.rect = viewport()->rect();
- return d->delegate->pixmapForDrag(option, indexes);
-}
-
-QModelIndex ICategorizedView::nextIndexHint(const QModelIndex& indexToAnchor, const \
QItemSelectionRange& removed) const
-{
- Q_UNUSED(indexToAnchor);
-
- if (removed.bottomRight().row() == model()->rowCount() - 1)
- {
- if (removed.topLeft().row() == 0)
- {
- return QModelIndex();
- }
- return model()->index(removed.topLeft().row() - 1, 0); // last remaining, \
no next one left
- }
- else
- {
- return model()->index(removed.bottomRight().row() + 1, 0); // next \
remaining
- }
-}
-
-void ICategorizedView::setToolTip(ItemViewToolTip* tip)
-{
- d->toolTip = tip;
-}
-
-void ICategorizedView::updateDelegateSizes()
-{
- QStyleOptionViewItem option = viewOptions();
- option.rect = QRect(QPoint(0,0), viewport()->size());
- d->delegate->setDefaultViewOptions(option);
-}
-
-void ICategorizedView::userInteraction()
-{
- // as soon as the user did anything affecting selection, we don't interfere \
anymore
- d->ensureInitialSelectedItem = false;
- d->hintAtSelectionIndex = QModelIndex();
-}
-
-
-QModelIndex ICategorizedView::indexForCategoryAt(const QPoint& pos) const
-{
- return categoryAt(pos);
-}
-
-void ICategorizedView::slotGridSizeChanged(const QSize& size)
-{
- setGridSize(size);
-
- if (!size.isNull())
- {
- horizontalScrollBar()->setSingleStep(size.width() / d->scrollStepFactor);
- verticalScrollBar()->setSingleStep(size.height() / d->scrollStepFactor);
- }
-}
-
-void ICategorizedView::ensureSelectionAfterChanges()
-{
- if (d->ensureInitialSelectedItem && model()->rowCount())
- {
- // Ensure the item (0,0) is selected, if the model was reset previously
- // and the user did not change the selection since reset.
- // Caveat: Item at (0,0) may have changed.
- bool hadInitial = d->ensureInitialSelectedItem;
- d->ensureInitialSelectedItem = false;
- d->ensureOneSelectedItem = false;
- QModelIndex index = model()->index(0,0);
-
- if (index.isValid())
- {
- selectionModel()->select(index, QItemSelectionModel::SelectCurrent | \
QItemSelectionModel::Clear);
- setCurrentIndex(index);
-
- // we want ensureInitial set to false if and only if the selection
- // is done from any other place than the previous line (i.e., by user \
action)
- // Effect: we select whatever is the current index(0,0)
- if (hadInitial)
- {
- d->ensureInitialSelectedItem = true;
- }
- }
- }
- else if (d->ensureOneSelectedItem)
- {
- // ensure we have a selection if there was one before
- d->ensureOneSelectedItem = false;
-
- if (model()->rowCount() && selectionModel()->selection().isEmpty())
- {
- QModelIndex index;
-
- if (d->hintAtSelectionIndex.isValid())
- {
- index = d->hintAtSelectionIndex;
- }
- else if (d->hintAtSelectionRow != -1)
- {
- index = model()->index(qMin(model()->rowCount(), \
d->hintAtSelectionRow), 0);
- }
- else
- {
- index = currentIndex();
- }
-
- if (!index.isValid())
- {
- index = model()->index(0,0);
- }
-
- d->hintAtSelectionRow = -1;
- d->hintAtSelectionIndex = QModelIndex();
-
- if (index.isValid())
- {
- setCurrentIndex(index);
- selectionModel()->select(index, QItemSelectionModel::SelectCurrent);
- }
- }
- }
-}
-
-} // namespace Digikam
diff --git a/utilities/cameragui/views/icategorizedview.h \
b/utilities/cameragui/views/icategorizedview.h deleted file mode 100644
index f7f4bc8..0000000
--- a/utilities/cameragui/views/icategorizedview.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/* ============================================================
- *
- * This file is a part of digiKam project
- * http://www.digikam.org
- *
- * Date : 2012-07-08
- * Description : Item view to list import interface items.
- *
- * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
- *
- * This program is free software; you can redistribute it
- * and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation;
- * either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ============================================================ */
-
-#ifndef ICATEGORIZEDVIEW_H
-#define ICATEGORIZEDVIEW_H
-
-// Local includes
-
-#include "importkcategorizedview.h"
-#include "dragdropimplementations.h"
-#include "ditemdelegate.h"
-#include "itemviewtooltip.h"
-
-class QSortFilterProxyModel;
-
-namespace Digikam
-{
-
-class ICategorizedView : public ImportKCategorizedView, DragDropViewImplementation
-{
- Q_OBJECT
-
-public:
-
- ICategorizedView(QWidget* const parent = 0);
- ~ICategorizedView();
-
- DItemDelegate* delegate() const;
-
- int numberOfSelectedIndexes() const;
-
- /** Selects the index as current and scrolls to it */
- void toFirstIndex();
- void toLastIndex();
- void toNextIndex();
- void toPreviousIndex();
- void toIndex(const QModelIndex& index);
- void awayFromSelection();
-
- /** Like scrollTo, but only scrolls if the index is not visible, regardless of \
hint. */
- void scrollToRelaxed(const QModelIndex& index, ScrollHint hint = EnsureVisible);
-
- /** Determine a step size for scrolling. The larget this number, the smaller and \
more
- * precise is the scrolling. Default is 10. */
- void setScrollStepGranularity(int factor);
-
- void setSelectedIndexes(const QList<QModelIndex>& indexes);
- void invertSelection();
-
- /** Sets the spacing. Does not use setSpacing()/spacing() from QListView */
- void setSpacing(int space);
-
- void setToolTipEnabled(bool enabled);
- bool isToolTipEnabled() const;
-
- /** Set if the PointingHand Cursor should be shown over the activation area */
- void setUsePointingHandCursor(bool useCursor);
-
- virtual QSortFilterProxyModel* filterModel() const = 0;
-
-public Q_SLOTS:
-
- virtual void copy() { DragDropViewImplementation::copy(); }
- virtual void cut() { DragDropViewImplementation::cut(); }
- virtual void paste() { DragDropViewImplementation::paste(); }
-
- void showIndexNotification(const QModelIndex& index, const QString& message);
- void hideIndexNotification();
-
-Q_SIGNALS:
-
- /** For overlays: Like the respective parent class signals, but with additional \
info.
- * Do not change the mouse events.
- */
- void clicked(const QMouseEvent* e, const QModelIndex& index);
- void entered(const QMouseEvent* e, const QModelIndex& index);
-
- /** While clicked() is emitted with a valid index, this corresponds to clicking \
on empty space.
- */
- void viewportClicked(const QMouseEvent* e);
-
- /** Remember you may want to check if the event is accepted or ignored.
- * This signal is emitted after being handled by this widget.
- * You can accept it if ignored.
- */
- void keyPressed(QKeyEvent* e);
-
- void zoomInStep();
- void zoomOutStep();
-
- /** Emitted when any selection change occurs. Any of the signals below will be \
emitted before.
- */
- void selectionChanged();
-
- /** Emitted when the selection is completely cleared.
- */
- void selectionCleared();
-
-protected Q_SLOTS:
-
- void slotClicked(const QModelIndex& index);
- void slotActivated(const QModelIndex& index);
- void slotEntered(const QModelIndex& index);
- void layoutAboutToBeChanged();
- void layoutWasChanged();
-
- virtual void slotThemeChanged();
- virtual void slotSetupChanged();
-
-protected:
-
- /** Provides default behavior, can reimplement in a subclass.
- * Returns true if a tooltip was shown.
- * The help event is optional.
- */
- virtual bool showToolTip(const QModelIndex& index, QStyleOptionViewItem& option, \
QHelpEvent* e = 0);
-
- // reimplemented from parent class
- void contextMenuEvent(QContextMenuEvent* event);
- void keyPressEvent(QKeyEvent* event);
- void mousePressEvent(QMouseEvent* event);
- void mouseReleaseEvent(QMouseEvent* event);
- void mouseMoveEvent(QMouseEvent* event);
- void resizeEvent(QResizeEvent* event);
- void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end);
- void rowsInserted(const QModelIndex &parent, int start, int end);
- void reset();
- void selectionChanged(const QItemSelection& selectedItems, const QItemSelection& \
deselectedItems);
- void wheelEvent(QWheelEvent* event);
- bool viewportEvent(QEvent* event);
- QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers \
modifiers);
-
- /** Reimplement thses in a subclass.
- */
- virtual void showContextMenuOnIndex(QContextMenuEvent* event, const QModelIndex& \
index);
- virtual void showContextMenu(QContextMenuEvent* event);
- virtual void indexActivated(const QModelIndex& index);
-
- DECLARE_VIEW_DRAG_DROP_METHODS(ImportKCategorizedView)
-
- /** Note: pure virtual dragDropHandler() still open from \
DragDropViewImplementation.
- */
- virtual QModelIndex mapIndexForDragDrop(const QModelIndex& index) const;
- virtual QPixmap pixmapForDrag(const QList<QModelIndex>& indexes) const;
-
- /**
- * Assuming the given indexes would be removed (hypothetically!),
- * return the index to be selected instead, starting from anchor.
- * The default implementation returns the next remaining sibling.
- */
- virtual QModelIndex nextIndexHint(const QModelIndex& indexToAnchor, const \
QItemSelectionRange& removed) const;
-
- void setToolTip(ItemViewToolTip* tip);
- void setItemDelegate(DItemDelegate* delegate);
-
- void updateDelegateSizes();
- void userInteraction();
-
- /** Returns an index that is representative for the category at position pos.
- */
- QModelIndex indexForCategoryAt(const QPoint& pos) const;
-
-private Q_SLOTS:
-
- void slotGridSizeChanged(const QSize&);
-
-private:
-
- void ensureSelectionAfterChanges();
-
-private:
-
- class Private;
- Private* const d;
-};
-
-} // namespace Digikam
-
-#endif // ICATEGORIZEDVIEW_H
diff --git a/utilities/cameragui/views/importkcategorizedview.cpp \
b/utilities/cameragui/views/importkcategorizedview.cpp deleted file mode 100644
index b3d7899..0000000
--- a/utilities/cameragui/views/importkcategorizedview.cpp
+++ /dev/null
@@ -1,1918 +0,0 @@
-/* ============================================================
- *
- * This file is a part of digiKam project
- * http://www.digikam.org
- *
- * Date : 2012-07-05
- * Description : Base item view to list import interface items.
- *
- * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
- *
- * This program is free software; you can redistribute it
- * and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation;
- * either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ============================================================ */
-
-#include "importkcategorizedview.moc"
-
-// C++ includes
-
-#include <cmath> // trunc on C99 compliant systems
-
-#if !defined(__MINGW32__)
-#include <kdefakes.h> // trunc for not C99 compliant systems
-#endif
-
-// Qt includes
-
-#include <QScrollBar>
-#include <QPainter>
-
-// KDE includes
-
-#include "kcategorizedsortfilterproxymodel.h"
-#include "kcategorydrawer.h"
-
-// Local includes
-
-#include "importkcategorizedview_p.h"
-
-namespace Digikam
-{
-
-ImportKCategorizedView::Private::Private(ImportKCategorizedView* const listView)
- : listView(listView),
- categoryDrawer(0),
- biggestItemSize(QSize(0, 0)),
- mouseButtonPressed(false),
- rightMouseButtonPressed(false),
- dragLeftViewport(false),
- drawItemsWhileDragging(true),
- proxyModel(0)
-{
-}
-
-ImportKCategorizedView::Private::~Private()
-{
-}
-
-const QModelIndexList& ImportKCategorizedView::Private::intersectionSet(const QRect& \
rect)
-{
- QModelIndex index;
- QRect indexVisualRect;
- int itemHeight;
-
- intersectedIndexes.clear();
-
- if (listView->gridSize().isEmpty())
- {
- itemHeight = biggestItemSize.height();
- }
- else
- {
- itemHeight = listView->gridSize().height();
- }
-
- // Lets find out where we should start
- int top = proxyModel->rowCount() - 1;
- int bottom = 0;
- int middle = (top + bottom) / 2;
-
- while (bottom <= top)
- {
- middle = (top + bottom) / 2;
- index = proxyModel->index(middle, 0);
- indexVisualRect = visualRect(index);
-
- // We need the whole height (not only the visualRect). This will help us to \
update
- // all needed indexes correctly (ereslibre)
- indexVisualRect.setHeight(indexVisualRect.height() + (itemHeight - \
indexVisualRect.height()));
-
- if (qMax(indexVisualRect.topLeft().y(), indexVisualRect.bottomRight().y()) <
- qMin(rect.topLeft().y(), rect.bottomRight().y()))
- {
- bottom = middle + 1;
- }
- else
- {
- top = middle - 1;
- }
- }
-
- for (int i = middle; i < proxyModel->rowCount(); ++i)
- {
- index = proxyModel->index(i, 0);
- indexVisualRect = visualRect(index);
-
- if (rect.intersects(indexVisualRect))
- {
- intersectedIndexes.append(index);
- }
-
- // If we passed next item, stop searching for hits
- if (qMax(rect.bottomRight().y(), rect.topLeft().y()) <
- qMin(indexVisualRect.topLeft().y(), indexVisualRect.bottomRight().y()))
- {
- break;
- }
- }
-
- return intersectedIndexes;
-}
-
-QRect ImportKCategorizedView::Private::visualRectInViewport(const QModelIndex& \
index) const
-{
- if (!index.isValid())
- {
- return QRect();
- }
-
- QRect retRect;
- QString curCategory = elementsInfo[index.row()].category;
- const bool leftToRightFlow = (listView->flow() == QListView::LeftToRight);
-
- if (leftToRightFlow)
- {
- if (listView->layoutDirection() == Qt::LeftToRight)
- {
- retRect = QRect(listView->spacing(), listView->spacing() * 2 +
- categoryDrawer->categoryHeight(index, \
listView->viewOptions()), 0, 0);
- }
- else
- {
- retRect = QRect(listView->viewport()->width() - listView->spacing(), \
listView->spacing() * 2 +
- categoryDrawer->categoryHeight(index, \
listView->viewOptions()), 0, 0);
- }
- }
- else
- {
- retRect = QRect(listView->spacing(), listView->spacing() * 2 +
- categoryDrawer->categoryHeight(index, \
listView->viewOptions()), 0, 0);
- }
-
- int viewportWidth = listView->viewport()->width() - listView->spacing();
- int itemHeight;
- int itemWidth;
-
- if (listView->gridSize().isEmpty() && leftToRightFlow)
- {
- itemHeight = biggestItemSize.height();
- itemWidth = biggestItemSize.width();
- }
- else if (leftToRightFlow)
- {
- itemHeight = listView->gridSize().height();
- itemWidth = listView->gridSize().width();
- }
- else if (listView->gridSize().isEmpty() && !leftToRightFlow)
- {
- itemHeight = biggestItemSize.height();
- itemWidth = listView->viewport()->width() - listView->spacing() * 2;
- }
- else
- {
- itemHeight = listView->gridSize().height();
- itemWidth = listView->gridSize().width() - listView->spacing() * 2;
- }
-
- int itemWidthPlusSeparation = listView->spacing() + itemWidth;
-
- if (!itemWidthPlusSeparation)
- {
- ++itemWidthPlusSeparation;
- }
-
- int elementsPerRow = viewportWidth / itemWidthPlusSeparation;
-
- if (!elementsPerRow)
- {
- ++elementsPerRow;
- }
-
- int column;
- int row;
-
- if (leftToRightFlow)
- {
- column = elementsInfo[index.row()].relativeOffsetToCategory % \
elementsPerRow;
- row = elementsInfo[index.row()].relativeOffsetToCategory / \
elementsPerRow;
-
- if (listView->layoutDirection() == Qt::LeftToRight)
- {
- retRect.setLeft(retRect.left() + column * listView->spacing() +
- column * itemWidth);
- }
- else
- {
- retRect.setLeft(retRect.right() - column * listView->spacing() -
- column * itemWidth - itemWidth);
-
- retRect.setRight(retRect.right() - column * listView->spacing() -
- column * itemWidth);
- }
- }
- else
- {
- elementsPerRow = 1;
- column = elementsInfo[index.row()].relativeOffsetToCategory % \
elementsPerRow;
- row = elementsInfo[index.row()].relativeOffsetToCategory / \
elementsPerRow;
- }
-
- foreach(const QString& category, categories)
- {
- if (category == curCategory)
- {
- break;
- }
-
- float rows = (float) ((float) categoriesIndexes[category].count() /
- (float) elementsPerRow);
-
- int rowsInt = categoriesIndexes[category].count() / elementsPerRow;
-
- if (rows - trunc(rows))
- {
- ++rowsInt;
- }
-
- retRect.setTop(retRect.top() +
- (rowsInt * itemHeight) +
- categoryDrawer->categoryHeight(index, \
listView->viewOptions()) +
- listView->spacing() * 2);
-
- if (listView->gridSize().isEmpty())
- {
- retRect.setTop(retRect.top() +
- (rowsInt * listView->spacing()));
- }
- }
-
- if (listView->gridSize().isEmpty())
- {
- retRect.setTop(retRect.top() + row * listView->spacing() +
- (row * itemHeight));
- }
- else
- {
- retRect.setTop(retRect.top() + (row * itemHeight));
- }
-
- retRect.setWidth(itemWidth);
-
- QModelIndex heightIndex = proxyModel->index(index.row(), 0);
-
- if (listView->gridSize().isEmpty())
- {
- retRect.setHeight(listView->sizeHintForIndex(heightIndex).height());
- }
- else
- {
- const QSize sizeHint = listView->sizeHintForIndex(heightIndex);
-
- if (sizeHint.width() < itemWidth && leftToRightFlow)
- {
- retRect.setWidth(sizeHint.width());
- retRect.moveLeft(retRect.left() + (itemWidth - sizeHint.width()) / 2);
- }
-
- retRect.setHeight(qMin(sizeHint.height(), listView->gridSize().height()));
- }
-
- return retRect;
-}
-
-QRect ImportKCategorizedView::Private::visualCategoryRectInViewport(const QString& \
category) const
-{
- QRect retRect(listView->spacing(),
- listView->spacing(),
- listView->viewport()->width() - listView->spacing() * 2,
- 0);
-
- if (!proxyModel || !categoryDrawer || !proxyModel->isCategorizedModel() ||
- !proxyModel->rowCount() || !categories.contains(category))
- {
- return QRect();
- }
-
- QModelIndex index = proxyModel->index(0, 0, QModelIndex());
- int viewportWidth = listView->viewport()->width() - listView->spacing();
- int itemHeight;
- int itemWidth;
-
- if (listView->gridSize().isEmpty())
- {
- itemHeight = biggestItemSize.height();
- itemWidth = biggestItemSize.width();
- }
- else
- {
- itemHeight = listView->gridSize().height();
- itemWidth = listView->gridSize().width();
- }
-
- int itemWidthPlusSeparation = listView->spacing() + itemWidth;
- int elementsPerRow = viewportWidth / itemWidthPlusSeparation;
-
- if (!elementsPerRow)
- {
- ++elementsPerRow;
- }
-
- if (listView->flow() == QListView::TopToBottom)
- {
- elementsPerRow = 1;
- }
-
- foreach(const QString& itCategory, categories)
- {
- if (itCategory == category)
- {
- break;
- }
-
- float rows = (float) ((float) categoriesIndexes[itCategory].count() /
- (float) elementsPerRow);
- int rowsInt = categoriesIndexes[itCategory].count() / elementsPerRow;
-
- if (rows - trunc(rows))
- {
- ++rowsInt;
- }
-
- retRect.setTop(retRect.top() +
- (rowsInt * itemHeight) +
- categoryDrawer->categoryHeight(index, \
listView->viewOptions()) +
- listView->spacing() * 2);
-
- if (listView->gridSize().isEmpty())
- {
- retRect.setTop(retRect.top() +
- (rowsInt * listView->spacing()));
- }
- }
-
- retRect.setHeight(categoryDrawer->categoryHeight(index, \
listView->viewOptions()));
-
- return retRect;
-}
-
-// We're sure elementsPosition doesn't contain index
-const QRect& ImportKCategorizedView::Private::cacheIndex(const QModelIndex& index)
-{
- QRect rect = visualRectInViewport(index);
- QHash<int, QRect>::iterator it = elementsPosition.insert(index.row(), rect);
-
- return *it;
-}
-
-// We're sure categoriesPosition doesn't contain category
-const QRect& ImportKCategorizedView::Private::cacheCategory(const QString& category)
-{
- QRect rect = visualCategoryRectInViewport(category);
- QHash<QString, QRect>::iterator it = categoriesPosition.insert(category, rect);
-
- return *it;
-}
-
-const QRect& ImportKCategorizedView::Private::cachedRectIndex(const QModelIndex& \
index)
-{
- QHash<int, QRect>::const_iterator it = elementsPosition.constFind(index.row());
-
- if (it != elementsPosition.constEnd()) // If we have it cached
- {
- // return it
- return *it;
- }
- else // Otherwise, cache it
- {
- // and return it
- return cacheIndex(index);
- }
-}
-
-const QRect& ImportKCategorizedView::Private::cachedRectCategory(const QString& \
category)
-{
- QHash<QString, QRect>::const_iterator it = \
categoriesPosition.constFind(category);
-
- if (it != categoriesPosition.constEnd()) // If we have it cached
- {
- // return it
- return *it;
- }
- else // Otherwise, cache it and
- {
- // return it
- return cacheCategory(category);
- }
-}
-
-QRect ImportKCategorizedView::Private::visualRect(const QModelIndex& index)
-{
- QRect retRect = cachedRectIndex(index);
- int dx = -listView->horizontalOffset();
- int dy = -listView->verticalOffset();
- retRect.adjust(dx, dy, dx, dy);
-
- return retRect;
-}
-
-QRect ImportKCategorizedView::Private::categoryVisualRect(const QString& category)
-{
- QRect retRect = cachedRectCategory(category);
- int dx = -listView->horizontalOffset();
- int dy = -listView->verticalOffset();
- retRect.adjust(dx, dy, dx, dy);
-
- return retRect;
-}
-
-QSize ImportKCategorizedView::Private::contentsSize()
-{
- // find the last index in the last category
- QModelIndex lastIndex = categoriesIndexes.isEmpty() ? QModelIndex() :
- \
proxyModel->index(categoriesIndexes[categories.last()].last(), 0);
-
- int lastItemBottom = cachedRectIndex(lastIndex).top() +
- listView->spacing() +
- (listView->gridSize().isEmpty() ? \
biggestItemSize.height()
- : \
listView->gridSize().height()) - listView->viewport()->height();
-
- return QSize(listView->viewport()->width(), lastItemBottom);
-}
-
-void ImportKCategorizedView::Private::drawNewCategory(const QModelIndex& index, int \
sortRole,
- const \
QStyleOption& option, QPainter* const painter)
-{
- if (!index.isValid())
- {
- return;
- }
-
- QStyleOption optionCopy = option;
- const QString category = proxyModel->data(index, \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString();
- optionCopy.state &= ~QStyle::State_Selected;
-
- if ((listView->selectionMode() != SingleSelection) && (listView->selectionMode() \
!= NoSelection))
- {
- if ((category == hoveredCategory) && !mouseButtonPressed)
- {
- optionCopy.state |= QStyle::State_MouseOver;
- }
- else if ((category == hoveredCategory) && mouseButtonPressed)
- {
- QPoint initialPressPosition = \
listView->viewport()->mapFromGlobal(QCursor::pos());
- initialPressPosition.setY(initialPressPosition.y() + \
listView->verticalOffset());
- initialPressPosition.setX(initialPressPosition.x() + \
listView->horizontalOffset());
-
- if (initialPressPosition == this->initialPressPosition)
- {
- optionCopy.state |= QStyle::State_Selected;
- }
- }
- }
-
- categoryDrawer->drawCategory(index, sortRole, optionCopy, painter);
-}
-
-void ImportKCategorizedView::Private::updateScrollbars()
-{
- listView->horizontalScrollBar()->setRange(0, 0);
-
- if (listView->verticalScrollMode() == QAbstractItemView::ScrollPerItem)
- {
- listView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
- }
-
- if (listView->horizontalScrollMode() == QAbstractItemView::ScrollPerItem)
- {
- listView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
- }
-
- listView->verticalScrollBar()->setSingleStep(listView->viewport()->height() / \
10);
- listView->verticalScrollBar()->setPageStep(listView->viewport()->height());
- listView->verticalScrollBar()->setRange(0, contentsSize().height());
-}
-
-void ImportKCategorizedView::Private::drawDraggedItems(QPainter* const painter)
-{
- QStyleOptionViewItemV4 option = listView->viewOptions();
- option.state &= ~QStyle::State_MouseOver;
-
- foreach(const QModelIndex& index, listView->selectionModel()->selectedIndexes())
- {
- const int dx = mousePosition.x() - initialPressPosition.x() + \
listView->horizontalOffset();
- const int dy = mousePosition.y() - initialPressPosition.y() + \
listView->verticalOffset();
- option.rect = visualRect(index);
- option.rect.adjust(dx, dy, dx, dy);
-
- if (option.rect.intersects(listView->viewport()->rect()))
- {
- listView->itemDelegate(index)->paint(painter, option, index);
- }
- }
-}
-
-void ImportKCategorizedView::Private::drawDraggedItems()
-{
- QRect rectToUpdate;
- QRect currentRect;
-
- foreach(const QModelIndex& index, listView->selectionModel()->selectedIndexes())
- {
- int dx = mousePosition.x() - initialPressPosition.x() + \
listView->horizontalOffset();
- int dy = mousePosition.y() - initialPressPosition.y() + \
listView->verticalOffset();
- currentRect = visualRect(index);
- currentRect.adjust(dx, dy, dx, dy);
-
- if (currentRect.intersects(listView->viewport()->rect()))
- {
- rectToUpdate = rectToUpdate.united(currentRect);
- }
- }
-
- listView->viewport()->update(lastDraggedItemsRect.united(rectToUpdate));
-
- lastDraggedItemsRect = rectToUpdate;
-}
-
-// ---- ImportKCategorizedView ------------------------------
-
-ImportKCategorizedView::ImportKCategorizedView(QWidget* const parent)
- : QListView(parent), d(new Private(this))
-{
-}
-
-ImportKCategorizedView::~ImportKCategorizedView()
-{
- delete d;
-}
-
-void ImportKCategorizedView::setGridSize(const QSize& size)
-{
- QListView::setGridSize(size);
-
- slotLayoutChanged();
-}
-
-void ImportKCategorizedView::setModel(QAbstractItemModel* model)
-{
- d->lastSelection = QItemSelection();
- d->forcedSelectionPosition = 0;
- d->hovered = QModelIndex();
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
- d->elementsInfo.clear();
- d->elementsPosition.clear();
- d->categoriesIndexes.clear();
- d->categoriesPosition.clear();
- d->categories.clear();
- d->intersectedIndexes.clear();
-
- if (d->proxyModel)
- {
- disconnect(d->proxyModel, SIGNAL(layoutChanged()), this, \
SLOT(slotLayoutChanged()));
-
- disconnect(d->proxyModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, \
SLOT(rowsRemoved(QModelIndex,int,int)));
- }
-
- QListView::setModel(model);
-
- d->proxyModel = dynamic_cast<KCategorizedSortFilterProxyModel*>(model);
-
- if (d->proxyModel)
- {
- connect(d->proxyModel, SIGNAL(layoutChanged()), this, \
SLOT(slotLayoutChanged()));
-
- connect(d->proxyModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, \
SLOT(rowsRemoved(QModelIndex,int,int)));
-
- if (d->proxyModel->rowCount())
- {
- slotLayoutChanged();
- }
- }
-}
-
-QRect ImportKCategorizedView::visualRect(const QModelIndex& index) const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QListView::visualRect(index);
- }
-
- if (!qobject_cast<const QSortFilterProxyModel*>(index.model()))
- {
- return d->visualRect(d->proxyModel->mapFromSource(index));
- }
-
- return d->visualRect(index);
-}
-
-QRect ImportKCategorizedView::categoryVisualRect(const QModelIndex& index) const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QRect();
- }
-
- if (!index.isValid())
- {
- return QRect();
- }
-
- QString category = d->elementsInfo[index.row()].category;
- return d->categoryVisualRect(category);
-}
-
-QModelIndex ImportKCategorizedView::categoryAt(const QPoint& point) const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QModelIndex();
- }
-
- // We traverse the categories and find the first where point.y() is below the \
visualRect
- int y = 0;
- int lastY = 0;
- QString lastCategory;
-
- foreach(const QString& category, d->categories)
- {
- y = d->categoryVisualRect(category).top();
-
- if (point.y() >= lastY && point.y() < y)
- {
- break;
- }
-
- lastY = y;
- y = 0;
- lastCategory = category;
- }
-
- // if lastCategory is the last one in the list y will be 0
- if (!lastCategory.isNull() && point.y() >= lastY && (point.y() < y || !y))
- {
- return d->proxyModel->index(d->categoriesIndexes[lastCategory][0], \
d->proxyModel->sortColumn());
- }
-
- return QModelIndex();
-}
-
-QItemSelectionRange ImportKCategorizedView::categoryRange(const QModelIndex& index) \
const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QItemSelectionRange();
- }
-
- if (!index.isValid())
- {
- return QItemSelectionRange();
- }
-
- QString category = d->elementsInfo[index.row()].category;
- QModelIndex first = d->proxyModel->index(d->categoriesIndexes[category].first(), \
d->proxyModel->sortColumn());
- QModelIndex last = d->proxyModel->index(d->categoriesIndexes[category].last(), \
d->proxyModel->sortColumn());
- return QItemSelectionRange(first, last);
-}
-
-KCategoryDrawer* ImportKCategorizedView::categoryDrawer() const
-{
- return d->categoryDrawer;
-}
-
-void ImportKCategorizedView::setCategoryDrawer(KCategoryDrawer* categoryDrawer)
-{
- d->lastSelection = QItemSelection();
- d->forcedSelectionPosition = 0;
- d->hovered = QModelIndex();
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
- d->elementsInfo.clear();
- d->elementsPosition.clear();
- d->categoriesIndexes.clear();
- d->categoriesPosition.clear();
- d->categories.clear();
- d->intersectedIndexes.clear();
- d->categoryDrawer = categoryDrawer;
-
- if (categoryDrawer)
- {
- if (d->proxyModel)
- {
- if (d->proxyModel->rowCount())
- {
- slotLayoutChanged();
- }
- }
- }
- else
- {
- updateGeometries();
- }
-}
-
-void ImportKCategorizedView::setDrawDraggedItems(bool drawDraggedItems)
-{
- d->drawItemsWhileDragging = drawDraggedItems;
-}
-
-QModelIndex ImportKCategorizedView::indexAt(const QPoint& point) const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QListView::indexAt(point);
- }
-
- QModelIndex index;
-
- const QModelIndexList item = d->intersectionSet(QRect(point, point));
-
- if (item.count() == 1)
- {
- index = item[0];
- }
-
- return index;
-}
-
-QModelIndexList ImportKCategorizedView::categorizedIndexesIn(const QRect& rect) \
const
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return QModelIndexList();
- }
-
- return d->intersectionSet(rect);
-}
-
-void ImportKCategorizedView::reset()
-{
- QListView::reset();
-
- d->lastSelection = QItemSelection();
- d->forcedSelectionPosition = 0;
- d->hovered = QModelIndex();
- d->biggestItemSize = QSize(0, 0);
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
- d->elementsInfo.clear();
- d->elementsPosition.clear();
- d->categoriesIndexes.clear();
- d->categoriesPosition.clear();
- d->categories.clear();
- d->intersectedIndexes.clear();
-}
-
-void ImportKCategorizedView::paintEvent(QPaintEvent* event)
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- QListView::paintEvent(event);
- return;
- }
-
- bool alternatingRows = alternatingRowColors();
- QStyleOptionViewItemV4 option = viewOptions();
- option.widget = this;
-
- if (wordWrap())
- {
- option.features |= QStyleOptionViewItemV4::WrapText;
- }
-
- QPainter painter(viewport());
- QRect area = event->rect();
- const bool focus = (hasFocus() || viewport()->hasFocus()) && \
currentIndex().isValid();
- const QStyle::State state = option.state;
- const bool enabled = (state & QStyle::State_Enabled) != 0;
-
- painter.save();
-
- QModelIndexList dirtyIndexes = d->intersectionSet(area);
- bool alternate = false;
-
- if (dirtyIndexes.count())
- {
- alternate = dirtyIndexes[0].row() % 2;
- }
-
- foreach(const QModelIndex& index, dirtyIndexes)
- {
- if (alternatingRows && alternate)
- {
- option.features |= QStyleOptionViewItemV4::Alternate;
- alternate = false;
- }
- else if (alternatingRows)
- {
- option.features &= ~QStyleOptionViewItemV4::Alternate;
- alternate = true;
- }
-
- option.state = state;
- option.rect = visualRect(index);
-
- if (selectionModel() && selectionModel()->isSelected(index))
- {
- option.state |= QStyle::State_Selected;
- }
-
- if (enabled)
- {
- QPalette::ColorGroup cg;
-
- if ((d->proxyModel->flags(index) & Qt::ItemIsEnabled) == 0)
- {
- option.state &= ~QStyle::State_Enabled;
- cg = QPalette::Disabled;
- }
- else
- {
- cg = QPalette::Normal;
- }
-
- option.palette.setCurrentColorGroup(cg);
- }
-
- if (focus && currentIndex() == index)
- {
- option.state |= QStyle::State_HasFocus;
-
- if (this->state() == EditingState)
- {
- option.state |= QStyle::State_Editing;
- }
- }
-
- if (index == d->hovered)
- {
- option.state |= QStyle::State_MouseOver;
- }
- else
- {
- option.state &= ~QStyle::State_MouseOver;
- }
-
- itemDelegate(index)->paint(&painter, option, index);
- }
-
- // Redraw categories
- QStyleOptionViewItemV4 otherOption;
- bool intersectedInThePast = false;
-
- foreach(const QString& category, d->categories)
- {
- otherOption = option;
- otherOption.rect = d->categoryVisualRect(category);
- otherOption.state &= ~QStyle::State_MouseOver;
-
- if (otherOption.rect.intersects(area))
- {
- intersectedInThePast = true;
- QModelIndex indexToDraw = \
d->proxyModel->index(d->categoriesIndexes[category][0],
- \
d->proxyModel->sortColumn());
-
- d->drawNewCategory(indexToDraw, d->proxyModel->sortRole(), otherOption, \
&painter);
- }
- else if (intersectedInThePast)
- {
- break; // the visible area has been finished, we don't need to keep \
asking, the rest won't intersect
- // this is doable because we know that categories are correctly ordered \
on the list
- }
- }
-
- if ((selectionMode() != SingleSelection) && (selectionMode() != NoSelection))
- {
- if (d->mouseButtonPressed && QListView::state() != DraggingState)
- {
- QPoint start, end, initialPressPosition;
-
- initialPressPosition = d->initialPressPosition;
-
- initialPressPosition.setY(initialPressPosition.y() - verticalOffset());
- initialPressPosition.setX(initialPressPosition.x() - \
horizontalOffset());
-
- if (d->initialPressPosition.x() > d->mousePosition.x() ||
- d->initialPressPosition.y() > d->mousePosition.y())
- {
- start = d->mousePosition;
- end = initialPressPosition;
- }
- else
- {
- start = initialPressPosition;
- end = d->mousePosition;
- }
-
- QStyleOptionRubberBand yetAnotherOption;
- yetAnotherOption.initFrom(this);
- yetAnotherOption.shape = QRubberBand::Rectangle;
- yetAnotherOption.opaque = false;
- yetAnotherOption.rect = QRect(start, \
end).intersected(viewport()->rect().adjusted(-16, -16, 16, 16));
- painter.save();
- style()->drawControl(QStyle::CE_RubberBand, &yetAnotherOption, \
&painter);
- painter.restore();
- }
- }
-
- if (d->drawItemsWhileDragging && QListView::state() == DraggingState && \
!d->dragLeftViewport)
- {
- painter.setOpacity(0.5);
- d->drawDraggedItems(&painter);
- }
-
- painter.restore();
-}
-
-void ImportKCategorizedView::resizeEvent(QResizeEvent* event)
-{
- QListView::resizeEvent(event);
-
- // Clear the items positions cache
- d->elementsPosition.clear();
- d->categoriesPosition.clear();
- d->forcedSelectionPosition = 0;
-
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return;
- }
-
- d->updateScrollbars();
-}
-
-QItemSelection ImportKCategorizedView::Private::selectionForRect(const QRect& rect)
-{
- QItemSelection selection;
- QModelIndex tl, br;
- QModelIndexList intersectedIndexes = intersectionSet(rect);
- QList<QModelIndex>::const_iterator it = intersectedIndexes.constBegin();
-
- for (; it != intersectedIndexes.constEnd(); ++it)
- {
- if (!tl.isValid() && !br.isValid())
- {
- tl = br = *it;
- }
- else if ((*it).row() == (tl.row() - 1))
- {
- tl = *it; // expand current range
- }
- else if ((*it).row() == (br.row() + 1))
- {
- br = (*it); // expand current range
- }
- else
- {
- selection.select(tl, br); // select current range
- tl = br = *it; // start new range
- }
- }
-
- if (tl.isValid() && br.isValid())
- {
- selection.select(tl, br);
- }
- else if (tl.isValid())
- {
- selection.select(tl, tl);
- }
- else if (br.isValid())
- {
- selection.select(br, br);
- }
-
- return selection;
-}
-
-void ImportKCategorizedView::setSelection(const QRect& rect, \
QItemSelectionModel::SelectionFlags command)
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- QListView::setSelection(rect, command);
- return;
- }
-
- QItemSelection selection;
-// QRect contentsRect = rect.translated(horizontalOffset(), verticalOffset());
- QModelIndexList intersectedIndexes = d->intersectionSet(rect);
-
- if (rect.width() == 1 && rect.height() == 1)
- {
- QModelIndex tl;
-
- if (!intersectedIndexes.isEmpty())
- {
- tl = intersectedIndexes.last(); // special case for mouse press; only \
select the top item
- }
-
- if (tl.isValid() && (tl.flags() & Qt::ItemIsEnabled))
- {
- selection.select(tl, tl);
- }
- }
- else
- {
- if (state() == DragSelectingState)
- {
- // visual selection mode (rubberband selection)
- selection = d->selectionForRect(rect);
- }
- else
- {
- // logical selection mode (key and mouse click selection)
- QModelIndex tl, br;
- // get the first item
- const QRect topLeft(rect.left(), rect.top(), 1, 1);
- intersectedIndexes = d->intersectionSet(topLeft);
-
- if (!intersectedIndexes.isEmpty())
- {
- tl = intersectedIndexes.last();
- }
-
- // get the last item
- const QRect bottomRight(rect.right(), rect.bottom(), 1, 1);
- intersectedIndexes = d->intersectionSet(bottomRight);
-
- if (!intersectedIndexes.isEmpty())
- {
- br = intersectedIndexes.last();
- }
-
- // get the ranges
- if (tl.isValid() && br.isValid() &&
- (tl.flags() & Qt::ItemIsEnabled) &&
- (br.flags() & Qt::ItemIsEnabled))
- {
- // first, middle, last in content coordinates
- QRect middle;
- QRect first = d->cachedRectIndex(tl);
- QRect last = d->cachedRectIndex(br);
- QSize fullSize = d->contentsSize();
-
- if (flow() == LeftToRight)
- {
- QRect& top = first;
- QRect& bottom = last;
-
- // if bottom is above top, swap them
- if (top.center().y() > bottom.center().y())
- {
- QRect tmp = top;
- top = bottom;
- bottom = tmp;
- }
-
- // if the rect are on differnet lines, expand
- if (top.top() != bottom.top())
- {
- // top rectangle
- if (isRightToLeft())
- {
- top.setLeft(0);
- }
- else
- {
- top.setRight(fullSize.width());
- }
-
- // bottom rectangle
- if (isRightToLeft())
- {
- bottom.setRight(fullSize.width());
- }
- else
- {
- bottom.setLeft(0);
- }
- }
- else if (top.left() > bottom.right())
- {
- if (isRightToLeft())
- {
- bottom.setLeft(top.right());
- }
- else
- {
- bottom.setRight(top.left());
- }
- }
- else
- {
- if (isRightToLeft())
- {
- top.setLeft(bottom.right());
- }
- else
- {
- top.setRight(bottom.left());
- }
- }
-
- // middle rectangle
- if (top.bottom() < bottom.top())
- {
- middle.setTop(top.bottom() + 1);
- middle.setLeft(qMin(top.left(), bottom.left()));
- middle.setBottom(bottom.top() - 1);
- middle.setRight(qMax(top.right(), bottom.right()));
- }
- }
- else
- {
- // TopToBottom
- QRect& left = first;
- QRect& right = last;
-
- if (left.center().x() > right.center().x())
- {
- qSwap(left, right);
- }
-
- int ch = fullSize.height();
-
- if (left.left() != right.left())
- {
- // left rectangle
- if (isRightToLeft())
- {
- left.setTop(0);
- }
- else
- {
- left.setBottom(ch);
- }
-
- // top rectangle
- if (isRightToLeft())
- {
- right.setBottom(ch);
- }
- else
- {
- right.setTop(0);
- }
-
- // only set middle if the
- middle.setTop(0);
- middle.setBottom(ch);
- middle.setLeft(left.right() + 1);
- middle.setRight(right.left() - 1);
- }
- else if (left.bottom() < right.top())
- {
- left.setBottom(right.top() - 1);
- }
- else
- {
- right.setBottom(left.top() - 1);
- }
- }
-
- // get viewport coordinates
- first = first.translated( - horizontalOffset(), - \
verticalOffset());
- middle = middle.translated( - horizontalOffset(), - \
verticalOffset());
- last = last.translated( - horizontalOffset(), - verticalOffset());
-
- // do the selections
- QItemSelection topSelection = d->selectionForRect(first);
- QItemSelection middleSelection = d->selectionForRect(middle);
- QItemSelection bottomSelection = d->selectionForRect(last);
- // merge
- selection.merge(topSelection, QItemSelectionModel::Select);
- selection.merge(middleSelection, QItemSelectionModel::Select);
- selection.merge(bottomSelection, QItemSelectionModel::Select);
- }
- }
- }
-
- selectionModel()->select(selection, command);
-}
-
-void ImportKCategorizedView::mouseMoveEvent(QMouseEvent* event)
-{
- QListView::mouseMoveEvent(event);
-
- // was a dragging started?
- if (state() == DraggingState)
- {
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
-
- if (d->drawItemsWhileDragging)
- {
- viewport()->update(d->lastDraggedItemsRect);
- }
- }
-
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return;
- }
-
- const QModelIndexList item = d->intersectionSet(QRect(event->pos(), \
event->pos()));
-
- if (item.count() == 1)
- {
- d->hovered = item[0];
- }
- else
- {
- d->hovered = QModelIndex();
- }
-
- const QString previousHoveredCategory = d->hoveredCategory;
-
- d->mousePosition = event->pos();
-
- d->hoveredCategory.clear();
-
- // Redraw categories
- foreach(const QString& category, d->categories)
- {
- if (d->categoryVisualRect(category).intersects(QRect(event->pos(), \
event->pos())))
- {
- d->hoveredCategory = category;
- viewport()->update(d->categoryVisualRect(category));
- }
- else if ((category == previousHoveredCategory) &&
- (!d->categoryVisualRect(previousHoveredCategory).intersects(QRect(event->pos(), \
event->pos()))))
- {
- viewport()->update(d->categoryVisualRect(category));
- }
- }
-
- QRect rect;
-
- if (d->mouseButtonPressed && QListView::state() != DraggingState)
- {
- QPoint start, end, initialPressPosition;
-
- initialPressPosition = d->initialPressPosition;
-
- initialPressPosition.setY(initialPressPosition.y() - verticalOffset());
- initialPressPosition.setX(initialPressPosition.x() - horizontalOffset());
-
- if (d->initialPressPosition.x() > d->mousePosition.x() ||
- d->initialPressPosition.y() > d->mousePosition.y())
- {
- start = d->mousePosition;
- end = initialPressPosition;
- }
- else
- {
- start = initialPressPosition;
- end = d->mousePosition;
- }
-
- rect = QRect(start, end).adjusted(-16, -16, 16, 16);
- rect = rect.united(QRect(start, end).adjusted(16, 16, -16, \
-16)).intersected(viewport()->rect());
-
- viewport()->update(rect);
- }
-}
-
-void ImportKCategorizedView::mousePressEvent(QMouseEvent* event)
-{
- d->dragLeftViewport = false;
-
- QListView::mousePressEvent(event);
-
- if (event->button() == Qt::LeftButton)
- {
- d->mouseButtonPressed = true;
-
- d->initialPressPosition = event->pos();
- d->initialPressPosition.setY(d->initialPressPosition.y() + \
verticalOffset());
- d->initialPressPosition.setX(d->initialPressPosition.x() + \
horizontalOffset());
- }
- else if (event->button() == Qt::RightButton)
- {
- d->rightMouseButtonPressed = true;
- }
-
- if (selectionModel())
- {
- d->lastSelection = selectionModel()->selection();
- }
-
- viewport()->update(d->categoryVisualRect(d->hoveredCategory));
-}
-
-void ImportKCategorizedView::mouseReleaseEvent(QMouseEvent* event)
-{
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
-
- QListView::mouseReleaseEvent(event);
-
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return;
- }
-
- QPoint initialPressPosition = viewport()->mapFromGlobal(QCursor::pos());
- initialPressPosition.setY(initialPressPosition.y() + verticalOffset());
- initialPressPosition.setX(initialPressPosition.x() + horizontalOffset());
-
- if ((selectionMode() != SingleSelection) && (selectionMode() != NoSelection) &&
- (initialPressPosition == d->initialPressPosition))
- {
- foreach(const QString& category, d->categories)
- {
- if (d->categoryVisualRect(category).contains(event->pos()) &&
- selectionModel())
- {
- QItemSelection selection = selectionModel()->selection();
- const QVector<int> &indexList = d->categoriesIndexes[category];
-
- foreach(int row, indexList)
- {
- QModelIndex selectIndex = d->proxyModel->index(row, 0);
-
- selection << QItemSelectionRange(selectIndex);
- }
-
- selectionModel()->select(selection, \
QItemSelectionModel::SelectCurrent);
-
- break;
- }
- }
- }
-
- QRect rect;
-
- if (state() != DraggingState)
- {
- QPoint start, end, initialPressPosition;
-
- initialPressPosition = d->initialPressPosition;
-
- initialPressPosition.setY(initialPressPosition.y() - verticalOffset());
- initialPressPosition.setX(initialPressPosition.x() - horizontalOffset());
-
- if (d->initialPressPosition.x() > d->mousePosition.x() ||
- d->initialPressPosition.y() > d->mousePosition.y())
- {
- start = d->mousePosition;
- end = initialPressPosition;
- }
- else
- {
- start = initialPressPosition;
- end = d->mousePosition;
- }
-
- rect = QRect(start, end).adjusted(-16, -16, 16, 16);
- rect = rect.united(QRect(start, end).adjusted(16, 16, -16, \
-16)).intersected(viewport()->rect());
-
- viewport()->update(rect);
- }
-
- if (d->hovered.isValid())
- {
- viewport()->update(visualRect(d->hovered));
- }
- else if (!d->hoveredCategory.isEmpty())
- {
- viewport()->update(d->categoryVisualRect(d->hoveredCategory));
- }
-}
-
-void ImportKCategorizedView::leaveEvent(QEvent* event)
-{
- d->hovered = QModelIndex();
- d->hoveredCategory.clear();
-
- QListView::leaveEvent(event);
-}
-
-void ImportKCategorizedView::startDrag(Qt::DropActions supportedActions)
-{
- // FIXME: QAbstractItemView does far better here since it sets the
- // pixmap of selected icons to the dragging cursor, but it sets a non
- // ARGB window so it is no transparent. Use QAbstractItemView when
- // this is fixed on Qt.
- // QAbstractItemView::startDrag(supportedActions);
- QListView::startDrag(supportedActions);
-}
-
-void ImportKCategorizedView::dragMoveEvent(QDragMoveEvent* event)
-{
- d->mousePosition = event->pos();
-
- d->dragLeftViewport = false;
-
- QListView::dragMoveEvent(event);
-
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- return;
- }
-
- d->hovered = indexAt(event->pos());
-
- d->drawDraggedItems();
-}
-
-void ImportKCategorizedView::dragLeaveEvent(QDragLeaveEvent* event)
-{
- d->dragLeftViewport = true;
-
- QListView::dragLeaveEvent(event);
-}
-
-void ImportKCategorizedView::dropEvent(QDropEvent* event)
-{
- QListView::dropEvent(event);
-}
-
-QModelIndex ImportKCategorizedView::moveCursor(CursorAction cursorAction,
- Qt::KeyboardModifiers modifiers)
-{
- if ((viewMode() != ImportKCategorizedView::IconMode) ||
- !d->proxyModel ||
- !d->categoryDrawer ||
- d->categories.isEmpty() ||
- !d->proxyModel->isCategorizedModel())
- {
- return QListView::moveCursor(cursorAction, modifiers);
- }
-
- int viewportWidth = viewport()->width() - spacing();
- int itemWidth;
-
- if (gridSize().isEmpty())
- {
- itemWidth = d->biggestItemSize.width();
- }
- else
- {
- itemWidth = gridSize().width();
- }
-
- int itemWidthPlusSeparation = spacing() + itemWidth;
-
- if (!itemWidthPlusSeparation)
- {
- ++itemWidthPlusSeparation;
- }
-
- int elementsPerRow = viewportWidth / itemWidthPlusSeparation;
-
- if (!elementsPerRow)
- {
- ++elementsPerRow;
- }
-
- QModelIndex current = selectionModel() ? selectionModel()->currentIndex()
- : QModelIndex();
-
- if (!current.isValid())
- {
- if (cursorAction == MoveEnd)
- {
- current = model()->index(model()->rowCount() - 1, 0, QModelIndex());
- //d->forcedSelectionPosition = \
d->elementsInfo[current.row()].relativeOffsetToCategory % \
elementsPerRow;
- }
- else
- {
- current = model()->index(0, 0, QModelIndex());
- d->forcedSelectionPosition = 0;
- }
-
- return current;
- }
-
- QString lastCategory = d->categories.first();
- QString theCategory = d->categories.first();
- QString afterCategory = d->categories.first();
- bool hasToBreak = false;
-
- foreach(const QString& category, d->categories)
- {
- if (hasToBreak)
- {
- afterCategory = category;
-
- break;
- }
-
- if (category == d->elementsInfo[current.row()].category)
- {
- theCategory = category;
- hasToBreak = true;
- }
-
- if (!hasToBreak)
- {
- lastCategory = category;
- }
- }
-
- switch (cursorAction)
- {
- case QAbstractItemView::MovePageUp:
- {
- // We need to reimplemt PageUp/Down as well because
- // default QListView implementation will not work properly with our \
custom layout
- QModelIndexList visibleIndexes = d->intersectionSet(viewport()->rect());
- if (!visibleIndexes.isEmpty())
- {
- int indexToMove = qMax(current.row() - visibleIndexes.size(), 0);
- return d->proxyModel->index(indexToMove, 0);
- }
- break;
- }
- // fall through
-
- case QAbstractItemView::MoveUp:
- {
- if (d->elementsInfo[current.row()].relativeOffsetToCategory >= \
elementsPerRow)
- {
- int indexToMove = current.row();
- indexToMove -= \
qMin(((d->elementsInfo[current.row()].relativeOffsetToCategory) +
- d->forcedSelectionPosition), elementsPerRow - \
d->forcedSelectionPosition +
- \
(d->elementsInfo[current.row()].relativeOffsetToCategory % \
elementsPerRow));
-
- return d->proxyModel->index(indexToMove, 0);
- }
- else
- {
- int lastCategoryLastRow = \
(d->categoriesIndexes[lastCategory].count() - 1) % elementsPerRow;
- int indexToMove = current.row() - \
d->elementsInfo[current.row()].relativeOffsetToCategory;
-
- if (d->forcedSelectionPosition >= lastCategoryLastRow)
- {
- indexToMove -= 1;
- }
- else
- {
- indexToMove -= qMin((lastCategoryLastRow - \
d->forcedSelectionPosition + 1),
- d->forcedSelectionPosition + elementsPerRow \
+ 1);
- }
-
- return d->proxyModel->index(indexToMove, 0);
- }
- }
-
- case QAbstractItemView::MovePageDown:
- {
- QModelIndexList visibleIndexes = d->intersectionSet(viewport()->rect());
- if (!visibleIndexes.isEmpty())
- {
- int indexToMove = qMin(current.row() + visibleIndexes.size(), \
d->elementsInfo.size() - 1);
- return d->proxyModel->index(indexToMove, 0);
- }
- }
- // fall through
- case QAbstractItemView::MoveDown:
- {
- if (d->elementsInfo[current.row()].relativeOffsetToCategory < \
(d->categoriesIndexes[theCategory].count() - 1 - \
((d->categoriesIndexes[theCategory].count() - 1) % elementsPerRow)))
- {
- int indexToMove = current.row();
- indexToMove += qMin(elementsPerRow, \
d->categoriesIndexes[theCategory].count() - 1 -
- \
d->elementsInfo[current.row()].relativeOffsetToCategory);
-
- return d->proxyModel->index(indexToMove, 0);
- }
- else
- {
- int afterCategoryLastRow = qMin(elementsPerRow, \
d->categoriesIndexes[afterCategory].count());
- int indexToMove = current.row() + \
(d->categoriesIndexes[theCategory].count() -
- \
d->elementsInfo[current.row()].relativeOffsetToCategory);
-
- if (d->forcedSelectionPosition >= afterCategoryLastRow)
- {
- indexToMove += afterCategoryLastRow - 1;
- }
- else
- {
- indexToMove += qMin(d->forcedSelectionPosition, elementsPerRow);
- }
-
- return d->proxyModel->index(indexToMove, 0);
- }
- }
-
- case QAbstractItemView::MoveLeft:
-
- if (layoutDirection() == Qt::RightToLeft)
- {
- if (current.row() + 1 == d->elementsInfo.size() ||
- !(d->elementsInfo[current.row() + 1].relativeOffsetToCategory % \
elementsPerRow))
- {
- return current;
- }
-
- return d->proxyModel->index(current.row() + 1, 0);
- }
-
- if (current.row() == 0 ||
- !(d->elementsInfo[current.row()].relativeOffsetToCategory % \
elementsPerRow))
- {
- return current;
- }
-
- return d->proxyModel->index(current.row() - 1, 0);
-
- case QAbstractItemView::MoveRight:
-
- if (layoutDirection() == Qt::RightToLeft)
- {
- if (current.row() == 0 ||
- !(d->elementsInfo[current.row()].relativeOffsetToCategory % \
elementsPerRow))
- {
- return current;
- }
-
- return d->proxyModel->index(current.row() - 1, 0);
- }
-
- if (current.row() + 1 == d->elementsInfo.size() ||
- !(d->elementsInfo[current.row() + 1].relativeOffsetToCategory % \
elementsPerRow))
- {
- return current;
- }
-
- return d->proxyModel->index(current.row() + 1, 0);
-
- default:
- break;
- }
-
- return QListView::moveCursor(cursorAction, modifiers);
-}
-
-void ImportKCategorizedView::rowsInserted(const QModelIndex& parent, int start, int \
end)
-{
- QListView::rowsInserted(parent, start, end);
-
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- d->forcedSelectionPosition = 0;
- d->hovered = QModelIndex();
- d->biggestItemSize = QSize(0, 0);
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
- d->elementsInfo.clear();
- d->elementsPosition.clear();
- d->categoriesIndexes.clear();
- d->categoriesPosition.clear();
- d->categories.clear();
- d->intersectedIndexes.clear();
-
- return;
- }
-
- rowsInsertedArtifficial(parent, start, end);
-}
-
-int ImportKCategorizedView::Private::categoryUpperBound(SparseModelIndexVector& \
modelIndexList,
- int \
begin, int averageSize)
-{
- int end = modelIndexList.size();
- QString category = proxyModel->data(modelIndexList[begin],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString();
-
- // First case: Small category with <10 entries
- const int smallEnd = qMin(end, begin + 10);
-
- for (int k=begin; k < smallEnd; ++k)
- {
- if (category != proxyModel->data(modelIndexList[k],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString())
- {
- return k;
- }
- }
-
- begin += 10;
-
- // Second case: only one category, test last value
- QString value = proxyModel->data(modelIndexList[end - 1],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString();
-
- if (value == category)
- {
- return end;
- }
-
- // Third case: use average of last category sizes
- if (averageSize && begin + averageSize < end)
- {
- if (category != proxyModel->data(modelIndexList[begin + averageSize],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString())
- {
- end = begin + averageSize;
- }
- else if (begin + 2*averageSize < end)
- {
- if (category != proxyModel->data(modelIndexList[begin + 2*averageSize],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString())
- {
- end = begin + 2 * averageSize;
- }
- }
- }
-
- // now apply a binary search - the model is sorted by category
- // from qUpperBound, Copyright (C) 2008 Nokia Corporation and/or its \
subsidiary(-ies)
- int middle;
- int n = end - begin;
- int half;
-
- while (n > 0)
- {
- half = n >> 1;
- middle = begin + half;
-
- if (category != proxyModel->data(modelIndexList[middle],
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString())
- {
- n = half;
- }
- else
- {
- begin = middle + 1;
- n -= half + 1;
- }
- }
-
- return begin;
-}
-
-void ImportKCategorizedView::rowsInsertedArtifficial(const QModelIndex& parent, int \
start, int end)
-{
- Q_UNUSED(parent);
-
- d->forcedSelectionPosition = 0;
- d->hovered = QModelIndex();
- d->biggestItemSize = QSize(0, 0);
- d->mouseButtonPressed = false;
- d->rightMouseButtonPressed = false;
- d->elementsInfo.clear();
- d->elementsPosition.clear();
- d->categoriesIndexes.clear();
- d->categoriesPosition.clear();
- d->categories.clear();
- d->intersectedIndexes.clear();
-
- if (start > end || end < 0 || start < 0 || !d->proxyModel->rowCount())
- {
- return;
- }
-
- // Add all elements mapped to the source model and explore categories
- const int rowCount = d->proxyModel->rowCount();
- const int sortColumn = d->proxyModel->sortColumn();
- QString lastCategory = d->proxyModel->data(d->proxyModel->index(0, sortColumn),
- \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString();
- int offset = -1;
-
- SparseModelIndexVector modelIndexList(rowCount, d->proxyModel, sortColumn);
-
- d->elementsInfo = QVector<struct Private::ElementInfo>(rowCount);
- int categorySizes = 0;
- int categoryCounts = 0;
-
- if (uniformItemSizes())
- {
- // use last index as sample for size hint
- QModelIndex sample = d->proxyModel->index(rowCount - 1, modelColumn(), \
rootIndex());
- d->biggestItemSize = sizeHintForIndex(sample);
- }
- else
- {
- QStyleOptionViewItem option = viewOptions();
-
- for (int k = 0; k < rowCount; ++k)
- {
- QModelIndex indexSize = (sortColumn == 0) ? modelIndexList[k] : \
d->proxyModel->index(k, 0);
- QSize hint = itemDelegate(indexSize)->sizeHint(option, \
indexSize);
- d->biggestItemSize = QSize(qMax(hint.width(), \
d->biggestItemSize.width()),
- qMax(hint.height(), \
d->biggestItemSize.height()));
- }
- }
-
- for (int k = 0; k < rowCount; )
- {
- lastCategory = d->proxyModel->data(modelIndexList[k], \
KCategorizedSortFilterProxyModel::CategoryDisplayRole).toString();
- int upperBound = d->categoryUpperBound(modelIndexList, k, categorySizes / \
++categoryCounts);
- categorySizes += upperBound - k;
- offset = 0;
-
- QVector<int> rows(upperBound - k);
-
- for (int i=k; i<upperBound; ++i, ++offset)
- {
- rows[offset] = i;
- struct Private::ElementInfo& elementInfo = d->elementsInfo[i];
- elementInfo.category = lastCategory;
- elementInfo.relativeOffsetToCategory = offset;
- }
-
- k = upperBound;
-
- d->categoriesIndexes.insert(lastCategory, rows);
- d->categories << lastCategory;
- }
-
- d->updateScrollbars();
-}
-
-void ImportKCategorizedView::rowsRemoved(const QModelIndex& parent, int start, int \
end)
-{
- Q_UNUSED(parent);
- Q_UNUSED(start);
- Q_UNUSED(end);
-
- if (d->proxyModel && d->categoryDrawer && d->proxyModel->isCategorizedModel())
- {
- // Force the view to update all elements
- rowsInsertedArtifficial(QModelIndex(), 0, d->proxyModel->rowCount() - 1);
- }
-}
-
-void ImportKCategorizedView::updateGeometries()
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- QListView::updateGeometries();
- return;
- }
-
- // Avoid QListView::updateGeometries(), since it will try to set another
- // range to our scroll bars, what we don't want.
- QAbstractItemView::updateGeometries();
-}
-
-void ImportKCategorizedView::slotLayoutChanged()
-{
- if (d->proxyModel && d->categoryDrawer && d->proxyModel->isCategorizedModel())
- {
- // all cached values are invalidated, recompute immediately
- rowsInsertedArtifficial(QModelIndex(), 0, d->proxyModel->rowCount() - 1);
- }
-}
-
-void ImportKCategorizedView::currentChanged(const QModelIndex& current, const \
QModelIndex& previous)
-{
- if (!d->proxyModel || !d->categoryDrawer || \
!d->proxyModel->isCategorizedModel())
- {
- QListView::currentChanged(current, previous);
- return;
- }
-
- // We need to update the forcedSelectionPosition property in order to correctly
- // navigate after with keyboard using up & down keys
-
- int viewportWidth = viewport()->width() - spacing();
-
- //int itemHeight;
- int itemWidth;
-
- if (gridSize().isEmpty())
- {
- //itemHeight = d->biggestItemSize.height();
- itemWidth = d->biggestItemSize.width();
- }
- else
- {
- //itemHeight = gridSize().height();
- itemWidth = gridSize().width();
- }
-
- int itemWidthPlusSeparation = spacing() + itemWidth;
-
- if (!itemWidthPlusSeparation)
- {
- ++itemWidthPlusSeparation;
- }
-
- int elementsPerRow = viewportWidth / itemWidthPlusSeparation;
-
- if (!elementsPerRow)
- {
- ++elementsPerRow;
- }
-
- if (current.isValid())
- {
- d->forcedSelectionPosition = \
d->elementsInfo[current.row()].relativeOffsetToCategory % \
elementsPerRow;
- }
-
- QListView::currentChanged(current, previous);
-}
-
-} // namespace Digikam
diff --git a/utilities/cameragui/views/importkcategorizedview.h \
b/utilities/cameragui/views/importkcategorizedview.h deleted file mode 100644
index 54a2aea..0000000
--- a/utilities/cameragui/views/importkcategorizedview.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/* ============================================================
- *
- * This file is a part of digiKam project
- * http://www.digikam.org
- *
- * Date : 2012-07-05
- * Description : Base item view to list import interface items.
- *
- * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
- *
- * This program is free software; you can redistribute it
- * and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation;
- * either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ============================================================ */
-
-#ifndef ImportKCategorizedView_H
-#define ImportKCategorizedView_H
-
-// Qt includes
-
-#include <QtGui/QListView>
-
-class KCategoryDrawer;
-
-namespace Digikam
-{
-
-class ImportKCategorizedView : public QListView
-{
- Q_OBJECT
-
-public:
-
- ImportKCategorizedView(QWidget* const parent = 0);
- ~ImportKCategorizedView();
-
- void setGridSize(const QSize& size);
-
- void setCategoryDrawer(KCategoryDrawer* categoryDrawer);
- KCategoryDrawer* categoryDrawer() const;
-
- /**
- * Switch on drawing of dragged items. Default: on.
- * While dragging over the view, dragged items will be drawn transparently
- * following the mouse cursor.
- */
- void setDrawDraggedItems(bool drawDraggedItems);
-
- virtual void setModel(QAbstractItemModel* model);
- virtual QRect visualRect(const QModelIndex& index) const;
- virtual QModelIndex indexAt(const QPoint& p) const;
-
- /**
- * This method will return all indexes whose visual rect intersects @p rect.
- * @param rect rectangle to test intersection with
- * @note Returns an empty list if the view is not categorized.
- */
- virtual QModelIndexList categorizedIndexesIn(const QRect& rect) const;
-
- /**
- * This method will return the visual rect of the header of the category
- * in which @p index is sorted.
- * @note Returns QRect() if the view is not categorized.
- */
- virtual QRect categoryVisualRect(const QModelIndex& index) const;
-
- /**
- * This method will return the first index of the category
- * in the region of which @p point is found.
- * @note Returns QModelIndex() if the view is not categorized.
- */
- virtual QModelIndex categoryAt(const QPoint& point) const;
-
- /**
- * This method returns the range of indexes contained
- * in the category in which @p index is sorted.
- * @note Returns an empty range if the view is no categorized.
- */
- virtual QItemSelectionRange categoryRange(const QModelIndex& index) const;
-
-public Q_SLOTS:
-
- virtual void reset();
-
-protected Q_SLOTS:
-
- virtual void rowsInserted(const QModelIndex& parent, int start, int end);
- virtual void rowsInsertedArtifficial(const QModelIndex& parent, int start, int \
end);
- virtual void rowsRemoved(const QModelIndex& parent, int start, int end);
- virtual void updateGeometries();
- virtual void slotLayoutChanged();
- virtual void currentChanged(const QModelIndex& current, const QModelIndex& \
previous);
-
-protected:
-
- virtual void paintEvent(QPaintEvent* event);
- virtual void resizeEvent(QResizeEvent* event);
- virtual void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags \
flags);
- virtual void mouseMoveEvent(QMouseEvent* event);
- virtual void mousePressEvent(QMouseEvent* event);
- virtual void mouseReleaseEvent(QMouseEvent* event);
- virtual void leaveEvent(QEvent* event);
- virtual void startDrag(Qt::DropActions supportedActions);
- virtual void dragMoveEvent(QDragMoveEvent* event);
- virtual void dragLeaveEvent(QDragLeaveEvent* event);
- virtual void dropEvent(QDropEvent* event);
- virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers \
modifiers);
-
-private:
-
- class Private;
- Private* const d;
-};
-
-} //namespace Digikam
-
-#endif // ImportKCategorizedView_H
diff --git a/utilities/cameragui/views/importkcategorizedview_p.h \
b/utilities/cameragui/views/importkcategorizedview_p.h deleted file mode 100644
index b3c468e..0000000
--- a/utilities/cameragui/views/importkcategorizedview_p.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/* ============================================================
- *
- * This file is a part of digiKam project
- * http://www.digikam.org
- *
- * Date : 2012-07-08
- * Description : Item view to list import interface items.
- *
- * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
- *
- * This program is free software; you can redistribute it
- * and/or modify it under the terms of the GNU General
- * Public License as published by the Free Software Foundation;
- * either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ============================================================ */
-
-#ifndef ImportKCategorizedView_P_H
-#define ImportKCategorizedView_P_H
-
-class KCategorizedSortFilterProxyModel;
-class KCategoryDrawer;
-
-namespace Digikam
-{
-
-class SparseModelIndexVector : public QVector<QModelIndex>
-{
-
-public:
-
- SparseModelIndexVector(int rowCount, QAbstractItemModel* const model, int \
column)
- : QVector<QModelIndex>(rowCount), model(model), column(column)
- {
- }
-
- inline QModelIndex& operator[](int i)
- {
- QModelIndex& index = QVector<QModelIndex>::operator[](i);
-
- if (!index.isValid())
- {
- index = model->index(i, column);
- }
-
- return index;
- }
-
-private:
-
- // not to be used
- const QModelIndex& operator[](int i) const
- {
- return QVector<QModelIndex>::operator[](i);
- }
-
-private:
-
- QAbstractItemModel* model;
- int column;
-};
-
-// ------------------------------------------------------------------------------
-
-class ImportKCategorizedView::Private
-{
-public:
-
- Private(ImportKCategorizedView* const listView);
- ~Private();
-
- /**
- * Returns the list of items that intersects with @p rect
- */
- const QModelIndexList& intersectionSet(const QRect& rect);
-
- /**
- * Gets the item rect in the viewport for @p index
- */
- QRect visualRectInViewport(const QModelIndex& index) const;
-
- /**
- * Returns the category rect in the viewport for @p category
- */
- QRect visualCategoryRectInViewport(const QString& category) const;
-
- /**
- * Caches and returns the rect that corresponds to @p index
- */
- const QRect& cacheIndex(const QModelIndex& index);
-
- /**
- * Caches and returns the rect that corresponds to @p category
- */
- const QRect& cacheCategory(const QString& category);
-
- /**
- * Returns the rect that corresponds to @p index
- * @note If the rect is not cached, it becomes cached
- */
- const QRect& cachedRectIndex(const QModelIndex& index);
-
- /**
- * Returns the rect that corresponds to @p category
- * @note If the rect is not cached, it becomes cached
- */
- const QRect& cachedRectCategory(const QString& category);
-
- /**
- * Returns the visual rect (taking in count x and y offsets) for @p index
- * @note If the rect is not cached, it becomes cached
- */
- QRect visualRect(const QModelIndex& index);
-
- /**
- * Returns the visual rect (taking in count x and y offsets) for @p category
- * @note If the rect is not cached, it becomes cached
- */
- QRect categoryVisualRect(const QString& category);
-
- /**
- * Returns the contents size of this view (topmost category to bottommost index \
+ spacing)
- */
- QSize contentsSize();
-
- /**
- * This method will draw a new category represented by index
- * @p index on the rect specified by @p option.rect, with
- * painter @p painter
- */
- void drawNewCategory(const QModelIndex& index,
- int sortRole,
- const QStyleOption& option,
- QPainter* const painter);
-
- /**
- * This method will update scrollbars ranges. Called when our model changes
- * or when the view is resized
- */
- void updateScrollbars();
-
- /**
- * This method will draw dragged items in the painting operation
- */
- void drawDraggedItems(QPainter* const painter);
-
- /**
- * This method will determine which rect needs to be updated because of a
- * dragging operation
- */
- void drawDraggedItems();
-
- /**
- * This method will, starting from the index at begin in the given (sorted) \
modelIndex List,
- * find the last index having the same category as the index to begin with.
- */
- int categoryUpperBound(SparseModelIndexVector& modelIndexList, int begin, int \
averageSize = 0);
-
- /**
- * Returns a QItemSelection for all items intersection rect.
- */
- QItemSelection selectionForRect(const QRect& rect);
-
-public:
-
- // Attributes
-
- struct ElementInfo
- {
- QString category;
- int relativeOffsetToCategory;
- };
-
-public:
-
- // Basic data
- ImportKCategorizedView* listView;
- KCategoryDrawer* categoryDrawer;
- QSize biggestItemSize;
-
- // Behavior data
- bool mouseButtonPressed;
- bool rightMouseButtonPressed;
- bool dragLeftViewport;
- bool drawItemsWhileDragging;
- QModelIndex hovered;
- QString hoveredCategory;
- QPoint initialPressPosition;
- QPoint mousePosition;
- int forcedSelectionPosition;
-
- // Cache data
- // We cannot merge some of them into structs because it would affect
- // performance
- QVector<struct ElementInfo> elementsInfo;
- QHash<int, QRect> elementsPosition;
- QHash<QString, QVector<int> > categoriesIndexes;
- QHash<QString, QRect> categoriesPosition;
- QStringList categories;
- QModelIndexList intersectedIndexes;
- QRect lastDraggedItemsRect;
- QItemSelection lastSelection;
-
- // Attributes for speed reasons
- KCategorizedSortFilterProxyModel* proxyModel;
-};
-
-} // namespace Digikam
-
-#endif // ImportKCategorizedView_P_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic