diff options
| author | Peter Penz <[email protected]> | 2010-10-09 09:45:56 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2010-10-09 09:45:56 +0000 |
| commit | 7e864a72b19b72be58d1924264b72bb2f203dda9 (patch) | |
| tree | 4ea5cded01ef8759c5cb7e5f1402bb0735a93a97 /src/views/dolphintreeview.h | |
| parent | 69d235fb48549d382fcbf432ce019f8aa5a2269e (diff) | |
Move the generic hover- and selection-adjustments from DolphinsDetailsView into the new base class DolphinTreeView.
Background info: QTreeView does not respect the width of a cell for the hover-feedback and the selections. This has been adjusted in DolphinDetailsView already, but the required code for this is quite large. This made it tricky to maintain the really Dolphin-specific parts in DolphinDetailsView.
svn path=/trunk/KDE/kdebase/apps/; revision=1184152
Diffstat (limited to 'src/views/dolphintreeview.h')
| -rw-r--r-- | src/views/dolphintreeview.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/views/dolphintreeview.h b/src/views/dolphintreeview.h new file mode 100644 index 000000000..67f8eedf2 --- /dev/null +++ b/src/views/dolphintreeview.h @@ -0,0 +1,137 @@ +/*************************************************************************** + * Copyright (C) 2010 by Peter Penz <[email protected]> * + * Copyright (C) 2008 by Simon St. James <[email protected]> * + * * + * 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 of the License, 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. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef DOLPHINTREEVIEW_H +#define DOLPHINTREEVIEW_H + +#include <QTreeView> +#include <libdolphin_export.h> + +/** + * @brief Extends QTreeView by a custom selection- and hover-mechanism. + * + * QTreeView does not respect the width of a cell for the hover-feedback + * and when selecting items. DolphinTreeView improves this by respecting the + * content-width of the first column. The selection-mechanism also + * respects the content-width. + */ +class LIBDOLPHINPRIVATE_EXPORT DolphinTreeView : public QTreeView +{ + Q_OBJECT + +public: + explicit DolphinTreeView(QWidget* parent = 0); + virtual ~DolphinTreeView(); + + virtual QRegion visualRegionForSelection(const QItemSelection& selection) const; + +protected: + /** + * @return True, if the item with the index \p index accepts a drop. In this + * case a visual feedback for the user is given during dragging. Per + * default false is returned. + */ + virtual bool acceptsDrop(const QModelIndex& index) const; + + virtual bool event(QEvent* event); + virtual void mousePressEvent(QMouseEvent* event); + virtual void mouseMoveEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); + virtual void startDrag(Qt::DropActions supportedActions); + virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dragMoveEvent(QDragMoveEvent* event); + virtual void dragLeaveEvent(QDragLeaveEvent* event); + virtual void paintEvent(QPaintEvent* event); + virtual void keyPressEvent(QKeyEvent* event); + virtual void keyReleaseEvent(QKeyEvent* event); + virtual void currentChanged(const QModelIndex& current, const QModelIndex& previous); + virtual QModelIndex indexAt (const QPoint& point) const; + virtual void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command); + virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); + +private slots: + /** + * If the elastic band is currently shown, update the elastic band based on + * the current mouse position and ensure that the selection is the set of items + * intersecting it. + */ + void updateElasticBandSelection(); + + /** + * Updates the destination \a destination from + * the elastic band to the current mouse position and triggers + * an update. + */ + void updateElasticBand(); + + /** + * Returns the rectangle for the elastic band dependent from the + * origin \a origin, the current destination + * \a destination and the viewport position. + */ + QRect elasticBandRect() const; + +private: + /** + * Returns true, if \a pos is within the expanding toggle of a tree. + */ + bool isAboveExpandingToggle(const QPoint& pos) const; + +private: + bool m_keyPressed; // true if a key is pressed currently; info used by currentChanged() + bool m_expandingTogglePressed; + bool m_useDefaultIndexAt; // true, if QTreeView::indexAt() should be used + bool m_ignoreScrollTo; // true if calls to scrollTo(...) should do nothing. + + QRect m_dropRect; + + struct ElasticBand + { + ElasticBand(); + + // Elastic band origin and destination coordinates are relative to t + // he origin of the view, not the viewport. + bool show; + QPoint origin; + QPoint destination; + + // Optimization mechanisms for use with elastic band selection. + // Basically, allow "incremental" updates to the selection based + // on the last elastic band shape. + QPoint lastSelectionOrigin; + QPoint lastSelectionDestination; + + // If true, compute the set of selected elements from scratch (slower) + bool ignoreOldInfo; + + // Edges of the filenames that are closest to the edges of oldSelectionRect. + // Used to decide whether horizontal changes in the elastic band are likely + // to require us to re-check which items are selected. + int outsideNearestLeftEdge; + int outsideNearestRightEdge; + int insideNearestLeftEdge; + int insideNearestRightEdge; + // The set of items that were selected at the time this band was shown. + // NOTE: Unless CTRL was pressed when the band was created, this is always empty. + QItemSelection originalSelection; + } m_band; +}; + +#endif |
