diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-10 01:15:27 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-10 01:15:27 +0000 |
commit | b6e09a3a8ea5f1338d089a29eb6e08f00f03f1aa (patch) | |
tree | 7dee2cbb5c94d3371357f796d42e344e1305ce9c /kdirstat/kdirtreeview.h | |
download | kdirstat-b6e09a3a8ea5f1338d089a29eb6e08f00f03f1aa.tar.gz kdirstat-b6e09a3a8ea5f1338d089a29eb6e08f00f03f1aa.zip |
Added abandoned KDE3 version of kdirstat
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kdirstat@1088039 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdirstat/kdirtreeview.h')
-rw-r--r-- | kdirstat/kdirtreeview.h | 889 |
1 files changed, 889 insertions, 0 deletions
diff --git a/kdirstat/kdirtreeview.h b/kdirstat/kdirtreeview.h new file mode 100644 index 0000000..baeae6b --- /dev/null +++ b/kdirstat/kdirtreeview.h @@ -0,0 +1,889 @@ +/* + * File name: kdirtreeview.h + * Summary: High level classes for KDirStat + * License: LGPL - See file COPYING.LIB for details. + * Author: Stefan Hundhammer <sh@suse.de> + * + * Updated: 2003-08-26 + */ + + +#ifndef KDirTreeView_h +#define KDirTreeView_h + + +// Alternative parent class for KDirTreeView. +// +// If you change this, don't forget to change the KDirTreeView class +// declaration also. Unfortunately there this 'define' can't be used - +// it seems to confuse the 'moc' preprocessor. + +#define USE_KLISTVIEW 0 +#define DEBUG_COUNTERS 10 + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + + +#include <qdatetime.h> +#include <qlistview.h> +#include <qpixmap.h> +#include <klistview.h> +#include "kdirtree.h" + + +// Forward declarations +class QWidget; +class QTimer; +class QPopupMenu; +class KPacManAnimation; + + +// Open a new name space since KDE's name space is pretty much cluttered +// already - all names that would even remotely match are already used up, +// yet the resprective classes don't quite fit the purposes required here. + +namespace KDirStat +{ +#define KDirTreeViewMaxFillColor 16 + + +#if USE_KLISTVIEW +# define KDirTreeViewParentClass KListView +#else +# define KDirTreeViewParentClass QListView +#endif + + class KDirTreeViewItem; + + + class KDirTreeView: public QListView + // Using + // class KDirTreeView: public KDirTreeViewParentClass + // or some other 'ifdef' ... construct seems to confuse "moc". + { + Q_OBJECT + + public: + /** + * Default constructor. + **/ + KDirTreeView( QWidget * parent = 0 ); + + /** + * Destructor. + **/ + virtual ~KDirTreeView(); + + /** + * Locate the counterpart to an original tree item "wanted" somewhere + * within this view tree. Returns 0 on failure. + * If "lazy" is set, only the open part of the tree is searched. + * "doClone" specifies whether or not to (deferred) clone nodes that + * are not cloned yet. This is only used if "lazy" is false. + **/ + KDirTreeViewItem * locate( KFileInfo * wanted, + bool lazy = true, + bool doClone = true ); + + /** + * Get the first child of this view or 0 if there is none. + * Use the child's next() method to get the next child. + * Reimplemented from @ref QListView. + **/ + KDirTreeViewItem * firstChild() const + { return (KDirTreeViewItem *) KDirTreeViewParentClass::firstChild(); } + + /** + * Return the currently selected item or 0, if none is selected. + **/ + KDirTreeViewItem * selection() const { return _selection; } + + /** + * Returns the default level until which items are opened by default + * (unless they are dot entries). + **/ + int openLevel() const { return _openLevel; } + + /** + * Returns true if the view tree is to be cloned lazily, i.e. only + * those view tree branches that are really visible are synced with the + * original tree. + **/ + bool doLazyClone() const { return _doLazyClone; } + + /** + * Enable / disable PacMan animation in this tree view during directory + * reading. This is disabled by default since it eats quite some + * performance. + **/ + void enablePacManAnimation( bool enable ) { _doPacManAnimation = enable; } + /** + * Returns true if the PacMan animation is to be used during directory + * reading. + **/ + bool doPacManAnimation() const { return _doPacManAnimation; } + + /** + * Returns the number of open items in the entire tree. + **/ + int openCount(); + + /** + * Return the percentage bar fill color for the specified directory + * level (0..MaxInt). Wraps around every usedFillColors() colors. + **/ + const QColor & fillColor( int level ) const; + + /** + * Very much like @ref fillColor(), but doesn't wrap around at @ref + * usedFillColors(), but at KDirTreeViewMaxFillColor. + **/ + const QColor & rawFillColor( int level ) const; + + /** + * Set the fill color of percentage bars of the specified directory + * level (0..KDirTreeViewMaxFillColor-1). + * + * Calling repaint() after setting all desired colors is the + * caller's responsibility. + **/ + void setFillColor( int level, const QColor &color ); + + /** + * Set all tree colors to default values. + **/ + void setDefaultFillColors(); + + /** + * Set the number of used percentage bar fill colors + * (1..KDirTreeViewMaxFillColor). + **/ + void setUsedFillColors( int usedFillColors ); + + /** + * Returns the number of used percentage bar fill colors. + **/ + int usedFillColors() const { return _usedFillColors; } + + /** + * Set the tree background color. + * + * Calling repaint() after setting all desired colors is the + * caller's responsibility. + **/ + void setTreeBackground( const QColor &color ); + + /** + * Returns the tree background color. + **/ + const QColor & treeBackground() const { return _treeBackground; } + + /** + * Returns the background color for percentage bars. + **/ + const QColor & percentageBarBackground() const { return _percentageBarBackground; } + + /** + * (Try to) ensure good contrast between the tree background and the + * percentage bars' 3D edges - prevent ugly 3D effects which will + * inevitably be the case for a white background (which unfortunately + * is very common): The percentage bars use white and black for 3D + * borders - like any other widget. But other widgets normally can + * assume their parent widget uses some more neutral color so white and + * black will result in at least some minimal contrast. + * + * This function automagically sets a reasonable default background + * color for the tree display: If the current color scheme's document + * background color (as used for input fields, lists etc.) is white or + * black, use the palette midlight color (the same color as "normal" + * widgets like push buttons etc., but brighter). For all other colors + * than white, the document background color (the palette base color) + * is used. + **/ + void ensureContrast(); + + /** + * Set the sort column. + * + * Reimplemented from QListView so we can keep track of the sort column. + **/ + virtual void setSorting( int column, bool increasing = TRUE ); + + /** + * Returns the internal @ref KDirTree this view works on. + * Handle with caution: This might be short-lived information. + * The view might choose to create a new tree shortly after returning + * this, so don't store this pointer internally. + **/ + KDirTree *tree() { return _tree; } + + int nameCol() const { return _nameCol; } + int iconCol() const { return _iconCol; } + int percentBarCol() const { return _percentBarCol; } + int percentNumCol() const { return _percentNumCol; } + int totalSizeCol() const { return _totalSizeCol; } + int workingStatusCol() const { return _workingStatusCol; } + int ownSizeCol() const { return _ownSizeCol; } + int totalItemsCol() const { return _totalItemsCol; } + int totalFilesCol() const { return _totalFilesCol; } + int totalSubDirsCol() const { return _totalSubDirsCol; } + int latestMtimeCol() const { return _latestMtimeCol; } + int readJobsCol() const { return _readJobsCol; } + int sortCol() const { return _sortCol; } + + QPixmap openDirIcon() const { return _openDirIcon; } + QPixmap closedDirIcon() const { return _closedDirIcon; } + QPixmap openDotEntryIcon() const { return _openDotEntryIcon; } + QPixmap closedDotEntryIcon() const { return _closedDotEntryIcon; } + QPixmap unreadableDirIcon() const { return _unreadableDirIcon; } + QPixmap mountPointIcon() const { return _mountPointIcon; } + QPixmap fileIcon() const { return _fileIcon; } + QPixmap symLinkIcon() const { return _symLinkIcon; } + QPixmap blockDevIcon() const { return _blockDevIcon; } + QPixmap charDevIcon() const { return _charDevIcon; } + QPixmap fifoIcon() const { return _fifoIcon; } + QPixmap stopIcon() const { return _stopIcon; } + QPixmap workingIcon() const { return _workingIcon; } + QPixmap readyIcon() const { return _readyIcon; } + + + /** + * Set function name of debug function #i + **/ + void setDebugFunc( int i, const QString & functionName ); + + /** + * Increase debug counter #i + **/ + void incDebugCount( int i ); + + + public slots: + + /** + * Open a directory URL. Assume "file:" protocol unless otherwise specified. + **/ + void openURL( KURL url ); + + /** + * Refresh (i.e. re-read from disk) the entire tree. + **/ + void refreshAll(); + + /** + * Refresh (i.e. re-read from disk) the selected subtree. + **/ + void refreshSelected(); + + /** + * Forcefully stop a running read process. + **/ + void abortReading(); + + /** + * Clear this view's contents. + **/ + void clear(); + + /** + * Select a (QListViewItem) item. Triggers selectionChanged() signals. + **/ + void selectItem( QListViewItem *item ); + + /** + * Select an item. Triggers selectionChanged() signals. + * Overloaded for convenience. + **/ + void selectItem( KDirTreeViewItem *item ) { selectItem( (QListViewItem *) item ); } + + /** + * Select a KDirTree item. Used for connecting the @ref + * KDirTree::selectionChanged() signal. + **/ + void selectItem( KFileInfo *item ); + + /** + * Clear the current selection. Triggers selectionChanged() signals. + **/ + void clearSelection(); + + /** + * Close all tree branches except the one specified. + **/ + void closeAllExcept( KDirTreeViewItem *except ); + + /** + * Send a standardized mail to the owner of the selected branch. + * The user will get a mailer window where he can edit that mail all he + * likes before deciding to send or discard it. + * + * The mail includes all currently open branches from the selected + * branch on. + **/ + void sendMailToOwner(); + + /** + * Notification of a change in the KDE palette, i.e. the user selected + * and applied different colors in the KDE control center. + **/ + void paletteChanged(); + + /** + * Read configuration and initialize variables accordingly. + * Will be called automatically in the constructor. + **/ + void readConfig(); + + /** + * Save configuraton. + **/ + void saveConfig() const; + + /** + * Emit a @ref userActivity() signal worth 'points' activity points. + **/ + void logActivity( int points ); + + /** + * Returns the minimum recommended size for this widget. + * Reimplemented from QWidget. + **/ + virtual QSize minimumSizeHint() const { return QSize( 0, 0 ); } + + + protected slots: + + /** + * Add a child as a clone of original tree item "newChild" to this view + * tree. + **/ + void addChild ( KFileInfo *newChild ); + + /** + * Delete a cloned child. + **/ + void deleteChild ( KFileInfo *newChild ); + + /** + * Recursively update the visual representation of the summary fields. + * This update is as lazy as possible for optimum performance since it + * is called very frequently as a cyclic update. + **/ + void updateSummary(); + + /** + * Signal end of all read jobs, finalize display and terminate pending + * cyclic visual update. + **/ + void slotFinished(); + + /** + * Signal abortion of all read jobs, finalize display and terminate pending + * cyclic visual update. + **/ + void slotAborted(); + + /** + * Signal end of one read job at this level and finalize display of + * this level. + **/ + void finalizeLocal( KDirInfo *dir ); + + /** + * Display progress information in the status bar. Automatically adds + * the elapsed time of a directory scan. + **/ + void sendProgressInfo( const QString & currentDir = "" ); + + +#if QT_VERSION < 300 + /** + * "moc" doesnt't seem to handle default arguments well, so this is an + * overloaded slot that uses the internally stored current directory. + **/ + void sendProgressInfo(); +#endif + + /** + * Set up everything prior to reading: Cyclic update timer, display + * busy state, default sorting, stopwatch. + **/ + void prepareReading(); + + /** + * Change the tree display to "busy" state, i.e. add a column to + * display the number of pending read jobs for each level. + **/ + void busyDisplay(); + + /** + * Change the tree display back to "idle" state, i.e. remove columns + * that are useful only while directories are being read, like the + * pending read jobs column. + **/ + void idleDisplay(); + + /** + * Pop up context menu (i.e. emit the contextMenu() signal) or open a + * small info popup with exact information, depending on 'column'. + **/ + void popupContextMenu ( QListViewItem * listViewItem, + const QPoint & pos, + int column ); + + /** + * Pop up info window with exact byte size. + **/ + void popupContextSizeInfo ( const QPoint & pos, + KFileSize size ); + + /** + * Pop up info window with arbitrary one-line text. + **/ + void popupContextInfo ( const QPoint & pos, + const QString & info ); + + + protected slots: + + /** + * Notification that a column has just been resized, thus may need + * repaining. + **/ + void columnResized( int column, int oldSize, int newSize ); + + + signals: + + /** + * Single line progress information, emitted when the read status + * changes - typically when a new directory is being read. Connect to a + * status bar etc. to keep the user busy. + **/ + void progressInfo( const QString &infoLine ); + + /** + * Emitted when reading is started. + **/ + void startingReading(); + + /** + * Emitted when reading this tree is finished. + **/ + void finished(); + + /** + * Emitted when reading this tree has been aborted. + **/ + void aborted(); + + /** + * Emitted when the currently selected item changes. + * Caution: 'item' may be 0 when the selection is cleared. + **/ + void selectionChanged( KDirTreeViewItem *item ); + + /** + * Emitted when the currently selected item changes. + * Caution: 'item' may be 0 when the selection is cleared. + **/ + void selectionChanged( KFileInfo *item ); + + /** + * Emitted when a context menu for this item should be opened. + * (usually on right click). 'pos' contains the click's mouse + * coordinates. + * + * NOTE: + * + * This is _not_ the same as @ref QListView::rightButtonClicked(): + * The context menu may not open on a right click on every column, + * usually only in the nameCol(). + **/ + void contextMenu( KDirTreeViewItem *item, const QPoint &pos ); + + /** + * Emitted at user activity. Some interactive actions are assigned an + * amount of "activity points" that can be used to judge whether or not + * the user is actually using this program or if it's just idly sitting + * around on the desktop. This is intended for use together with a @ref + * KActivityTracker. + **/ + void userActivity( int points ); + + + protected: + + KDirTree * _tree; + QTimer * _updateTimer; + QTime _stopWatch; + QString _currentDir; + KDirTreeViewItem * _selection; + QPopupMenu * _contextInfo; + int _idContextInfo; + + int _openLevel; + bool _doLazyClone; + bool _doPacManAnimation; + int _updateInterval; // millisec + int _usedFillColors; + QColor _fillColor [ KDirTreeViewMaxFillColor ]; + QColor _treeBackground; + QColor _percentageBarBackground; + + + // The various columns in which to display information + + int _nameCol; + int _iconCol; + int _percentNumCol; + int _percentBarCol; + int _totalSizeCol; + int _workingStatusCol; + int _ownSizeCol; + int _totalItemsCol; + int _totalFilesCol; + int _totalSubDirsCol; + int _latestMtimeCol; + int _readJobsCol; + int _sortCol; + + int _debugCount[ DEBUG_COUNTERS ]; + QString _debugFunc [ DEBUG_COUNTERS ]; + + + // The various icons + + QPixmap _openDirIcon; + QPixmap _closedDirIcon; + QPixmap _openDotEntryIcon; + QPixmap _closedDotEntryIcon; + QPixmap _unreadableDirIcon; + QPixmap _mountPointIcon; + QPixmap _fileIcon; + QPixmap _symLinkIcon; + QPixmap _blockDevIcon; + QPixmap _charDevIcon; + QPixmap _fifoIcon; + QPixmap _stopIcon; + QPixmap _workingIcon; + QPixmap _readyIcon; + }; + + + + class KDirTreeViewItem: public QListViewItem + { + public: + /** + * Constructor for the root item. + **/ + KDirTreeViewItem ( KDirTreeView * view, + KFileInfo * orig ); + + /** + * Constructor for all other items. + **/ + KDirTreeViewItem ( KDirTreeView * view, + KDirTreeViewItem * parent, + KFileInfo * orig ); + + /** + * Destructor. + **/ + virtual ~KDirTreeViewItem(); + + /** + * Locate the counterpart to an original tree item "wanted" somewhere + * within this view tree. Returns 0 on failure. + * + * When "lazy" is set, only the open part of the tree is searched. + * "doClone" specifies whether or not to (deferred) clone nodes that + * are not cloned yet. This is only used if "lazy" is false. + * "Level" is just a hint for the current tree level for better + * performance. It will be calculated automatically if omitted. + **/ + KDirTreeViewItem * locate( KFileInfo * wanted, + bool lazy = true, + bool doClone = true, + int level = -1 ); + + /** + * Recursively update the visual representation of the summary fields. + * This update is as lazy as possible for optimum performance. + **/ + void updateSummary(); + + /** + * Bring (the top level of) this branch of the view tree in sync with + * the original tree. Does _not_ recurse into subdirectories - only + * this level of this branch is processed. Called when lazy tree + * cloning is in effect and this branch is about to be opened. + **/ + void deferredClone(); + + + /** + * Finalize this level - clean up unneeded / undesired dot entries. + **/ + void finalizeLocal(); + + /** + * Returns the corresponding view. + **/ + KDirTreeView * view() { return _view; } + + + /** + * Returns the parent view item or 0 if this is the root. + **/ + KDirTreeViewItem * parent() { return _parent; } + + /** + * Returns the corresponding original item of the "real" (vs. view) + * tree where all the important information resides. + **/ + KFileInfo * orig() { return _orig; } + + /** + * Returns the first child of this item or 0 if there is none. + * Use the child's next() method to get the next child. + * Reimplemented from @ref QListViewItem. + **/ + KDirTreeViewItem * firstChild() const + { return (KDirTreeViewItem *) QListViewItem::firstChild(); } + + /** + * Returns the next sibling of this item or 0 if there is none. + * (Kind of) reimplemented from @ref QListViewItem. + **/ + KDirTreeViewItem * next() const + { return (KDirTreeViewItem *) QListViewItem::nextSibling(); } + + /** + * Comparison function used for sorting the list. + * + * Using this function is much more efficient than overwriting + * QListViewItem::key() which operates on QStrings. + * + * Returns: + * -1 if this < other + * 0 if this == other + * +1 if this > other + * + * Reimplemented from QListViewItem + **/ + virtual int compare( QListViewItem * other, + int col, + bool ascending ) const; + + /** + * Perform any necessary pending updates when a branch is opened. + * Reimplemented from @ref QListViewItem. + **/ + virtual void setOpen( bool open ); + + /** + * Notification that a branch in this subtree has been opened or close + * somewhere. Don't call this if the state hasn't really changed! + **/ + void openNotify( bool open ); + + /** + * Recursively open this subtree and all its ancestors up to the root. + **/ + void openSubtree(); + + /** + * Recursively close all tree branches from here on downwards. + **/ + void closeSubtree(); + + /** + * Close all tree branches except this one from the root on. + **/ + void closeAllExceptThis(); + + /** + * Returns the number of open items in this subtree. + **/ + int openCount() const { return _openCount; } + + /** + * Recursively return an ASCII representation of all open items from + * here on. + **/ + QString asciiDump(); + + + protected: + + /** + * Set the appropriate icon depending on this item's type and open / + * closed state. + **/ + void setIcon(); + + /** + * Remove dot entry if it doesn't have any children. + * Reparent all of the dot entry's children if there are no + * subdirectories on this level. + **/ + void cleanupDotEntries(); + + /** + * Find this entry's dot entry (clone). + * + * This doesn't create one if deferred cloning is in effect (which is + * not a drawback since cloning directory nodes create a dot entry + * clone along with the directory clone). + * + * Returns 0 if there is no dot entry clone. + **/ + KDirTreeViewItem * findDotEntry() const; + + + /** + * Paint method. Reimplemented from @ref QListViewItem so different + * colors can be used - and of course for painting percentage bars. + * + * Reimplemented from @ref QListViewItem. + **/ + virtual void paintCell ( QPainter * painter, + const QColorGroup & colorGroup, + int column, + int width, + int alignment ); + + /** + * Paint a percentage bar into a @ref QListViewItem cell. + * 'width' is the width of the entire cell. + * 'indent' is the number of pixels to indent the bar. + **/ + void paintPercentageBar ( float percent, + QPainter * painter, + int indent, + int width, + const QColor & fillColor, + const QColor & barBackground ); + + /** + * Generic comparison function. + **/ + template<typename T> inline + int compare( T a, T b ) const + { + if ( a < b ) return -1; + if ( a > b ) return 1; + return 0; + } + + private: + + /** + * Initializations common to all constructors. + **/ + void init ( KDirTreeView * view, + KDirTreeViewItem * parent, + KFileInfo * orig ); + + protected: + + // Data members + + KDirTreeView * _view; + KDirTreeViewItem * _parent; + KFileInfo * _orig; + KPacManAnimation * _pacMan; + float _percent; + int _openCount; + + }; + + + inline kdbgstream & operator<< ( kdbgstream & stream, KDirTreeViewItem * item ) + { + if ( item ) + { + if ( item->orig() ) + { + stream << item->orig()->debugUrl(); + } + else + { + stream << "<NULL orig()> " << endl; + } + } + else + stream << "<NULL>"; + + return stream; + } + + + + //---------------------------------------------------------------------- + // Static Functions + //---------------------------------------------------------------------- + + /** + * Format a file size with all digits, yet human readable using the current + * locale's thousand separator, i.e. 12,345,678 rather than 12345678 + **/ + QString formatSizeLong( KFileSize size ); + + /** + * Format a file size for use within a QListView::key() function: + * Right-justify and fill with leading zeroes. + **/ + QString hexKey( KFileSize size ); + + /** + * Format a millisecond granularity time human readable. + * Milliseconds will only be inluded if 'showMilliSeconds' is true. + **/ + QString formatTime ( long millisec, + bool showMilliSeconds = false ); + + /** + * Format counters of any kind. + * + * Returns an empty string if 'suppressZero' is 'true' and the value of + * 'count' is 0. + **/ + QString formatCount( int count, bool suppressZero = false ); + + /** + * Format percentages. + **/ + QString formatPercent( float percent ); + + /** + * Format time and date human-readable as "yyyy-mm-dd hh:mm:ss" + * - unlike that ctime() crap that is really useless. + * See the source for more about why this format. + **/ + QString formatTimeDate( time_t rawTime ); + + /** + * Format time and date according to the current locale for those who + * really must have that brain-dead ctime() format. + **/ + QString localeTimeDate( time_t rawTime ); + + /** + * Return a color that contrasts to 'contrastColor'. + **/ + QColor contrastingColor ( const QColor &desiredColor, + const QColor &contrastColor ); + +} // namespace KDirStat + + +#endif // ifndef KDirTreeView_h + + +// EOF |