You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kdirstat/kdirstat/ktreemapview.h

448 lines
11 KiB

/*
* File name: ktreemapview.h
* Summary: High level classes for KDirStat
* License: LGPL - See file COPYING.LIB for details.
* Author: Stefan Hundhammer <sh@suse.de>
*
* Updated: 2003-02-02
*/
#ifndef KTreemapView_h
#define KTreemapView_h
#include <tqcanvas.h>
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#define MinAmbientLight 0
#define MaxAmbientLight 200
#define DefaultAmbientLight 40
#define MinHeightScalePercent 10
#define MaxHeightScalePercent 200
#define DefaultHeightScalePercent 100
#define DefaultHeightScaleFactor ( DefaultHeightScalePercent / 100.0 )
#define DefaultMinTileSize 3
#define CushionHeight 1.0
class TQMouseEvent;
class TDEConfig;
namespace KDirStat
{
class KTreemapTile;
class KTreemapSelectionRect;
class KDirTree;
class KFileInfo;
class KTreemapView: public TQCanvasView
{
Q_OBJECT
public:
/**
* Constructor.
**/
KTreemapView( KDirTree * tree,
TQWidget * parent = 0,
const TQSize & initialSize = TQSize() );
/**
* Destructor.
**/
virtual ~KTreemapView();
/**
* Returns the (topmost) treemap tile at the specified position
* or 0 if there is none.
**/
KTreemapTile * tileAt( TQPoint pos );
/**
* Returns the minimum recommended size for this widget.
* Reimplemented from TQWidget.
**/
virtual TQSize minimumSizeHint() const { return TQSize( 0, 0 ); }
/**
* Returns this treemap view's currently selected treemap tile or 0 if
* there is none.
**/
KTreemapTile * selectedTile() const { return _selectedTile; }
/**
* Returns this treemap view's root treemap tile or 0 if there is none.
**/
KTreemapTile * rootTile() const { return _rootTile; }
/**
* Returns this treemap view's @ref KDirTree.
**/
KDirTree * tree() const { return _tree; }
/**
* Search the treemap for a tile that corresponds to the specified
* KFileInfo node. Returns 0 if there is none.
*
* Notice: This is an expensive operation since all treemap tiles need
* to be searched.
**/
KTreemapTile * findTile( KFileInfo * node );
/**
* Returns a suitable color for 'file' based on a set of internal rules
* (according to filename extension, MIME type or permissions).
**/
TQColor tileColor( KFileInfo * file );
public slots:
/**
* Make a treemap tile this treemap's selected tile.
* 'tile' may be 0. In this case, only the previous selection is
* deselected.
**/
void selectTile( KTreemapTile * tile );
/**
* Search the treemap for a tile with the specified KFileInfo node and
* select that tile if it is found. If nothing is found or if 'node' is
* 0, the previously selected tile is deselected.
**/
void selectTile( KFileInfo * node );
/**
* Zoom in one level towards the currently selected treemap tile:
* The entire treemap will be rebuilt with the near-topmost ancestor of
* the selected tile as the new root.
**/
void zoomIn();
/**
* Zoom out one level: The parent (if there is any) KFileInfo node of
* the current treemap root becomes the new root. This usually works
* only after zoomIn().
**/
void zoomOut();
/**
* Select the parent of the currently selected tile (if possible).
*
* This is very much the same as clicking with the middle mouse button,
* but not quite: The middle mouse button cycles back to the tile
* clicked at if there is no more parent. This method does not (because
* there is no known mouse position).
**/
void selectParent();
/**
* Completely rebuild the entire treemap from the internal tree's root
* on.
**/
void rebuildTreemap();
/**
* Clear the treemap contents.
**/
void clear();
/**
* Delete all items of a TQCanvas.
*
* Strangely enough, TQCanvas itself does not provide such a function.
**/
static void deleteAllItems( TQCanvas * canvas );
/**
* Notification that a dir tree node has been deleted.
**/
void deleteNotify( KFileInfo * node );
/**
* Read some parameters from the global @ref TDEConfig object.
**/
void readConfig();
public:
/**
* Rebuild the treemap with 'newRoot' as the new root and the specified
* size. If 'newSize' is (0, 0), visibleSize() is used.
**/
void rebuildTreemap( KFileInfo * newRoot,
const TQSize & newSize = TQSize() );
/**
* Returns the visible size of the viewport presuming no scrollbars are
* needed - which makes a lot more sense than fiddling with scrollbars
* since treemaps can be scaled to make scrollbars unnecessary.
**/
TQSize visibleSize();
/**
* Returns the visible width of the viewport presuming no scrollbars
* are needed.
*
* This uses visibleSize() which is a somewhat expensive operation, so
* if you need both visibleWidth() and visibleHeight(), better call
* visibleSize() once and access its width() and height() methods.
**/
int visibleWidth() { return visibleSize().width(); }
/**
* Returns the visible height of the viewport presuming no scrollbars
* are needed.
*
* This uses visibleSize() which is a somewhat expensive operation, so
* if you need both visibleWidth() and visibleHeight(), better call
* visibleSize() once and access its width() and height() methods.
**/
int visibleHeight() { return visibleSize().height(); }
/**
* Returns true if it is possible to zoom in with the currently
* selected tile, false if not.
**/
bool canZoomIn() const;
/**
* Returns true if it is possible to zoom out with the currently
* selected tile, false if not.
**/
bool canZoomOut() const;
/**
* Returns true if it is possible to select the parent of the currently
* selected tile, false if not.
**/
bool canSelectParent() const;
/**
* Returns 'true' if the treemap is automatically resized to fit into
* the available space, 'false' if not.
**/
bool autoResize() const { return _autoResize; }
/**
* Returns 'true' if treemap tiles are to be squarified upon creation,
* 'false' if not.
**/
bool squarify() const { return _squarify; }
/**
* Returns 'true' if cushion shading is to be used, 'false' if not.
**/
bool doCushionShading() const { return _doCushionShading; }
/**
* Returns 'true' if cushion shaded treemap tiles are to be separated
* by a grid, 'false' if not.
**/
bool forceCushionGrid() const { return _forceCushionGrid; }
/**
* Returns 'true' if tile boundary lines should be drawn for cushion
* treemaps, 'false' if not.
**/
bool ensureContrast() const { return _ensureContrast; }
/**
* Returns the minimum tile size in pixels. No treemap tiles less than
* this in width or height are desired.
**/
int minTileSize() const { return _minTileSize; }
/**
* Returns the cushion grid color.
**/
const TQColor & cushionGridColor() const { return _cushionGridColor; }
/**
* Returns the outline color to use if cushion shading is not used.
**/
const TQColor & outlineColor() const { return _outlineColor; }
/**
* Returns the fill color for non-directory treemap tiles when cushion
* shading is not used.
**/
const TQColor & fileFillColor() const { return _fileFillColor; }
/**
* Returns the fill color for directory (or "dotentry") treemap tiles
* when cushion shading is not used.
**/
const TQColor & dirFillColor() const { return _dirFillColor; }
/**
* Returns the intensity of ambient light for cushion shading
* [0..255]
**/
int ambientLight() const { return _ambientLight; }
/**
* Returns the X coordinate of a directed light source for cushion
* shading.
**/
double lightX() const { return _lightX; }
/**
* Returns the Y coordinate of a directed light source for cushion
* shading.
**/
double lightY() const { return _lightY; }
/**
* Returns the Z coordinate of a directed light source for cushion
* shading.
**/
double lightZ() const { return _lightZ; }
/**
* Returns cushion ridge height degradation factor (0 .. 1.0) for each
* level of subdivision.
**/
double heightScaleFactor() const { return _heightScaleFactor; }
signals:
/**
* Emitted when the currently selected item changes.
* Caution: 'item' may be 0 when the selection is cleared.
**/
void selectionChanged( KFileInfo * item );
/**
* Emitted when the treemap changes, e.g. is rebuilt, zoomed in, or
* zoomed out.
**/
void treemapChanged();
/**
* Emitted when a context menu for this tile should be opened.
* (usually on right click). 'pos' contains the click's mouse
* coordinates.
**/
void contextMenu( KTreemapTile * tile, const TQPoint & 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:
/**
* Catch mouse click - emits a selectionChanged() signal.
**/
virtual void contentsMousePressEvent( TQMouseEvent * event );
/**
* Catch mouse double click:
* Left button double-click zooms in,
* right button double-click zooms out,
* middle button double-click rebuilds treemap.
**/
virtual void contentsMouseDoubleClickEvent( TQMouseEvent * event );
/**
* Resize the treemap view. Suppress the treemap contents if the size
* falls below a minimum size, redisplay it if it grows above that
* minimum size.
*
* Reimplemented from TQFrame.
**/
virtual void resizeEvent( TQResizeEvent * event );
/**
* Convenience method to read a color from 'config'.
**/
TQColor readColorEntry( TDEConfig * config,
const char * entryName,
TQColor defaultColor );
// Data members
KDirTree * _tree;
KTreemapTile * _rootTile;
KTreemapTile * _selectedTile;
KTreemapSelectionRect * _selectionRect;
TQString _savedRootUrl;
bool _autoResize;
bool _squarify;
bool _doCushionShading;
bool _forceCushionGrid;
bool _ensureContrast;
int _minTileSize;
TQColor _highlightColor;
TQColor _cushionGridColor;
TQColor _outlineColor;
TQColor _fileFillColor;
TQColor _dirFillColor;
int _ambientLight;
double _lightX;
double _lightY;
double _lightZ;
double _heightScaleFactor;
}; // class KTreemapView
/**
* Transparent rectangle to make a treemap tile clearly visible as
* "selected". Leaf tiles could do that on their own, but higher-level
* tiles (corresponding to directories) are obscured for the most part, so
* only a small portion (if any) of their highlighted outline could be
* visible. This selection rectangle simply draws a two-pixel red outline
* on top (i.e., great z-height) of everything else. The rectangle is
* transparent, so the treemap tile contents remain visible.
**/
class KTreemapSelectionRect: public TQCanvasRectangle
{
public:
/**
* Constructor.
**/
KTreemapSelectionRect( TQCanvas * canvas, const TQColor & color );
/**
* Highlight the specified treemap tile: Resize this selection
* rectangle to match this tile and move it to this tile's
* position. Show the selection rectangle if it is currently
* invisible.
**/
void highlight( KTreemapTile * tile );
}; // class KTreemapSelectionRect
} // namespace KDirStat
#endif // ifndef KTreemapView_h
// EOF