From a41a034902bb3aa75db4524978a174353b5de2fe Mon Sep 17 00:00:00 2001 From: Michele Calgaro Date: Fri, 6 Feb 2015 15:49:31 +0900 Subject: Moved iconview widget to src/widget folders. Signed-off-by: Michele Calgaro --- src/iconview/ntqiconview.h | 521 ---- src/iconview/qiconview.cpp | 6640 ------------------------------------------ src/iconview/qt_iconview.pri | 6 - src/qt.pro | 7 +- src/qt_professional.pri | 15 - src/tools/ntqglobal.h | 6 - src/widgets/ntqiconview.h | 515 ++++ src/widgets/qiconview.cpp | 6640 ++++++++++++++++++++++++++++++++++++++++++ src/widgets/qlistview.cpp | 2 +- src/widgets/qt_widgets.pri | 2 + 10 files changed, 7159 insertions(+), 7195 deletions(-) delete mode 100644 src/iconview/ntqiconview.h delete mode 100644 src/iconview/qiconview.cpp delete mode 100644 src/iconview/qt_iconview.pri create mode 100644 src/widgets/ntqiconview.h create mode 100644 src/widgets/qiconview.cpp (limited to 'src') diff --git a/src/iconview/ntqiconview.h b/src/iconview/ntqiconview.h deleted file mode 100644 index 34085827c..000000000 --- a/src/iconview/ntqiconview.h +++ /dev/null @@ -1,521 +0,0 @@ -/**************************************************************************** -** -** Definition of TQIconView widget class -** -** Created : 990707 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the iconview module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#ifndef TQICONVIEW_H -#define TQICONVIEW_H - -#ifndef QT_H -#include "ntqscrollview.h" -#include "ntqstring.h" -#include "ntqrect.h" -#include "ntqpoint.h" -#include "ntqsize.h" -#include "ntqfont.h" // TQString->TQFont conversion -#include "ntqdragobject.h" -#include "ntqbitmap.h" -#include "ntqpicture.h" -#endif // QT_H - -#ifndef QT_NO_ICONVIEW - -#if !defined( TQT_MODULE_ICONVIEW ) || defined( QT_INTERNAL_ICONVIEW ) -#define TQM_EXPORT_ICONVIEW -#else -#define TQM_EXPORT_ICONVIEW Q_EXPORT -#endif - -class TQIconView; -class TQPainter; -class TQMimeSource; -class TQMouseEvent; -class TQDragEnterEvent; -class TQDragMoveEvent; -class TQDragLeaveEvent; -class TQKeyEvent; -class TQFocusEvent; -class TQShowEvent; -class TQIconViewItem; -class TQIconViewItemLineEdit; -class TQStringList; -class TQIconDragPrivate; - -#ifndef QT_NO_DRAGANDDROP - -class TQM_EXPORT_ICONVIEW TQIconDragItem -{ -public: - TQIconDragItem(); - virtual ~TQIconDragItem(); - virtual TQByteArray data() const; - virtual void setData( const TQByteArray &d ); - bool operator== ( const TQIconDragItem& ) const; - -private: - TQByteArray ba; - -}; - -class TQM_EXPORT_ICONVIEW TQIconDrag : public TQDragObject -{ - TQ_OBJECT -public: - TQIconDrag( TQWidget * dragSource, const char* name = 0 ); - virtual ~TQIconDrag(); - - void append( const TQIconDragItem &item, const TQRect &pr, const TQRect &tr ); - - virtual const char* format( int i ) const; - static bool canDecode( TQMimeSource* e ); - virtual TQByteArray encodedData( const char* mime ) const; - -private: - TQIconDragPrivate *d; - TQChar endMark; - - friend class TQIconView; - friend class TQIconViewPrivate; -#if defined(TQ_DISABLE_COPY) // Disabled copy constructor and operator= - TQIconDrag( const TQIconDrag & ); - TQIconDrag &operator=( const TQIconDrag & ); -#endif -}; - -#endif - -class TQIconViewToolTip; -class TQIconViewItemPrivate; - -class TQM_EXPORT_ICONVIEW TQIconViewItem : public TQt -{ - friend class TQIconView; - friend class TQIconViewToolTip; - friend class TQIconViewItemLineEdit; - -public: - TQIconViewItem( TQIconView *parent ); - TQIconViewItem( TQIconView *parent, TQIconViewItem *after ); - TQIconViewItem( TQIconView *parent, const TQString &text ); - TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text ); - TQIconViewItem( TQIconView *parent, const TQString &text, const TQPixmap &icon ); - TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text, const TQPixmap &icon ); -#ifndef QT_NO_PICTURE - TQIconViewItem( TQIconView *parent, const TQString &text, const TQPicture &picture ); - TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text, const TQPicture &picture ); -#endif - virtual ~TQIconViewItem(); - - virtual void setRenameEnabled( bool allow ); - virtual void setDragEnabled( bool allow ); - virtual void setDropEnabled( bool allow ); - - virtual TQString text() const; - virtual TQPixmap *pixmap() const; -#ifndef QT_NO_PICTURE - virtual TQPicture *picture() const; -#endif - virtual TQString key() const; - - bool renameEnabled() const; - bool dragEnabled() const; - bool dropEnabled() const; - - TQIconView *iconView() const; - TQIconViewItem *prevItem() const; - TQIconViewItem *nextItem() const; - - int index() const; - - virtual void setSelected( bool s, bool cb ); - virtual void setSelected( bool s ); - virtual void setSelectable( bool s ); - - bool isSelected() const; - bool isSelectable() const; - - void setVisible( bool b ); - bool isVisible() const; - - virtual void repaint(); - - virtual bool move( int x, int y ); - virtual void moveBy( int dx, int dy ); - virtual bool move( const TQPoint &pnt ); - virtual void moveBy( const TQPoint &pnt ); - - TQRect rect() const; - int x() const; - int y() const; - int width() const; - int height() const; - TQSize size() const; - TQPoint pos() const; - TQRect textRect( bool relative = TRUE ) const; - TQRect pixmapRect( bool relative = TRUE ) const; - bool contains( const TQPoint& pnt ) const; - bool intersects( const TQRect& r ) const; - - virtual bool acceptDrop( const TQMimeSource *mime ) const; - -#ifndef QT_NO_TEXTEDIT - void rename(); -#endif - - virtual int compare( TQIconViewItem *i ) const; - - virtual void setText( const TQString &text ); - virtual void setPixmap( const TQPixmap &icon ); -#ifndef QT_NO_PICTURE - virtual void setPicture( const TQPicture &icon ); -#endif - virtual void setText( const TQString &text, bool recalc, bool redraw = TRUE ); - virtual void setPixmap( const TQPixmap &icon, bool recalc, bool redraw = TRUE ); - virtual void setKey( const TQString &k ); - - virtual int rtti() const; - static int RTTI; - -protected: -#ifndef QT_NO_TEXTEDIT - virtual void removeRenameBox(); -#endif - virtual void calcRect( const TQString &text_ = TQString::null ); - virtual void paintItem( TQPainter *p, const TQColorGroup &cg ); - virtual void paintFocus( TQPainter *p, const TQColorGroup &cg ); -#ifndef QT_NO_DRAGANDDROP - virtual void dropped( TQDropEvent *e, const TQValueList &lst ); -#endif - virtual void dragEntered(); - virtual void dragLeft(); - void setItemRect( const TQRect &r ); - void setTextRect( const TQRect &r ); - void setPixmapRect( const TQRect &r ); - void calcTmpText(); - TQString tempText() const; - -private: - void init( TQIconViewItem *after = 0 -#ifndef QT_NO_PICTURE - , TQPicture *pic = 0 -#endif - ); -#ifndef QT_NO_TEXTEDIT - void renameItem(); - void cancelRenameItem(); -#endif - void checkRect(); - - TQIconView *view; - TQString itemText, itemKey; - TQString tmpText; - TQPixmap *itemIcon; -#ifndef QT_NO_PICTURE - TQPicture *itemPic; -#endif - TQIconViewItem *prev, *next; - uint allow_rename : 1; - uint allow_drag : 1; - uint allow_drop : 1; - uint visible : 1; - uint selected : 1; - uint selectable : 1; - uint dirty : 1; - uint wordWrapDirty : 1; - TQRect itemRect, itemTextRect, itemIconRect; -#ifndef QT_NO_TEXTEDIT - TQIconViewItemLineEdit *renameBox; -#endif - TQRect oldRect; - - TQIconViewItemPrivate *d; - -}; - -class TQIconViewPrivate; /* don't touch */ - -class TQM_EXPORT_ICONVIEW TQIconView : public TQScrollView -{ - friend class TQIconViewItem; - friend class TQIconViewPrivate; - friend class TQIconViewToolTip; - - TQ_OBJECT - // #### sorting and sort direction do not work - TQ_ENUMS( SelectionMode ItemTextPos Arrangement ResizeMode ) - TQ_PROPERTY( bool sorting READ sorting ) - TQ_PROPERTY( bool sortDirection READ sortDirection ) - TQ_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode ) - TQ_PROPERTY( int gridX READ gridX WRITE setGridX ) - TQ_PROPERTY( int gridY READ gridY WRITE setGridY ) - TQ_PROPERTY( int spacing READ spacing WRITE setSpacing ) - TQ_PROPERTY( ItemTextPos itemTextPos READ itemTextPos WRITE setItemTextPos ) - TQ_PROPERTY( TQBrush itemTextBackground READ itemTextBackground WRITE setItemTextBackground ) - TQ_PROPERTY( Arrangement arrangement READ arrangement WRITE setArrangement ) - TQ_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode ) - TQ_PROPERTY( int maxItemWidth READ maxItemWidth WRITE setMaxItemWidth ) - TQ_PROPERTY( int maxItemTextLength READ maxItemTextLength WRITE setMaxItemTextLength ) - TQ_PROPERTY( bool autoArrange READ autoArrange WRITE setAutoArrange ) - TQ_PROPERTY( bool itemsMovable READ itemsMovable WRITE setItemsMovable ) - TQ_PROPERTY( bool wordWrapIconText READ wordWrapIconText WRITE setWordWrapIconText ) - TQ_PROPERTY( bool showToolTips READ showToolTips WRITE setShowToolTips ) - TQ_PROPERTY( uint count READ count ) - -public: - enum SelectionMode { - Single = 0, - Multi, - Extended, - NoSelection - }; - enum Arrangement { - LeftToRight = 0, - TopToBottom - }; - enum ResizeMode { - Fixed = 0, - Adjust - }; - enum ItemTextPos { - Bottom = 0, - Right - }; - - TQIconView( TQWidget* parent=0, const char* name=0, WFlags f = 0 ); - virtual ~TQIconView(); - - virtual void insertItem( TQIconViewItem *item, TQIconViewItem *after = 0L ); - virtual void takeItem( TQIconViewItem *item ); - - int index( const TQIconViewItem *item ) const; - - TQIconViewItem *firstItem() const; - TQIconViewItem *lastItem() const; - TQIconViewItem *currentItem() const; - virtual void setCurrentItem( TQIconViewItem *item ); - virtual void setSelected( TQIconViewItem *item, bool s, bool cb = FALSE ); - - uint count() const; - -public: - virtual void showEvent( TQShowEvent * ); - - virtual void setSelectionMode( SelectionMode m ); - SelectionMode selectionMode() const; - - TQIconViewItem *findItem( const TQPoint &pos ) const; - TQIconViewItem *findItem( const TQString &text, ComparisonFlags compare = BeginsWith ) const; - virtual void selectAll( bool select ); - virtual void clearSelection(); - virtual void invertSelection(); - - virtual void repaintItem( TQIconViewItem *item ); - void repaintSelectedItems(); - - void ensureItemVisible( TQIconViewItem *item ); - TQIconViewItem* findFirstVisibleItem( const TQRect &r ) const; - TQIconViewItem* findLastVisibleItem( const TQRect &r ) const; - - virtual void clear(); - - virtual void setGridX( int rx ); - virtual void setGridY( int ry ); - int gridX() const; - int gridY() const; - virtual void setSpacing( int sp ); - int spacing() const; - virtual void setItemTextPos( ItemTextPos pos ); - ItemTextPos itemTextPos() const; - virtual void setItemTextBackground( const TQBrush &b ); - TQBrush itemTextBackground() const; - virtual void setArrangement( Arrangement am ); - Arrangement arrangement() const; - virtual void setResizeMode( ResizeMode am ); - ResizeMode resizeMode() const; - virtual void setMaxItemWidth( int w ); - int maxItemWidth() const; - virtual void setMaxItemTextLength( int w ); - int maxItemTextLength() const; - virtual void setAutoArrange( bool b ); - bool autoArrange() const; - virtual void setShowToolTips( bool b ); - bool showToolTips() const; - - void setSorting( bool sort, bool ascending = TRUE ); - bool sorting() const; - bool sortDirection() const; - - virtual void setItemsMovable( bool b ); - bool itemsMovable() const; - virtual void setWordWrapIconText( bool b ); - bool wordWrapIconText() const; - - bool eventFilter( TQObject * o, TQEvent * ); - - TQSize minimumSizeHint() const; - TQSize sizeHint() const; - - virtual void sort( bool ascending = TRUE ); - - virtual void setFont( const TQFont & ); - virtual void setPalette( const TQPalette & ); - - bool isRenaming() const; - -public slots: - virtual void arrangeItemsInGrid( const TQSize &grid, bool update = TRUE ); - virtual void arrangeItemsInGrid( bool update = TRUE ); - virtual void setContentsPos( int x, int y ); - virtual void updateContents(); - -signals: - void selectionChanged(); - void selectionChanged( TQIconViewItem *item ); - void currentChanged( TQIconViewItem *item ); - void clicked( TQIconViewItem * ); - void clicked( TQIconViewItem *, const TQPoint & ); - void pressed( TQIconViewItem * ); - void pressed( TQIconViewItem *, const TQPoint & ); - - void doubleClicked( TQIconViewItem *item ); - void returnPressed( TQIconViewItem *item ); - void rightButtonClicked( TQIconViewItem* item, const TQPoint& pos ); - void rightButtonPressed( TQIconViewItem* item, const TQPoint& pos ); - void mouseButtonPressed( int button, TQIconViewItem* item, const TQPoint& pos ); - void mouseButtonClicked( int button, TQIconViewItem* item, const TQPoint& pos ); - void contextMenuRequested( TQIconViewItem* item, const TQPoint &pos ); - -#ifndef QT_NO_DRAGANDDROP - void dropped( TQDropEvent *e, const TQValueList &lst ); -#endif - void moved(); - void onItem( TQIconViewItem *item ); - void onViewport(); - void itemRenamed( TQIconViewItem *item, const TQString & ); - void itemRenamed( TQIconViewItem *item ); - -protected slots: - virtual void doAutoScroll(); - virtual void adjustItems(); - virtual void slotUpdate(); - -private slots: - void movedContents( int dx, int dy ); - -protected: - void drawContents( TQPainter *p, int cx, int cy, int cw, int ch ); - void contentsMousePressEvent( TQMouseEvent *e ); - void contentsMouseReleaseEvent( TQMouseEvent *e ); - void contentsMouseMoveEvent( TQMouseEvent *e ); - void contentsMouseDoubleClickEvent( TQMouseEvent *e ); - void contentsContextMenuEvent( TQContextMenuEvent *e ); - -#ifndef QT_NO_DRAGANDDROP - void contentsDragEnterEvent( TQDragEnterEvent *e ); - void contentsDragMoveEvent( TQDragMoveEvent *e ); - void contentsDragLeaveEvent( TQDragLeaveEvent *e ); - void contentsDropEvent( TQDropEvent *e ); -#endif - - void bufferedPaintEvent( TQPaintEvent* ); - void resizeEvent( TQResizeEvent* e ); - void keyPressEvent( TQKeyEvent *e ); - void focusInEvent( TQFocusEvent *e ); - void focusOutEvent( TQFocusEvent *e ); - void enterEvent( TQEvent *e ); - - virtual void drawRubber( TQPainter *p ); -#ifndef QT_NO_DRAGANDDROP - virtual TQDragObject *dragObject(); - virtual void startDrag(); -#endif - virtual void insertInGrid( TQIconViewItem *item ); - virtual void drawBackground( TQPainter *p, const TQRect &r ); - - void emitSelectionChanged( TQIconViewItem * i = 0 ); - void emitRenamed( TQIconViewItem *item ); - - TQIconViewItem *makeRowLayout( TQIconViewItem *begin, int &y, bool &changed ); - - void styleChange( TQStyle& ); - void windowActivationChange( bool ); - -private: - void contentsMousePressEventEx( TQMouseEvent *e ); - virtual void drawDragShapes( const TQPoint &pnt ); -#ifndef QT_NO_DRAGANDDROP - virtual void initDragEnter( TQDropEvent *e ); -#endif - void drawContents( TQPainter* ); - TQIconViewItem* findItemByName( TQIconViewItem *start ); - void handleItemChange( TQIconViewItem *old, bool shift, - bool control, bool homeend = FALSE); - - int calcGridNum( int w, int x ) const; - TQIconViewItem *rowBegin( TQIconViewItem *item ) const; - void updateItemContainer( TQIconViewItem *item ); - void appendItemContainer(); - void rebuildContainers(); - enum Direction { - DirUp = 0, - DirDown, - DirLeft, - DirRight - }; - TQIconViewItem* findItem( Direction dir, - const TQPoint &relativeTo, - const TQRect &searchRect ) const; - bool neighbourItem( Direction dir, - const TQPoint &relativeTo, - const TQIconViewItem *item ) const; - TQBitmap mask( TQPixmap *pix ) const; - int visibleWidthSB() const; - int visibleHeightSB() const; - - TQIconViewPrivate *d; - -private: // Disabled copy constructor and operator= -#if defined(TQ_DISABLE_COPY) - TQIconView( const TQIconView & ); - TQIconView& operator=( const TQIconView & ); -#endif -}; - -#endif // QT_NO_ICONVIEW - -#endif // TQICONVIEW_H diff --git a/src/iconview/qiconview.cpp b/src/iconview/qiconview.cpp deleted file mode 100644 index f6b2ae132..000000000 --- a/src/iconview/qiconview.cpp +++ /dev/null @@ -1,6640 +0,0 @@ -/**************************************************************************** -** -** Implementation of TQIconView widget class -** -** Created : 990707 -** -** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. -** -** This file is part of the iconview module of the TQt GUI Toolkit. -** -** This file may be used under the terms of the GNU General -** Public License versions 2.0 or 3.0 as published by the Free -** Software Foundation and appearing in the files LICENSE.GPL2 -** and LICENSE.GPL3 included in the packaging of this file. -** Alternatively you may (at your option) use any later version -** of the GNU General Public License if such license has been -** publicly approved by Trolltech ASA (or its successors, if any) -** and the KDE Free TQt Foundation. -** -** Please review the following information to ensure GNU General -** Public Licensing requirements will be met: -** http://trolltech.com/products/qt/licenses/licensing/opensource/. -** If you are unsure which license is appropriate for your use, please -** review the following information: -** http://trolltech.com/products/qt/licenses/licensing/licensingoverview -** or contact the sales department at sales@trolltech.com. -** -** This file may be used under the terms of the Q Public License as -** defined by Trolltech ASA and appearing in the file LICENSE.TQPL -** included in the packaging of this file. Licensees holding valid TQt -** Commercial licenses may use this file in accordance with the TQt -** Commercial License Agreement provided with the Software. -** -** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, -** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted -** herein. -** -**********************************************************************/ - -#include "ntqglobal.h" -#if defined(Q_CC_BOR) -// needed for qsort() because of a std namespace problem on Borland -#include "qplatformdefs.h" -#endif - -#include "ntqiconview.h" - -#ifndef QT_NO_ICONVIEW - -#include "ntqfontmetrics.h" -#include "ntqpainter.h" -#include "ntqevent.h" -#include "ntqpalette.h" -#include "ntqmime.h" -#include "ntqimage.h" -#include "ntqpen.h" -#include "ntqbrush.h" -#include "ntqtimer.h" -#include "ntqcursor.h" -#include "ntqapplication.h" -#include "ntqtextedit.h" -#include "ntqmemarray.h" -#include "ntqptrlist.h" -#include "ntqvbox.h" -#include "ntqtooltip.h" -#include "ntqbitmap.h" -#include "ntqpixmapcache.h" -#include "ntqptrdict.h" -#include "ntqstringlist.h" -#include "ntqcleanuphandler.h" -#include "private/qrichtext_p.h" -#include "ntqstyle.h" - -#include -#include - -#define RECT_EXTENSION 300 - -static const char * const unknown_xpm[] = { - "32 32 11 1", - "c c #ffffff", - "g c #c0c0c0", - "a c #c0ffc0", - "h c #a0a0a4", - "d c #585858", - "f c #303030", - "i c #400000", - "b c #00c000", - "e c #000000", - "# c #000000", - ". c None", - "...###..........................", - "...#aa##........................", - ".###baaa##......................", - ".#cde#baaa##....................", - ".#cccdeebaaa##..##f.............", - ".#cccccdeebaaa##aaa##...........", - ".#cccccccdeebaaaaaaaa##.........", - ".#cccccccccdeebaaaaaaa#.........", - ".#cccccgcgghhebbbbaaaaa#........", - ".#ccccccgcgggdebbbbbbaa#........", - ".#cccgcgcgcgghdeebiebbba#.......", - ".#ccccgcggggggghdeddeeba#.......", - ".#cgcgcgcggggggggghghdebb#......", - ".#ccgcggggggggghghghghd#b#......", - ".#cgcgcggggggggghghghhd#b#......", - ".#gcggggggggghghghhhhhd#b#......", - ".#cgcggggggggghghghhhhd#b#......", - ".#ggggggggghghghhhhhhhdib#......", - ".#gggggggggghghghhhhhhd#b#......", - ".#hhggggghghghhhhhhhhhd#b#......", - ".#ddhhgggghghghhhhhhhhd#b#......", - "..##ddhhghghhhhhhhhhhhdeb#......", - "....##ddhhhghhhhhhhhhhd#b#......", - "......##ddhhhhhhhhhhhhd#b#......", - "........##ddhhhhhhhhhhd#b#......", - "..........##ddhhhhhhhhd#b#......", - "............##ddhhhhhhd#b###....", - "..............##ddhhhhd#b#####..", - "................##ddhhd#b######.", - "..................##dddeb#####..", - "....................##d#b###....", - "......................####......"}; - -static TQPixmap *unknown_icon = 0; -static TQPixmap *qiv_buffer_pixmap = 0; -#if !defined(Q_WS_X11) -static TQPixmap *qiv_selection = 0; -#endif -static bool optimize_layout = FALSE; - -static TQCleanupHandler qiv_cleanup_pixmap; - -#if !defined(Q_WS_X11) -static void createSelectionPixmap( const TQColorGroup &cg ) -{ - TQBitmap m( 2, 2 ); - m.fill( TQt::color1 ); - TQPainter p( &m ); - p.setPen( TQt::color0 ); - for ( int j = 0; j < 2; ++j ) { - p.drawPoint( j % 2, j ); - } - p.end(); - - qiv_selection = new TQPixmap( 2, 2 ); - qiv_cleanup_pixmap.add( &qiv_selection ); - qiv_selection->fill( TQt::color0 ); - qiv_selection->setMask( m ); - qiv_selection->fill( cg.highlight() ); -} -#endif - -static TQPixmap *get_qiv_buffer_pixmap( const TQSize &s ) -{ - if ( !qiv_buffer_pixmap ) { - qiv_buffer_pixmap = new TQPixmap( s ); - qiv_cleanup_pixmap.add( &qiv_buffer_pixmap ); - return qiv_buffer_pixmap; - } - - qiv_buffer_pixmap->resize( s ); - return qiv_buffer_pixmap; -} - -#ifndef QT_NO_DRAGANDDROP - -class TQM_EXPORT_ICONVIEW TQIconDragData -{ -public: - TQIconDragData(); - TQIconDragData( const TQRect &ir, const TQRect &tr ); - - TQRect pixmapRect() const; - TQRect textRect() const; - - void setPixmapRect( const TQRect &r ); - void setTextRect( const TQRect &r ); - - TQRect iconRect_, textRect_; - TQString key_; - - bool operator==( const TQIconDragData &i ) const; -}; - -class TQM_EXPORT_ICONVIEW TQIconDragDataItem -{ -public: - TQIconDragDataItem() {} - TQIconDragDataItem( const TQIconDragItem &i1, const TQIconDragData &i2 ) : data( i1 ), item( i2 ) {} - TQIconDragItem data; - TQIconDragData item; - bool operator== ( const TQIconDragDataItem& ) const; -}; - -class TQIconDragPrivate -{ -public: - TQValueList items; - static bool decode( TQMimeSource* e, TQValueList &lst ); -}; - -#endif - -class TQIconViewToolTip; - -class TQIconViewPrivate -{ -public: - TQIconViewItem *firstItem, *lastItem; - uint count; - TQIconView::SelectionMode selectionMode; - TQIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem, - *startDragItem, *pressedItem, *selectAnchor, *renamingItem; - TQRect *rubber; - TQPixmap *backBuffer; - TQTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer, - *fullRedrawTimer; - int rastX, rastY, spacing; - int dragItems; - TQPoint oldDragPos; - TQIconView::Arrangement arrangement; - TQIconView::ResizeMode resizeMode; - TQSize oldSize; -#ifndef QT_NO_DRAGANDDROP - TQValueList iconDragData; -#endif - int numDragItems, cachedW, cachedH; - int maxItemWidth, maxItemTextLength; - TQPoint dragStart; - TQString currInputString; - TQIconView::ItemTextPos itemTextPos; -#ifndef QT_NO_CURSOR - TQCursor oldCursor; -#endif - int cachedContentsX, cachedContentsY; - TQBrush itemTextBrush; - TQRegion clipRegion; - TQPoint dragStartPos; - TQFontMetrics *fm; - int minLeftBearing, minRightBearing; - int rubberStartX, rubberStartY; - - uint mousePressed :1; - uint cleared :1; - uint dropped :1; - uint clearing :1; - uint oldDragAcceptAction :1; - uint isIconDrag :1; - uint drawDragShapes :1; - uint dirty :1; - uint rearrangeEnabled :1; - uint reorderItemsWhenInsert :1; - uint drawAllBack :1; - uint resortItemsWhenInsert :1; - uint sortDirection :1; - uint wordWrapIconText :1; - uint containerUpdateLocked :1; - uint firstSizeHint : 1; - uint showTips :1; - uint pressedSelected :1; - uint canStartRubber :1; - uint dragging :1; - uint drawActiveSelection :1; - uint inMenuMode :1; - - TQIconViewToolTip *toolTip; - TQPixmapCache maskCache; - TQPixmap *backrubber; - TQPtrDict selectedItems; - - struct ItemContainer { - ItemContainer( ItemContainer *pr, ItemContainer *nx, const TQRect &r ) - : p( pr ), n( nx ), rect( r ) { - items.setAutoDelete( FALSE ); - if ( p ) - p->n = this; - if ( n ) - n->p = this; - } - ItemContainer *p, *n; - TQRect rect; - TQPtrList items; - } *firstContainer, *lastContainer; - - struct SortableItem { - TQIconViewItem *item; - }; - -public: - - /* finds the containers that intersect with \a searchRect in the direction \a dir relative to \a relativeTo */ - TQPtrList* findContainers( - TQIconView:: Direction dir, - const TQPoint &relativeTo, - const TQRect &searchRect ) const; - // friend int cmpIconViewItems( const void *n1, const void *n2 ); -}; - - -TQPtrList* TQIconViewPrivate::findContainers( - TQIconView:: Direction dir, - const TQPoint &relativeTo, - const TQRect &searchRect ) const -{ - - TQPtrList* list = - new TQPtrList(); - - if ( arrangement == TQIconView::LeftToRight ) { - if ( dir == TQIconView::DirLeft || dir == TQIconView::DirRight ) { - ItemContainer *c = firstContainer; - for ( ; c; c = c->n ) - if ( c->rect.intersects( searchRect ) ) - list->append( c ); - } else { - if ( dir == TQIconView::DirDown ) { - ItemContainer *c = firstContainer; - for ( ; c; c = c->n ) - if ( c->rect.intersects( searchRect ) && - c->rect.bottom() >= relativeTo.y() ) - list->append( c ); - } else { - ItemContainer *c = lastContainer; - for ( ; c; c = c->p ) - if ( c->rect.intersects( searchRect ) && - c->rect.top() <= relativeTo.y() ) - list->append( c ); - } - } - } else { - if ( dir == TQIconView::DirUp || dir == TQIconView::DirDown ) { - ItemContainer *c = firstContainer; - for ( ; c; c = c->n ) - if ( c->rect.intersects( searchRect ) ) - list->append( c ); - } else { - if ( dir == TQIconView::DirRight ) { - ItemContainer *c = firstContainer; - for ( ; c; c = c->n ) - if ( c->rect.intersects( searchRect ) && - c->rect.right() >= relativeTo.x() ) - list->append( c ); - } else { - ItemContainer *c = lastContainer; - for ( ; c; c = c->p ) - if ( c->rect.intersects( searchRect ) && - c->rect.left() <= relativeTo.x() ) - list->append( c ); - } - } - } - return list; -} - - -#if defined(Q_C_CALLBACKS) -extern "C" { -#endif - -#ifdef Q_OS_TEMP -static int _cdecl cmpIconViewItems( const void *n1, const void *n2 ) -#else -static int cmpIconViewItems( const void *n1, const void *n2 ) -#endif -{ - if ( !n1 || !n2 ) - return 0; - - TQIconViewPrivate::SortableItem *i1 = (TQIconViewPrivate::SortableItem *)n1; - TQIconViewPrivate::SortableItem *i2 = (TQIconViewPrivate::SortableItem *)n2; - - return i1->item->compare( i2->item ); -} - -#if defined(Q_C_CALLBACKS) -} -#endif - - -#ifndef QT_NO_TOOLTIP -class TQIconViewToolTip : public TQToolTip -{ -public: - TQIconViewToolTip( TQWidget *parent, TQIconView *iv ); - virtual ~TQIconViewToolTip(); - - void maybeTip( const TQPoint &pos ); - -private: - TQIconView *view; -}; - -TQIconViewToolTip::TQIconViewToolTip( TQWidget *parent, TQIconView *iv ) - : TQToolTip( parent ), view( iv ) -{ -} - -TQIconViewToolTip::~TQIconViewToolTip() -{ -} - -void TQIconViewToolTip::maybeTip( const TQPoint &pos ) -{ - if ( !parentWidget() || !view || view->wordWrapIconText() || !view->showToolTips() ) - return; - - TQIconViewItem *item = view->findItem( view->viewportToContents( pos ) ); - if ( !item || item->tmpText == item->itemText ) - return; - - TQRect r( item->textRect( FALSE ) ); - TQRect r2 = item->pixmapRect( FALSE ); - /* this probably should be | r, but TQToolTip does not handle that - * well */ - - // At this point the rectangle is too small (it is the width of the icon) - // since we need it to be bigger than that, extend it here. - r.setWidth( view->d->fm->boundingRect( item->itemText ).width() + 4 ); - r = TQRect( view->contentsToViewport( TQPoint( r.x(), r.y() ) ), TQSize( r.width(), r.height() ) ); - - r2 = TQRect( view->contentsToViewport( TQPoint( r2.x(), r2.y() ) ), TQSize( r2.width(), r2.height() ) ); - tip( r2, item->itemText, r ); -} -#endif - - -class TQIconViewItemPrivate -{ -public: - TQIconViewPrivate::ItemContainer *container1, *container2; -}; - -#ifndef QT_NO_TEXTEDIT - -class TQIconViewItemLineEdit : public TQTextEdit -{ - friend class TQIconViewItem; - -public: - TQIconViewItemLineEdit( const TQString &text, TQWidget *parent, TQIconViewItem *theItem, const char* name=0 ); - -protected: - void keyPressEvent( TQKeyEvent *e ); - void focusOutEvent( TQFocusEvent *e ); - -protected: - TQIconViewItem *item; - TQString startText; -private: -#if defined(TQ_DISABLE_COPY) // Disabled copy constructor and operator= - TQIconViewItemLineEdit( const TQIconViewItemLineEdit & ); - TQIconViewItemLineEdit &operator=( const TQIconViewItemLineEdit & ); -#endif - -}; - -TQIconViewItemLineEdit::TQIconViewItemLineEdit( const TQString &text, TQWidget *parent, - TQIconViewItem *theItem, const char *name ) - : TQTextEdit( parent, name ), item( theItem ), startText( text ) -{ - setFrameStyle( TQFrame::Plain | TQFrame::Box ); - setLineWidth( 1 ); - - setHScrollBarMode( AlwaysOff ); - setVScrollBarMode( AlwaysOff ); - - setWordWrap( WidgetWidth ); - setWrapColumnOrWidth( item->iconView()->maxItemWidth() - - ( item->iconView()->itemTextPos() == TQIconView::Bottom ? - 0 : item->pixmapRect().width() ) ); - document()->formatter()->setAllowBreakInWords( TRUE ); - resize( 200, 200 ); // ### some size, there should be a forceReformat() - setTextFormat( PlainText ); - setText( text ); - setAlignment( TQt::AlignCenter ); - - resize( wrapColumnOrWidth() + 2, heightForWidth( wrapColumnOrWidth() ) + 2 ); -} - -void TQIconViewItemLineEdit::keyPressEvent( TQKeyEvent *e ) -{ - if ( e->key() == Key_Escape ) { - item->TQIconViewItem::setText( startText ); - item->cancelRenameItem(); - } else if ( e->key() == Key_Enter || - e->key() == Key_Return ) { - item->renameItem(); - } else { - TQTextEdit::keyPressEvent( e ); - sync(); - resize( width(), document()->height() + 2 ); - - } -} - -void TQIconViewItemLineEdit::focusOutEvent( TQFocusEvent *e ) -{ - Q_UNUSED(e) // I need this to get rid of a Borland warning - if ( e->reason() != TQFocusEvent::Popup ) - item->cancelRenameItem(); -} -#endif - -#ifndef QT_NO_DRAGANDDROP - - -/*! - \class TQIconDragItem ntqiconview.h - \ingroup draganddrop - - \brief The TQIconDragItem class encapsulates a drag item. - - \module iconview - - The TQIconDrag class uses a list of TQIconDragItems to support drag - and drop operations. - - In practice a TQIconDragItem object (or an object of a class derived - from TQIconDragItem) is created for each icon view item which is - dragged. Each of these TQIconDragItems is stored in a TQIconDrag - object. - - See TQIconView::dragObject() for more information. - - See the \l fileiconview/qfileiconview.cpp and - \l iconview/simple_dd/main.cpp examples. -*/ - -/*! - Constructs a TQIconDragItem with no data. -*/ - -TQIconDragItem::TQIconDragItem() - : ba( (int)strlen( "no data" ) ) -{ - memcpy( ba.data(), "no data", strlen( "no data" ) ); -} - -/*! - Destructor. -*/ - -TQIconDragItem::~TQIconDragItem() -{ -} - -/*! - Returns the data contained in the TQIconDragItem. -*/ - -TQByteArray TQIconDragItem::data() const -{ - return ba; -} - -/*! - Sets the data for the TQIconDragItem to the data stored in the - TQByteArray \a d. -*/ - -void TQIconDragItem::setData( const TQByteArray &d ) -{ - ba = d; -} - -/*! - \reimp -*/ - -bool TQIconDragItem::operator==( const TQIconDragItem &i ) const -{ - return ba == i.ba; -} - -/*! - \reimp -*/ - -bool TQIconDragDataItem::operator==( const TQIconDragDataItem &i ) const -{ - return ( i.item == item && - i.data == data ); -} - -/*! - \reimp -*/ - -bool TQIconDragData::operator==( const TQIconDragData &i ) const -{ - return key_ == i.key_; -} - - -/*! - \class TQIconDrag ntqiconview.h - - \brief The TQIconDrag class supports drag and drop operations - within a TQIconView. - - \ingroup draganddrop - \module iconview - - A TQIconDrag object is used to maintain information about the - positions of dragged items and the data associated with the - dragged items. TQIconViews are able to use this information to - paint the dragged items in the correct positions. Internally - TQIconDrag stores the data associated with drag items in - TQIconDragItem objects. - - If you want to use the extended drag-and-drop functionality of - TQIconView, create a TQIconDrag object in a reimplementation of - TQIconView::dragObject(). Then create a TQIconDragItem for each item - which should be dragged, set the data it represents with - TQIconDragItem::setData(), and add each TQIconDragItem to the drag - object using append(). - - The data in TQIconDragItems is stored in a TQByteArray and is - mime-typed (see TQMimeSource and the - \link http://doc.trolltech.com/dnd.html Drag and Drop\endlink - overview). If you want to use your own mime-types derive a class - from TQIconDrag and reimplement format(), encodedData() and - canDecode(). - - The fileiconview example program demonstrates the use of the - TQIconDrag class including subclassing and reimplementing - dragObject(), format(), encodedData() and canDecode(). See the files - \c qt/examples/fileiconview/qfileiconview.h and - \c qt/examples/fileiconview/qfileiconview.cpp. - - \sa TQMimeSource::format() -*/ -// ### consider using \dontinclude and friends there -// ### Not here in the module overview instead... - -/*! - Constructs a drag object called \a name, which is a child of \a - dragSource. - - Note that the drag object will be deleted when \a dragSource is deleted. -*/ - -TQIconDrag::TQIconDrag( TQWidget * dragSource, const char* name ) - : TQDragObject( dragSource, name ) -{ - d = new TQIconDragPrivate; -} - -/*! - Destructor. -*/ - -TQIconDrag::~TQIconDrag() -{ - delete d; -} - -/*! - Append the TQIconDragItem, \a i, to the TQIconDrag object's list of - items. You must also supply the geometry of the pixmap, \a pr, and - the textual caption, \a tr. - - \sa TQIconDragItem -*/ - -void TQIconDrag::append( const TQIconDragItem &i, const TQRect &pr, const TQRect &tr ) -{ - d->items.append( TQIconDragDataItem( i, TQIconDragData( pr, tr ) ) ); -} - -/*! - \reimp -*/ - -const char* TQIconDrag::format( int i ) const -{ - if ( i == 0 ) - return "application/x-qiconlist"; - return 0; -} - -/*! - Returns the encoded data of the drag object if \a mime is - application/x-qiconlist. -*/ - -TQByteArray TQIconDrag::encodedData( const char* mime ) const -{ - if ( d->items.count() <= 0 || TQString( mime ) != - "application/x-qiconlist" ) - return TQByteArray(); - - TQValueList::ConstIterator it = d->items.begin(); - TQString s; - for ( ; it != d->items.end(); ++it ) { - TQString k( "%1$@@$%2$@@$%3$@@$%4$@@$%5$@@$%6$@@$%7$@@$%8$@@$" ); - k = k.arg( (*it).item.pixmapRect().x() ).arg( - (*it).item.pixmapRect().y() ).arg( (*it).item.pixmapRect().width() ). - arg( (*it).item.pixmapRect().height() ).arg( - (*it).item.textRect().x() ).arg( (*it).item.textRect().y() ). - arg( (*it).item.textRect().width() ).arg( - (*it).item.textRect().height() ); - k += TQString( (*it).data.data() ) + "$@@$"; - s += k; - } - - TQByteArray a( s.length() + 1 ); - memcpy( a.data(), s.latin1(), a.size() ); - return a; -} - -/*! - Returns TRUE if \a e can be decoded by the TQIconDrag, otherwise - return FALSE. -*/ - -bool TQIconDrag::canDecode( TQMimeSource* e ) -{ - if ( e->provides( "application/x-qiconlist" ) ) - return TRUE; - return FALSE; -} - -/*! - Decodes the data which is stored (encoded) in \a e and, if - successful, fills the \a list of icon drag items with the decoded - data. Returns TRUE if there was some data, FALSE otherwise. -*/ - -bool TQIconDragPrivate::decode( TQMimeSource* e, TQValueList &lst ) -{ - TQByteArray ba = e->encodedData( "application/x-qiconlist" ); - if ( ba.size() ) { - lst.clear(); - TQString s = ba.data(); - TQIconDragDataItem item; - TQRect ir, tr; - TQStringList l = TQStringList::split( "$@@$", s ); - - int i = 0; - TQStringList::Iterator it = l.begin(); - for ( ; it != l.end(); ++it ) { - if ( i == 0 ) { - ir.setX( ( *it ).toInt() ); - } else if ( i == 1 ) { - ir.setY( ( *it ).toInt() ); - } else if ( i == 2 ) { - ir.setWidth( ( *it ).toInt() ); - } else if ( i == 3 ) { - ir.setHeight( ( *it ).toInt() ); - } else if ( i == 4 ) { - tr.setX( ( *it ).toInt() ); - } else if ( i == 5 ) { - tr.setY( ( *it ).toInt() ); - } else if ( i == 6 ) { - tr.setWidth( ( *it ).toInt() ); - } else if ( i == 7 ) { - tr.setHeight( ( *it ).toInt() ); - } else if ( i == 8 ) { - TQByteArray d( ( *it ).length() ); - memcpy( d.data(), ( *it ).latin1(), ( *it ).length() ); - item.item.setPixmapRect( ir ); - item.item.setTextRect( tr ); - item.data.setData( d ); - lst.append( item ); - } - ++i; - if ( i > 8 ) - i = 0; - } - return TRUE; - } - - return FALSE; -} - -TQIconDragData::TQIconDragData() - : iconRect_(), textRect_() -{ -} - -TQIconDragData::TQIconDragData( const TQRect &ir, const TQRect &tr ) - : iconRect_( ir ), textRect_( tr ) -{ -} - -TQRect TQIconDragData::textRect() const -{ - return textRect_; -} - -TQRect TQIconDragData::pixmapRect() const -{ - return iconRect_; -} - -void TQIconDragData::setPixmapRect( const TQRect &r ) -{ - iconRect_ = r; -} - -void TQIconDragData::setTextRect( const TQRect &r ) -{ - textRect_ = r; -} - -#endif - - -/*! - \class TQIconViewItem ntqiconview.h - \brief The TQIconViewItem class provides a single item in a TQIconView. - - \ingroup advanced - \module iconview - - A TQIconViewItem contains an icon, a string and optionally a sort - key, and can display itself in a TQIconView. - The class is designed to be very similar to TQListView and TQListBox - in use, both via instantiation and subclassing. - - The simplest way to create a TQIconViewItem and insert it into a - TQIconView is to construct the item passing the constructor a - pointer to the icon view, a string and an icon: - - \code - (void) new TQIconViewItem( - iconView, // A pointer to a TQIconView - "This is the text of the item", - aPixmap ); - \endcode - - By default the text of an icon view item may not be edited by the - user but calling setRenameEnabled(TRUE) will allow the user to - perform in-place editing of the item's text. - - When the icon view is deleted all items in it are deleted - automatically. - - The TQIconView::firstItem() and TQIconViewItem::nextItem() functions - provide a means of iterating over all the items in a TQIconView: - - \code - TQIconViewItem *item; - for ( item = iconView->firstItem(); item; item = item->nextItem() ) - do_something_with( item ); - \endcode - - The item's icon view is available from iconView(), and its - position in the icon view from index(). - - The item's selection status is available from isSelected() and is - set and controlled by setSelected() and isSelectable(). - - The text and icon can be set with setText() and setPixmap() and - retrieved with text() and pixmap(). The item's sort key defaults - to text() but may be set with setKey() and retrieved with key(). - The comparison function, compare() uses key(). - - Items may be repositioned with move() and moveBy(). An item's - geometry is available from rect(), x(), y(), width(), height(), - size(), pos(), textRect() and pixmapRect(). You can also test - against the position of a point with contains() and intersects(). - - To remove an item from an icon view, just delete the item. The - TQIconViewItem destructor removes it cleanly from its icon view. - - Because the icon view is designed to use drag-and-drop, the icon - view item also has functions for drag-and-drop which may be - reimplemented. - - \target pixmap-size-limit - Note: Pixmaps with individual dimensions larger than 300 pixels may - not be displayed properly, depending on the \link TQIconView::Arrangement - arrangement in use\endlink. For example, pixmaps wider than 300 pixels - will not be arranged correctly if the icon view uses a - \l TQIconView::TopToBottom arrangement, and pixmaps taller than 300 pixels - will not be arranged correctly if the icon view uses a - \l TQIconView::LeftToRight arrangement. -*/ - -/*! - Constructs a TQIconViewItem and inserts it into icon view \a parent - with no text and a default icon. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent ) - : view( parent ), itemText(), itemIcon( unknown_icon ) -{ - init(); -} - -/*! - Constructs a TQIconViewItem and inserts it into the icon view \a - parent with no text and a default icon, after the icon view item - \a after. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after ) - : view( parent ), itemText(), itemIcon( unknown_icon ), - prev( 0 ), next( 0 ) -{ - init( after ); -} - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and a default icon. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text ) - : view( parent ), itemText( text ), itemIcon( unknown_icon ) -{ - init( 0 ); -} - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and a default icon, after the - icon view item \a after. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, - const TQString &text ) - : view( parent ), itemText( text ), itemIcon( unknown_icon ) -{ - init( after ); -} - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and \a icon as the icon. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text, - const TQPixmap &icon ) - : view( parent ), - itemText( text ), itemIcon( new TQPixmap( icon ) ) -{ - init( 0 ); -} - - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and \a icon as the icon, after - the icon view item \a after. - - \sa setPixmap() -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, - const TQString &text, const TQPixmap &icon ) - : view( parent ), itemText( text ), itemIcon( new TQPixmap( icon ) ) -{ - init( after ); -} - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and \a picture as the icon. -*/ - -#ifndef QT_NO_PICTURE -TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text, - const TQPicture &picture ) - : view( parent ), itemText( text ), itemIcon( 0 ) -{ - init( 0, new TQPicture( picture ) ); -} - -/*! - Constructs an icon view item and inserts it into the icon view \a - parent using \a text as the text and \a picture as the icon, after - the icon view item \a after. -*/ - -TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, - const TQString &text, const TQPicture &picture ) - : view( parent ), itemText( text ), itemIcon( 0 ) -{ - init( after, new TQPicture( picture ) ); -} -#endif - -/*! - This private function initializes the icon view item and inserts it - into the icon view. -*/ - -void TQIconViewItem::init( TQIconViewItem *after -#ifndef QT_NO_PICTURE - , TQPicture *pic -#endif - ) -{ - d = new TQIconViewItemPrivate; - d->container1 = 0; - d->container2 = 0; - prev = next = 0; - allow_rename = FALSE; - allow_drag = TRUE; - allow_drop = TRUE; - visible = TRUE; - selected = FALSE; - selectable = TRUE; -#ifndef QT_NO_TEXTEDIT - renameBox = 0; -#endif -#ifndef QT_NO_PICTURE - itemPic = pic; -#endif - if ( view ) { - itemKey = itemText; - dirty = TRUE; - wordWrapDirty = TRUE; - itemRect = TQRect( -1, -1, 0, 0 ); - calcRect(); - view->insertItem( this, after ); - } -} - -/*! - Destroys the icon view item and tells the parent icon view that - the item has been destroyed. -*/ - -TQIconViewItem::~TQIconViewItem() -{ -#ifndef QT_NO_TEXTEDIT - removeRenameBox(); -#endif - if ( view && !view->d->clearing ) - view->takeItem( this ); - view = 0; - if ( itemIcon && itemIcon->serialNumber() != unknown_icon->serialNumber() ) - delete itemIcon; -#ifndef QT_NO_PICTURE - delete itemPic; -#endif - delete d; -} - -int TQIconViewItem::RTTI = 0; - -/*! - Returns 0. - - Make your derived classes return their own values for rtti(), so - that you can distinguish between icon view item types. You should - use values greater than 1000, preferably a large random number, to - allow for extensions to this class. -*/ - -int TQIconViewItem::rtti() const -{ - return RTTI; -} - -/*! - If \a b is TRUE, the item is made visible; otherwise it is hidden. -*/ - -void TQIconViewItem::setVisible( bool b ) -{ - if ( b == (bool)visible ) - return; - TQIconView *iv = iconView(); - if ( !iv ) - return; - visible = b; - if ( iv ) - iv->updateContents(); -} - -/*! - Returns TRUE if the item is visible; otherwise returns FALSE. - - \sa setVisible() -*/ - -bool TQIconViewItem::isVisible() const -{ - return (bool)visible; -} - -/*! - Sets \a text as the text of the icon view item. This function - might be a no-op if you reimplement text(). - - \sa text() -*/ - -void TQIconViewItem::setText( const TQString &text ) -{ - if ( text == itemText ) - return; - - wordWrapDirty = TRUE; - itemText = text; - if ( itemKey.isEmpty() ) - itemKey = itemText; - - TQRect oR = rect(); - calcRect(); - oR = oR.unite( rect() ); - - if ( view ) { - if ( TQRect( view->contentsX(), view->contentsY(), - view->visibleWidthSB(), view->visibleHeightSB() ). - intersects( oR ) ) - view->repaintContents( oR.x() - 1, oR.y() - 1, - oR.width() + 2, oR.height() + 2, FALSE ); - } -} - -/*! - Sets \a k as the sort key of the icon view item. By default - text() is used for sorting. - - \sa compare() -*/ - -void TQIconViewItem::setKey( const TQString &k ) -{ - if ( k == itemKey ) - return; - - itemKey = k; -} - -/*! - Sets \a icon as the item's icon in the icon view. This function - might be a no-op if you reimplement pixmap(). - - Note: Pixmaps with individual dimensions larger than 300 pixels may - not be displayed properly, depending on the \link TQIconView::Arrangement - arrangement in use\endlink. See the \link #pixmap-size-limit main class - documentation\endlink for details. - - \sa pixmap() -*/ - -void TQIconViewItem::setPixmap( const TQPixmap &icon ) -{ - if (isVisible() == FALSE) - return; - - if ( itemIcon && itemIcon == unknown_icon ) - itemIcon = 0; - - if ( itemIcon ) - *itemIcon = icon; - else - itemIcon = new TQPixmap( icon ); - TQRect oR = rect(); - calcRect(); - oR = oR.unite( rect() ); - - if ( view ) { - if ( TQRect( view->contentsX(), view->contentsY(), - view->visibleWidthSB(), view->visibleHeightSB() ). - intersects( oR ) ) - view->repaintContents( oR.x() - 1, oR.y() - 1, - oR.width() + 2, oR.height() + 2, FALSE ); - } -} - -/*! - Sets \a icon as the item's icon in the icon view. This function - might be a no-op if you reimplement picture(). - - \sa picture() -*/ - -#ifndef QT_NO_PICTURE -void TQIconViewItem::setPicture( const TQPicture &icon ) -{ - // clear assigned pixmap if any - if ( itemIcon ) { - if ( itemIcon == unknown_icon ) { - itemIcon = 0; - } else { - delete itemIcon; - itemIcon = 0; - } - } - if ( itemPic ) - delete itemPic; - itemPic = new TQPicture( icon ); - - TQRect oR = rect(); - calcRect(); - oR = oR.unite( rect() ); - - if ( view ) { - if ( TQRect( view->contentsX(), view->contentsY(), - view->visibleWidthSB(), view->visibleHeightSB() ). - intersects( oR ) ) - view->repaintContents( oR.x() - 1, oR.y() - 1, - oR.width() + 2, oR.height() + 2, FALSE ); - } -} -#endif - -/*! - \overload - - Sets \a text as the text of the icon view item. If \a recalc is - TRUE, the icon view's layout is recalculated. If \a redraw is TRUE - (the default), the icon view is repainted. - - \sa text() -*/ - -void TQIconViewItem::setText( const TQString &text, bool recalc, bool redraw ) -{ - if ( text == itemText ) - return; - - wordWrapDirty = TRUE; - itemText = text; - - if ( recalc ) - calcRect(); - if ( redraw ) - repaint(); -} - -/*! - \overload - - Sets \a icon as the item's icon in the icon view. If \a recalc is - TRUE, the icon view's layout is recalculated. If \a redraw is TRUE - (the default), the icon view is repainted. - - Note: Pixmaps with individual dimensions larger than 300 pixels may - not be displayed properly, depending on the \link TQIconView::Arrangement - arrangement in use\endlink. See the \link #pixmap-size-limit main class - documentation\endlink for details. - - \sa pixmap() -*/ - -void TQIconViewItem::setPixmap( const TQPixmap &icon, bool recalc, bool redraw ) -{ - if (isVisible() == FALSE) - return; - - if ( itemIcon && itemIcon == unknown_icon ) - itemIcon = 0; - - if ( itemIcon ) - *itemIcon = icon; - else - itemIcon = new TQPixmap( icon ); - - if ( redraw ) { - if ( recalc ) { - TQRect oR = rect(); - calcRect(); - oR = oR.unite( rect() ); - - if ( view ) { - if ( TQRect( view->contentsX(), view->contentsY(), - view->visibleWidthSB(), view->visibleHeightSB() ). - intersects( oR ) ) - view->repaintContents( oR.x() - 1, oR.y() - 1, - oR.width() + 2, oR.height() + 2, FALSE ); - } - } else { - repaint(); - } - } else if ( recalc ) { - calcRect(); - } -} - -/*! - If \a allow is TRUE, the user can rename the icon view item by - clicking on the text (or pressing F2) while the item is selected - (in-place renaming). If \a allow is FALSE, in-place renaming is - not possible. -*/ - -void TQIconViewItem::setRenameEnabled( bool allow ) -{ - allow_rename = (uint)allow; -} - -/*! - If \a allow is TRUE, the icon view permits the user to drag the - icon view item either to another position within the icon view or - to somewhere outside of it. If \a allow is FALSE, the item cannot - be dragged. -*/ - -void TQIconViewItem::setDragEnabled( bool allow ) -{ - allow_drag = (uint)allow; -} - -/*! - If \a allow is TRUE, the icon view lets the user drop something on - this icon view item. -*/ - -void TQIconViewItem::setDropEnabled( bool allow ) -{ - allow_drop = (uint)allow; -} - -/*! - Returns the text of the icon view item. Normally you set the text - of the item with setText(), but sometimes it's inconvenient to - call setText() for every item; so you can subclass TQIconViewItem, - reimplement this function, and return the text of the item. If you - do this, you must call calcRect() manually each time the text - (and therefore its size) changes. - - \sa setText() -*/ - -TQString TQIconViewItem::text() const -{ - return itemText; -} - -/*! - Returns the key of the icon view item or text() if no key has been - explicitly set. - - \sa setKey(), compare() -*/ - -TQString TQIconViewItem::key() const -{ - return itemKey; -} - -/*! - Returns the icon of the icon view item if it is a pixmap, or 0 if - it is a picture. In the latter case use picture() instead. - Normally you set the pixmap of the item with setPixmap(), but - sometimes it's inconvenient to call setPixmap() for every item. So - you can subclass TQIconViewItem, reimplement this function and - return a pointer to the item's pixmap. If you do this, you \e must - call calcRect() manually each time the size of this pixmap - changes. - - \sa setPixmap() -*/ - -TQPixmap *TQIconViewItem::pixmap() const -{ - return itemIcon; -} - -/*! - Returns the icon of the icon view item if it is a picture, or 0 if - it is a pixmap. In the latter case use pixmap() instead. Normally - you set the picture of the item with setPicture(), but sometimes - it's inconvenient to call setPicture() for every item. So you can - subclass TQIconViewItem, reimplement this function and return a - pointer to the item's picture. If you do this, you \e must call - calcRect() manually each time the size of this picture changes. - - \sa setPicture() -*/ - -#ifndef QT_NO_PICTURE -TQPicture *TQIconViewItem::picture() const -{ - return itemPic; -} -#endif - -/*! - Returns TRUE if the item can be renamed by the user with in-place - renaming; otherwise returns FALSE. - - \sa setRenameEnabled() -*/ - -bool TQIconViewItem::renameEnabled() const -{ - return (bool)allow_rename; -} - -/*! - Returns TRUE if the user is allowed to drag the icon view item; - otherwise returns FALSE. - - \sa setDragEnabled() -*/ - -bool TQIconViewItem::dragEnabled() const -{ - return (bool)allow_drag; -} - -/*! - Returns TRUE if the user is allowed to drop something onto the - item; otherwise returns FALSE. - - \sa setDropEnabled() -*/ - -bool TQIconViewItem::dropEnabled() const -{ - return (bool)allow_drop; -} - -/*! - Returns a pointer to this item's icon view parent. -*/ - -TQIconView *TQIconViewItem::iconView() const -{ - return view; -} - -/*! - Returns a pointer to the previous item, or 0 if this is the first - item in the icon view. - - \sa nextItem() TQIconView::firstItem() -*/ - -TQIconViewItem *TQIconViewItem::prevItem() const -{ - return prev; -} - -/*! - Returns a pointer to the next item, or 0 if this is the last item - in the icon view. - - To find the first item use TQIconView::firstItem(). - - Example: - \code - TQIconViewItem *item; - for ( item = iconView->firstItem(); item; item = item->nextItem() ) - do_something_with( item ); - \endcode - - \sa prevItem() -*/ - -TQIconViewItem *TQIconViewItem::nextItem() const -{ - return next; -} - -/*! - Returns the index of this item in the icon view, or -1 if an error - occurred. -*/ - -int TQIconViewItem::index() const -{ - if ( view ) - return view->index( this ); - - return -1; -} - - - -/*! - \overload - - This variant is equivalent to calling the other variant with \e cb - set to FALSE. -*/ - -void TQIconViewItem::setSelected( bool s ) -{ - setSelected( s, FALSE ); -} - -/*! - Selects or unselects the item, depending on \a s; it may also - unselect other items, depending on TQIconView::selectionMode() and - \a cb. - - If \a s is FALSE, the item is unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Single, the - item is selected and the item previously selected is unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Extended, the - item is selected. If \a cb is TRUE, the selection state of the - other items is left unchanged. If \a cb is FALSE (the default) all - other items are unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Multi, the - item is selected. - - Note that \a cb is used only if TQIconView::selectionMode() is \c - Extended; cb defaults to FALSE. - - All items whose selection status changes repaint themselves. -*/ - -void TQIconViewItem::setSelected( bool s, bool cb ) -{ - if ( !view ) - return; - if ( view->selectionMode() != TQIconView::NoSelection && - selectable && s != (bool)selected ) { - - if ( view->d->selectionMode == TQIconView::Single && this != view->d->currentItem ) { - TQIconViewItem *o = view->d->currentItem; - if ( o && o->selected ) - o->selected = FALSE; - view->d->currentItem = this; - if ( o ) - o->repaint(); - emit view->currentChanged( this ); - } - - if ( !s ) { - selected = FALSE; - } else { - if ( view->d->selectionMode == TQIconView::Single && view->d->currentItem ) { - view->d->currentItem->selected = FALSE; - } - if ( ( view->d->selectionMode == TQIconView::Extended && !cb ) || - view->d->selectionMode == TQIconView::Single ) { - bool b = view->signalsBlocked(); - view->blockSignals( TRUE ); - view->selectAll( FALSE ); - view->blockSignals( b ); - } - selected = s; - } - - repaint(); - if ( !view->signalsBlocked() ) { - bool emitIt = view->d->selectionMode == TQIconView::Single && s; - TQIconView *v = view; - emit v->selectionChanged(); - if ( emitIt ) - emit v->selectionChanged( this ); - } - } -} - -/*! - Sets this item to be selectable if \a enable is TRUE (the default) - or unselectable if \a enable is FALSE. - - The user is unable to select a non-selectable item using either - the keyboard or the mouse. (The application programmer can select - an item in code regardless of this setting.) - - \sa isSelectable() -*/ - -void TQIconViewItem::setSelectable( bool enable ) -{ - selectable = (uint)enable; -} - -/*! - Returns TRUE if the item is selected; otherwise returns FALSE. - - \sa setSelected() -*/ - -bool TQIconViewItem::isSelected() const -{ - return (bool)selected; -} - -/*! - Returns TRUE if the item is selectable; otherwise returns FALSE. - - \sa setSelectable() -*/ - -bool TQIconViewItem::isSelectable() const -{ - return (bool)selectable; -} - -/*! - Repaints the item. -*/ - -void TQIconViewItem::repaint() -{ - if ( view ) - view->repaintItem( this ); -} - -/*! - Moves the item to position (\a x, \a y) in the icon view (these - are contents coordinates). -*/ - -bool TQIconViewItem::move( int x, int y ) -{ - if ( x == this->x() && y == this->y() ) - return FALSE; - itemRect.setRect( x, y, itemRect.width(), itemRect.height() ); - checkRect(); - if ( view ) - view->updateItemContainer( this ); - return TRUE; -} - -/*! - Moves the item \a dx pixels in the x-direction and \a dy pixels in - the y-direction. -*/ - -void TQIconViewItem::moveBy( int dx, int dy ) -{ - itemRect.moveBy( dx, dy ); - checkRect(); - if ( view ) - view->updateItemContainer( this ); -} - -/*! - \overload - - Moves the item to the point \a pnt. -*/ - -bool TQIconViewItem::move( const TQPoint &pnt ) -{ - return move( pnt.x(), pnt.y() ); -} - -/*! - \overload - - Moves the item by the x, y values in point \a pnt. -*/ - -void TQIconViewItem::moveBy( const TQPoint &pnt ) -{ - moveBy( pnt.x(), pnt.y() ); -} - -/*! - Returns the bounding rectangle of the item (in contents - coordinates). -*/ - -TQRect TQIconViewItem::rect() const -{ - return itemRect; -} - -/*! - Returns the x-coordinate of the item (in contents coordinates). -*/ - -int TQIconViewItem::x() const -{ - return itemRect.x(); -} - -/*! - Returns the y-coordinate of the item (in contents coordinates). -*/ - -int TQIconViewItem::y() const -{ - return itemRect.y(); -} - -/*! - Returns the width of the item. -*/ - -int TQIconViewItem::width() const -{ - return TQMAX( itemRect.width(), TQApplication::globalStrut().width() ); -} - -/*! - Returns the height of the item. -*/ - -int TQIconViewItem::height() const -{ - return TQMAX( itemRect.height(), TQApplication::globalStrut().height() ); -} - -/*! - Returns the size of the item. -*/ - -TQSize TQIconViewItem::size() const -{ - return TQSize( itemRect.width(), itemRect.height() ); -} - -/*! - Returns the position of the item (in contents coordinates). -*/ - -TQPoint TQIconViewItem::pos() const -{ - return TQPoint( itemRect.x(), itemRect.y() ); -} - -/*! - Returns the bounding rectangle of the item's text. - - If \a relative is TRUE, (the default), the returned rectangle is - relative to the origin of the item's rectangle. If \a relative is - FALSE, the returned rectangle is relative to the origin of the - icon view's contents coordinate system. -*/ - -TQRect TQIconViewItem::textRect( bool relative ) const -{ - if ( relative ) - return itemTextRect; - else - return TQRect( x() + itemTextRect.x(), y() + itemTextRect.y(), itemTextRect.width(), itemTextRect.height() ); -} - -/*! - Returns the bounding rectangle of the item's icon. - - If \a relative is TRUE, (the default), the rectangle is relative to - the origin of the item's rectangle. If \a relative is FALSE, the - returned rectangle is relative to the origin of the icon view's - contents coordinate system. -*/ - -TQRect TQIconViewItem::pixmapRect( bool relative ) const -{ - if ( relative ) - return itemIconRect; - else - return TQRect( x() + itemIconRect.x(), y() + itemIconRect.y(), itemIconRect.width(), itemIconRect.height() ); -} - -/*! - Returns TRUE if the item contains the point \a pnt (in contents - coordinates); otherwise returns FALSE. -*/ - -bool TQIconViewItem::contains( const TQPoint& pnt ) const -{ - TQRect textArea = textRect( FALSE ); - TQRect pixmapArea = pixmapRect( FALSE ); - if ( iconView()->itemTextPos() == TQIconView::Bottom ) - textArea.setTop( pixmapArea.bottom() ); - else - textArea.setLeft( pixmapArea.right() ); - return textArea.contains( pnt ) || pixmapArea.contains( pnt ); -} - -/*! - Returns TRUE if the item intersects the rectangle \a r (in - contents coordinates); otherwise returns FALSE. -*/ - -bool TQIconViewItem::intersects( const TQRect& r ) const -{ - return ( textRect( FALSE ).intersects( r ) || - pixmapRect( FALSE ).intersects( r ) ); -} - -/*! - \fn bool TQIconViewItem::acceptDrop( const TQMimeSource *mime ) const - - Returns TRUE if you can drop things with a TQMimeSource of \a mime - onto this item; otherwise returns FALSE. - - The default implementation always returns FALSE. You must subclass - TQIconViewItem and reimplement acceptDrop() to accept drops. -*/ - -bool TQIconViewItem::acceptDrop( const TQMimeSource * ) const -{ - return FALSE; -} - -#ifndef QT_NO_TEXTEDIT -/*! - Starts in-place renaming of an icon, if allowed. - - This function sets up the icon view so that the user can edit the - item text, and then returns. When the user is done, setText() will - be called and TQIconView::itemRenamed() will be emitted (unless the - user canceled, e.g. by pressing the Escape key). - - \sa setRenameEnabled() -*/ - -void TQIconViewItem::rename() -{ - if ( !view ) - return; - if ( renameBox ) - removeRenameBox(); - oldRect = rect(); - renameBox = new TQIconViewItemLineEdit( itemText, view->viewport(), this, "qt_renamebox" ); - iconView()->ensureItemVisible( this ); - TQRect tr( textRect( FALSE ) ); - view->addChild( renameBox, tr.x() + ( tr.width() / 2 - renameBox->width() / 2 ), tr.y() - 3 ); - renameBox->selectAll(); - view->viewport()->setFocusProxy( renameBox ); - renameBox->setFocus(); - renameBox->show(); - Q_ASSERT( view->d->renamingItem == 0L ); - view->d->renamingItem = this; -} -#endif - -/*! - Compares this icon view item to \a i. Returns -1 if this item is - less than \a i, 0 if they are equal, and 1 if this icon view item - is greater than \a i. - - The default implementation compares the item keys (key()) using - TQString::localeAwareCompare(). A reimplementation may use - different values and a different comparison function. Here is a - reimplementation that uses plain Unicode comparison: - - \code - int MyIconViewItem::compare( TQIconViewItem *i ) const - { - return key().compare( i->key() ); - } - \endcode - - \sa key() TQString::localeAwareCompare() TQString::compare() -*/ - -int TQIconViewItem::compare( TQIconViewItem *i ) const -{ - return key().localeAwareCompare( i->key() ); -} - -#ifndef QT_NO_TEXTEDIT -/*! - This private function is called when the user pressed Return during - in-place renaming. -*/ - -void TQIconViewItem::renameItem() -{ - if ( !renameBox || !view ) - return; - - if ( !view->d->wordWrapIconText ) { - wordWrapDirty = TRUE; - calcRect(); - } - TQRect r = itemRect; - setText( renameBox->text() ); - view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE ); - view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE ); - removeRenameBox(); - - view->emitRenamed( this ); -} - -/*! - Cancels in-place renaming. -*/ - -void TQIconViewItem::cancelRenameItem() -{ - if ( !view ) - return; - - TQRect r = itemRect; - calcRect(); - view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE ); - view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE ); - - if ( !renameBox ) - return; - - removeRenameBox(); -} - -/*! - Removes the editbox that is used for in-place renaming. -*/ - -void TQIconViewItem::removeRenameBox() -{ - if ( !renameBox || !view ) - return; - - bool resetFocus = view->viewport()->focusProxy() == renameBox; - renameBox->hide(); - renameBox->deleteLater(); - renameBox = 0; - if ( resetFocus ) { - view->viewport()->setFocusProxy( view ); - view->setFocus(); - } - Q_ASSERT( view->d->renamingItem == this ); - view->d->renamingItem = 0L; -} -#endif - -/*! - This virtual function is responsible for calculating the - rectangles returned by rect(), textRect() and pixmapRect(). - setRect(), setTextRect() and setPixmapRect() are provided mainly - for reimplementations of this function. - - \a text_ is an internal parameter which defaults to TQString::null. -*/ - -void TQIconViewItem::calcRect( const TQString &text_ ) -{ - if ( !view ) // ##### - return; - - wordWrapDirty = TRUE; - int pw = 0; - int ph = 0; - -#ifndef QT_NO_PICTURE - if ( picture() ) { - TQRect br = picture()->boundingRect(); - pw = br.width() + 2; - ph = br.height() + 2; - } else -#endif - { - pw = ( pixmap() ? pixmap() : unknown_icon )->width() + 2; - ph = ( pixmap() ? pixmap() : unknown_icon )->height() + 2; - } - - itemIconRect.setWidth( pw ); - itemIconRect.setHeight( ph ); - - calcTmpText(); - - TQString t = text_; - if ( t.isEmpty() ) { - if ( view->d->wordWrapIconText ) - t = itemText; - else - t = tmpText; - } - - int tw = 0; - int th = 0; - // ##### TODO: fix font bearings! - TQRect r; - if ( view->d->wordWrapIconText ) { - r = TQRect( view->d->fm->boundingRect( 0, 0, iconView()->maxItemWidth() - - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : - pixmapRect().width() ), - 0xFFFFFFFF, AlignHCenter | WordBreak | BreakAnywhere, t ) ); - r.setWidth( r.width() + 4 ); - } else { - r = TQRect( 0, 0, view->d->fm->width( t ), view->d->fm->height() ); - r.setWidth( r.width() + 4 ); - } - - if ( r.width() > iconView()->maxItemWidth() - - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : - pixmapRect().width() ) ) - r.setWidth( iconView()->maxItemWidth() - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : - pixmapRect().width() ) ); - - tw = r.width(); - th = r.height(); - if ( tw < view->d->fm->width( "X" ) ) - tw = view->d->fm->width( "X" ); - - itemTextRect.setWidth( tw ); - itemTextRect.setHeight( th ); - - int w = 0; - int h = 0; - if ( view->itemTextPos() == TQIconView::Bottom ) { - w = TQMAX( itemTextRect.width(), itemIconRect.width() ); - h = itemTextRect.height() + itemIconRect.height() + 1; - - itemRect.setWidth( w ); - itemRect.setHeight( h ); - - itemTextRect = TQRect( ( width() - itemTextRect.width() ) / 2, height() - itemTextRect.height(), - itemTextRect.width(), itemTextRect.height() ); - itemIconRect = TQRect( ( width() - itemIconRect.width() ) / 2, 0, - itemIconRect.width(), itemIconRect.height() ); - } else { - h = TQMAX( itemTextRect.height(), itemIconRect.height() ); - w = itemTextRect.width() + itemIconRect.width() + 1; - - itemRect.setWidth( w ); - itemRect.setHeight( h ); - - itemTextRect = TQRect( width() - itemTextRect.width(), ( height() - itemTextRect.height() ) / 2, - itemTextRect.width(), itemTextRect.height() ); - itemIconRect = TQRect( 0, ( height() - itemIconRect.height() ) / 2, - itemIconRect.width(), itemIconRect.height() ); - } - if ( view ) - view->updateItemContainer( this ); -} - -/*! - Paints the item using the painter \a p and the color group \a cg. - If you want the item to be drawn with a different font or color, - reimplement this function, change the values of the color group or - the painter's font, and then call the TQIconViewItem::paintItem() - with the changed values. -*/ - -void TQIconViewItem::paintItem( TQPainter *p, const TQColorGroup &cg ) -{ - if ( !view ) - return; - - p->save(); - - if ( isSelected() ) { - p->setPen( cg.highlightedText() ); - } else { - p->setPen( cg.text() ); - } - - calcTmpText(); - -#ifndef QT_NO_PICTURE - if ( picture() ) { - TQPicture *pic = picture(); - if ( isSelected() ) { - p->setBrush( TQBrush( cg.highlight(), TQBrush::Dense4Pattern ) ); - p->setPen( TQPen( cg.highlight(), TQBrush::Dense4Pattern ) ); - p->drawRoundRect( pixmapRect( FALSE ), - 1000 / pixmapRect( FALSE ).width(), - 1000 / pixmapRect( FALSE ).height() ); - } - p->drawPicture( x()-pic->boundingRect().x(), y()-pic->boundingRect().y(), *pic ); - if ( isSelected() ) { - p->setBrush( TQBrush( cg.highlight() ) ); - p->setPen( TQPen( cg.highlight() ) ); - p->drawRoundRect( textRect( FALSE ), - 1000 / textRect( FALSE ).width(), - 1000 / textRect( FALSE ).height() ); - p->setPen( TQPen( cg.highlightedText() ) ); - } else if ( view->d->itemTextBrush != NoBrush ) { - p->setBrush( view->d->itemTextBrush ); - p->setPen( TQPen( view->d->itemTextBrush.color() ) ); - p->drawRoundRect( textRect( FALSE ), - 1000 / textRect( FALSE ).width(), - 1000 / textRect( FALSE ).height() ); - } - - int align = view->itemTextPos() == TQIconView::Bottom ? AlignHCenter : AlignAuto; - if ( view->d->wordWrapIconText ) - align |= WordBreak | BreakAnywhere; - p->drawText( textRect( FALSE ), align, view->d->wordWrapIconText ? itemText : tmpText ); - p->restore(); - return; - } -#endif - bool textOnBottom = ( view->itemTextPos() == TQIconView::Bottom ); - int dim; - if ( textOnBottom ) - dim = ( pixmap() ? pixmap() : unknown_icon)->width(); - else - dim = ( pixmap() ? pixmap() : unknown_icon)->height(); - if ( isSelected() ) { - TQPixmap *pix = pixmap() ? pixmap() : unknown_icon; - if ( pix && !pix->isNull() ) { - TQPixmap *buffer = get_qiv_buffer_pixmap( pix->size() ); - TQBitmap mask = view->mask( pix ); - - TQPainter p2( buffer ); - p2.fillRect( pix->rect(), white ); - p2.drawPixmap( 0, 0, *pix ); - p2.end(); - buffer->setMask( mask ); - p2.begin( buffer ); -#if defined(Q_WS_X11) - p2.fillRect( pix->rect(), TQBrush( cg.highlight(), TQBrush::Dense4Pattern) ); -#else // in WIN32 Dense4Pattern doesn't work correctly (transparency problem), so work around it - if ( iconView()->d->drawActiveSelection ) { - if ( !qiv_selection ) - createSelectionPixmap( cg ); - p2.drawTiledPixmap( 0, 0, pix->width(), pix->height(), - *qiv_selection ); - } -#endif - p2.end(); - TQRect cr = pix->rect(); - if ( textOnBottom ) - p->drawPixmap( x() + ( width() - dim ) / 2, y(), *buffer, 0, 0, - cr.width(), cr.height() ); - else - p->drawPixmap( x() , y() + ( height() - dim ) / 2, *buffer, 0, 0, - cr.width(), cr.height() ); - } - } else { - if ( textOnBottom ) - p->drawPixmap( x() + ( width() - dim ) / 2, y(), - *( pixmap() ? pixmap() : unknown_icon ) ); - else - p->drawPixmap( x() , y() + ( height() - dim ) / 2, - *( pixmap() ? pixmap() : unknown_icon ) ); - } - - p->save(); - if ( isSelected() ) { - p->setBrush( TQBrush( cg.highlight() ) ); - p->setPen( TQPen( cg.highlight() ) ); - p->drawRoundRect( textRect( FALSE ), - 1000 / textRect( FALSE ).width(), - 1000 / textRect( FALSE ).height() ); - p->setPen( TQPen( cg.highlightedText() ) ); - } else if ( view->d->itemTextBrush != NoBrush ) { - p->setBrush( view->d->itemTextBrush ); - p->setPen( TQPen( view->d->itemTextBrush.color() ) ); - p->drawRoundRect( textRect( FALSE ), - 1000 / textRect( FALSE ).width(), - 1000 / textRect( FALSE ).height() ); - } - - int align = AlignHCenter; - if ( view->d->wordWrapIconText ) - align |= WordBreak | BreakAnywhere; - p->drawText( textRect( FALSE ), align, - view->d->wordWrapIconText ? itemText : tmpText ); - - p->restore(); - - p->restore(); -} - -/*! - Paints the focus rectangle of the item using the painter \a p and - the color group \a cg. - - The default implementation does nothing; subclasses may - reimplement this function. -*/ - -void TQIconViewItem::paintFocus( TQPainter *, const TQColorGroup & ) -{ -} - -/*! - \fn void TQIconViewItem::dropped( TQDropEvent *e, const TQValueList &lst ) - - This function is called when something is dropped on the item. \a - e provides all the information about the drop. If the drag object - of the drop was a TQIconDrag, \a lst contains the list of the - dropped items. You can get the data by calling - TQIconDragItem::data() on each item. If the \a lst is empty, i.e. - the drag was not a TQIconDrag, you must decode the data in \a e and - work with that. - - The default implementation does nothing; subclasses may - reimplement this function. -*/ - -#ifndef QT_NO_DRAGANDDROP -void TQIconViewItem::dropped( TQDropEvent *, const TQValueList & ) -{ -} -#endif - -/*! - This function is called when a drag enters the item's bounding - rectangle. - - The default implementation does nothing; subclasses may - reimplement this function. -*/ - -void TQIconViewItem::dragEntered() -{ -} - -/*! - This function is called when a drag leaves the item's bounding - rectangle. - - The default implementation does nothing; subclasses may - reimplement this function. -*/ - -void TQIconViewItem::dragLeft() -{ -} - -/*! - Sets the bounding rectangle of the whole item to \a r. This - function is provided for subclasses which reimplement calcRect(), - so that they can set the calculated rectangle. \e{Any other use is - discouraged.} - - \sa calcRect() textRect() setTextRect() pixmapRect() setPixmapRect() -*/ - -void TQIconViewItem::setItemRect( const TQRect &r ) -{ - itemRect = r; - checkRect(); - if ( view ) - view->updateItemContainer( this ); -} - -/*! - Sets the bounding rectangle of the item's text to \a r. This - function is provided for subclasses which reimplement calcRect(), - so that they can set the calculated rectangle. \e{Any other use is - discouraged.} - - \sa calcRect() textRect() setItemRect() setPixmapRect() -*/ - -void TQIconViewItem::setTextRect( const TQRect &r ) -{ - itemTextRect = r; - if ( view ) - view->updateItemContainer( this ); -} - -/*! - Sets the bounding rectangle of the item's icon to \a r. This - function is provided for subclasses which reimplement calcRect(), - so that they can set the calculated rectangle. \e{Any other use is - discouraged.} - - \sa calcRect() pixmapRect() setItemRect() setTextRect() -*/ - -void TQIconViewItem::setPixmapRect( const TQRect &r ) -{ - itemIconRect = r; - if ( view ) - view->updateItemContainer( this ); -} - -/*! - \internal -*/ - -void TQIconViewItem::calcTmpText() -{ - if ( !view || view->d->wordWrapIconText || !wordWrapDirty ) - return; - wordWrapDirty = FALSE; - - int w = iconView()->maxItemWidth() - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : - pixmapRect().width() ); - if ( view->d->fm->width( itemText ) < w ) { - tmpText = itemText; - return; - } - - tmpText = "..."; - int i = 0; - while ( view->d->fm->width( tmpText + itemText[ i ] ) < w ) - tmpText += itemText[ i++ ]; - tmpText.remove( (uint)0, 3 ); - tmpText += "..."; -} - -/*! \internal */ - -TQString TQIconViewItem::tempText() const -{ - return tmpText; -} - -void TQIconViewItem::checkRect() -{ - int x = itemRect.x(); - int y = itemRect.y(); - int w = itemRect.width(); - int h = itemRect.height(); - - bool changed = FALSE; - if ( x < 0 ) { - x = 0; - changed = TRUE; - } - if ( y < 0 ) { - y = 0; - changed = TRUE; - } - - if ( changed ) - itemRect.setRect( x, y, w, h ); -} - - -/*! \file iconview/simple_dd/main.h */ -/*! \file iconview/simple_dd/main.cpp */ - - -/*! - \class TQIconView ntqiconview.h - \brief The TQIconView class provides an area with movable labelled icons. - - \module iconview - \ingroup advanced - \mainclass - - A TQIconView can display and manage a grid or other 2D layout of - labelled icons. Each labelled icon is a TQIconViewItem. Items - (TQIconViewItems) can be added or deleted at any time; items can be - moved within the TQIconView. Single or multiple items can be - selected. Items can be renamed in-place. TQIconView also supports - \link #draganddrop drag and drop\endlink. - - Each item contains a label string, a pixmap or picture (the icon - itself) and optionally a sort key. The sort key is used for - sorting the items and defaults to the label string. The label - string can be displayed below or to the right of the icon (see \l - ItemTextPos). - - The simplest way to create a TQIconView is to create a TQIconView - object and create some TQIconViewItems with the TQIconView as their - parent, set the icon view's geometry and show it. - For example: - \code - TQIconView *iv = new TQIconView( this ); - TQDir dir( path, "*.xpm" ); - for ( uint i = 0; i < dir.count(); i++ ) { - (void) new TQIconViewItem( iv, dir[i], TQPixmap( path + dir[i] ) ); - } - iv->resize( 600, 400 ); - iv->show(); - \endcode - - The TQIconViewItem call passes a pointer to the TQIconView we wish to - populate, along with the label text and a TQPixmap. - - When an item is inserted the TQIconView allocates a position for it. - Existing items are rearranged if autoArrange() is TRUE. The - default arrangement is \c LeftToRight -- the TQIconView fills - the \e top-most row from left to right, then moves one row \e down - and fills that row from left to right and so on. The - arrangement can be modified with any of the following approaches: - \list - \i Call setArrangement(), e.g. with \c TopToBottom which will fill up - the \e left-most column from top to bottom, then moves one column - \e right and fills that from top to bottom and so on. - - \i Construct each TQIconViewItem using a constructor which allows - you to specify which item the new one is to follow. - \i Call setSorting() or sort() to sort the items. - \endlist - - The spacing between items is set with setSpacing(). Items can be - laid out using a fixed grid using setGridX() and setGridY(); by - default the TQIconView calculates a grid dynamically. The position - of items' label text is set with setItemTextPos(). The text's - background can be set with setItemTextBackground(). The maximum - width of an item and of its text are set with setMaxItemWidth() - and setMaxItemTextLength(). The label text will be word-wrapped if - it is too long; this is controlled by setWordWrapIconText(). If - the label text is truncated, the user can still see the entire - text in a tool tip if they hover the mouse over the item. This is - controlled with setShowToolTips(). - - Items which are \link TQIconViewItem::isSelectable() - selectable\endlink may be selected depending on the SelectionMode; - the default is \c Single. Because TQIconView offers multiple - selection it must display keyboard focus and selection state - separately. Therefore there are functions to set the selection - state of an item (setSelected()) and to select which item displays - keyboard focus (setCurrentItem()). When multiple items may be - selected the icon view provides a rubberband, too. - - When in-place renaming is enabled (it is disabled by default), the - user may change the item's label. They do this by selecting the item - (single clicking it or navigating to it with the arrow keys), then - single clicking it (or pressing F2), and entering their text. If no - key has been set with TQIconViewItem::setKey() the new text will also - serve as the key. (See TQIconViewItem::setRenameEnabled().) - - You can control whether users can move items themselves with - setItemsMovable(). - - Because the internal structure used to store the icon view items is - linear, no iterator class is needed to iterate over all the items. - Instead we iterate by getting the first item from the \e{icon view} - and then each subsequent (\l TQIconViewItem::nextItem()) from each - \e item in turn: - \code - for ( TQIconViewItem *item = iv->firstItem(); item; item = item->nextItem() ) - do_something( item ); - \endcode - TQIconView also provides currentItem(). You can search for an item - using findItem() (searching by position or for label text) and - with findFirstVisibleItem() and findLastVisibleItem(). The number - of items is returned by count(). An item can be removed from an - icon view using takeItem(); to delete an item use \c delete. All - the items can be deleted with clear(). - - The TQIconView emits a wide range of useful signals, including - selectionChanged(), currentChanged(), clicked(), moved() and - itemRenamed(). - - \target draganddrop - \section1 Drag and Drop - - TQIconView supports the drag and drop of items within the TQIconView - itself. It also supports the drag and drop of items out of or into - the TQIconView and drag and drop onto items themselves. The drag and - drop of items outside the TQIconView can be achieved in a simple way - with basic functionality, or in a more sophisticated way which - provides more power and control. - - The simple approach to dragging items out of the icon view is to - subclass TQIconView and reimplement TQIconView::dragObject(). - - \code - TQDragObject *MyIconView::dragObject() - { - return new TQTextDrag( currentItem()->text(), this ); - } - \endcode - - In this example we create a TQTextDrag object, (derived from - TQDragObject), containing the item's label and return it as the drag - object. We could just as easily have created a TQImageDrag from the - item's pixmap and returned that instead. - - TQIconViews and their TQIconViewItems can also be the targets of drag - and drops. To make the TQIconView itself able to accept drops connect - to the dropped() signal. When a drop occurs this signal will be - emitted with a TQDragEvent and a TQValueList of TQIconDragItems. To - make a TQIconViewItem into a drop target subclass TQIconViewItem and - reimplement TQIconViewItem::acceptDrop() and - TQIconViewItem::dropped(). - - \code - bool MyIconViewItem::acceptDrop( const TQMimeSource *mime ) const - { - if ( mime->provides( "text/plain" ) ) - return TRUE; - return FALSE; - } - - void MyIconViewItem::dropped( TQDropEvent *evt, const TQValueList& ) - { - TQString label; - if ( TQTextDrag::decode( evt, label ) ) - setText( label ); - } - \endcode - - See \l iconview/simple_dd/main.h and \l - iconview/simple_dd/main.cpp for a simple drag and drop example - which demonstrates drag and drop between a TQIconView and a - TQListBox. - - If you want to use extended drag-and-drop or have drag shapes drawn - you must take a more sophisticated approach. - - The first part is starting drags -- you should use a TQIconDrag (or a - class derived from it) for the drag object. In dragObject() create the - drag object, populate it with TQIconDragItems and return it. Normally - such a drag should offer each selected item's data. So in dragObject() - you should iterate over all the items, and create a TQIconDragItem for - each selected item, and append these items with TQIconDrag::append() to - the TQIconDrag object. You can use TQIconDragItem::setData() to set the - data of each item that should be dragged. If you want to offer the - data in additional mime-types, it's best to use a class derived from - TQIconDrag, which implements additional encoding and decoding - functions. - - When a drag enters the icon view, there is little to do. Simply - connect to the dropped() signal and reimplement - TQIconViewItem::acceptDrop() and TQIconViewItem::dropped(). If you've - used a TQIconDrag (or a subclass of it) the second argument to the - dropped signal contains a TQValueList of TQIconDragItems -- you can - access their data by calling TQIconDragItem::data() on each one. - - For an example implementation of complex drag-and-drop look at the - fileiconview example (qt/examples/fileiconview). - - \sa TQIconViewItem::setDragEnabled(), TQIconViewItem::setDropEnabled(), - TQIconViewItem::acceptDrop(), TQIconViewItem::dropped(). - - -*/ - -/*! \enum TQIconView::ResizeMode - - This enum type is used to tell TQIconView how it should treat the - positions of its icons when the widget is resized. The modes are: - - \value Fixed The icons' positions are not changed. - \value Adjust The icons' positions are adjusted to be within the - new geometry, if possible. -*/ - -/*! - \enum TQIconView::SelectionMode - - This enumerated type is used by TQIconView to indicate how it - reacts to selection by the user. It has four values: - - \value Single When the user selects an item, any already-selected - item becomes unselected and the user cannot unselect the selected - item. This means that the user can never clear the selection. (The - application programmer can, using TQIconView::clearSelection().) - - \value Multi When the user selects an item, e.g. by navigating - to it with the keyboard arrow keys or by clicking it, the - selection status of that item is toggled and the other items are - left alone. Also, multiple items can be selected by dragging the - mouse while the left mouse button stays pressed. - - \value Extended When the user selects an item the selection is - cleared and the new item selected. However, if the user presses - the Ctrl key when clicking on an item, the clicked item gets - toggled and all other items are left untouched. If the user - presses the Shift key while clicking on an item, all items between - the current item and the clicked item get selected or unselected, - depending on the state of the clicked item. Also, multiple items - can be selected by dragging the mouse while the left mouse button - stays pressed. - - \value NoSelection Items cannot be selected. - - To summarise: \c Single is a real single-selection icon view; \c - Multi a real multi-selection icon view; \c Extended is an icon - view in which users can select multiple items but usually want to - select either just one or a range of contiguous items; and \c - NoSelection mode is for an icon view where the user can look but - not touch. -*/ - -/*! - \enum TQIconView::Arrangement - - This enum type determines in which direction the items flow when - the view runs out of space. - - \value LeftToRight Items which don't fit into the view cause the - viewport to extend vertically (you get a vertical scrollbar). - - \value TopToBottom Items which don't fit into the view cause the - viewport to extend horizontally (you get a horizontal scrollbar). -*/ - -/*! - \enum TQIconView::ItemTextPos - - This enum type specifies the position of the item text in relation - to the icon. - - \value Bottom The text is drawn below the icon. - \value Right The text is drawn to the right of the icon. -*/ - -/*! - \fn void TQIconView::dropped ( TQDropEvent * e, const TQValueList &lst ) - - This signal is emitted when a drop event occurs in the viewport - (but not on any icon) which the icon view itself can't handle. - - \a e provides all the information about the drop. If the drag - object of the drop was a TQIconDrag, \a lst contains the list of - the dropped items. You can get the data using - TQIconDragItem::data() on each item. If the \a lst is empty, i.e. - the drag was not a TQIconDrag, you have to decode the data in \a e - and work with that. - - Note TQIconViewItems may be drop targets; if a drop event occurs on - an item the item handles the drop. -*/ - -/*! - \fn void TQIconView::moved() - - This signal is emitted after successfully dropping one (or more) - items of the icon view. If the items should be removed, it's best - to do so in a slot connected to this signal. -*/ - -/*! - \fn void TQIconView::doubleClicked(TQIconViewItem * item) - - This signal is emitted when the user double-clicks on \a item. -*/ - -/*! - \fn void TQIconView::returnPressed (TQIconViewItem * item) - - This signal is emitted if the user presses the Return or Enter - key. \a item is the currentItem() at the time of the keypress. -*/ - -/*! - \fn void TQIconView::selectionChanged() - - This signal is emitted when the selection has been changed. It's - emitted in each selection mode. -*/ - -/*! - \overload void TQIconView::selectionChanged( TQIconViewItem *item ) - - This signal is emitted when the selection changes. \a item is the - newly selected item. This signal is emitted only in single - selection mode. -*/ - -/*! - \fn void TQIconView::currentChanged( TQIconViewItem *item ) - - This signal is emitted when a new item becomes current. \a item is - the new current item (or 0 if no item is now current). - - \sa currentItem() -*/ - -/*! - \fn void TQIconView::onItem( TQIconViewItem *item ) - - This signal is emitted when the user moves the mouse cursor onto - an \a item, similar to the TQWidget::enterEvent() function. -*/ - -// ### bug here - enter/leave event aren't considered. move the mouse -// out of the window and back in, to the same item. - -/*! - \fn void TQIconView::onViewport() - - This signal is emitted when the user moves the mouse cursor from - an item to an empty part of the icon view. - - \sa onItem() -*/ - -/*! - \overload void TQIconView::itemRenamed (TQIconViewItem * item) - - This signal is emitted when \a item has been renamed, usually by - in-place renaming. - - \sa TQIconViewItem::setRenameEnabled() TQIconViewItem::rename() -*/ - -/*! - \fn void TQIconView::itemRenamed (TQIconViewItem * item, const TQString &name) - - This signal is emitted when \a item has been renamed to \a name, - usually by in-place renaming. - - \sa TQIconViewItem::setRenameEnabled() TQIconViewItem::rename() -*/ - -/*! - \fn void TQIconView::rightButtonClicked (TQIconViewItem * item, const TQPoint & pos) - - This signal is emitted when the user clicks the right mouse - button. If \a item is non-null, the cursor is on \a item. If \a - item is null, the mouse cursor isn't on any item. - - \a pos is the position of the mouse cursor in the global - coordinate system (TQMouseEvent::globalPos()). (If the click's - press and release differ by a pixel or two, \a pos is the - position at release time.) - - \sa rightButtonPressed() mouseButtonClicked() clicked() -*/ - -/*! - \fn void TQIconView::contextMenuRequested( TQIconViewItem *item, const TQPoint & pos ) - - This signal is emitted when the user invokes a context menu with - the right mouse button or with special system keys, with \a item - being the item under the mouse cursor or the current item, - respectively. - - \a pos is the position for the context menu in the global - coordinate system. -*/ - -/*! - \fn void TQIconView::mouseButtonPressed (int button, TQIconViewItem * item, const TQPoint & pos) - - This signal is emitted when the user presses mouse button \a - button. If \a item is non-null, the cursor is on \a item. If \a - item is null, the mouse cursor isn't on any item. - - \a pos is the position of the mouse cursor in the global - coordinate system (TQMouseEvent::globalPos()). - - \sa rightButtonClicked() mouseButtonPressed() pressed() -*/ - -/*! - \fn void TQIconView::mouseButtonClicked (int button, TQIconViewItem * item, const TQPoint & pos ) - - This signal is emitted when the user clicks mouse button \a - button. If \a item is non-null, the cursor is on \a item. If \a - item is null, the mouse cursor isn't on any item. - - \a pos is the position of the mouse cursor in the global - coordinate system (TQMouseEvent::globalPos()). (If the click's - press and release differ by a pixel or two, \a pos is the - position at release time.) - - \sa mouseButtonPressed() rightButtonClicked() clicked() -*/ - -/*! - \overload void TQIconView::clicked ( TQIconViewItem * item, const TQPoint & pos ) - - This signal is emitted when the user clicks any mouse button on an - icon view item. \a item is a pointer to the item that has been - clicked. - - \a pos is the position of the mouse cursor in the global coordinate - system (TQMouseEvent::globalPos()). (If the click's press and release - differ by a pixel or two, \a pos is the position at release time.) - - \sa mouseButtonClicked() rightButtonClicked() pressed() -*/ - -/*! - \overload void TQIconView::pressed ( TQIconViewItem * item, const TQPoint & pos ) - - This signal is emitted when the user presses any mouse button. If - \a item is non-null, the cursor is on \a item. If \a item is null, - the mouse cursor isn't on any item. - - \a pos is the position of the mouse cursor in the global - coordinate system (TQMouseEvent::globalPos()). (If the click's - press and release differ by a pixel or two, \a pos is the - position at release time.) - - \sa mouseButtonPressed() rightButtonPressed() clicked() -*/ - -/*! - \fn void TQIconView::clicked ( TQIconViewItem * item ) - - This signal is emitted when the user clicks any mouse button. If - \a item is non-null, the cursor is on \a item. If \a item is null, - the mouse cursor isn't on any item. - - \sa mouseButtonClicked() rightButtonClicked() pressed() -*/ - -/*! - \fn void TQIconView::pressed ( TQIconViewItem * item ) - - This signal is emitted when the user presses any mouse button. If - \a item is non-null, the cursor is on \a item. If \a item is null, - the mouse cursor isn't on any item. - - \sa mouseButtonPressed() rightButtonPressed() clicked() -*/ - -/*! - \fn void TQIconView::rightButtonPressed( TQIconViewItem * item, const TQPoint & pos ) - - This signal is emitted when the user presses the right mouse - button. If \a item is non-null, the cursor is on \a item. If \a - item is null, the mouse cursor isn't on any item. - - \a pos is the position of the mouse cursor in the global - coordinate system (TQMouseEvent::globalPos()). -*/ - -/*! - Constructs an empty icon view called \a name, with parent \a - parent and using the widget flags \a f. -*/ - -TQIconView::TQIconView( TQWidget *parent, const char *name, WFlags f ) - : TQScrollView( parent, name, WStaticContents | WNoAutoErase | f ) -{ - if ( !unknown_icon ) { - unknown_icon = new TQPixmap( (const char **)unknown_xpm ); - qiv_cleanup_pixmap.add( &unknown_icon ); - } - - d = new TQIconViewPrivate; - d->dragging = FALSE; - d->firstItem = 0; - d->lastItem = 0; - d->count = 0; - d->mousePressed = FALSE; - d->selectionMode = Single; - d->currentItem = 0; - d->highlightedItem = 0; - d->rubber = 0; - d->canStartRubber = FALSE; - d->backBuffer = 0; - d->scrollTimer = 0; - d->startDragItem = 0; - d->tmpCurrentItem = 0; - d->rastX = d->rastY = -1; - d->spacing = 5; - d->cleared = FALSE; - d->arrangement = LeftToRight; - d->resizeMode = Fixed; - d->dropped = FALSE; - d->adjustTimer = new TQTimer( this, "iconview adjust timer" ); - d->isIconDrag = FALSE; - d->inMenuMode = FALSE; -#ifndef QT_NO_DRAGANDDROP - d->iconDragData.clear(); -#endif - d->numDragItems = 0; - d->updateTimer = new TQTimer( this, "iconview update timer" ); - d->cachedW = d->cachedH = 0; - d->maxItemWidth = 100; - d->maxItemTextLength = 255; - d->inputTimer = new TQTimer( this, "iconview input timer" ); - d->currInputString = TQString::null; - d->dirty = FALSE; - d->rearrangeEnabled = TRUE; - d->itemTextPos = Bottom; - d->reorderItemsWhenInsert = TRUE; -#ifndef QT_NO_CURSOR - d->oldCursor = arrowCursor; -#endif - d->resortItemsWhenInsert = FALSE; - d->sortDirection = TRUE; - d->wordWrapIconText = TRUE; - d->cachedContentsX = d->cachedContentsY = -1; - d->clearing = FALSE; - d->fullRedrawTimer = new TQTimer( this, "iconview full redraw timer" ); - d->itemTextBrush = NoBrush; - d->drawAllBack = TRUE; - d->fm = new TQFontMetrics( font() ); - d->minLeftBearing = d->fm->minLeftBearing(); - d->minRightBearing = d->fm->minRightBearing(); - d->firstContainer = d->lastContainer = 0; - d->containerUpdateLocked = FALSE; - d->firstSizeHint = FALSE; - d->selectAnchor = 0; - d->renamingItem = 0; - d->drawActiveSelection = TRUE; - d->drawDragShapes = FALSE; - d->backrubber = 0; - - connect( d->adjustTimer, SIGNAL( timeout() ), - this, SLOT( adjustItems() ) ); - connect( d->updateTimer, SIGNAL( timeout() ), - this, SLOT( slotUpdate() ) ); - connect( d->fullRedrawTimer, SIGNAL( timeout() ), - this, SLOT( updateContents() ) ); - connect( this, SIGNAL( contentsMoving(int,int) ), - this, SLOT( movedContents(int,int) ) ); - - setAcceptDrops( TRUE ); - viewport()->setAcceptDrops( TRUE ); - - setMouseTracking( TRUE ); - viewport()->setMouseTracking( TRUE ); - - viewport()->setBackgroundMode( PaletteBase); - setBackgroundMode( PaletteBackground, PaletteBase ); - viewport()->setFocusProxy( this ); - viewport()->setFocusPolicy( TQWidget::WheelFocus ); - -#ifndef QT_NO_TOOLTIP - d->toolTip = new TQIconViewToolTip( viewport(), this ); -#endif - d->showTips = TRUE; -} - -/*! - \reimp -*/ - -void TQIconView::styleChange( TQStyle& old ) -{ - TQScrollView::styleChange( old ); - *d->fm = TQFontMetrics( font() ); - d->minLeftBearing = d->fm->minLeftBearing(); - d->minRightBearing = d->fm->minRightBearing(); - - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - item->wordWrapDirty = TRUE; - item->calcRect(); - } - -#if !defined(Q_WS_X11) - delete qiv_selection; - qiv_selection = 0; -#endif -} - -/*! - \reimp -*/ - -void TQIconView::setFont( const TQFont & f ) -{ - TQScrollView::setFont( f ); - *d->fm = TQFontMetrics( font() ); - d->minLeftBearing = d->fm->minLeftBearing(); - d->minRightBearing = d->fm->minRightBearing(); - - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - item->wordWrapDirty = TRUE; - item->calcRect(); - } -} - -/*! - \reimp -*/ - -void TQIconView::setPalette( const TQPalette & p ) -{ - TQScrollView::setPalette( p ); - *d->fm = TQFontMetrics( font() ); - d->minLeftBearing = d->fm->minLeftBearing(); - d->minRightBearing = d->fm->minRightBearing(); - - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - item->wordWrapDirty = TRUE; - item->calcRect(); - } -} - -/*! - Destroys the icon view and deletes all items. -*/ - -TQIconView::~TQIconView() -{ - TQIconViewItem *tmp, *item = d->firstItem; - d->clearing = TRUE; - TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; - while ( c ) { - tmpc = c->n; - delete c; - c = tmpc; - } - while ( item ) { - tmp = item->next; - delete item; - item = tmp; - } - delete d->backBuffer; - d->backBuffer = 0; - delete d->fm; - d->fm = 0; -#ifndef QT_NO_TOOLTIP - delete d->toolTip; - d->toolTip = 0; -#endif - delete d; - d = NULL; -} - -/*! - Inserts the icon view item \a item after \a after. If \a after is - 0, \a item is appended after the last item. - - \e{You should never need to call this function.} Instead create - TQIconViewItem's and associate them with your icon view like this: - - \code - (void) new TQIconViewItem( myIconview, "The text of the item", aPixmap ); - \endcode -*/ - -void TQIconView::insertItem( TQIconViewItem *item, TQIconViewItem *after ) -{ - if ( !item ) - return; - - if ( d->firstItem == item || item->prev || item->next) - return; - - if ( !item->view ) - item->view = this; - - if ( !d->firstItem ) { - d->firstItem = d->lastItem = item; - item->prev = 0; - item->next = 0; - } else { - if ( !after || after == d->lastItem ) { - d->lastItem->next = item; - item->prev = d->lastItem; - item->next = 0; - d->lastItem = item; - } else { - TQIconViewItem *i = d->firstItem; - while ( i != after ) - i = i->next; - - if ( i ) { - TQIconViewItem *next = i->next; - item->next = next; - item->prev = i; - i->next = item; - next->prev = item; - } - } - } - - if ( isVisible() ) { - if ( d->reorderItemsWhenInsert ) { - if ( d->updateTimer->isActive() ) - d->updateTimer->stop(); - d->fullRedrawTimer->stop(); - // #### uncomment this ASA insertInGrid uses cached values and is efficient - //insertInGrid( item ); - - d->cachedW = TQMAX( d->cachedW, item->x() + item->width() ); - d->cachedH = TQMAX( d->cachedH, item->y() + item->height() ); - - d->updateTimer->start( 0, TRUE ); - } else { - insertInGrid( item ); - - viewport()->update(item->x() - contentsX(), - item->y() - contentsY(), - item->width(), item->height()); - } - } else if ( !autoArrange() ) { - item->dirty = FALSE; - } - - d->count++; - d->dirty = TRUE; -} - -/*! - This slot is used for a slightly-delayed update. - - The icon view is not redrawn immediately after inserting a new item - but after a very small delay using a TQTimer. This means that when - many items are inserted in a loop the icon view is probably redrawn - only once at the end of the loop. This makes the insertions both - flicker-free and faster. -*/ - -void TQIconView::slotUpdate() -{ - d->updateTimer->stop(); - d->fullRedrawTimer->stop(); - - if ( !d->firstItem || !d->lastItem ) - return; - - // #### remove that ASA insertInGrid uses cached values and is efficient - if ( d->resortItemsWhenInsert ) - sort( d->sortDirection ); - else { - int y = d->spacing; - TQIconViewItem *item = d->firstItem; - int w = 0, h = 0; - while ( item ) { - bool changed; - TQIconViewItem *next = makeRowLayout( item, y, changed ); - if ( !next || !next->next ) - break; - - if( !TQApplication::reverseLayout() ) - item = next; - w = TQMAX( w, item->x() + item->width() ); - h = TQMAX( h, item->y() + item->height() ); - item = next; - if ( d->arrangement == LeftToRight ) - h = TQMAX( h, y ); - - item = item->next; - } - - if ( d->lastItem && d->arrangement == TopToBottom ) { - item = d->lastItem; - int x = item->x(); - while ( item && item->x() >= x ) { - w = TQMAX( w, item->x() + item->width() ); - h = TQMAX( h, item->y() + item->height() ); - item = item->prev; - } - } - - w = TQMAX( TQMAX( d->cachedW, w ), d->lastItem->x() + d->lastItem->width() ); - h = TQMAX( TQMAX( d->cachedH, h ), d->lastItem->y() + d->lastItem->height() ); - - if ( d->arrangement == TopToBottom ) - w += d->spacing; - else - h += d->spacing; - viewport()->setUpdatesEnabled( FALSE ); - resizeContents( w, h ); - viewport()->setUpdatesEnabled( TRUE ); - viewport()->repaint( FALSE ); - } - - int cx = d->cachedContentsX == -1 ? contentsX() : d->cachedContentsX; - int cy = d->cachedContentsY == -1 ? contentsY() : d->cachedContentsY; - - if ( cx != contentsX() || cy != contentsY() ) - setContentsPos( cx, cy ); - - d->cachedContentsX = d->cachedContentsY = -1; - d->cachedW = d->cachedH = 0; -} - -/*! - Takes the icon view item \a item out of the icon view and causes - an update of the screen display. The item is not deleted. You - should normally not need to call this function because - TQIconViewItem::~TQIconViewItem() calls it. The normal way to delete - an item is to delete it. -*/ - -void TQIconView::takeItem( TQIconViewItem *item ) -{ - if ( !item ) - return; - - if ( item->d->container1 ) - item->d->container1->items.removeRef( item ); - if ( item->d->container2 ) - item->d->container2->items.removeRef( item ); - item->d->container2 = 0; - item->d->container1 = 0; - - bool block = signalsBlocked(); - blockSignals( d->clearing ); - - TQRect r = item->rect(); - - if ( d->currentItem == item ) { - if ( item->prev ) { - d->currentItem = item->prev; - emit currentChanged( d->currentItem ); - repaintItem( d->currentItem ); - } else if ( item->next ) { - d->currentItem = item->next; - emit currentChanged( d->currentItem ); - repaintItem( d->currentItem ); - } else { - d->currentItem = 0; - emit currentChanged( d->currentItem ); - } - } - if ( item->isSelected() ) { - item->selected = FALSE; - emit selectionChanged(); - } - - if ( item == d->firstItem ) { - d->firstItem = d->firstItem->next; - if ( d->firstItem ) - d->firstItem->prev = 0; - } else if ( item == d->lastItem ) { - d->lastItem = d->lastItem->prev; - if ( d->lastItem ) - d->lastItem->next = 0; - } else { - TQIconViewItem *i = item; - if ( i ) { - if ( i->prev ) - i->prev->next = i->next; - if ( i->next ) - i->next->prev = i->prev; - } - } - - if ( d->selectAnchor == item ) - d->selectAnchor = d->currentItem; - - if ( !d->clearing ) - repaintContents( r.x(), r.y(), r.width(), r.height(), TRUE ); - - item->view = 0; - item->prev = 0; - item->next = 0; - d->count--; - - blockSignals( block ); -} - -/*! - Returns the index of \a item, or -1 if \a item doesn't exist in - this icon view. -*/ - -int TQIconView::index( const TQIconViewItem *item ) const -{ - if ( !item ) - return -1; - - if ( item == d->firstItem ) - return 0; - else if ( item == d->lastItem ) - return d->count - 1; - else { - TQIconViewItem *i = d->firstItem; - int j = 0; - while ( i && i != item ) { - i = i->next; - ++j; - } - - return i ? j : -1; - } -} - -/*! - Returns a pointer to the first item of the icon view, or 0 if - there are no items in the icon view. - - \sa lastItem() currentItem() -*/ - -TQIconViewItem *TQIconView::firstItem() const -{ - if (d) { - return d->firstItem; - } - else { - return NULL; - } -} - -/*! - Returns a pointer to the last item of the icon view, or 0 if there - are no items in the icon view. - - \sa firstItem() currentItem() -*/ - -TQIconViewItem *TQIconView::lastItem() const -{ - if (d) { - return d->lastItem; - } - else { - return NULL; - } -} - -/*! - Returns a pointer to the current item of the icon view, or 0 if no - item is current. - - \sa setCurrentItem() firstItem() lastItem() -*/ - -TQIconViewItem *TQIconView::currentItem() const -{ - if (d) { - return d->currentItem; - } - else { - return NULL; - } -} - -/*! - Makes \a item the new current item of the icon view. -*/ - -void TQIconView::setCurrentItem( TQIconViewItem *item ) -{ - if ( !item || item == d->currentItem ) - return; - - setMicroFocusHint( item->x(), item->y(), item->width(), item->height(), FALSE ); - - TQIconViewItem *old = d->currentItem; - d->currentItem = item; - emit currentChanged( d->currentItem ); - if ( d->selectionMode == Single ) { - bool changed = FALSE; - if ( old && old->selected ) { - old->selected = FALSE; - changed = TRUE; - } - if ( item && !item->selected && item->isSelectable() && d->selectionMode != NoSelection ) { - item->selected = TRUE; - changed = TRUE; - emit selectionChanged( item ); - } - if ( changed ) - emit selectionChanged(); - } - - if ( old ) - repaintItem( old ); - repaintItem( d->currentItem ); -} - -/*! - Selects or unselects \a item depending on \a s, and may also - unselect other items, depending on TQIconView::selectionMode() and - \a cb. - - If \a s is FALSE, \a item is unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Single, \a - item is selected, and the item which was selected is unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Extended, \a - item is selected. If \a cb is TRUE, the selection state of the - icon view's other items is left unchanged. If \a cb is FALSE (the - default) all other items are unselected. - - If \a s is TRUE and TQIconView::selectionMode() is \c Multi \a item - is selected. - - Note that \a cb is used only if TQIconView::selectionMode() is \c - Extended. \a cb defaults to FALSE. - - All items whose selection status is changed repaint themselves. -*/ - -void TQIconView::setSelected( TQIconViewItem *item, bool s, bool cb ) -{ - if ( !item ) - return; - item->setSelected( s, cb ); -} - -/*! - \property TQIconView::count - \brief the number of items in the icon view -*/ - -uint TQIconView::count() const -{ - return d->count; -} - -/*! - Performs autoscrolling when selecting multiple icons with the - rubber band. -*/ - -void TQIconView::doAutoScroll() -{ - TQRect oldRubber = *d->rubber; - - TQPoint vp = viewport()->mapFromGlobal( TQCursor::pos() ); - TQPoint pos = viewportToContents( vp ); - - if ( pos == d->rubber->bottomRight() ) - return; - - d->rubber->setRight( pos.x() ); - d->rubber->setBottom( pos.y() ); - - int minx = contentsWidth(), miny = contentsHeight(); - int maxx = 0, maxy = 0; - bool changed = FALSE; - bool block = signalsBlocked(); - - TQRect rr; - - blockSignals( TRUE ); - viewport()->setUpdatesEnabled( FALSE ); - bool alreadyIntersected = FALSE; - TQRect nr = d->rubber->normalize(); - TQRect rubberUnion = nr.unite( oldRubber.normalize() ); - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - for ( ; c; c = c->n ) { - if ( c->rect.intersects( rubberUnion ) ) { - alreadyIntersected = TRUE; - TQIconViewItem *item = c->items.first(); - for ( ; item; item = c->items.next() ) { - if ( d->selectedItems.find( item ) ) - continue; - if ( !item->intersects( nr ) ) { - if ( item->isSelected() ) { - item->setSelected( FALSE ); - changed = TRUE; - rr = rr.unite( item->rect() ); - } - } else if ( item->intersects( nr ) ) { - if ( !item->isSelected() && item->isSelectable() ) { - item->setSelected( TRUE, TRUE ); - changed = TRUE; - rr = rr.unite( item->rect() ); - } - - minx = TQMIN( minx, item->x() - 1 ); - miny = TQMIN( miny, item->y() - 1 ); - maxx = TQMAX( maxx, item->x() + item->width() + 1 ); - maxy = TQMAX( maxy, item->y() + item->height() + 1 ); - } - } - } else { - if ( alreadyIntersected ) - break; - } - } - viewport()->setUpdatesEnabled( TRUE ); - blockSignals( block ); - - // static bool drawAll; - if ( d->backrubber == 0 ) { - d->backrubber = new TQPixmap( viewport()->rect().size() ); - d->backrubber->fill( viewport(), viewport()->rect().topLeft() ); - // drawAll = true; - } - - // int oldX = 0, oldY = 0; - // if ( !drawAll && d->scrollTimer ) { - // oldX = contentsX(); - // oldY = contentsY(); - // } - ensureVisible( pos.x(), pos.y() ); - // if ( !drawAll && d->scrollTimer && ( oldX != contentsX() || oldY != contentsY() ) ) - // drawAll = true; - - TQRect allRect = oldRubber.normalize(); - if ( changed ) - allRect |= rr.normalize(); - allRect |= d->rubber->normalize(); - TQPoint point = contentsToViewport( allRect.topLeft() ); - allRect = TQRect( point.x(), point.y(), allRect.width(), allRect.height() ); - allRect &= viewport()->rect(); - - d->dragging = FALSE; - - TQPainter p( d->backrubber ); - p.translate( -contentsX(), -contentsY() ); -#if 0 - if ( !drawAll ) { - oldRubber = oldRubber.normalize(); - point = contentsToViewport( oldRubber.topLeft() ); - oldRubber = TQRect( point.x(), point.y(), oldRubber.width(), oldRubber.height() ); - oldRubber &= viewport()->rect(); - - point = contentsToViewport( nr.topLeft() ); - nr = TQRect( point.x(), point.y(), nr.width(), nr.height() ); - nr &= viewport()->rect(); - - TQRegion region; - if ( allRect != nr ) - region = TQRegion(allRect).subtract( TQRegion( nr ) ); - if ( allRect != oldRubber ) - region += TQRegion(allRect).subtract( TQRegion( oldRubber ) ); - - TQMemArray< TQRect > ar = region.rects(); - for ( uint i = 0; i < ar.size(); ++i ) { - ar[i].addCoords( -2, -2, 4, 4 ); - ar[i] = ar[i].normalize(); - - p.setClipRect( ar[i] ); - drawContents( &p, contentsX() + ar[i].left(), contentsY() + ar[i].top(), ar[i].width(), ar[i].height() ); - } - } - else -#endif - { - drawContents( &p, - contentsX() + allRect.left(), contentsY() + allRect.top(), - allRect.width(), allRect.height() ); - } - - p.end(); - // drawAll = false; - d->dragging = TRUE; - bitBlt( viewport(), allRect.topLeft(), d->backrubber, allRect ); - - if ( changed ) { - emit selectionChanged(); - if ( d->selectionMode == Single ) - emit selectionChanged( d->currentItem ); - } - - if ( !TQRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) && - !d->scrollTimer ) { - d->scrollTimer = new TQTimer( this ); - - connect( d->scrollTimer, SIGNAL( timeout() ), - this, SLOT( doAutoScroll() ) ); - d->scrollTimer->start( 100, FALSE ); - } else if ( TQRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) && - d->scrollTimer ) { - disconnect( d->scrollTimer, SIGNAL( timeout() ), - this, SLOT( doAutoScroll() ) ); - d->scrollTimer->stop(); - delete d->scrollTimer; - d->scrollTimer = 0; - } - -} - -/*! - \reimp -*/ - -void TQIconView::drawContents( TQPainter *p, int cx, int cy, int cw, int ch ) -{ - p->save(); - TQRect r = TQRect( cx, cy, cw, ch ); - - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - TQRegion remaining( TQRect( cx, cy, cw, ch ) ); - bool alreadyIntersected = FALSE; - while ( c ) { - if ( c->rect.intersects( r ) ) { - p->save(); - p->resetXForm(); - TQRect r2 = c->rect; - r2 = r2.intersect( r ); - TQRect r3( contentsToViewport( TQPoint( r2.x(), r2.y() ) ), TQSize( r2.width(), r2.height() ) ); - if ( d->drawAllBack ) { - p->setClipRect( r3 ); - } else { - TQRegion reg = d->clipRegion.intersect( r3 ); - p->setClipRegion( reg ); - } - drawBackground( p, r3 ); - remaining = remaining.subtract( r3 ); - p->restore(); - - TQColorGroup cg; - d->drawActiveSelection = hasFocus() || d->inMenuMode - || !style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this ); - - if ( !d->drawActiveSelection ) - cg = palette().inactive(); - else - cg = colorGroup(); - - TQIconViewItem *item = c->items.first(); - // clip items to the container rect by default... this - // prevents icons with alpha channels from being painted - // twice when they are in 2 containers - // - // NOTE: the item could override this cliprect in it's - // paintItem() implementation, which makes this useless - p->setClipRect( TQRect( contentsToViewport( r2.topLeft() ), r2.size() ) ); - for ( ; item; item = c->items.next() ) { - if ( item->rect().intersects( r ) && !item->dirty ) { - p->save(); - p->setFont( font() ); - item->paintItem( p, cg ); - p->restore(); - } - } - alreadyIntersected = TRUE; - } else { - if ( alreadyIntersected ) - break; - } - c = c->n; - } - - if ( !remaining.isNull() && !remaining.isEmpty() ) { - p->save(); - p->resetXForm(); - if ( d->drawAllBack ) { - p->setClipRegion( remaining ); - } else { - remaining = d->clipRegion.intersect( remaining ); - p->setClipRegion( remaining ); - } - drawBackground( p, remaining.boundingRect() ); - p->restore(); - } - - if ( ( hasFocus() || viewport()->hasFocus() ) && d->currentItem && - d->currentItem->rect().intersects( r ) ) { - d->currentItem->paintFocus( p, colorGroup() ); - } - - p->restore(); - if ( d->rubber ) { - p->save(); - p->translate( contentsX(), contentsY() ); - p->setRasterOp( NotROP ); - p->setPen( TQPen( color0, 1 ) ); - p->setBrush( NoBrush ); - drawRubber( p ); - p->restore(); - } -} - -/*! - \overload - - Arranges all the items in the grid given by gridX() and gridY(). - - Even if sorting() is enabled, the items are not sorted by this - function. If you want to sort or rearrange the items, use - iconview->sort(iconview->sortDirection()). - - If \a update is TRUE (the default), the viewport is repainted as - well. - - \sa TQIconView::setGridX(), TQIconView::setGridY(), TQIconView::sort() -*/ - -void TQIconView::arrangeItemsInGrid( bool update ) -{ - if ( !d->firstItem || !d->lastItem ) - return; - - d->containerUpdateLocked = TRUE; - - int w = 0, h = 0, y = d->spacing; - - TQIconViewItem *item = d->firstItem; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - bool changedLayout = FALSE; - while ( item ) { - bool changed; - TQIconViewItem *next = makeRowLayout( item, y, changed ); - changedLayout = changed || changedLayout; - if( !TQApplication::reverseLayout() ) - item = next; - w = TQMAX( w, item->x() + item->width() ); - h = TQMAX( h, item->y() + item->height() ); - item = next; - if ( d->arrangement == LeftToRight ) - h = TQMAX( h, y ); - - if ( !item || !item->next ) - break; - - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - } - - if ( d->lastItem && d->arrangement == TopToBottom ) { - item = d->lastItem; - while (item && (item->isVisible() == FALSE)) { - item = item->prev; - } - int x = 0; - if (item) - x = item->x(); - while ( item && item->x() >= x ) { - w = TQMAX( w, item->x() + item->width() ); - h = TQMAX( h, item->y() + item->height() ); - item = item->prev; - while (item && (item->isVisible() == FALSE)) { - item = item->prev; - } - } - } - d->containerUpdateLocked = FALSE; - - TQIconViewItem *lastVisibleItem = d->lastItem; - while (lastVisibleItem->prev && (lastVisibleItem->isVisible() == FALSE)) { - lastVisibleItem = lastVisibleItem->prev; - } - - w = TQMAX( TQMAX( d->cachedW, w ), lastVisibleItem->x() + lastVisibleItem->width() ); - h = TQMAX( TQMAX( d->cachedH, h ), lastVisibleItem->y() + lastVisibleItem->height() ); - - if ( d->arrangement == TopToBottom ) - w += d->spacing; - else - h += d->spacing; - - bool ue = isUpdatesEnabled(); - viewport()->setUpdatesEnabled( FALSE ); - int vw = visibleWidth(); - int vh = visibleHeight(); - resizeContents( w, h ); - bool doAgain = FALSE; - if ( d->arrangement == LeftToRight ) - doAgain = visibleWidth() != vw; - if ( d->arrangement == TopToBottom ) - doAgain = visibleHeight() != vh; - if ( doAgain ) // in the case that the visibleExtend changed because of the resizeContents (scrollbar show/hide), redo layout again - arrangeItemsInGrid( FALSE ); - viewport()->setUpdatesEnabled( ue ); - d->dirty = !isVisible(); - rebuildContainers(); - if ( update && ( !optimize_layout || changedLayout ) ) - repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE ); -} - -/*! - This variant uses \a grid instead of (gridX(), gridY()). If \a - grid is invalid (see TQSize::isValid()), arrangeItemsInGrid() - calculates a valid grid itself and uses that. - - If \a update is TRUE (the default) the viewport is repainted. -*/ - -void TQIconView::arrangeItemsInGrid( const TQSize &grid, bool update ) -{ - d->containerUpdateLocked = TRUE; - TQSize grid_( grid ); - if ( !grid_.isValid() ) { - int w = 0, h = 0; - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - w = TQMAX( w, item->width() ); - h = TQMAX( h, item->height() ); - } - - grid_ = TQSize( TQMAX( d->rastX + d->spacing, w ), - TQMAX( d->rastY + d->spacing, h ) ); - } - - int w = 0, h = 0; - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - int nx = item->x() / grid_.width(); - int ny = item->y() / grid_.height(); - item->move( nx * grid_.width(), - ny * grid_.height() ); - w = TQMAX( w, item->x() + item->width() ); - h = TQMAX( h, item->y() + item->height() ); - item->dirty = FALSE; - } - d->containerUpdateLocked = FALSE; - - resizeContents( w, h ); - rebuildContainers(); - if ( update ) - repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE ); -} - -/*! - \reimp -*/ - -void TQIconView::setContentsPos( int x, int y ) -{ - if ( d->updateTimer->isActive() ) { - d->cachedContentsX = x; - d->cachedContentsY = y; - } else { - d->cachedContentsY = d->cachedContentsX = -1; - TQScrollView::setContentsPos( x, y ); - } -} - -/*! - \reimp -*/ - -void TQIconView::showEvent( TQShowEvent * ) -{ - if ( d->dirty ) { - resizeContents( TQMAX( contentsWidth(), viewport()->width() ), - TQMAX( contentsHeight(), viewport()->height() ) ); - if ( d->resortItemsWhenInsert ) - sort( d->sortDirection ); - if ( autoArrange() ) - arrangeItemsInGrid( FALSE ); - } - TQScrollView::show(); -} - -/*! - \property TQIconView::selectionMode - \brief the selection mode of the icon view - - This can be \c Single (the default), \c Extended, \c Multi or \c - NoSelection. -*/ - -void TQIconView::setSelectionMode( SelectionMode m ) -{ - d->selectionMode = m; -} - -TQIconView::SelectionMode TQIconView::selectionMode() const -{ - return d->selectionMode; -} - -/*! - Returns a pointer to the item that contains point \a pos, which is - given in contents coordinates, or 0 if no item contains point \a - pos. -*/ - -TQIconViewItem *TQIconView::findItem( const TQPoint &pos ) const -{ - if ( !d->firstItem ) - return 0; - - TQIconViewPrivate::ItemContainer *c = d->lastContainer; - for ( ; c; c = c->p ) { - if ( c->rect.contains( pos ) ) { - TQIconViewItem *item = c->items.last(); - for ( ; item; item = c->items.prev() ) - if ( item->contains( pos ) ) - return item; - } - } - - return 0; -} - -/*! - \overload - - Returns a pointer to the first item whose text begins with \a - text, or 0 if no such item could be found. Use the \a compare flag - to control the comparison behaviour. (See \l - {TQt::StringComparisonMode}.) -*/ - -TQIconViewItem *TQIconView::findItem( const TQString &text, ComparisonFlags compare ) const -{ - if ( !d->firstItem ) - return 0; - - if ( compare == CaseSensitive || compare == 0 ) - compare |= ExactMatch; - - TQString itmtxt; - TQString comtxt = text; - if ( ! (compare & CaseSensitive) ) - comtxt = text.lower(); - - TQIconViewItem *item; - if ( d->currentItem ) - item = d->currentItem; - else - item = d->firstItem; - - TQIconViewItem *beginsWithItem = 0; - TQIconViewItem *endsWithItem = 0; - TQIconViewItem *containsItem = 0; - - if ( item ) { - for ( ; item; item = item->next ) { - if ( ! (compare & CaseSensitive) ) - itmtxt = item->text().lower(); - else - itmtxt = item->text(); - - if ( compare & ExactMatch && itmtxt == comtxt ) - return item; - if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) ) - beginsWithItem = containsItem = item; - if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) ) - endsWithItem = containsItem = item; - if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) ) - containsItem = item; - } - - if ( d->currentItem && d->firstItem ) { - item = d->firstItem; - for ( ; item && item != d->currentItem; item = item->next ) { - if ( ! (compare & CaseSensitive) ) - itmtxt = item->text().lower(); - else - itmtxt = item->text(); - - if ( compare & ExactMatch && itmtxt == comtxt ) - return item; - if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) ) - beginsWithItem = containsItem = item; - if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) ) - endsWithItem = containsItem = item; - if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) ) - containsItem = item; - } - } - } - - // Obey the priorities - if ( beginsWithItem ) - return beginsWithItem; - else if ( endsWithItem ) - return endsWithItem; - else if ( containsItem ) - return containsItem; - return 0; -} - -/*! - Unselects all the items. -*/ - -void TQIconView::clearSelection() -{ - selectAll( FALSE ); -} - -/*! - In Multi and Extended modes, this function sets all items to be - selected if \a select is TRUE, and to be unselected if \a select - is FALSE. - - In Single and NoSelection modes, this function only changes the - selection status of currentItem(). -*/ - -void TQIconView::selectAll( bool select ) -{ - if ( d->selectionMode == NoSelection ) - return; - - if ( d->selectionMode == Single ) { - if ( d->currentItem ) - d->currentItem->setSelected( select ); - return; - } - - bool b = signalsBlocked(); - blockSignals( TRUE ); - TQIconViewItem *item = d->firstItem; - TQIconViewItem *i = d->currentItem; - bool changed = FALSE; - bool ue = viewport()->isUpdatesEnabled(); - viewport()->setUpdatesEnabled( FALSE ); - TQRect rr; - for ( ; item; item = item->next ) { - if (item->isVisible()) { - if ( select != item->isSelected() ) { - item->setSelected( select, TRUE ); - rr = rr.unite( item->rect() ); - changed = TRUE; - } - else { - if ( FALSE != item->isSelected() ) { - item->setSelected( FALSE, TRUE ); - changed = TRUE; - } - } - } - } - viewport()->setUpdatesEnabled( ue ); - // we call updateContents not repaintContents because of possible previous updateContents - TQScrollView::updateContents( rr ); - TQApplication::sendPostedEvents( viewport(), TQEvent::Paint ); - if ( i ) - setCurrentItem( i ); - blockSignals( b ); - if ( changed ) { - emit selectionChanged(); - } -} - -/*! - Inverts the selection. Works only in Multi and Extended selection - mode. -*/ - -void TQIconView::invertSelection() -{ - if ( d->selectionMode == Single || - d->selectionMode == NoSelection ) - return; - - bool b = signalsBlocked(); - blockSignals( TRUE ); - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) - item->setSelected( !item->isSelected(), TRUE ); - blockSignals( b ); - emit selectionChanged(); -} - -/*! - Repaints the \a item. -*/ - -void TQIconView::repaintItem( TQIconViewItem *item ) -{ - if ( !item || item->dirty ) - return; - - if ( TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ). - intersects( TQRect( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2 ) ) ) - repaintContents( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2, FALSE ); -} - -/*! - Repaints the selected items. -*/ -void TQIconView::repaintSelectedItems() -{ - if ( selectionMode() == NoSelection ) - return; - - if ( selectionMode() == Single ) { - if ( !currentItem() || !currentItem()->isSelected() ) - return; - TQRect itemRect = currentItem()->rect(); //rect in contents coordinates - itemRect.moveBy( -contentsX(), -contentsY() ); - viewport()->update( itemRect ); - } else { - // check if any selected items are visible - TQIconViewItem *item = firstItem(); - const TQRect vr = TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ); - - while ( item ) { - if ( item->isSelected() && item->rect().intersects( vr ) ) - repaintItem( item ); - item = item->nextItem(); - } - } -} - -/*! - Makes sure that \a item is entirely visible. If necessary, - ensureItemVisible() scrolls the icon view. - - \sa ensureVisible() -*/ - -void TQIconView::ensureItemVisible( TQIconViewItem *item ) -{ - if ( !item ) - return; - - if ( (d->updateTimer && d->updateTimer->isActive()) || - (d->fullRedrawTimer && d->fullRedrawTimer->isActive()) ) - slotUpdate(); - - int w = item->width(); - int h = item->height(); - ensureVisible( item->x() + w / 2, item->y() + h / 2, - w / 2 + 1, h / 2 + 1 ); -} - -/*! - Finds the first item whose bounding rectangle overlaps \a r and - returns a pointer to that item. \a r is given in content - coordinates. Returns 0 if no item overlaps \a r. - - If you want to find all items that touch \a r, you will need to - use this function and nextItem() in a loop ending at - findLastVisibleItem() and test TQIconViewItem::rect() for each of - these items. - - \sa findLastVisibleItem() TQIconViewItem::rect() -*/ - -TQIconViewItem* TQIconView::findFirstVisibleItem( const TQRect &r ) const -{ - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - TQIconViewItem *i = 0; - bool alreadyIntersected = FALSE; - for ( ; c; c = c->n ) { - if ( c->rect.intersects( r ) ) { - alreadyIntersected = TRUE; - TQIconViewItem *item = c->items.first(); - for ( ; item; item = c->items.next() ) { - if ( r.intersects( item->rect() ) ) { - if ( !i ) { - i = item; - } else { - TQRect r2 = item->rect(); - TQRect r3 = i->rect(); - if ( r2.y() < r3.y() ) - i = item; - else if ( r2.y() == r3.y() && - r2.x() < r3.x() ) - i = item; - } - } - } - } else { - if ( alreadyIntersected ) - break; - } - } - - return i; -} - -/*! - Finds the last item whose bounding rectangle overlaps \a r and - returns a pointer to that item. \a r is given in content - coordinates. Returns 0 if no item overlaps \a r. - - \sa findFirstVisibleItem() -*/ - -TQIconViewItem* TQIconView::findLastVisibleItem( const TQRect &r ) const -{ - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - TQIconViewItem *i = 0; - bool alreadyIntersected = FALSE; - for ( ; c; c = c->n ) { - if ( c->rect.intersects( r ) ) { - alreadyIntersected = TRUE; - TQIconViewItem *item = c->items.first(); - for ( ; item; item = c->items.next() ) { - if ( r.intersects( item->rect() ) ) { - if ( !i ) { - i = item; - } else { - TQRect r2 = item->rect(); - TQRect r3 = i->rect(); - if ( r2.y() > r3.y() ) - i = item; - else if ( r2.y() == r3.y() && - r2.x() > r3.x() ) - i = item; - } - } - } - } else { - if ( alreadyIntersected ) - break; - } - } - - return i; -} - -/*! - Clears the icon view. All items are deleted. -*/ - -void TQIconView::clear() -{ - setContentsPos( 0, 0 ); - d->clearing = TRUE; - bool block = signalsBlocked(); - blockSignals( TRUE ); - clearSelection(); - blockSignals( block ); - setContentsPos( 0, 0 ); - d->currentItem = 0; - - if ( !d->firstItem ) { - d->clearing = FALSE; - return; - } - - TQIconViewItem *item = d->firstItem, *tmp; - d->firstItem = 0; - while ( item ) { - tmp = item->next; - delete item; - item = tmp; - } - TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; - while ( c ) { - tmpc = c->n; - delete c; - c = tmpc; - } - d->firstContainer = d->lastContainer = 0; - - d->count = 0; - d->lastItem = 0; - setCurrentItem( 0 ); - d->highlightedItem = 0; - d->tmpCurrentItem = 0; - d->drawDragShapes = FALSE; - - resizeContents( 0, 0 ); - // maybe we don�t need this update, so delay it - d->fullRedrawTimer->start( 0, TRUE ); - - d->cleared = TRUE; - d->clearing = FALSE; -} - -/*! - \property TQIconView::gridX - \brief the horizontal grid of the icon view - - If the value is -1, (the default), TQIconView computes suitable - column widths based on the icon view's contents. - - Note that setting a grid width overrides setMaxItemWidth(). -*/ - -void TQIconView::setGridX( int rx ) -{ - d->rastX = rx >= 0 ? rx : -1; -} - -/*! - \property TQIconView::gridY - \brief the vertical grid of the icon view - - If the value is -1, (the default), TQIconView computes suitable - column heights based on the icon view's contents. -*/ - -void TQIconView::setGridY( int ry ) -{ - d->rastY = ry >= 0 ? ry : -1; -} - -int TQIconView::gridX() const -{ - return d->rastX; -} - -int TQIconView::gridY() const -{ - return d->rastY; -} - -/*! - \property TQIconView::spacing - \brief the space in pixels between icon view items - - The default is 5 pixels. - - Negative values for spacing are illegal. -*/ - -void TQIconView::setSpacing( int sp ) -{ - d->spacing = sp; -} - -int TQIconView::spacing() const -{ - return d->spacing; -} - -/*! - \property TQIconView::itemTextPos - \brief the position where the text of each item is drawn. - - Valid values are \c Bottom or \c Right. The default is \c Bottom. -*/ - -void TQIconView::setItemTextPos( ItemTextPos pos ) -{ - if ( pos == d->itemTextPos || ( pos != Bottom && pos != Right ) ) - return; - - d->itemTextPos = pos; - - TQIconViewItem *item = d->firstItem; - for ( ; item; item = item->next ) { - item->wordWrapDirty = TRUE; - item->calcRect(); - } - - arrangeItemsInGrid( TRUE ); -} - -TQIconView::ItemTextPos TQIconView::itemTextPos() const -{ - return d->itemTextPos; -} - -/*! - \property TQIconView::itemTextBackground - \brief the brush to use when drawing the background of an item's text. - - By default this brush is set to NoBrush, meaning that only the - normal icon view background is used. -*/ - -void TQIconView::setItemTextBackground( const TQBrush &brush ) -{ - d->itemTextBrush = brush; -} - -TQBrush TQIconView::itemTextBackground() const -{ - return d->itemTextBrush; -} - -/*! - \property TQIconView::arrangement - \brief the arrangement mode of the icon view - - This can be \c LeftToRight or \c TopToBottom. The default is \c - LeftToRight. -*/ - -void TQIconView::setArrangement( Arrangement am ) -{ - if ( d->arrangement == am ) - return; - - d->arrangement = am; - - viewport()->setUpdatesEnabled( FALSE ); - resizeContents( viewport()->width(), viewport()->height() ); - viewport()->setUpdatesEnabled( TRUE ); - arrangeItemsInGrid( TRUE ); -} - -TQIconView::Arrangement TQIconView::arrangement() const -{ - return d->arrangement; -} - -/*! - \property TQIconView::resizeMode - \brief the resize mode of the icon view - - This can be \c Fixed or \c Adjust. The default is \c Fixed. - See \l ResizeMode. -*/ - -void TQIconView::setResizeMode( ResizeMode rm ) -{ - if ( d->resizeMode == rm ) - return; - - d->resizeMode = rm; -} - -TQIconView::ResizeMode TQIconView::resizeMode() const -{ - return d->resizeMode; -} - -/*! - \property TQIconView::maxItemWidth - \brief the maximum width that an item may have. - - The default is 100 pixels. - - Note that if the gridX() value is set TQIconView will ignore - this property. -*/ - -void TQIconView::setMaxItemWidth( int w ) -{ - d->maxItemWidth = w; -} - -/*! - \property TQIconView::maxItemTextLength - \brief the maximum length (in characters) that an item's text may have. - - The default is 255 characters. -*/ - -void TQIconView::setMaxItemTextLength( int w ) -{ - d->maxItemTextLength = w; -} - -int TQIconView::maxItemWidth() const -{ - if ( d->rastX != -1 ) - return d->rastX - 2; - else - return d->maxItemWidth; -} - -int TQIconView::maxItemTextLength() const -{ - return d->maxItemTextLength; -} - -/*! - \property TQIconView::itemsMovable - \brief whether the user is allowed to move items around in the icon view - - The default is TRUE. -*/ - -void TQIconView::setItemsMovable( bool b ) -{ - d->rearrangeEnabled = b; -} - -bool TQIconView::itemsMovable() const -{ - return d->rearrangeEnabled; -} - -/*! - \property TQIconView::autoArrange - \brief whether the icon view rearranges its items when a new item is inserted. - - The default is TRUE. - - Note that if the icon view is not visible at the time of - insertion, TQIconView defers all position-related work until it is - shown and then calls arrangeItemsInGrid(). -*/ - -void TQIconView::setAutoArrange( bool b ) -{ - d->reorderItemsWhenInsert = b; -} - -bool TQIconView::autoArrange() const -{ - return d->reorderItemsWhenInsert; -} - -/*! - If \a sort is TRUE, this function sets the icon view to sort items - when a new item is inserted. If \a sort is FALSE, the icon view - will not be sorted. - - Note that autoArrange() must be TRUE for sorting to take place. - - If \a ascending is TRUE (the default), items are sorted in - ascending order. If \a ascending is FALSE, items are sorted in - descending order. - - TQIconViewItem::compare() is used to compare pairs of items. The - sorting is based on the items' keys; these default to the items' - text unless specifically set to something else. - - \sa TQIconView::setAutoArrange(), TQIconView::autoArrange(), - sortDirection(), sort(), TQIconViewItem::setKey() -*/ - -void TQIconView::setSorting( bool sort, bool ascending ) -{ - d->resortItemsWhenInsert = sort; - d->sortDirection = ascending; -} - -/*! - \property TQIconView::sorting - \brief whether the icon view sorts on insertion - - The default is FALSE, i.e. no sorting on insertion. - - To set the sorting, use setSorting(). -*/ - -bool TQIconView::sorting() const -{ - return d->resortItemsWhenInsert; -} - -/*! - \property TQIconView::sortDirection - \brief whether the sort direction for inserting new items is ascending; - - The default is TRUE (i.e. ascending). This sort direction is only - meaningful if both sorting() and autoArrange() are TRUE. - - To set the sort direction, use setSorting() -*/ - -bool TQIconView::sortDirection() const -{ - return d->sortDirection; -} - -/*! - \property TQIconView::wordWrapIconText - \brief whether the item text will be word-wrapped if it is too long - - The default is TRUE. - - If this property is FALSE, icon text that is too long is - truncated, and an ellipsis (...) appended to indicate that - truncation has occurred. The full text can still be seen by the - user if they hover the mouse because the full text is shown in a - tooltip; see setShowToolTips(). -*/ - -void TQIconView::setWordWrapIconText( bool b ) -{ - if ( d->wordWrapIconText == (uint)b ) - return; - - d->wordWrapIconText = b; - for ( TQIconViewItem *item = d->firstItem; item; item = item->next ) { - item->wordWrapDirty = TRUE; - item->calcRect(); - } - arrangeItemsInGrid( TRUE ); -} - -bool TQIconView::wordWrapIconText() const -{ - return d->wordWrapIconText; -} - -/*! - \property TQIconView::showToolTips - \brief whether the icon view will display a tool tip with the complete text for any truncated item text - - The default is TRUE. Note that this has no effect if - setWordWrapIconText() is TRUE, as it is by default. -*/ - -void TQIconView::setShowToolTips( bool b ) -{ - d->showTips = b; -} - -bool TQIconView::showToolTips() const -{ - return d->showTips; -} - -/*! - \reimp -*/ -void TQIconView::contentsMousePressEvent( TQMouseEvent *e ) -{ - contentsMousePressEventEx( e ); -} - -void TQIconView::contentsMousePressEventEx( TQMouseEvent *e ) -{ - if ( d->rubber ) { - TQRect r( d->rubber->normalize() ); - delete d->rubber; - d->rubber = 0; - - repaintContents( r, FALSE ); - d->dragging = FALSE; - - delete d->backrubber; - d->backrubber = 0; - - if ( d->scrollTimer ) { - disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) ); - d->scrollTimer->stop(); - delete d->scrollTimer; - d->scrollTimer = 0; - } - } - - d->dragStartPos = e->pos(); - TQIconViewItem *item = findItem( e->pos() ); - d->pressedItem = item; - - if ( item ) - d->selectAnchor = item; - -#ifndef QT_NO_TEXTEDIT - if ( d->renamingItem ) - d->renamingItem->renameItem(); -#endif - - if ( !d->currentItem && !item && d->firstItem ) { - d->currentItem = d->firstItem; - repaintItem( d->firstItem ); - } - - if (item && item->dragEnabled()) - d->startDragItem = item; - else - d->startDragItem = 0; - - if ( e->button() == LeftButton && !( e->state() & ShiftButton ) && - !( e->state() & ControlButton ) && item && item->isSelected() && - item->textRect( FALSE ).contains( e->pos() ) ) { - - if ( !item->renameEnabled() ) { - d->mousePressed = TRUE; -#ifndef QT_NO_TEXTEDIT - } else { - ensureItemVisible( item ); - setCurrentItem( item ); - item->rename(); - goto emit_signals; -#endif - } - } - - d->pressedSelected = item && item->isSelected(); - - if ( item && item->isSelectable() ) { - if ( d->selectionMode == Single ) - item->setSelected( TRUE, e->state() & ControlButton ); - else if ( d->selectionMode == Multi ) - item->setSelected( !item->isSelected(), e->state() & ControlButton ); - else if ( d->selectionMode == Extended ) { - if ( e->state() & ShiftButton ) { - d->pressedSelected = FALSE; - bool block = signalsBlocked(); - blockSignals( TRUE ); - viewport()->setUpdatesEnabled( FALSE ); - TQRect r; - bool select = TRUE; - if ( d->currentItem ) - r = TQRect( TQMIN( d->currentItem->x(), item->x() ), - TQMIN( d->currentItem->y(), item->y() ), - 0, 0 ); - else - r = TQRect( 0, 0, 0, 0 ); - if ( d->currentItem ) { - if ( d->currentItem->x() < item->x() ) - r.setWidth( item->x() - d->currentItem->x() + item->width() ); - else - r.setWidth( d->currentItem->x() - item->x() + d->currentItem->width() ); - if ( d->currentItem->y() < item->y() ) - r.setHeight( item->y() - d->currentItem->y() + item->height() ); - else - r.setHeight( d->currentItem->y() - item->y() + d->currentItem->height() ); - r = r.normalize(); - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - bool alreadyIntersected = FALSE; - TQRect redraw; - for ( ; c; c = c->n ) { - if ( c->rect.intersects( r ) ) { - alreadyIntersected = TRUE; - TQIconViewItem *i = c->items.first(); - for ( ; i; i = c->items.next() ) { - if ( r.intersects( i->rect() ) ) { - redraw = redraw.unite( i->rect() ); - i->setSelected( select, TRUE ); - } - } - } else { - if ( alreadyIntersected ) - break; - } - } - redraw = redraw.unite( item->rect() ); - viewport()->setUpdatesEnabled( TRUE ); - repaintContents( redraw, FALSE ); - } - blockSignals( block ); - viewport()->setUpdatesEnabled( TRUE ); - item->setSelected( select, TRUE ); - emit selectionChanged(); - } else if ( e->state() & ControlButton ) { - d->pressedSelected = FALSE; - item->setSelected( !item->isSelected(), e->state() & ControlButton ); - } else { - item->setSelected( TRUE, e->state() & ControlButton ); - } - } - } else if ( ( d->selectionMode != Single || e->button() == RightButton ) - && !( e->state() & ControlButton ) ) - selectAll( FALSE ); - - setCurrentItem( item ); - - d->canStartRubber = FALSE; - if ( e->button() == LeftButton ) { - if ( !item && ( d->selectionMode == Multi || d->selectionMode == Extended ) ) { - d->canStartRubber = TRUE; - d->rubberStartX = e->x(); - d->rubberStartY = e->y(); - } - - d->mousePressed = TRUE; - } - - emit_signals: - if ( !d->canStartRubber ) { - emit mouseButtonPressed( e->button(), item, e->globalPos() ); - emit pressed( item ); - emit pressed( item, e->globalPos() ); - - if ( e->button() == RightButton ) - emit rightButtonPressed( item, e->globalPos() ); - } -} - -/*! - \reimp -*/ - -void TQIconView::contentsContextMenuEvent( TQContextMenuEvent *e ) -{ - if ( !receivers( SIGNAL(contextMenuRequested(TQIconViewItem*,const TQPoint&)) ) ) { - e->ignore(); - return; - } - if ( e->reason() == TQContextMenuEvent::Keyboard ) { - TQIconViewItem *item = currentItem(); - TQRect r = item ? item->rect() : TQRect( 0, 0, visibleWidth(), visibleHeight() ); - emit contextMenuRequested( item, viewport()->mapToGlobal( contentsToViewport( r.center() ) ) ); - } else { - d->mousePressed = FALSE; - TQIconViewItem *item = findItem( e->pos() ); - emit contextMenuRequested( item, e->globalPos() ); - } -} - -/*! - \reimp -*/ - -void TQIconView::contentsMouseReleaseEvent( TQMouseEvent *e ) -{ - TQIconViewItem *item = findItem( e->pos() ); - d->selectedItems.clear(); - - bool emitClicked = TRUE; - d->mousePressed = FALSE; - d->startDragItem = 0; - - d->canStartRubber = FALSE; - if ( d->rubber ) { - TQRect r(d->rubber->normalize()); - - if ( ( d->rubber->topLeft() - d->rubber->bottomRight() ).manhattanLength() > - TQApplication::startDragDistance() ) - emitClicked = FALSE; - delete d->rubber; - d->rubber = 0; - repaintContents(r, FALSE); - d->dragging = FALSE; - delete d->backrubber; - d->backrubber = 0; - d->currentItem = d->tmpCurrentItem; - d->tmpCurrentItem = 0; - if ( d->currentItem ) - repaintItem( d->currentItem ); - } - - if ( d->scrollTimer ) { - disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) ); - d->scrollTimer->stop(); - delete d->scrollTimer; - d->scrollTimer = 0; - } - - if ( d->selectionMode == Extended && - d->currentItem == d->pressedItem && - d->pressedSelected && d->currentItem ) { - bool block = signalsBlocked(); - blockSignals( TRUE ); - clearSelection(); - blockSignals( block ); - if ( d->currentItem->isSelectable() ) { - d->currentItem->selected = TRUE; - repaintItem( d->currentItem ); - } - emit selectionChanged(); - } - d->pressedItem = 0; - - if ( emitClicked ) { - emit mouseButtonClicked( e->button(), item, e->globalPos() ); - emit clicked( item ); - emit clicked( item, e->globalPos() ); - if ( e->button() == RightButton ) - emit rightButtonClicked( item, e->globalPos() ); - } -} - -/*! - \reimp -*/ - -void TQIconView::contentsMouseMoveEvent( TQMouseEvent *e ) -{ - TQIconViewItem *item = findItem( e->pos() ); - if ( d->highlightedItem != item ) { - if ( item ) - emit onItem( item ); - else - emit onViewport(); - d->highlightedItem = item; - } - - if ( d->mousePressed && e->state() == NoButton ) - d->mousePressed = FALSE; - - if ( d->startDragItem ) - item = d->startDragItem; - - if ( d->mousePressed && item && item == d->currentItem && - ( item->isSelected() || d->selectionMode == NoSelection ) && item->dragEnabled() ) { - if ( !d->startDragItem ) { - d->currentItem->setSelected( TRUE, TRUE ); - d->startDragItem = item; - } - if ( ( d->dragStartPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { - d->mousePressed = FALSE; - d->cleared = FALSE; -#ifndef QT_NO_DRAGANDDROP - startDrag(); -#endif - if ( d->tmpCurrentItem ) - repaintItem( d->tmpCurrentItem ); - } - } else if ( d->mousePressed && ((!d->currentItem && d->rubber) || d->canStartRubber) ) { - if ( d->canStartRubber ) { - d->canStartRubber = FALSE; - d->tmpCurrentItem = d->currentItem; - d->currentItem = 0; - repaintItem( d->tmpCurrentItem ); - delete d->rubber; - d->rubber = new TQRect( d->rubberStartX, d->rubberStartY, 0, 0 ); - d->selectedItems.clear(); - if ( ( e->state() & ControlButton ) == ControlButton || - ( e->state() & ShiftButton ) == ShiftButton ) { - for ( TQIconViewItem *i = firstItem(); i; i = i->nextItem() ) - if ( i->isSelected() ) - d->selectedItems.insert( i, i ); - } - } - doAutoScroll(); - } -} - -/*! - \reimp -*/ - -void TQIconView::contentsMouseDoubleClickEvent( TQMouseEvent *e ) -{ - TQIconViewItem *item = findItem( e->pos() ); - if ( item ) { - selectAll( FALSE ); - item->setSelected( TRUE, TRUE ); - emit doubleClicked( item ); - } -} - -/*! - \reimp -*/ - -#ifndef QT_NO_DRAGANDDROP -void TQIconView::contentsDragEnterEvent( TQDragEnterEvent *e ) -{ - d->dragging = TRUE; - d->drawDragShapes = TRUE; - d->tmpCurrentItem = 0; - initDragEnter( e ); - d->oldDragPos = e->pos(); - d->oldDragAcceptAction = FALSE; - drawDragShapes( e->pos() ); - d->dropped = FALSE; -} - -/*! - \reimp -*/ - -void TQIconView::contentsDragMoveEvent( TQDragMoveEvent *e ) -{ - if ( e->pos() == d->oldDragPos ) { - if (d->oldDragAcceptAction) - e->acceptAction(); - else - e->ignore(); - return; - } - - drawDragShapes( d->oldDragPos ); - d->dragging = FALSE; - - TQIconViewItem *old = d->tmpCurrentItem; - d->tmpCurrentItem = 0; - - TQIconViewItem *item = findItem( e->pos() ); - - if ( item ) { - if ( old && - old->rect().contains(d->oldDragPos) && - !old->rect().contains(e->pos()) ) { - old->dragLeft(); - repaintItem( old ); - } - if ( !item->rect().contains(d->oldDragPos) ) - item->dragEntered(); - if (item->acceptDrop(e) || (item->isSelected() && e->source() == viewport())) { - d->oldDragAcceptAction = TRUE; - e->acceptAction(); - } else { - d->oldDragAcceptAction = FALSE; - e->ignore(); - } - - d->tmpCurrentItem = item; - TQPainter p; - p.begin( viewport() ); - p.translate( -contentsX(), -contentsY() ); - item->paintFocus( &p, colorGroup() ); - p.end(); - } else { - e->acceptAction(); - d->oldDragAcceptAction = TRUE; - if ( old ) { - old->dragLeft(); - repaintItem( old ); - } - } - - d->oldDragPos = e->pos(); - drawDragShapes( e->pos() ); - d->dragging = TRUE; -} - -/*! - \reimp -*/ - -void TQIconView::contentsDragLeaveEvent( TQDragLeaveEvent * ) -{ - if ( !d->dropped ) - drawDragShapes( d->oldDragPos ); - d->dragging = FALSE; - - if ( d->tmpCurrentItem ) { - repaintItem( d->tmpCurrentItem ); - d->tmpCurrentItem->dragLeft(); - } - - d->tmpCurrentItem = 0; - d->isIconDrag = FALSE; - d->iconDragData.clear(); -} - -/*! - \reimp -*/ - -void TQIconView::contentsDropEvent( TQDropEvent *e ) -{ - d->dropped = TRUE; - d->dragging = FALSE; - drawDragShapes( d->oldDragPos ); - - if ( d->tmpCurrentItem ) - repaintItem( d->tmpCurrentItem ); - - TQIconViewItem *i = findItem( e->pos() ); - - if ((!i || i->isSelected()) && e->source() == viewport() && d->currentItem && !d->cleared) { - if ( !d->rearrangeEnabled ) - return; - TQRect r = d->currentItem->rect(); - - d->currentItem->move( e->pos() - d->dragStart ); - - int w = d->currentItem->x() + d->currentItem->width() + 1; - int h = d->currentItem->y() + d->currentItem->height() + 1; - - repaintItem( d->currentItem ); - repaintContents( r.x(), r.y(), r.width(), r.height(), FALSE ); - - int dx = d->currentItem->x() - r.x(); - int dy = d->currentItem->y() - r.y(); - - TQIconViewItem *item = d->firstItem; - TQRect rr; - for ( ; item; item = item->next ) { - if ( item->isSelected() && item != d->currentItem ) { - rr = rr.unite( item->rect() ); - item->moveBy( dx, dy ); - rr = rr.unite( item->rect() ); - } - w = TQMAX( w, item->x() + item->width() + 1 ); - h = TQMAX( h, item->y() + item->height() + 1 ); - } - repaintContents( rr, FALSE ); - bool fullRepaint = FALSE; - if ( w > contentsWidth() || - h > contentsHeight() ) - fullRepaint = TRUE; - - int oldw = contentsWidth(); - int oldh = contentsHeight(); - - resizeContents( w, h ); - - - if ( fullRepaint ) { - repaintContents( oldw, 0, contentsWidth() - oldw, contentsHeight(), FALSE ); - repaintContents( 0, oldh, contentsWidth(), contentsHeight() - oldh, FALSE ); - } - e->acceptAction(); - } else if ( !i && ( e->source() != viewport() || d->cleared ) ) { - TQValueList lst; - if ( TQIconDrag::canDecode( e ) ) { - TQValueList l; - TQIconDragPrivate::decode( e, l ); - TQValueList::Iterator it = l.begin(); - for ( ; it != l.end(); ++it ) - lst << ( *it ).data; - } - emit dropped( e, lst ); - } else if ( i ) { - TQValueList lst; - if ( TQIconDrag::canDecode( e ) ) { - TQValueList l; - TQIconDragPrivate::decode( e, l ); - TQValueList::Iterator it = l.begin(); - for ( ; it != l.end(); ++it ) - lst << ( *it ).data; - } - i->dropped( e, lst ); - } - d->isIconDrag = FALSE; -} -#endif - -/*! - This function grabs all paintevents that otherwise would have been - processed by the TQScrollView::viewportPaintEvent(). Here we use a - doublebuffer to reduce 'on-paint' flickering on TQIconView - (and of course its children). - - \sa TQScrollView::viewportPaintEvent(), TQIconView::drawContents() -*/ - -void TQIconView::bufferedPaintEvent( TQPaintEvent* pe ) -{ - TQWidget* vp = viewport(); - TQRect r = pe->rect() & vp->rect(); - int ex = r.x() + contentsX(); - int ey = r.y() + contentsY(); - int ew = r.width(); - int eh = r.height(); - - if ( !d->backBuffer ) - d->backBuffer = new TQPixmap(vp->size()); - if ( d->backBuffer->size() != vp->size() ) { - // Resize function (with hysteresis). Uses a good compromise between memory - // consumption and speed (number) of resizes. - float newWidth = (float)vp->width(); - float newHeight = (float)vp->height(); - if ( newWidth > d->backBuffer->width() || newHeight > d->backBuffer->height() ) - { - newWidth *= 1.1892; - newHeight *= 1.1892; - d->backBuffer->resize( (int)newWidth, (int)newHeight ); - } else if ( 1.5*newWidth < d->backBuffer->width() || 1.5*newHeight < d->backBuffer->height() ) - d->backBuffer->resize( (int)newWidth, (int)newHeight ); - } - - TQPainter p; - p.begin(d->backBuffer, vp); - drawContentsOffset(&p, contentsX(), contentsY(), ex, ey, ew, eh); - p.end(); - bitBlt(vp, r.x(), r.y(), d->backBuffer, r.x(), r.y(), ew, eh); -} - -/*! - \reimp -*/ - -void TQIconView::resizeEvent( TQResizeEvent* e ) -{ - TQScrollView::resizeEvent( e ); - if ( d->resizeMode == Adjust ) { - optimize_layout = TRUE; - adjustItems(); - optimize_layout = FALSE; -#if 0 // no need for timer delay anymore - d->oldSize = e->oldSize(); - if ( d->adjustTimer->isActive() ) - d->adjustTimer->stop(); - d->adjustTimer->start( 0, TRUE ); -#endif - } -} - -/*! - Adjusts the positions of the items to the geometry of the icon - view. -*/ - -void TQIconView::adjustItems() -{ - d->adjustTimer->stop(); - if ( d->resizeMode == Adjust ) - arrangeItemsInGrid( TRUE ); -} - -/*! - \reimp -*/ - -void TQIconView::keyPressEvent( TQKeyEvent *e ) -{ - if ( !d->firstItem ) - return; - - if ( !d->currentItem ) { - setCurrentItem( d->firstItem ); - if ( d->selectionMode == Single ) - d->currentItem->setSelected( TRUE, TRUE ); - return; - } - - bool selectCurrent = TRUE; - - switch ( e->key() ) { - case Key_Escape: - e->ignore(); - break; -#ifndef QT_NO_TEXTEDIT - case Key_F2: { - if ( d->currentItem->renameEnabled() ) { - d->currentItem->renameItem(); - d->currentItem->rename(); - return; - } - } break; -#endif - case Key_Home: { - d->currInputString = TQString::null; - if ( !d->firstItem ) - break; - - selectCurrent = FALSE; - - TQIconViewItem *item = 0; - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - while ( !item && c ) { - TQPtrList &list = c->items; - TQIconViewItem *i = list.first(); - while ( i ) { - if ( !item ) { - item = i; - } else { - if ( d->arrangement == LeftToRight ) { - // we use pixmap so the items textlength are ignored - // find topmost, leftmost item - if ( i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() || - ( i->pixmapRect( FALSE ).y() == item->pixmapRect( FALSE ).y() && - i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() ) ) - item = i; - } else { - // find leftmost, topmost item - if ( i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() || - ( i->pixmapRect( FALSE ).x() == item->pixmapRect( FALSE ).x() && - i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() ) ) - item = i; - } - } - i = list.next(); - } - c = c->n; - } - - if ( item ) { - TQIconViewItem *old = d->currentItem; - setCurrentItem( item ); - ensureItemVisible( item ); - handleItemChange( old, e->state() & ShiftButton, - e->state() & ControlButton, TRUE ); - } - } break; - case Key_End: { - d->currInputString = TQString::null; - if ( !d->lastItem ) - break; - - selectCurrent = FALSE; - - TQIconViewItem *item = 0; - TQIconViewPrivate::ItemContainer *c = d->lastContainer; - while ( !item && c ) { - TQPtrList &list = c->items; - TQIconViewItem *i = list.first(); - while ( i ) { - if ( !item ) { - item = i; - } else { - if ( d->arrangement == LeftToRight ) { - // find bottommost, rightmost item - if ( i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() || - ( i->pixmapRect( FALSE ).bottom() == item->pixmapRect( FALSE ).bottom() && - i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() ) ) - item = i; - } else { - // find rightmost, bottommost item - if ( i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() || - ( i->pixmapRect( FALSE ).right() == item->pixmapRect( FALSE ).right() && - i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() ) ) - item = i; - } - } - i = list.next(); - } - c = c->p; - } - - if ( item ) { - TQIconViewItem *old = d->currentItem; - setCurrentItem( item ); - ensureItemVisible( item ); - handleItemChange( old, e->state() & ShiftButton, - e->state() & ControlButton, TRUE ); - } - } break; - case Key_Right: { - d->currInputString = TQString::null; - TQIconViewItem *item; - selectCurrent = FALSE; - Direction dir = DirRight; - - TQRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() ); - item = findItem( dir, d->currentItem->rect().center(), r ); - - // search the row below from the right - while ( !item && r.y() < contentsHeight() ) { - r.moveBy(0, d->currentItem->height() ); - item = findItem( dir, TQPoint( 0, r.center().y() ), r ); - } - - if ( item ) { - TQIconViewItem *old = d->currentItem; - setCurrentItem( item ); - ensureItemVisible( item ); - handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton ); - } - } break; - case Key_Left: { - d->currInputString = TQString::null; - TQIconViewItem *item; - selectCurrent = FALSE; - Direction dir = DirLeft; - - TQRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() ); - item = findItem( dir, d->currentItem->rect().center(), r ); - - // search the row above from the left - while ( !item && r.y() >= 0 ) { - r.moveBy(0, - d->currentItem->height() ); - item = findItem( dir, TQPoint( contentsWidth(), r.center().y() ), r ); - } - - if ( item ) { - TQIconViewItem *old = d->currentItem; - setCurrentItem( item ); - ensureItemVisible( item ); - handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton ); - } - } break; - case Key_Space: { - d->currInputString = TQString::null; - if ( d->selectionMode == Single) - break; - - d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE ); - } break; - case Key_Enter: case Key_Return: - d->currInputString = TQString::null; - emit returnPressed( d->currentItem ); - break; - case Key_Down: { - d->currInputString = TQString::null; - TQIconViewItem *item; - selectCurrent = FALSE; - Direction dir = DirDown; - - TQRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() ); - item = findItem( dir, d->currentItem->rect().center(), r ); - - // finding the closest item below and to the right - while ( !item && r.x() < contentsWidth() ) { - r.moveBy( r.width() , 0 ); - item = findItem( dir, TQPoint( r.center().x(), 0 ), r ); - } - - - TQIconViewItem *i = d->currentItem; - setCurrentItem( item ); - item = i; - handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); - } break; - case Key_Up: { - d->currInputString = TQString::null; - TQIconViewItem *item; - selectCurrent = FALSE; - Direction dir = DirUp; - - TQRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() ); - item = findItem( dir, d->currentItem->rect().center(), r ); - - // finding the closest item above and to the left - while ( !item && r.x() >= 0 ) { - r.moveBy(- r.width(), 0 ); - item = findItem( dir, TQPoint(r.center().x(), contentsHeight() ), r ); - } - - TQIconViewItem *i = d->currentItem; - setCurrentItem( item ); - item = i; - handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); - } break; - case Key_Next: { - d->currInputString = TQString::null; - selectCurrent = FALSE; - TQRect r; - if ( d->arrangement == LeftToRight ) - r = TQRect( 0, d->currentItem->y() + visibleHeight(), contentsWidth(), visibleHeight() ); - else - r = TQRect( d->currentItem->x() + visibleWidth(), 0, visibleWidth(), contentsHeight() ); - TQIconViewItem *item = d->currentItem; - TQIconViewItem *ni = findFirstVisibleItem( r ); - if ( !ni ) { - if ( d->arrangement == LeftToRight ) - r = TQRect( 0, d->currentItem->y() + d->currentItem->height(), contentsWidth(), contentsHeight() ); - else - r = TQRect( d->currentItem->x() + d->currentItem->width(), 0, contentsWidth(), contentsHeight() ); - ni = findLastVisibleItem( r ); - } - if ( ni ) { - setCurrentItem( ni ); - handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); - } - } break; - case Key_Prior: { - d->currInputString = TQString::null; - selectCurrent = FALSE; - TQRect r; - if ( d->arrangement == LeftToRight ) - r = TQRect( 0, d->currentItem->y() - visibleHeight(), contentsWidth(), visibleHeight() ); - else - r = TQRect( d->currentItem->x() - visibleWidth(), 0, visibleWidth(), contentsHeight() ); - TQIconViewItem *item = d->currentItem; - TQIconViewItem *ni = findFirstVisibleItem( r ); - if ( !ni ) { - if ( d->arrangement == LeftToRight ) - r = TQRect( 0, 0, contentsWidth(), d->currentItem->y() ); - else - r = TQRect( 0, 0, d->currentItem->x(), contentsHeight() ); - ni = findFirstVisibleItem( r ); - } - if ( ni ) { - setCurrentItem( ni ); - handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); - } - } break; - default: - if ( !e->text().isEmpty() && e->text()[ 0 ].isPrint() ) { - selectCurrent = FALSE; - TQIconViewItem *i = d->currentItem; - if ( !i ) - i = d->firstItem; - if ( !d->inputTimer->isActive() ) { - d->currInputString = e->text(); - i = i->next; - if ( !i ) - i = d->firstItem; - i = findItemByName( i ); - } else { - d->inputTimer->stop(); - d->currInputString += e->text(); - i = findItemByName( i ); - if ( !i ) { - d->currInputString = e->text(); - if (d->currentItem && d->currentItem->next) - i = d->currentItem->next; - else - i = d->firstItem; - i = findItemByName(i); - } - } - if ( i ) { - setCurrentItem( i ); - if ( d->selectionMode == Extended ) { - bool changed = FALSE; - bool block = signalsBlocked(); - blockSignals( TRUE ); - selectAll( FALSE ); - blockSignals( block ); - if ( !i->selected && i->isSelectable() ) { - changed = TRUE; - i->selected = TRUE; - repaintItem( i ); - } - if ( changed ) - emit selectionChanged(); - } - } - d->inputTimer->start( 400, TRUE ); - } else { - selectCurrent = FALSE; - d->currInputString = TQString::null; - if ( e->state() & ControlButton ) { - switch ( e->key() ) { - case Key_A: - selectAll( TRUE ); - break; - } - } - e->ignore(); - return; - } - } - - if ( !( e->state() & ShiftButton ) || !d->selectAnchor ) - d->selectAnchor = d->currentItem; - - if ( d->currentItem && !d->currentItem->isSelected() && - d->selectionMode == Single && selectCurrent ) { - d->currentItem->setSelected( TRUE ); - } - - ensureItemVisible( d->currentItem ); -} - -/* - Finds the closest item in the Direction \a dir relative from the point \a relativeTo - which intersects with the searchRect. - - The function choses the closest item with its center in the searchRect. -*/ -TQIconViewItem* TQIconView::findItem( Direction dir, - const TQPoint &relativeTo, - const TQRect &searchRect ) const -{ - TQIconViewItem *item; - TQIconViewItem *centerMatch = 0; - int centerMatchML = 0; - - // gets list of containers with potential items - TQPtrList* cList = - d->findContainers( dir, relativeTo, searchRect); - - cList->first(); - while ( cList->current() && !centerMatch ) { - TQPtrList &list = (cList->current())->items; - for ( item = list.first(); item; item = list.next() ) { - if ( neighbourItem( dir, relativeTo, item ) && - searchRect.contains( item->rect().center() ) && - item != currentItem() ) { - int ml = (relativeTo - item->rect().center()).manhattanLength(); - if ( centerMatch ) { - if ( ml < centerMatchML ) { - centerMatch = item; - centerMatchML = ml; - } - } else { - centerMatch = item; - centerMatchML = ml; - } - } - } - cList->next(); - } - delete cList; - return centerMatch; -} - - -/* - Returns TRUE if the items orientation compared to - the point \a relativeTo is correct. -*/ -bool TQIconView::neighbourItem( Direction dir, - const TQPoint &relativeTo, - const TQIconViewItem *item ) const -{ - switch ( dir ) { - case DirUp: - if ( item->rect().center().y() < relativeTo.y() ) - return TRUE; - break; - case DirDown: - if ( item->rect().center().y() > relativeTo.y() ) - return TRUE; - break; - case DirLeft: - if ( item->rect().center().x() < relativeTo.x() ) - return TRUE; - break; - case DirRight: - if ( item->rect().center().x() > relativeTo.x() ) - return TRUE; - break; - default: - // nothing - break; - } - return FALSE; -} - -/*! - \reimp -*/ - -void TQIconView::focusInEvent( TQFocusEvent* ) -{ - d->mousePressed = FALSE; - d->inMenuMode = FALSE; - if ( d->currentItem ) { - repaintItem( d->currentItem ); - } else if ( d->firstItem && TQFocusEvent::reason() != TQFocusEvent::Mouse ) { - d->currentItem = d->firstItem; - emit currentChanged( d->currentItem ); - repaintItem( d->currentItem ); - } - - if ( style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this ) ) - repaintSelectedItems(); - - if ( d->currentItem ) - setMicroFocusHint( d->currentItem->x(), d->currentItem->y(), d->currentItem->width(), d->currentItem->height(), FALSE ); -} - -/*! - \reimp -*/ - -void TQIconView::focusOutEvent( TQFocusEvent* ) -{ - if (style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this )) { - d->inMenuMode = - TQFocusEvent::reason() == TQFocusEvent::Popup || - (tqApp->focusWidget() && tqApp->focusWidget()->inherits("TQMenuBar")); - if ( !d->inMenuMode ) - repaintSelectedItems(); - } - if ( d->currentItem ) - repaintItem( d->currentItem ); -} - -/*! - Draws the rubber band using the painter \a p. -*/ - -void TQIconView::drawRubber( TQPainter *p ) -{ - if ( !p || !d->rubber ) - return; - - TQPoint pnt( d->rubber->x(), d->rubber->y() ); - pnt = contentsToViewport( pnt ); - - style().drawPrimitive( TQStyle::PE_RubberBand, p, - TQRect( pnt.x(), pnt.y(), d->rubber->width(), d->rubber->height() ).normalize(), - colorGroup(), TQStyle::Style_Default, TQStyleOption(colorGroup().base()) ); -} - -/*! - Returns the TQDragObject that should be used for drag-and-drop. - This function is called by the icon view when starting a drag to - get the dragobject that should be used for the drag. Subclasses - may reimplement this. - - \sa TQIconDrag -*/ - -#ifndef QT_NO_DRAGANDDROP -TQDragObject *TQIconView::dragObject() -{ - if ( !d->currentItem ) - return 0; - - TQPoint orig = d->dragStartPos; - - TQIconDrag *drag = new TQIconDrag( viewport() ); - drag->setPixmap( ( d->currentItem->pixmap() ? - *d->currentItem->pixmap() : TQPixmap() ), // ### TQPicture - TQPoint( d->currentItem->pixmapRect().width() / 2, - d->currentItem->pixmapRect().height() / 2 ) ); - - if ( d->selectionMode == NoSelection ) { - TQIconViewItem *item = d->currentItem; - drag->append( TQIconDragItem(), - TQRect( item->pixmapRect( FALSE ).x() - orig.x(), - item->pixmapRect( FALSE ).y() - orig.y(), - item->pixmapRect().width(), item->pixmapRect().height() ), - TQRect( item->textRect( FALSE ).x() - orig.x(), - item->textRect( FALSE ).y() - orig.y(), - item->textRect().width(), item->textRect().height() ) ); - } else { - for ( TQIconViewItem *item = d->firstItem; item; item = item->next ) { - if ( item->isSelected() ) { - drag->append( TQIconDragItem(), - TQRect( item->pixmapRect( FALSE ).x() - orig.x(), - item->pixmapRect( FALSE ).y() - orig.y(), - item->pixmapRect().width(), item->pixmapRect().height() ), - TQRect( item->textRect( FALSE ).x() - orig.x(), - item->textRect( FALSE ).y() - orig.y(), - item->textRect().width(), item->textRect().height() ) ); - } - } - } - - return drag; -} - -/*! - Starts a drag. -*/ - -void TQIconView::startDrag() -{ - if ( !d->startDragItem ) - return; - - TQPoint orig = d->dragStartPos; - d->dragStart = TQPoint( orig.x() - d->startDragItem->x(), - orig.y() - d->startDragItem->y() ); - d->startDragItem = 0; - d->mousePressed = FALSE; - d->pressedItem = 0; - d->pressedSelected = 0; - - TQDragObject *drag = dragObject(); - if ( !drag ) - return; - - if ( drag->drag() ) - if ( drag->target() != viewport() ) - emit moved(); -} - -#endif - -/*! - Inserts the TQIconViewItem \a item in the icon view's grid. \e{You - should never need to call this function.} Instead, insert - TQIconViewItems by creating them with a pointer to the TQIconView - that they are to be inserted into. -*/ - -void TQIconView::insertInGrid( TQIconViewItem *item ) -{ - if ( !item ) - return; - - if ( d->reorderItemsWhenInsert ) { - // #### make this efficient - but it's not too dramatic - int y = d->spacing; - - item->dirty = FALSE; - if ( item == d->firstItem ) { - bool dummy; - makeRowLayout( item, y, dummy ); - return; - } - - TQIconViewItem *begin = rowBegin( item ); - y = begin->y(); - while ( begin ) { - bool dummy; - begin = makeRowLayout( begin, y, dummy ); - - if ( !begin || !begin->next ) - break; - - begin = begin->next; - } - item->dirty = FALSE; - } else { - TQRegion r( TQRect( 0, 0, TQMAX( contentsWidth(), visibleWidthSB() ), - TQMAX( contentsHeight(), visibleHeightSB() ) ) ); - - TQIconViewItem *i = d->firstItem; - int y = -1; - for ( ; i; i = i->next ) { - r = r.subtract( i->rect() ); - y = TQMAX( y, i->y() + i->height() ); - } - - TQMemArray rects = r.rects(); - TQMemArray::Iterator it = rects.begin(); - bool foundPlace = FALSE; - for ( ; it != rects.end(); ++it ) { - TQRect rect = *it; - if ( rect.width() >= item->width() && - rect.height() >= item->height() ) { - int sx = 0, sy = 0; - if ( rect.width() >= item->width() + d->spacing ) - sx = d->spacing; - if ( rect.height() >= item->height() + d->spacing ) - sy = d->spacing; - item->move( rect.x() + sx, rect.y() + sy ); - foundPlace = TRUE; - break; - } - } - - if ( !foundPlace ) - item->move( d->spacing, y + d->spacing ); - - resizeContents( TQMAX( contentsWidth(), item->x() + item->width() ), - TQMAX( contentsHeight(), item->y() + item->height() ) ); - item->dirty = FALSE; - } -} - -/*! - Emits a signal to indicate selection changes. \a i is the - TQIconViewItem that was selected or de-selected. - - \e{You should never need to call this function.} -*/ - -void TQIconView::emitSelectionChanged( TQIconViewItem *i ) -{ - emit selectionChanged(); - if ( d->selectionMode == Single ) - emit selectionChanged( i ? i : d->currentItem ); -} - -/*! - \internal -*/ - -void TQIconView::emitRenamed( TQIconViewItem *item ) -{ - if ( !item ) - return; - - emit itemRenamed( item, item->text() ); - emit itemRenamed( item ); -} - -/*! - If a drag enters the icon view the shapes of the objects which the - drag contains are drawn, usnig \a pos as origin. -*/ - -void TQIconView::drawDragShapes( const TQPoint &pos ) -{ -#ifndef QT_NO_DRAGANDDROP - if ( pos == TQPoint( -1, -1 ) ) - return; - - if ( !d->drawDragShapes ) { - d->drawDragShapes = TRUE; - return; - } - - TQStyleOption opt(colorGroup().base()); - - TQPainter p; - p.begin( viewport() ); - p.translate( -contentsX(), -contentsY() ); - p.setRasterOp( NotROP ); - p.setPen( TQPen( color0 ) ); - - if ( d->isIconDrag ) { - TQValueList::Iterator it = d->iconDragData.begin(); - for ( ; it != d->iconDragData.end(); ++it ) { - TQRect ir = (*it).item.pixmapRect(); - TQRect tr = (*it).item.textRect(); - tr.moveBy( pos.x(), pos.y() ); - ir.moveBy( pos.x(), pos.y() ); - if ( !ir.intersects( TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ) ) ) - continue; - - style().drawPrimitive(TQStyle::PE_FocusRect, &p, ir, colorGroup(), - TQStyle::Style_Default, opt); - style().drawPrimitive(TQStyle::PE_FocusRect, &p, tr, colorGroup(), - TQStyle::Style_Default, opt); - } - } else if ( d->numDragItems > 0 ) { - for ( int i = 0; i < d->numDragItems; ++i ) { - TQRect r( pos.x() + i * 40, pos.y(), 35, 35 ); - style().drawPrimitive(TQStyle::PE_FocusRect, &p, r, colorGroup(), - TQStyle::Style_Default, opt); - } - - } - p.end(); -#endif -} - -/*! - When a drag enters the icon view, this function is called to - initialize it. Initializing in this context means getting - information about the drag, for example so that the icon view - knows enough about the drag to be able to draw drag shapes for the - drag data (e.g. shapes of icons which are dragged), etc. -*/ - -#ifndef QT_NO_DRAGANDDROP -void TQIconView::initDragEnter( TQDropEvent *e ) -{ - if ( TQIconDrag::canDecode( e ) ) { - TQIconDragPrivate::decode( e, d->iconDragData ); - d->isIconDrag = TRUE; - } else if ( TQUriDrag::canDecode( e ) ) { - TQStrList lst; - TQUriDrag::decode( e, lst ); - d->numDragItems = lst.count(); - } else { - d->numDragItems = 0; - } - -} -#endif - -/*! - This function is called to draw the rectangle \a r of the - background using the painter \a p. - - The default implementation fills \a r with the viewport's - backgroundBrush(). Subclasses may reimplement this to draw custom - backgrounds. - - \sa contentsX() contentsY() drawContents() -*/ - -void TQIconView::drawBackground( TQPainter *p, const TQRect &r ) -{ - p->fillRect( r, viewport()->backgroundBrush() ); -} - -/*! - \reimp -*/ - -bool TQIconView::eventFilter( TQObject * o, TQEvent * e ) -{ - if ( o == viewport() ) { - switch( e->type() ) { - case TQEvent::FocusIn: - focusInEvent( (TQFocusEvent*)e ); - return TRUE; - case TQEvent::FocusOut: - focusOutEvent( (TQFocusEvent*)e ); - return TRUE; - case TQEvent::Enter: - enterEvent( e ); - return TRUE; - case TQEvent::Paint: - if ( o == viewport() ) { - if ( d->dragging ) { - if ( !d->rubber ) - drawDragShapes( d->oldDragPos ); - viewportPaintEvent( (TQPaintEvent*)e ); - if ( !d->rubber ) - drawDragShapes( d->oldDragPos ); - } else { - bufferedPaintEvent( (TQPaintEvent*)e ); - } - } - return TRUE; - default: - // nothing - break; - } - } - - return TQScrollView::eventFilter( o, e ); -} - - -/*! - \reimp -*/ - -TQSize TQIconView::minimumSizeHint() const -{ - return TQScrollView::minimumSizeHint(); -} - -/*! - \internal - Finds the next item after the start item beginning - with \a text. -*/ - -TQIconViewItem* TQIconView::findItemByName( TQIconViewItem *start ) -{ - if ( !start ) - return 0; - TQString match = d->currInputString.lower(); - if ( match.length() < 1 ) - return start; - TQString curText; - TQIconViewItem *i = start; - do { - curText = i->text().lower(); - if ( curText.startsWith( match ) ) - return i; - i = i->next; - if ( !i ) - i = d->firstItem; - } while ( i != start ); - return 0; -} - -/*! - Lays out a row of icons (if Arrangement == \c TopToBottom this is - a column). Starts laying out with the item \a begin. \a y is the - starting coordinate. Returns the last item of the row (column) and - sets the new starting coordinate to \a y. The \a changed parameter - is used internally. - - \warning This function may be made private in a future version of - TQt. We do not recommend calling it. -*/ - -TQIconViewItem *TQIconView::makeRowLayout( TQIconViewItem *begin, int &y, bool &changed ) -{ - TQIconViewItem *end = 0; - - // Find the first visible item - while (begin->next && (begin->isVisible() == FALSE)) { - begin = begin->next; - } - - bool reverse = TQApplication::reverseLayout(); - changed = FALSE; - - if ( d->arrangement == LeftToRight ) { - - if ( d->rastX == -1 ) { - // first calculate the row height - int h = 0; - int x = 0; - int ih = 0; - TQIconViewItem *item = begin; - for (;;) { - x += d->spacing + item->width(); - if ( x > visibleWidthSB() && item != begin ) { - item = item->prev; - while (item && (item->isVisible() == FALSE)) { - item = item->prev; - } - break; - } - h = TQMAX( h, item->height() ); - ih = TQMAX( ih, item->pixmapRect().height() ); - TQIconViewItem *old = item; - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - if ( !item ) { - item = old; - break; - } - } - end = item; - - if ( d->rastY != -1 ) - h = TQMAX( h, d->rastY ); - - // now move the items - item = begin; - for (;;) { - item->dirty = FALSE; - int x; - if ( item == begin ) { - if ( reverse ) - x = visibleWidthSB() - d->spacing - item->width(); - else - x = d->spacing; - } else { - if ( reverse ) - x = item->prev->x() - item->width() - d->spacing; - else - x = item->prev->x() + item->prev->width() + d->spacing; - } - changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed; - if ( y + h < item->y() + item->height() ) - h = TQMAX( h, ih + item->textRect().height() ); - if ( item == end ) - break; - item = item->next; - } - y += h + d->spacing; - } else { - // first calculate the row height - int h = begin->height(); - int x = d->spacing; - int ih = begin->pixmapRect().height(); - TQIconViewItem *item = begin; - int i = 0; - int sp = 0; - for (;;) { - int r = calcGridNum( item->width(), d->rastX ); - if ( item == begin ) { - i += r; - sp += r; - x = d->spacing + d->rastX * r; - } else { - sp += r; - i += r; - x = i * d->rastX + sp * d->spacing; - } - if ( x > visibleWidthSB() && item != begin ) { - item = item->prev; - while (item && (item->isVisible() == FALSE)) { - item = item->prev; - } - break; - } - h = TQMAX( h, item->height() ); - ih = TQMAX( ih, item->pixmapRect().height() ); - TQIconViewItem *old = item; - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - if ( !item ) { - item = old; - break; - } - } - end = item; - - if ( d->rastY != -1 ) - h = TQMAX( h, d->rastY ); - - // now move the items - item = begin; - i = 0; - sp = 0; - for (;;) { - item->dirty = FALSE; - int r = calcGridNum( item->width(), d->rastX ); - if ( item == begin ) { - if ( d->itemTextPos == Bottom ) - changed = item->move( d->spacing + ( r * d->rastX - item->width() ) / 2, - y + ih - item->pixmapRect().height() ) || changed; - else - changed = item->move( d->spacing, y + ih - item->pixmapRect().height() ) || changed; - i += r; - sp += r; - } else { - sp += r; - int x = i * d->rastX + sp * d->spacing; - if ( d->itemTextPos == Bottom ) - changed = item->move( x + ( r * d->rastX - item->width() ) / 2, - y + ih - item->pixmapRect().height() ) || changed; - else - changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed; - i += r; - } - if ( y + h < item->y() + item->height() ) - h = TQMAX( h, ih + item->textRect().height() ); - if ( item == end ) - break; - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - } - y += h + d->spacing; - } - - - } else { // -------------------------------- TopToBottom ------------------------------ - - int x = y; - - { - int w = 0; - int y = 0; - TQIconViewItem *item = begin; - for (;;) { - y += d->spacing + item->height(); - if ( y > visibleHeightSB() && item != begin ) { - item = item->prev; - while (item && (item->isVisible() == FALSE)) { - item = item->prev; - } - break; - } - w = TQMAX( w, item->width() ); - TQIconViewItem *old = item; - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - if ( !item ) { - item = old; - break; - } - } - end = item; - - if ( d->rastX != -1 ) - w = TQMAX( w, d->rastX ); - - // now move the items - item = begin; - TQIconViewItem *prevVisibleItem = NULL; - for (;;) { - item->dirty = FALSE; - if ( d->itemTextPos == Bottom ) { - if ( item == begin ) - changed = item->move( x + ( w - item->width() ) / 2, d->spacing ) || changed; - else - changed = item->move( x + ( w - item->width() ) / 2, - prevVisibleItem->y() + prevVisibleItem->height() + d->spacing ) || changed; - } else { - if ( item == begin ) - changed = item->move( x, d->spacing ) || changed; - else - changed = item->move( x, prevVisibleItem->y() + prevVisibleItem->height() + d->spacing ) || changed; - } - if ( item == end ) - break; - prevVisibleItem = item; - item = item->next; - while (item && (item->isVisible() == FALSE)) { - item = item->next; - } - } - x += w + d->spacing; - } - - y = x; - } - - return end; -} - -/*! - \internal - Calculates how many cells an item of width \a w needs in a grid with of - \a x and returns the result. -*/ - -int TQIconView::calcGridNum( int w, int x ) const -{ - float r = (float)w / (float)x; - if ( ( w / x ) * x != w ) - r += 1.0; - return (int)r; -} - -/*! - \internal - Returns the first item of the row which contains \a item. -*/ - -TQIconViewItem *TQIconView::rowBegin( TQIconViewItem * ) const -{ - // #### todo - return d->firstItem; -} - -/*! - Sorts and rearranges all the items in the icon view. If \a - ascending is TRUE, the items are sorted in increasing order, - otherwise they are sorted in decreasing order. - - TQIconViewItem::compare() is used to compare pairs of items. The - sorting is based on the items' keys; these default to the items' - text unless specifically set to something else. - - Note that this function sets the sort order to \a ascending. - - \sa TQIconViewItem::key(), TQIconViewItem::setKey(), - TQIconViewItem::compare(), TQIconView::setSorting(), - TQIconView::sortDirection() -*/ - -void TQIconView::sort( bool ascending ) -{ - if ( count() == 0 ) - return; - - d->sortDirection = ascending; - TQIconViewPrivate::SortableItem *items = new TQIconViewPrivate::SortableItem[ count() ]; - - TQIconViewItem *item = d->firstItem; - int i = 0; - for ( ; item; item = item->next ) - items[ i++ ].item = item; - - qsort( items, count(), sizeof( TQIconViewPrivate::SortableItem ), cmpIconViewItems ); - - TQIconViewItem *prev = 0; - item = 0; - if ( ascending ) { - for ( i = 0; i < (int)count(); ++i ) { - item = items[ i ].item; - if ( item ) { - item->prev = prev; - if ( item->prev ) - item->prev->next = item; - item->next = 0; - } - if ( i == 0 ) - d->firstItem = item; - if ( i == (int)count() - 1 ) - d->lastItem = item; - prev = item; - } - } else { - for ( i = (int)count() - 1; i >= 0 ; --i ) { - item = items[ i ].item; - if ( item ) { - item->prev = prev; - if ( item->prev ) - item->prev->next = item; - item->next = 0; - } - if ( i == (int)count() - 1 ) - d->firstItem = item; - if ( i == 0 ) - d->lastItem = item; - prev = item; - } - } - - delete [] items; - - arrangeItemsInGrid( TRUE ); -} - -/*! - \reimp -*/ - -TQSize TQIconView::sizeHint() const -{ - constPolish(); - - if ( !d->firstItem ) - return TQScrollView::sizeHint(); - - if ( d->dirty && d->firstSizeHint ) { - ( (TQIconView*)this )->resizeContents( TQMAX( 400, contentsWidth() ), - TQMAX( 400, contentsHeight() ) ); - if ( autoArrange() ) - ( (TQIconView*)this )->arrangeItemsInGrid( FALSE ); - d->firstSizeHint = FALSE; - } - - d->dirty = TRUE; // ######## warwick: I'm sure this is wrong. Fixed in 2.3. - int extra = style().pixelMetric(TQStyle::PM_ScrollBarExtent, - verticalScrollBar()) + 2*frameWidth(); - TQSize s( TQMIN(400, contentsWidth() + extra), - TQMIN(400, contentsHeight() + extra) ); - return s; -} - -/*! - \internal -*/ - -void TQIconView::updateContents() -{ - viewport()->update(); -} - -/*! - \reimp -*/ - -void TQIconView::enterEvent( TQEvent *e ) -{ - TQScrollView::enterEvent( e ); - emit onViewport(); -} - -/*! - \internal - This function is always called when the geometry of an item changes. - This function moves the item into the correct area in the internal - data structure. -*/ - -void TQIconView::updateItemContainer( TQIconViewItem *item ) -{ - if ( !item || d->containerUpdateLocked || (!isVisible() && autoArrange()) ) - return; - - if ( item->d->container1 && d->firstContainer ) { - //Special-case to check if we can use removeLast otherwise use removeRef (slower) - if (item->d->container1->items.last() == item) - item->d->container1->items.removeLast(); - else - item->d->container1->items.removeRef( item ); - } - item->d->container1 = 0; - if ( item->d->container2 && d->firstContainer ) { - //Special-case to check if we can use removeLast otherwise use removeRef (slower) - if (item->d->container2->items.last() == item) - item->d->container2->items.removeLast(); - else - item->d->container2->items.removeRef( item ); - } - item->d->container2 = 0; - - TQIconViewPrivate::ItemContainer *c = d->firstContainer; - if ( !c ) { - appendItemContainer(); - c = d->firstContainer; - } - - const TQRect irect = item->rect(); - bool contains = FALSE; - for (;;) { - if ( c->rect.intersects( irect ) ) { - contains = c->rect.contains( irect ); - break; - } - - c = c->n; - if ( !c ) { - appendItemContainer(); - c = d->lastContainer; - } - } - - if ( !c ) { -#if defined(QT_CHECK_RANGE) - tqWarning( "TQIconViewItem::updateItemContainer(): No fitting container found!" ); -#endif - return; - } - - if (item->isVisible()) { - c->items.append( item ); - item->d->container1 = c; - - if ( !contains ) { - c = c->n; - if ( !c ) { - appendItemContainer(); - c = d->lastContainer; - } - c->items.append( item ); - item->d->container2 = c; - } - } - if ( contentsWidth() < irect.right() || contentsHeight() < irect.bottom() ) - resizeContents( TQMAX( contentsWidth(), irect.right() ), TQMAX( contentsHeight(), irect.bottom() ) ); -} - -/*! - \internal - Appends a new rect area to the internal data structure of the items. -*/ - -void TQIconView::appendItemContainer() -{ - TQSize s; - // #### We have to find out which value is best here - if ( d->arrangement == LeftToRight ) - s = TQSize( INT_MAX - 1, RECT_EXTENSION ); - else - s = TQSize( RECT_EXTENSION, INT_MAX - 1 ); - - if ( !d->firstContainer ) { - d->firstContainer = new TQIconViewPrivate::ItemContainer( 0, 0, TQRect( TQPoint( 0, 0 ), s ) ); - d->lastContainer = d->firstContainer; - } else { - if ( d->arrangement == LeftToRight ) - d->lastContainer = new TQIconViewPrivate::ItemContainer( - d->lastContainer, 0, TQRect( d->lastContainer->rect.bottomLeft(), s ) ); - else - d->lastContainer = new TQIconViewPrivate::ItemContainer( - d->lastContainer, 0, TQRect( d->lastContainer->rect.topRight(), s ) ); - } -} - -/*! \internal - - Rebuilds the whole internal data structure. This is done when it's - likely that most/all items change their geometry (e.g. in - arrangeItemsInGrid()), because calling this is then more efficient - than calling updateItemContainer() for each item. -*/ - -void TQIconView::rebuildContainers() -{ - TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; - while ( c ) { - tmpc = c->n; - delete c; - c = tmpc; - } - d->firstContainer = d->lastContainer = 0; - - TQIconViewItem *item = d->firstItem; - appendItemContainer(); - c = d->lastContainer; - while ( item ) { - if (item->isVisible()) { - if ( c->rect.contains( item->rect() ) ) { - item->d->container1 = c; - item->d->container2 = 0; - c->items.append( item ); - item = item->next; - } else if ( c->rect.intersects( item->rect() ) ) { - item->d->container1 = c; - c->items.append( item ); - c = c->n; - if ( !c ) { - appendItemContainer(); - c = d->lastContainer; - } - c->items.append( item ); - item->d->container2 = c; - item = item->next; - c = c->p; - } else { - if ( d->arrangement == LeftToRight ) { - if ( item->y() < c->rect.y() && c->p ) { - c = c->p; - continue; - } - } else { - if ( item->x() < c->rect.x() && c->p ) { - c = c->p; - continue; - } - } - - c = c->n; - if ( !c ) { - appendItemContainer(); - c = d->lastContainer; - } - } - } - else { - // Skip this hidden item - item = item->next; - } - } -} - -/*! - \internal -*/ - -void TQIconView::movedContents( int, int ) -{ - if ( d->drawDragShapes ) { - drawDragShapes( d->oldDragPos ); - d->oldDragPos = TQPoint( -1, -1 ); - } -} - -void TQIconView::handleItemChange( TQIconViewItem *old, bool shift, - bool control, bool homeend ) -{ - if ( d->selectionMode == Single ) { - bool block = signalsBlocked(); - blockSignals( TRUE ); - if ( old ) - old->setSelected( FALSE ); - blockSignals( block ); - d->currentItem->setSelected( TRUE, TRUE ); - } else if ( d->selectionMode == Extended ) { - if ( shift ) { - if ( !d->selectAnchor ) { - if ( old && !old->selected && old->isSelectable() ) { - old->selected = TRUE; - repaintItem( old ); - } - d->currentItem->setSelected( TRUE, TRUE ); - } else { - TQIconViewItem *from = d->selectAnchor, *to = d->currentItem; - if ( !from || !to ) - return; - - // checking if it's downwards and if we span rows - bool downwards = FALSE; - bool spanning = FALSE; - if ( d->arrangement == LeftToRight) { - if ( from->rect().center().y() < to->rect().center().y() ) - downwards = TRUE; - } else { - if ( from->rect().center().x() < to->rect().center().x() ) - downwards = TRUE; - } - - TQRect fr = from->rect(); - TQRect tr = to->rect(); - if ( d->arrangement == LeftToRight ) { - fr.moveTopLeft( TQPoint( tr.x(), fr.y() ) ); - if ( !tr.intersects( fr ) ) - spanning = TRUE; - } else { - fr.moveTopLeft( TQPoint( fr.x(), tr.y() ) ); - if ( !tr.intersects( fr ) ) - spanning = TRUE; - } - - - // finding the rectangles - TQRect topRect, bottomRect, midRect; - if ( !spanning ) { - midRect = from->rect().unite( to->rect() ); - } else { - if ( downwards ) { - topRect = from->rect(); - bottomRect = to->rect(); - } else { - topRect = to->rect(); - bottomRect = from->rect(); - } - if ( d->arrangement == LeftToRight ) { - topRect.setRight( contentsWidth() ); - bottomRect.setLeft( 0 ); - midRect.setRect( 0, topRect.bottom(), - contentsWidth(), - bottomRect.top() - topRect.bottom() ); - } else { - topRect.setBottom( contentsHeight() ); - bottomRect.setTop( 0 ); - midRect.setRect( topRect.right(), - 0, - bottomRect.left() - topRect.right(), - contentsHeight() ); - } - } - - // finding contained items and selecting them - TQIconViewItem *item = 0; - bool changed = FALSE; - bool midValid = midRect.isValid(); - bool topValid = topRect.isValid(); - bool bottomValid = bottomRect.isValid(); - TQRect selectedRect, unselectedRect; - for ( item = d->firstItem; item; item = item->next ) { - bool contained = FALSE; - TQPoint itemCenter = item->rect().center(); - if ( midValid && midRect.contains( itemCenter ) ) - contained = TRUE; - if ( !contained && topValid && topRect.contains( itemCenter ) ) - contained = TRUE; - if ( !contained && bottomValid && bottomRect.contains( itemCenter ) ) - contained = TRUE; - - if ( contained ) { - if ( !item->selected && item->isSelectable() ) { - changed = TRUE; - item->selected = TRUE; - selectedRect = selectedRect.unite( item->rect() ); - } - } else if ( item->selected && !control ) { - item->selected = FALSE; - unselectedRect = unselectedRect.unite( item->rect() ); - changed = TRUE; - } - } - - TQRect viewRect( contentsX(), contentsY(), - visibleWidth(), visibleHeight() ); - - if ( viewRect.intersects( selectedRect ) ) { - if ( homeend ) - TQScrollView::updateContents( viewRect.intersect( selectedRect ) ); - else - repaintContents( viewRect.intersect( selectedRect ) ); - } - if ( viewRect.intersects( unselectedRect ) ) { - if ( homeend ) - TQScrollView::updateContents( viewRect.intersect( unselectedRect ) ); - else - repaintContents( viewRect.intersect( unselectedRect ) ); - } - - if ( changed ) - emit selectionChanged(); - } - } else if ( !control ) { - blockSignals( TRUE ); - selectAll( FALSE ); - blockSignals( FALSE ); - d->currentItem->setSelected( TRUE, TRUE ); - } - } else { - if ( shift ) - d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE ); - } -} - -TQBitmap TQIconView::mask( TQPixmap *pix ) const -{ - TQBitmap m; - if ( d->maskCache.find( TQString::number( pix->serialNumber() ), m ) ) - return m; - m = pix->createHeuristicMask(); - d->maskCache.insert( TQString::number( pix->serialNumber() ), m ); - return m; -} - -/*! - \reimp - \internal - - (Implemented to get rid of a compiler warning.) -*/ -void TQIconView::drawContents( TQPainter * ) -{ -} - -/*! - \reimp -*/ -void TQIconView::windowActivationChange( bool oldActive ) -{ - if ( oldActive && d->scrollTimer ) - d->scrollTimer->stop(); - - if ( !isVisible() ) - return; - - if ( palette().active() == palette().inactive() ) - return; - - repaintSelectedItems(); -} - -/*! - Returns TRUE if an iconview item is being renamed; otherwise - returns FALSE. -*/ - -bool TQIconView::isRenaming() const -{ -#ifndef QT_NO_TEXTEDIT - return d->renamingItem && d->renamingItem->renameBox; -#else - return FALSE; -#endif -} - -int TQIconView::visibleWidthSB() const -{ - if ( vScrollBarMode() != Auto ) - return visibleWidth(); - - int offset = verticalScrollBar()->isVisible() ? 0 - : style().pixelMetric( TQStyle::PM_ScrollBarExtent, verticalScrollBar() ); - return TQMAX( 0, visibleWidth() - offset ); -} - -int TQIconView::visibleHeightSB() const -{ - if ( hScrollBarMode() != Auto ) - return visibleHeight(); - - int offset = horizontalScrollBar()->isVisible() ? 0 - : style().pixelMetric( TQStyle::PM_ScrollBarExtent, horizontalScrollBar() ); - return TQMAX( 0, visibleHeight() - offset ); -} - -#endif // QT_NO_ICONVIEW diff --git a/src/iconview/qt_iconview.pri b/src/iconview/qt_iconview.pri deleted file mode 100644 index df1613b5d..000000000 --- a/src/iconview/qt_iconview.pri +++ /dev/null @@ -1,6 +0,0 @@ -# Qt iconview module - -iconview { - HEADERS += $$ICONVIEW_H/ntqiconview.h - SOURCES += $$ICONVIEW_CPP/qiconview.cpp -} diff --git a/src/qt.pro b/src/qt.pro index b2e0d1afb..d35364259 100644 --- a/src/qt.pro +++ b/src/qt.pro @@ -31,7 +31,6 @@ WIDGETS_CPP = widgets SQL_CPP = sql TABLE_CPP = table DIALOGS_CPP = dialogs -ICONVIEW_CPP = iconview NETWORK_CPP = network OPENGL_CPP = opengl TOOLS_CPP = tools @@ -49,7 +48,6 @@ win32 { WIDGETS_H = $$WIDGETS_CPP TABLE_H = $$TABLE_CPP DIALOGS_H = $$DIALOGS_CPP - ICONVIEW_H = $$ICONVIEW_CPP NETWORK_H = $$NETWORK_CPP OPENGL_H = $$OPENGL_CPP TOOLS_H = $$TOOLS_CPP @@ -66,7 +64,6 @@ win32 { WIDGETS_H = $$WIN_ALL_H TABLE_H = $$WIN_ALL_H DIALOGS_H = $$WIN_ALL_H - ICONVIEW_H = $$WIN_ALL_H NETWORK_H = $$WIN_ALL_H OPENGL_H = $$WIN_ALL_H TOOLS_H = $$WIN_ALL_H @@ -95,7 +92,6 @@ unix { SQL_H = $$SQL_CPP TABLE_H = $$TABLE_CPP DIALOGS_H = $$DIALOGS_CPP - ICONVIEW_H = $$ICONVIEW_CPP NETWORK_H = $$NETWORK_CPP OPENGL_H = $$OPENGL_CPP TOOLS_H = $$TOOLS_CPP @@ -117,7 +113,7 @@ embedded { } DEPENDPATH += ;$$NETWORK_H;$$KERNEL_H;$$WIDGETS_H;$$INPUTMETHOD_H;$$SQL_H;$$TABLE_H;$$DIALOGS_H; -DEPENDPATH += $$ICONVIEW_H;$$OPENGL_H;$$TOOLS_H;$$CODECS_H;$$WORKSPACE_H;$$XML_H; +DEPENDPATH += $$OPENGL_H;$$TOOLS_H;$$CODECS_H;$$WORKSPACE_H;$$XML_H; DEPENDPATH += $$CANVAS_H;$$STYLES_H embedded:DEPENDPATH += ;$$EMBEDDED_H @@ -149,7 +145,6 @@ embedded:include($$KERNEL_CPP/qt_qws.pri) include($$KERNEL_CPP/qt_kernel.pri) include($$WIDGETS_CPP/qt_widgets.pri) include($$DIALOGS_CPP/qt_dialogs.pri) -include($$ICONVIEW_CPP/qt_iconview.pri) include($$WORKSPACE_CPP/qt_workspace.pri) include($$INPUTMETHOD_CPP/qt_inputmethod.pri) include($$NETWORK_CPP/qt_network.pri) diff --git a/src/qt_professional.pri b/src/qt_professional.pri index 6320b9c57..38375d490 100644 --- a/src/qt_professional.pri +++ b/src/qt_professional.pri @@ -46,21 +46,6 @@ DEFINES *= TQT_MODULE_WORKSPACE } -!iconview:contains( DEFINES, QT_INTERNAL_ICONVIEW ) { - CONFIG += iconview - ICONVIEW_CPP = $$QT_SOURCE_TREE/src/iconview - win32 { - WIN_ALL_H = $$QT_SOURCE_TREE/include - ICONVIEW_H = $$WIN_ALL_H - } - unix { - ICONVIEW_H = $$ICONVIEW_CPP - } - INCLUDEPATH += $$QT_SOURCE_TREE/src/iconview - include( $$QT_SOURCE_TREE/src/iconview/qt_iconview.pri ) - DEFINES *= TQT_MODULE_ICONVIEW -} - !canvas:contains( DEFINES, QT_INTERNAL_CANVAS ) { CONFIG += canvas CANVAS_CPP = $$QT_SOURCE_TREE/src/canvas diff --git a/src/tools/ntqglobal.h b/src/tools/ntqglobal.h index 7b54c340a..db41468f1 100644 --- a/src/tools/ntqglobal.h +++ b/src/tools/ntqglobal.h @@ -791,12 +791,6 @@ class TQDataStream; #ifndef TQT_MODULE_DIALOGS # define QT_NO_DIALOG #endif -#ifndef TQT_MODULE_ICONVIEW -# define QT_NO_ICONVIEW -#endif -#ifndef TQT_MODULE_WORKSPACE -# define QT_NO_WORKSPACE -#endif #ifndef TQT_MODULE_NETWORK #define QT_NO_NETWORK #endif diff --git a/src/widgets/ntqiconview.h b/src/widgets/ntqiconview.h new file mode 100644 index 000000000..f40205193 --- /dev/null +++ b/src/widgets/ntqiconview.h @@ -0,0 +1,515 @@ +/**************************************************************************** +** +** Definition of TQIconView widget class +** +** Created : 990707 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the iconview module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#ifndef TQICONVIEW_H +#define TQICONVIEW_H + +#ifndef QT_H +#include "ntqscrollview.h" +#include "ntqstring.h" +#include "ntqrect.h" +#include "ntqpoint.h" +#include "ntqsize.h" +#include "ntqfont.h" // TQString->TQFont conversion +#include "ntqdragobject.h" +#include "ntqbitmap.h" +#include "ntqpicture.h" +#endif // QT_H + +#ifndef QT_NO_ICONVIEW + +class TQIconView; +class TQPainter; +class TQMimeSource; +class TQMouseEvent; +class TQDragEnterEvent; +class TQDragMoveEvent; +class TQDragLeaveEvent; +class TQKeyEvent; +class TQFocusEvent; +class TQShowEvent; +class TQIconViewItem; +class TQIconViewItemLineEdit; +class TQStringList; +class TQIconDragPrivate; + +#ifndef QT_NO_DRAGANDDROP + +class Q_EXPORT TQIconDragItem +{ +public: + TQIconDragItem(); + virtual ~TQIconDragItem(); + virtual TQByteArray data() const; + virtual void setData( const TQByteArray &d ); + bool operator== ( const TQIconDragItem& ) const; + +private: + TQByteArray ba; + +}; + +class Q_EXPORT TQIconDrag : public TQDragObject +{ + TQ_OBJECT +public: + TQIconDrag( TQWidget * dragSource, const char* name = 0 ); + virtual ~TQIconDrag(); + + void append( const TQIconDragItem &item, const TQRect &pr, const TQRect &tr ); + + virtual const char* format( int i ) const; + static bool canDecode( TQMimeSource* e ); + virtual TQByteArray encodedData( const char* mime ) const; + +private: + TQIconDragPrivate *d; + TQChar endMark; + + friend class TQIconView; + friend class TQIconViewPrivate; +#if defined(TQ_DISABLE_COPY) // Disabled copy constructor and operator= + TQIconDrag( const TQIconDrag & ); + TQIconDrag &operator=( const TQIconDrag & ); +#endif +}; + +#endif + +class TQIconViewToolTip; +class TQIconViewItemPrivate; + +class Q_EXPORT TQIconViewItem : public TQt +{ + friend class TQIconView; + friend class TQIconViewToolTip; + friend class TQIconViewItemLineEdit; + +public: + TQIconViewItem( TQIconView *parent ); + TQIconViewItem( TQIconView *parent, TQIconViewItem *after ); + TQIconViewItem( TQIconView *parent, const TQString &text ); + TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text ); + TQIconViewItem( TQIconView *parent, const TQString &text, const TQPixmap &icon ); + TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text, const TQPixmap &icon ); +#ifndef QT_NO_PICTURE + TQIconViewItem( TQIconView *parent, const TQString &text, const TQPicture &picture ); + TQIconViewItem( TQIconView *parent, TQIconViewItem *after, const TQString &text, const TQPicture &picture ); +#endif + virtual ~TQIconViewItem(); + + virtual void setRenameEnabled( bool allow ); + virtual void setDragEnabled( bool allow ); + virtual void setDropEnabled( bool allow ); + + virtual TQString text() const; + virtual TQPixmap *pixmap() const; +#ifndef QT_NO_PICTURE + virtual TQPicture *picture() const; +#endif + virtual TQString key() const; + + bool renameEnabled() const; + bool dragEnabled() const; + bool dropEnabled() const; + + TQIconView *iconView() const; + TQIconViewItem *prevItem() const; + TQIconViewItem *nextItem() const; + + int index() const; + + virtual void setSelected( bool s, bool cb ); + virtual void setSelected( bool s ); + virtual void setSelectable( bool s ); + + bool isSelected() const; + bool isSelectable() const; + + void setVisible( bool b ); + bool isVisible() const; + + virtual void repaint(); + + virtual bool move( int x, int y ); + virtual void moveBy( int dx, int dy ); + virtual bool move( const TQPoint &pnt ); + virtual void moveBy( const TQPoint &pnt ); + + TQRect rect() const; + int x() const; + int y() const; + int width() const; + int height() const; + TQSize size() const; + TQPoint pos() const; + TQRect textRect( bool relative = TRUE ) const; + TQRect pixmapRect( bool relative = TRUE ) const; + bool contains( const TQPoint& pnt ) const; + bool intersects( const TQRect& r ) const; + + virtual bool acceptDrop( const TQMimeSource *mime ) const; + +#ifndef QT_NO_TEXTEDIT + void rename(); +#endif + + virtual int compare( TQIconViewItem *i ) const; + + virtual void setText( const TQString &text ); + virtual void setPixmap( const TQPixmap &icon ); +#ifndef QT_NO_PICTURE + virtual void setPicture( const TQPicture &icon ); +#endif + virtual void setText( const TQString &text, bool recalc, bool redraw = TRUE ); + virtual void setPixmap( const TQPixmap &icon, bool recalc, bool redraw = TRUE ); + virtual void setKey( const TQString &k ); + + virtual int rtti() const; + static int RTTI; + +protected: +#ifndef QT_NO_TEXTEDIT + virtual void removeRenameBox(); +#endif + virtual void calcRect( const TQString &text_ = TQString::null ); + virtual void paintItem( TQPainter *p, const TQColorGroup &cg ); + virtual void paintFocus( TQPainter *p, const TQColorGroup &cg ); +#ifndef QT_NO_DRAGANDDROP + virtual void dropped( TQDropEvent *e, const TQValueList &lst ); +#endif + virtual void dragEntered(); + virtual void dragLeft(); + void setItemRect( const TQRect &r ); + void setTextRect( const TQRect &r ); + void setPixmapRect( const TQRect &r ); + void calcTmpText(); + TQString tempText() const; + +private: + void init( TQIconViewItem *after = 0 +#ifndef QT_NO_PICTURE + , TQPicture *pic = 0 +#endif + ); +#ifndef QT_NO_TEXTEDIT + void renameItem(); + void cancelRenameItem(); +#endif + void checkRect(); + + TQIconView *view; + TQString itemText, itemKey; + TQString tmpText; + TQPixmap *itemIcon; +#ifndef QT_NO_PICTURE + TQPicture *itemPic; +#endif + TQIconViewItem *prev, *next; + uint allow_rename : 1; + uint allow_drag : 1; + uint allow_drop : 1; + uint visible : 1; + uint selected : 1; + uint selectable : 1; + uint dirty : 1; + uint wordWrapDirty : 1; + TQRect itemRect, itemTextRect, itemIconRect; +#ifndef QT_NO_TEXTEDIT + TQIconViewItemLineEdit *renameBox; +#endif + TQRect oldRect; + + TQIconViewItemPrivate *d; + +}; + +class TQIconViewPrivate; /* don't touch */ + +class Q_EXPORT TQIconView : public TQScrollView +{ + friend class TQIconViewItem; + friend class TQIconViewPrivate; + friend class TQIconViewToolTip; + + TQ_OBJECT + // #### sorting and sort direction do not work + TQ_ENUMS( SelectionMode ItemTextPos Arrangement ResizeMode ) + TQ_PROPERTY( bool sorting READ sorting ) + TQ_PROPERTY( bool sortDirection READ sortDirection ) + TQ_PROPERTY( SelectionMode selectionMode READ selectionMode WRITE setSelectionMode ) + TQ_PROPERTY( int gridX READ gridX WRITE setGridX ) + TQ_PROPERTY( int gridY READ gridY WRITE setGridY ) + TQ_PROPERTY( int spacing READ spacing WRITE setSpacing ) + TQ_PROPERTY( ItemTextPos itemTextPos READ itemTextPos WRITE setItemTextPos ) + TQ_PROPERTY( TQBrush itemTextBackground READ itemTextBackground WRITE setItemTextBackground ) + TQ_PROPERTY( Arrangement arrangement READ arrangement WRITE setArrangement ) + TQ_PROPERTY( ResizeMode resizeMode READ resizeMode WRITE setResizeMode ) + TQ_PROPERTY( int maxItemWidth READ maxItemWidth WRITE setMaxItemWidth ) + TQ_PROPERTY( int maxItemTextLength READ maxItemTextLength WRITE setMaxItemTextLength ) + TQ_PROPERTY( bool autoArrange READ autoArrange WRITE setAutoArrange ) + TQ_PROPERTY( bool itemsMovable READ itemsMovable WRITE setItemsMovable ) + TQ_PROPERTY( bool wordWrapIconText READ wordWrapIconText WRITE setWordWrapIconText ) + TQ_PROPERTY( bool showToolTips READ showToolTips WRITE setShowToolTips ) + TQ_PROPERTY( uint count READ count ) + +public: + enum SelectionMode { + Single = 0, + Multi, + Extended, + NoSelection + }; + enum Arrangement { + LeftToRight = 0, + TopToBottom + }; + enum ResizeMode { + Fixed = 0, + Adjust + }; + enum ItemTextPos { + Bottom = 0, + Right + }; + + TQIconView( TQWidget* parent=0, const char* name=0, WFlags f = 0 ); + virtual ~TQIconView(); + + virtual void insertItem( TQIconViewItem *item, TQIconViewItem *after = 0L ); + virtual void takeItem( TQIconViewItem *item ); + + int index( const TQIconViewItem *item ) const; + + TQIconViewItem *firstItem() const; + TQIconViewItem *lastItem() const; + TQIconViewItem *currentItem() const; + virtual void setCurrentItem( TQIconViewItem *item ); + virtual void setSelected( TQIconViewItem *item, bool s, bool cb = FALSE ); + + uint count() const; + +public: + virtual void showEvent( TQShowEvent * ); + + virtual void setSelectionMode( SelectionMode m ); + SelectionMode selectionMode() const; + + TQIconViewItem *findItem( const TQPoint &pos ) const; + TQIconViewItem *findItem( const TQString &text, ComparisonFlags compare = BeginsWith ) const; + virtual void selectAll( bool select ); + virtual void clearSelection(); + virtual void invertSelection(); + + virtual void repaintItem( TQIconViewItem *item ); + void repaintSelectedItems(); + + void ensureItemVisible( TQIconViewItem *item ); + TQIconViewItem* findFirstVisibleItem( const TQRect &r ) const; + TQIconViewItem* findLastVisibleItem( const TQRect &r ) const; + + virtual void clear(); + + virtual void setGridX( int rx ); + virtual void setGridY( int ry ); + int gridX() const; + int gridY() const; + virtual void setSpacing( int sp ); + int spacing() const; + virtual void setItemTextPos( ItemTextPos pos ); + ItemTextPos itemTextPos() const; + virtual void setItemTextBackground( const TQBrush &b ); + TQBrush itemTextBackground() const; + virtual void setArrangement( Arrangement am ); + Arrangement arrangement() const; + virtual void setResizeMode( ResizeMode am ); + ResizeMode resizeMode() const; + virtual void setMaxItemWidth( int w ); + int maxItemWidth() const; + virtual void setMaxItemTextLength( int w ); + int maxItemTextLength() const; + virtual void setAutoArrange( bool b ); + bool autoArrange() const; + virtual void setShowToolTips( bool b ); + bool showToolTips() const; + + void setSorting( bool sort, bool ascending = TRUE ); + bool sorting() const; + bool sortDirection() const; + + virtual void setItemsMovable( bool b ); + bool itemsMovable() const; + virtual void setWordWrapIconText( bool b ); + bool wordWrapIconText() const; + + bool eventFilter( TQObject * o, TQEvent * ); + + TQSize minimumSizeHint() const; + TQSize sizeHint() const; + + virtual void sort( bool ascending = TRUE ); + + virtual void setFont( const TQFont & ); + virtual void setPalette( const TQPalette & ); + + bool isRenaming() const; + +public slots: + virtual void arrangeItemsInGrid( const TQSize &grid, bool update = TRUE ); + virtual void arrangeItemsInGrid( bool update = TRUE ); + virtual void setContentsPos( int x, int y ); + virtual void updateContents(); + +signals: + void selectionChanged(); + void selectionChanged( TQIconViewItem *item ); + void currentChanged( TQIconViewItem *item ); + void clicked( TQIconViewItem * ); + void clicked( TQIconViewItem *, const TQPoint & ); + void pressed( TQIconViewItem * ); + void pressed( TQIconViewItem *, const TQPoint & ); + + void doubleClicked( TQIconViewItem *item ); + void returnPressed( TQIconViewItem *item ); + void rightButtonClicked( TQIconViewItem* item, const TQPoint& pos ); + void rightButtonPressed( TQIconViewItem* item, const TQPoint& pos ); + void mouseButtonPressed( int button, TQIconViewItem* item, const TQPoint& pos ); + void mouseButtonClicked( int button, TQIconViewItem* item, const TQPoint& pos ); + void contextMenuRequested( TQIconViewItem* item, const TQPoint &pos ); + +#ifndef QT_NO_DRAGANDDROP + void dropped( TQDropEvent *e, const TQValueList &lst ); +#endif + void moved(); + void onItem( TQIconViewItem *item ); + void onViewport(); + void itemRenamed( TQIconViewItem *item, const TQString & ); + void itemRenamed( TQIconViewItem *item ); + +protected slots: + virtual void doAutoScroll(); + virtual void adjustItems(); + virtual void slotUpdate(); + +private slots: + void movedContents( int dx, int dy ); + +protected: + void drawContents( TQPainter *p, int cx, int cy, int cw, int ch ); + void contentsMousePressEvent( TQMouseEvent *e ); + void contentsMouseReleaseEvent( TQMouseEvent *e ); + void contentsMouseMoveEvent( TQMouseEvent *e ); + void contentsMouseDoubleClickEvent( TQMouseEvent *e ); + void contentsContextMenuEvent( TQContextMenuEvent *e ); + +#ifndef QT_NO_DRAGANDDROP + void contentsDragEnterEvent( TQDragEnterEvent *e ); + void contentsDragMoveEvent( TQDragMoveEvent *e ); + void contentsDragLeaveEvent( TQDragLeaveEvent *e ); + void contentsDropEvent( TQDropEvent *e ); +#endif + + void bufferedPaintEvent( TQPaintEvent* ); + void resizeEvent( TQResizeEvent* e ); + void keyPressEvent( TQKeyEvent *e ); + void focusInEvent( TQFocusEvent *e ); + void focusOutEvent( TQFocusEvent *e ); + void enterEvent( TQEvent *e ); + + virtual void drawRubber( TQPainter *p ); +#ifndef QT_NO_DRAGANDDROP + virtual TQDragObject *dragObject(); + virtual void startDrag(); +#endif + virtual void insertInGrid( TQIconViewItem *item ); + virtual void drawBackground( TQPainter *p, const TQRect &r ); + + void emitSelectionChanged( TQIconViewItem * i = 0 ); + void emitRenamed( TQIconViewItem *item ); + + TQIconViewItem *makeRowLayout( TQIconViewItem *begin, int &y, bool &changed ); + + void styleChange( TQStyle& ); + void windowActivationChange( bool ); + +private: + void contentsMousePressEventEx( TQMouseEvent *e ); + virtual void drawDragShapes( const TQPoint &pnt ); +#ifndef QT_NO_DRAGANDDROP + virtual void initDragEnter( TQDropEvent *e ); +#endif + void drawContents( TQPainter* ); + TQIconViewItem* findItemByName( TQIconViewItem *start ); + void handleItemChange( TQIconViewItem *old, bool shift, + bool control, bool homeend = FALSE); + + int calcGridNum( int w, int x ) const; + TQIconViewItem *rowBegin( TQIconViewItem *item ) const; + void updateItemContainer( TQIconViewItem *item ); + void appendItemContainer(); + void rebuildContainers(); + enum Direction { + DirUp = 0, + DirDown, + DirLeft, + DirRight + }; + TQIconViewItem* findItem( Direction dir, + const TQPoint &relativeTo, + const TQRect &searchRect ) const; + bool neighbourItem( Direction dir, + const TQPoint &relativeTo, + const TQIconViewItem *item ) const; + TQBitmap mask( TQPixmap *pix ) const; + int visibleWidthSB() const; + int visibleHeightSB() const; + + TQIconViewPrivate *d; + +private: // Disabled copy constructor and operator= +#if defined(TQ_DISABLE_COPY) + TQIconView( const TQIconView & ); + TQIconView& operator=( const TQIconView & ); +#endif +}; + +#endif // QT_NO_ICONVIEW + +#endif // TQICONVIEW_H diff --git a/src/widgets/qiconview.cpp b/src/widgets/qiconview.cpp new file mode 100644 index 000000000..ac1510b9c --- /dev/null +++ b/src/widgets/qiconview.cpp @@ -0,0 +1,6640 @@ +/**************************************************************************** +** +** Implementation of TQIconView widget class +** +** Created : 990707 +** +** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the iconview module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing requirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#include "ntqglobal.h" +#if defined(Q_CC_BOR) +// needed for qsort() because of a std namespace problem on Borland +#include "qplatformdefs.h" +#endif + +#include "ntqiconview.h" + +#ifndef QT_NO_ICONVIEW + +#include "ntqfontmetrics.h" +#include "ntqpainter.h" +#include "ntqevent.h" +#include "ntqpalette.h" +#include "ntqmime.h" +#include "ntqimage.h" +#include "ntqpen.h" +#include "ntqbrush.h" +#include "ntqtimer.h" +#include "ntqcursor.h" +#include "ntqapplication.h" +#include "ntqtextedit.h" +#include "ntqmemarray.h" +#include "ntqptrlist.h" +#include "ntqvbox.h" +#include "ntqtooltip.h" +#include "ntqbitmap.h" +#include "ntqpixmapcache.h" +#include "ntqptrdict.h" +#include "ntqstringlist.h" +#include "ntqcleanuphandler.h" +#include "private/qrichtext_p.h" +#include "ntqstyle.h" + +#include +#include + +#define RECT_EXTENSION 300 + +static const char * const unknown_xpm[] = { + "32 32 11 1", + "c c #ffffff", + "g c #c0c0c0", + "a c #c0ffc0", + "h c #a0a0a4", + "d c #585858", + "f c #303030", + "i c #400000", + "b c #00c000", + "e c #000000", + "# c #000000", + ". c None", + "...###..........................", + "...#aa##........................", + ".###baaa##......................", + ".#cde#baaa##....................", + ".#cccdeebaaa##..##f.............", + ".#cccccdeebaaa##aaa##...........", + ".#cccccccdeebaaaaaaaa##.........", + ".#cccccccccdeebaaaaaaa#.........", + ".#cccccgcgghhebbbbaaaaa#........", + ".#ccccccgcgggdebbbbbbaa#........", + ".#cccgcgcgcgghdeebiebbba#.......", + ".#ccccgcggggggghdeddeeba#.......", + ".#cgcgcgcggggggggghghdebb#......", + ".#ccgcggggggggghghghghd#b#......", + ".#cgcgcggggggggghghghhd#b#......", + ".#gcggggggggghghghhhhhd#b#......", + ".#cgcggggggggghghghhhhd#b#......", + ".#ggggggggghghghhhhhhhdib#......", + ".#gggggggggghghghhhhhhd#b#......", + ".#hhggggghghghhhhhhhhhd#b#......", + ".#ddhhgggghghghhhhhhhhd#b#......", + "..##ddhhghghhhhhhhhhhhdeb#......", + "....##ddhhhghhhhhhhhhhd#b#......", + "......##ddhhhhhhhhhhhhd#b#......", + "........##ddhhhhhhhhhhd#b#......", + "..........##ddhhhhhhhhd#b#......", + "............##ddhhhhhhd#b###....", + "..............##ddhhhhd#b#####..", + "................##ddhhd#b######.", + "..................##dddeb#####..", + "....................##d#b###....", + "......................####......"}; + +static TQPixmap *unknown_icon = 0; +static TQPixmap *qiv_buffer_pixmap = 0; +#if !defined(Q_WS_X11) +static TQPixmap *qiv_selection = 0; +#endif +static bool optimize_layout = FALSE; + +static TQCleanupHandler qiv_cleanup_pixmap; + +#if !defined(Q_WS_X11) +static void createSelectionPixmap( const TQColorGroup &cg ) +{ + TQBitmap m( 2, 2 ); + m.fill( TQt::color1 ); + TQPainter p( &m ); + p.setPen( TQt::color0 ); + for ( int j = 0; j < 2; ++j ) { + p.drawPoint( j % 2, j ); + } + p.end(); + + qiv_selection = new TQPixmap( 2, 2 ); + qiv_cleanup_pixmap.add( &qiv_selection ); + qiv_selection->fill( TQt::color0 ); + qiv_selection->setMask( m ); + qiv_selection->fill( cg.highlight() ); +} +#endif + +static TQPixmap *get_qiv_buffer_pixmap( const TQSize &s ) +{ + if ( !qiv_buffer_pixmap ) { + qiv_buffer_pixmap = new TQPixmap( s ); + qiv_cleanup_pixmap.add( &qiv_buffer_pixmap ); + return qiv_buffer_pixmap; + } + + qiv_buffer_pixmap->resize( s ); + return qiv_buffer_pixmap; +} + +#ifndef QT_NO_DRAGANDDROP + +class Q_EXPORT TQIconDragData +{ +public: + TQIconDragData(); + TQIconDragData( const TQRect &ir, const TQRect &tr ); + + TQRect pixmapRect() const; + TQRect textRect() const; + + void setPixmapRect( const TQRect &r ); + void setTextRect( const TQRect &r ); + + TQRect iconRect_, textRect_; + TQString key_; + + bool operator==( const TQIconDragData &i ) const; +}; + +class Q_EXPORT TQIconDragDataItem +{ +public: + TQIconDragDataItem() {} + TQIconDragDataItem( const TQIconDragItem &i1, const TQIconDragData &i2 ) : data( i1 ), item( i2 ) {} + TQIconDragItem data; + TQIconDragData item; + bool operator== ( const TQIconDragDataItem& ) const; +}; + +class TQIconDragPrivate +{ +public: + TQValueList items; + static bool decode( TQMimeSource* e, TQValueList &lst ); +}; + +#endif + +class TQIconViewToolTip; + +class TQIconViewPrivate +{ +public: + TQIconViewItem *firstItem, *lastItem; + uint count; + TQIconView::SelectionMode selectionMode; + TQIconViewItem *currentItem, *tmpCurrentItem, *highlightedItem, + *startDragItem, *pressedItem, *selectAnchor, *renamingItem; + TQRect *rubber; + TQPixmap *backBuffer; + TQTimer *scrollTimer, *adjustTimer, *updateTimer, *inputTimer, + *fullRedrawTimer; + int rastX, rastY, spacing; + int dragItems; + TQPoint oldDragPos; + TQIconView::Arrangement arrangement; + TQIconView::ResizeMode resizeMode; + TQSize oldSize; +#ifndef QT_NO_DRAGANDDROP + TQValueList iconDragData; +#endif + int numDragItems, cachedW, cachedH; + int maxItemWidth, maxItemTextLength; + TQPoint dragStart; + TQString currInputString; + TQIconView::ItemTextPos itemTextPos; +#ifndef QT_NO_CURSOR + TQCursor oldCursor; +#endif + int cachedContentsX, cachedContentsY; + TQBrush itemTextBrush; + TQRegion clipRegion; + TQPoint dragStartPos; + TQFontMetrics *fm; + int minLeftBearing, minRightBearing; + int rubberStartX, rubberStartY; + + uint mousePressed :1; + uint cleared :1; + uint dropped :1; + uint clearing :1; + uint oldDragAcceptAction :1; + uint isIconDrag :1; + uint drawDragShapes :1; + uint dirty :1; + uint rearrangeEnabled :1; + uint reorderItemsWhenInsert :1; + uint drawAllBack :1; + uint resortItemsWhenInsert :1; + uint sortDirection :1; + uint wordWrapIconText :1; + uint containerUpdateLocked :1; + uint firstSizeHint : 1; + uint showTips :1; + uint pressedSelected :1; + uint canStartRubber :1; + uint dragging :1; + uint drawActiveSelection :1; + uint inMenuMode :1; + + TQIconViewToolTip *toolTip; + TQPixmapCache maskCache; + TQPixmap *backrubber; + TQPtrDict selectedItems; + + struct ItemContainer { + ItemContainer( ItemContainer *pr, ItemContainer *nx, const TQRect &r ) + : p( pr ), n( nx ), rect( r ) { + items.setAutoDelete( FALSE ); + if ( p ) + p->n = this; + if ( n ) + n->p = this; + } + ItemContainer *p, *n; + TQRect rect; + TQPtrList items; + } *firstContainer, *lastContainer; + + struct SortableItem { + TQIconViewItem *item; + }; + +public: + + /* finds the containers that intersect with \a searchRect in the direction \a dir relative to \a relativeTo */ + TQPtrList* findContainers( + TQIconView:: Direction dir, + const TQPoint &relativeTo, + const TQRect &searchRect ) const; + // friend int cmpIconViewItems( const void *n1, const void *n2 ); +}; + + +TQPtrList* TQIconViewPrivate::findContainers( + TQIconView:: Direction dir, + const TQPoint &relativeTo, + const TQRect &searchRect ) const +{ + + TQPtrList* list = + new TQPtrList(); + + if ( arrangement == TQIconView::LeftToRight ) { + if ( dir == TQIconView::DirLeft || dir == TQIconView::DirRight ) { + ItemContainer *c = firstContainer; + for ( ; c; c = c->n ) + if ( c->rect.intersects( searchRect ) ) + list->append( c ); + } else { + if ( dir == TQIconView::DirDown ) { + ItemContainer *c = firstContainer; + for ( ; c; c = c->n ) + if ( c->rect.intersects( searchRect ) && + c->rect.bottom() >= relativeTo.y() ) + list->append( c ); + } else { + ItemContainer *c = lastContainer; + for ( ; c; c = c->p ) + if ( c->rect.intersects( searchRect ) && + c->rect.top() <= relativeTo.y() ) + list->append( c ); + } + } + } else { + if ( dir == TQIconView::DirUp || dir == TQIconView::DirDown ) { + ItemContainer *c = firstContainer; + for ( ; c; c = c->n ) + if ( c->rect.intersects( searchRect ) ) + list->append( c ); + } else { + if ( dir == TQIconView::DirRight ) { + ItemContainer *c = firstContainer; + for ( ; c; c = c->n ) + if ( c->rect.intersects( searchRect ) && + c->rect.right() >= relativeTo.x() ) + list->append( c ); + } else { + ItemContainer *c = lastContainer; + for ( ; c; c = c->p ) + if ( c->rect.intersects( searchRect ) && + c->rect.left() <= relativeTo.x() ) + list->append( c ); + } + } + } + return list; +} + + +#if defined(Q_C_CALLBACKS) +extern "C" { +#endif + +#ifdef Q_OS_TEMP +static int _cdecl cmpIconViewItems( const void *n1, const void *n2 ) +#else +static int cmpIconViewItems( const void *n1, const void *n2 ) +#endif +{ + if ( !n1 || !n2 ) + return 0; + + TQIconViewPrivate::SortableItem *i1 = (TQIconViewPrivate::SortableItem *)n1; + TQIconViewPrivate::SortableItem *i2 = (TQIconViewPrivate::SortableItem *)n2; + + return i1->item->compare( i2->item ); +} + +#if defined(Q_C_CALLBACKS) +} +#endif + + +#ifndef QT_NO_TOOLTIP +class TQIconViewToolTip : public TQToolTip +{ +public: + TQIconViewToolTip( TQWidget *parent, TQIconView *iv ); + virtual ~TQIconViewToolTip(); + + void maybeTip( const TQPoint &pos ); + +private: + TQIconView *view; +}; + +TQIconViewToolTip::TQIconViewToolTip( TQWidget *parent, TQIconView *iv ) + : TQToolTip( parent ), view( iv ) +{ +} + +TQIconViewToolTip::~TQIconViewToolTip() +{ +} + +void TQIconViewToolTip::maybeTip( const TQPoint &pos ) +{ + if ( !parentWidget() || !view || view->wordWrapIconText() || !view->showToolTips() ) + return; + + TQIconViewItem *item = view->findItem( view->viewportToContents( pos ) ); + if ( !item || item->tmpText == item->itemText ) + return; + + TQRect r( item->textRect( FALSE ) ); + TQRect r2 = item->pixmapRect( FALSE ); + /* this probably should be | r, but TQToolTip does not handle that + * well */ + + // At this point the rectangle is too small (it is the width of the icon) + // since we need it to be bigger than that, extend it here. + r.setWidth( view->d->fm->boundingRect( item->itemText ).width() + 4 ); + r = TQRect( view->contentsToViewport( TQPoint( r.x(), r.y() ) ), TQSize( r.width(), r.height() ) ); + + r2 = TQRect( view->contentsToViewport( TQPoint( r2.x(), r2.y() ) ), TQSize( r2.width(), r2.height() ) ); + tip( r2, item->itemText, r ); +} +#endif + + +class TQIconViewItemPrivate +{ +public: + TQIconViewPrivate::ItemContainer *container1, *container2; +}; + +#ifndef QT_NO_TEXTEDIT + +class TQIconViewItemLineEdit : public TQTextEdit +{ + friend class TQIconViewItem; + +public: + TQIconViewItemLineEdit( const TQString &text, TQWidget *parent, TQIconViewItem *theItem, const char* name=0 ); + +protected: + void keyPressEvent( TQKeyEvent *e ); + void focusOutEvent( TQFocusEvent *e ); + +protected: + TQIconViewItem *item; + TQString startText; +private: +#if defined(TQ_DISABLE_COPY) // Disabled copy constructor and operator= + TQIconViewItemLineEdit( const TQIconViewItemLineEdit & ); + TQIconViewItemLineEdit &operator=( const TQIconViewItemLineEdit & ); +#endif + +}; + +TQIconViewItemLineEdit::TQIconViewItemLineEdit( const TQString &text, TQWidget *parent, + TQIconViewItem *theItem, const char *name ) + : TQTextEdit( parent, name ), item( theItem ), startText( text ) +{ + setFrameStyle( TQFrame::Plain | TQFrame::Box ); + setLineWidth( 1 ); + + setHScrollBarMode( AlwaysOff ); + setVScrollBarMode( AlwaysOff ); + + setWordWrap( WidgetWidth ); + setWrapColumnOrWidth( item->iconView()->maxItemWidth() - + ( item->iconView()->itemTextPos() == TQIconView::Bottom ? + 0 : item->pixmapRect().width() ) ); + document()->formatter()->setAllowBreakInWords( TRUE ); + resize( 200, 200 ); // ### some size, there should be a forceReformat() + setTextFormat( PlainText ); + setText( text ); + setAlignment( TQt::AlignCenter ); + + resize( wrapColumnOrWidth() + 2, heightForWidth( wrapColumnOrWidth() ) + 2 ); +} + +void TQIconViewItemLineEdit::keyPressEvent( TQKeyEvent *e ) +{ + if ( e->key() == Key_Escape ) { + item->TQIconViewItem::setText( startText ); + item->cancelRenameItem(); + } else if ( e->key() == Key_Enter || + e->key() == Key_Return ) { + item->renameItem(); + } else { + TQTextEdit::keyPressEvent( e ); + sync(); + resize( width(), document()->height() + 2 ); + + } +} + +void TQIconViewItemLineEdit::focusOutEvent( TQFocusEvent *e ) +{ + Q_UNUSED(e) // I need this to get rid of a Borland warning + if ( e->reason() != TQFocusEvent::Popup ) + item->cancelRenameItem(); +} +#endif + +#ifndef QT_NO_DRAGANDDROP + + +/*! + \class TQIconDragItem ntqiconview.h + \ingroup draganddrop + + \brief The TQIconDragItem class encapsulates a drag item. + + \module iconview + + The TQIconDrag class uses a list of TQIconDragItems to support drag + and drop operations. + + In practice a TQIconDragItem object (or an object of a class derived + from TQIconDragItem) is created for each icon view item which is + dragged. Each of these TQIconDragItems is stored in a TQIconDrag + object. + + See TQIconView::dragObject() for more information. + + See the \l fileiconview/qfileiconview.cpp and + \l iconview/simple_dd/main.cpp examples. +*/ + +/*! + Constructs a TQIconDragItem with no data. +*/ + +TQIconDragItem::TQIconDragItem() + : ba( (int)strlen( "no data" ) ) +{ + memcpy( ba.data(), "no data", strlen( "no data" ) ); +} + +/*! + Destructor. +*/ + +TQIconDragItem::~TQIconDragItem() +{ +} + +/*! + Returns the data contained in the TQIconDragItem. +*/ + +TQByteArray TQIconDragItem::data() const +{ + return ba; +} + +/*! + Sets the data for the TQIconDragItem to the data stored in the + TQByteArray \a d. +*/ + +void TQIconDragItem::setData( const TQByteArray &d ) +{ + ba = d; +} + +/*! + \reimp +*/ + +bool TQIconDragItem::operator==( const TQIconDragItem &i ) const +{ + return ba == i.ba; +} + +/*! + \reimp +*/ + +bool TQIconDragDataItem::operator==( const TQIconDragDataItem &i ) const +{ + return ( i.item == item && + i.data == data ); +} + +/*! + \reimp +*/ + +bool TQIconDragData::operator==( const TQIconDragData &i ) const +{ + return key_ == i.key_; +} + + +/*! + \class TQIconDrag ntqiconview.h + + \brief The TQIconDrag class supports drag and drop operations + within a TQIconView. + + \ingroup draganddrop + \module iconview + + A TQIconDrag object is used to maintain information about the + positions of dragged items and the data associated with the + dragged items. TQIconViews are able to use this information to + paint the dragged items in the correct positions. Internally + TQIconDrag stores the data associated with drag items in + TQIconDragItem objects. + + If you want to use the extended drag-and-drop functionality of + TQIconView, create a TQIconDrag object in a reimplementation of + TQIconView::dragObject(). Then create a TQIconDragItem for each item + which should be dragged, set the data it represents with + TQIconDragItem::setData(), and add each TQIconDragItem to the drag + object using append(). + + The data in TQIconDragItems is stored in a TQByteArray and is + mime-typed (see TQMimeSource and the + \link http://doc.trolltech.com/dnd.html Drag and Drop\endlink + overview). If you want to use your own mime-types derive a class + from TQIconDrag and reimplement format(), encodedData() and + canDecode(). + + The fileiconview example program demonstrates the use of the + TQIconDrag class including subclassing and reimplementing + dragObject(), format(), encodedData() and canDecode(). See the files + \c qt/examples/fileiconview/qfileiconview.h and + \c qt/examples/fileiconview/qfileiconview.cpp. + + \sa TQMimeSource::format() +*/ +// ### consider using \dontinclude and friends there +// ### Not here in the module overview instead... + +/*! + Constructs a drag object called \a name, which is a child of \a + dragSource. + + Note that the drag object will be deleted when \a dragSource is deleted. +*/ + +TQIconDrag::TQIconDrag( TQWidget * dragSource, const char* name ) + : TQDragObject( dragSource, name ) +{ + d = new TQIconDragPrivate; +} + +/*! + Destructor. +*/ + +TQIconDrag::~TQIconDrag() +{ + delete d; +} + +/*! + Append the TQIconDragItem, \a i, to the TQIconDrag object's list of + items. You must also supply the geometry of the pixmap, \a pr, and + the textual caption, \a tr. + + \sa TQIconDragItem +*/ + +void TQIconDrag::append( const TQIconDragItem &i, const TQRect &pr, const TQRect &tr ) +{ + d->items.append( TQIconDragDataItem( i, TQIconDragData( pr, tr ) ) ); +} + +/*! + \reimp +*/ + +const char* TQIconDrag::format( int i ) const +{ + if ( i == 0 ) + return "application/x-qiconlist"; + return 0; +} + +/*! + Returns the encoded data of the drag object if \a mime is + application/x-qiconlist. +*/ + +TQByteArray TQIconDrag::encodedData( const char* mime ) const +{ + if ( d->items.count() <= 0 || TQString( mime ) != + "application/x-qiconlist" ) + return TQByteArray(); + + TQValueList::ConstIterator it = d->items.begin(); + TQString s; + for ( ; it != d->items.end(); ++it ) { + TQString k( "%1$@@$%2$@@$%3$@@$%4$@@$%5$@@$%6$@@$%7$@@$%8$@@$" ); + k = k.arg( (*it).item.pixmapRect().x() ).arg( + (*it).item.pixmapRect().y() ).arg( (*it).item.pixmapRect().width() ). + arg( (*it).item.pixmapRect().height() ).arg( + (*it).item.textRect().x() ).arg( (*it).item.textRect().y() ). + arg( (*it).item.textRect().width() ).arg( + (*it).item.textRect().height() ); + k += TQString( (*it).data.data() ) + "$@@$"; + s += k; + } + + TQByteArray a( s.length() + 1 ); + memcpy( a.data(), s.latin1(), a.size() ); + return a; +} + +/*! + Returns TRUE if \a e can be decoded by the TQIconDrag, otherwise + return FALSE. +*/ + +bool TQIconDrag::canDecode( TQMimeSource* e ) +{ + if ( e->provides( "application/x-qiconlist" ) ) + return TRUE; + return FALSE; +} + +/*! + Decodes the data which is stored (encoded) in \a e and, if + successful, fills the \a list of icon drag items with the decoded + data. Returns TRUE if there was some data, FALSE otherwise. +*/ + +bool TQIconDragPrivate::decode( TQMimeSource* e, TQValueList &lst ) +{ + TQByteArray ba = e->encodedData( "application/x-qiconlist" ); + if ( ba.size() ) { + lst.clear(); + TQString s = ba.data(); + TQIconDragDataItem item; + TQRect ir, tr; + TQStringList l = TQStringList::split( "$@@$", s ); + + int i = 0; + TQStringList::Iterator it = l.begin(); + for ( ; it != l.end(); ++it ) { + if ( i == 0 ) { + ir.setX( ( *it ).toInt() ); + } else if ( i == 1 ) { + ir.setY( ( *it ).toInt() ); + } else if ( i == 2 ) { + ir.setWidth( ( *it ).toInt() ); + } else if ( i == 3 ) { + ir.setHeight( ( *it ).toInt() ); + } else if ( i == 4 ) { + tr.setX( ( *it ).toInt() ); + } else if ( i == 5 ) { + tr.setY( ( *it ).toInt() ); + } else if ( i == 6 ) { + tr.setWidth( ( *it ).toInt() ); + } else if ( i == 7 ) { + tr.setHeight( ( *it ).toInt() ); + } else if ( i == 8 ) { + TQByteArray d( ( *it ).length() ); + memcpy( d.data(), ( *it ).latin1(), ( *it ).length() ); + item.item.setPixmapRect( ir ); + item.item.setTextRect( tr ); + item.data.setData( d ); + lst.append( item ); + } + ++i; + if ( i > 8 ) + i = 0; + } + return TRUE; + } + + return FALSE; +} + +TQIconDragData::TQIconDragData() + : iconRect_(), textRect_() +{ +} + +TQIconDragData::TQIconDragData( const TQRect &ir, const TQRect &tr ) + : iconRect_( ir ), textRect_( tr ) +{ +} + +TQRect TQIconDragData::textRect() const +{ + return textRect_; +} + +TQRect TQIconDragData::pixmapRect() const +{ + return iconRect_; +} + +void TQIconDragData::setPixmapRect( const TQRect &r ) +{ + iconRect_ = r; +} + +void TQIconDragData::setTextRect( const TQRect &r ) +{ + textRect_ = r; +} + +#endif + + +/*! + \class TQIconViewItem ntqiconview.h + \brief The TQIconViewItem class provides a single item in a TQIconView. + + \ingroup advanced + \module iconview + + A TQIconViewItem contains an icon, a string and optionally a sort + key, and can display itself in a TQIconView. + The class is designed to be very similar to TQListView and TQListBox + in use, both via instantiation and subclassing. + + The simplest way to create a TQIconViewItem and insert it into a + TQIconView is to construct the item passing the constructor a + pointer to the icon view, a string and an icon: + + \code + (void) new TQIconViewItem( + iconView, // A pointer to a TQIconView + "This is the text of the item", + aPixmap ); + \endcode + + By default the text of an icon view item may not be edited by the + user but calling setRenameEnabled(TRUE) will allow the user to + perform in-place editing of the item's text. + + When the icon view is deleted all items in it are deleted + automatically. + + The TQIconView::firstItem() and TQIconViewItem::nextItem() functions + provide a means of iterating over all the items in a TQIconView: + + \code + TQIconViewItem *item; + for ( item = iconView->firstItem(); item; item = item->nextItem() ) + do_something_with( item ); + \endcode + + The item's icon view is available from iconView(), and its + position in the icon view from index(). + + The item's selection status is available from isSelected() and is + set and controlled by setSelected() and isSelectable(). + + The text and icon can be set with setText() and setPixmap() and + retrieved with text() and pixmap(). The item's sort key defaults + to text() but may be set with setKey() and retrieved with key(). + The comparison function, compare() uses key(). + + Items may be repositioned with move() and moveBy(). An item's + geometry is available from rect(), x(), y(), width(), height(), + size(), pos(), textRect() and pixmapRect(). You can also test + against the position of a point with contains() and intersects(). + + To remove an item from an icon view, just delete the item. The + TQIconViewItem destructor removes it cleanly from its icon view. + + Because the icon view is designed to use drag-and-drop, the icon + view item also has functions for drag-and-drop which may be + reimplemented. + + \target pixmap-size-limit + Note: Pixmaps with individual dimensions larger than 300 pixels may + not be displayed properly, depending on the \link TQIconView::Arrangement + arrangement in use\endlink. For example, pixmaps wider than 300 pixels + will not be arranged correctly if the icon view uses a + \l TQIconView::TopToBottom arrangement, and pixmaps taller than 300 pixels + will not be arranged correctly if the icon view uses a + \l TQIconView::LeftToRight arrangement. +*/ + +/*! + Constructs a TQIconViewItem and inserts it into icon view \a parent + with no text and a default icon. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent ) + : view( parent ), itemText(), itemIcon( unknown_icon ) +{ + init(); +} + +/*! + Constructs a TQIconViewItem and inserts it into the icon view \a + parent with no text and a default icon, after the icon view item + \a after. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after ) + : view( parent ), itemText(), itemIcon( unknown_icon ), + prev( 0 ), next( 0 ) +{ + init( after ); +} + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and a default icon. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text ) + : view( parent ), itemText( text ), itemIcon( unknown_icon ) +{ + init( 0 ); +} + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and a default icon, after the + icon view item \a after. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, + const TQString &text ) + : view( parent ), itemText( text ), itemIcon( unknown_icon ) +{ + init( after ); +} + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and \a icon as the icon. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text, + const TQPixmap &icon ) + : view( parent ), + itemText( text ), itemIcon( new TQPixmap( icon ) ) +{ + init( 0 ); +} + + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and \a icon as the icon, after + the icon view item \a after. + + \sa setPixmap() +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, + const TQString &text, const TQPixmap &icon ) + : view( parent ), itemText( text ), itemIcon( new TQPixmap( icon ) ) +{ + init( after ); +} + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and \a picture as the icon. +*/ + +#ifndef QT_NO_PICTURE +TQIconViewItem::TQIconViewItem( TQIconView *parent, const TQString &text, + const TQPicture &picture ) + : view( parent ), itemText( text ), itemIcon( 0 ) +{ + init( 0, new TQPicture( picture ) ); +} + +/*! + Constructs an icon view item and inserts it into the icon view \a + parent using \a text as the text and \a picture as the icon, after + the icon view item \a after. +*/ + +TQIconViewItem::TQIconViewItem( TQIconView *parent, TQIconViewItem *after, + const TQString &text, const TQPicture &picture ) + : view( parent ), itemText( text ), itemIcon( 0 ) +{ + init( after, new TQPicture( picture ) ); +} +#endif + +/*! + This private function initializes the icon view item and inserts it + into the icon view. +*/ + +void TQIconViewItem::init( TQIconViewItem *after +#ifndef QT_NO_PICTURE + , TQPicture *pic +#endif + ) +{ + d = new TQIconViewItemPrivate; + d->container1 = 0; + d->container2 = 0; + prev = next = 0; + allow_rename = FALSE; + allow_drag = TRUE; + allow_drop = TRUE; + visible = TRUE; + selected = FALSE; + selectable = TRUE; +#ifndef QT_NO_TEXTEDIT + renameBox = 0; +#endif +#ifndef QT_NO_PICTURE + itemPic = pic; +#endif + if ( view ) { + itemKey = itemText; + dirty = TRUE; + wordWrapDirty = TRUE; + itemRect = TQRect( -1, -1, 0, 0 ); + calcRect(); + view->insertItem( this, after ); + } +} + +/*! + Destroys the icon view item and tells the parent icon view that + the item has been destroyed. +*/ + +TQIconViewItem::~TQIconViewItem() +{ +#ifndef QT_NO_TEXTEDIT + removeRenameBox(); +#endif + if ( view && !view->d->clearing ) + view->takeItem( this ); + view = 0; + if ( itemIcon && itemIcon->serialNumber() != unknown_icon->serialNumber() ) + delete itemIcon; +#ifndef QT_NO_PICTURE + delete itemPic; +#endif + delete d; +} + +int TQIconViewItem::RTTI = 0; + +/*! + Returns 0. + + Make your derived classes return their own values for rtti(), so + that you can distinguish between icon view item types. You should + use values greater than 1000, preferably a large random number, to + allow for extensions to this class. +*/ + +int TQIconViewItem::rtti() const +{ + return RTTI; +} + +/*! + If \a b is TRUE, the item is made visible; otherwise it is hidden. +*/ + +void TQIconViewItem::setVisible( bool b ) +{ + if ( b == (bool)visible ) + return; + TQIconView *iv = iconView(); + if ( !iv ) + return; + visible = b; + if ( iv ) + iv->updateContents(); +} + +/*! + Returns TRUE if the item is visible; otherwise returns FALSE. + + \sa setVisible() +*/ + +bool TQIconViewItem::isVisible() const +{ + return (bool)visible; +} + +/*! + Sets \a text as the text of the icon view item. This function + might be a no-op if you reimplement text(). + + \sa text() +*/ + +void TQIconViewItem::setText( const TQString &text ) +{ + if ( text == itemText ) + return; + + wordWrapDirty = TRUE; + itemText = text; + if ( itemKey.isEmpty() ) + itemKey = itemText; + + TQRect oR = rect(); + calcRect(); + oR = oR.unite( rect() ); + + if ( view ) { + if ( TQRect( view->contentsX(), view->contentsY(), + view->visibleWidthSB(), view->visibleHeightSB() ). + intersects( oR ) ) + view->repaintContents( oR.x() - 1, oR.y() - 1, + oR.width() + 2, oR.height() + 2, FALSE ); + } +} + +/*! + Sets \a k as the sort key of the icon view item. By default + text() is used for sorting. + + \sa compare() +*/ + +void TQIconViewItem::setKey( const TQString &k ) +{ + if ( k == itemKey ) + return; + + itemKey = k; +} + +/*! + Sets \a icon as the item's icon in the icon view. This function + might be a no-op if you reimplement pixmap(). + + Note: Pixmaps with individual dimensions larger than 300 pixels may + not be displayed properly, depending on the \link TQIconView::Arrangement + arrangement in use\endlink. See the \link #pixmap-size-limit main class + documentation\endlink for details. + + \sa pixmap() +*/ + +void TQIconViewItem::setPixmap( const TQPixmap &icon ) +{ + if (isVisible() == FALSE) + return; + + if ( itemIcon && itemIcon == unknown_icon ) + itemIcon = 0; + + if ( itemIcon ) + *itemIcon = icon; + else + itemIcon = new TQPixmap( icon ); + TQRect oR = rect(); + calcRect(); + oR = oR.unite( rect() ); + + if ( view ) { + if ( TQRect( view->contentsX(), view->contentsY(), + view->visibleWidthSB(), view->visibleHeightSB() ). + intersects( oR ) ) + view->repaintContents( oR.x() - 1, oR.y() - 1, + oR.width() + 2, oR.height() + 2, FALSE ); + } +} + +/*! + Sets \a icon as the item's icon in the icon view. This function + might be a no-op if you reimplement picture(). + + \sa picture() +*/ + +#ifndef QT_NO_PICTURE +void TQIconViewItem::setPicture( const TQPicture &icon ) +{ + // clear assigned pixmap if any + if ( itemIcon ) { + if ( itemIcon == unknown_icon ) { + itemIcon = 0; + } else { + delete itemIcon; + itemIcon = 0; + } + } + if ( itemPic ) + delete itemPic; + itemPic = new TQPicture( icon ); + + TQRect oR = rect(); + calcRect(); + oR = oR.unite( rect() ); + + if ( view ) { + if ( TQRect( view->contentsX(), view->contentsY(), + view->visibleWidthSB(), view->visibleHeightSB() ). + intersects( oR ) ) + view->repaintContents( oR.x() - 1, oR.y() - 1, + oR.width() + 2, oR.height() + 2, FALSE ); + } +} +#endif + +/*! + \overload + + Sets \a text as the text of the icon view item. If \a recalc is + TRUE, the icon view's layout is recalculated. If \a redraw is TRUE + (the default), the icon view is repainted. + + \sa text() +*/ + +void TQIconViewItem::setText( const TQString &text, bool recalc, bool redraw ) +{ + if ( text == itemText ) + return; + + wordWrapDirty = TRUE; + itemText = text; + + if ( recalc ) + calcRect(); + if ( redraw ) + repaint(); +} + +/*! + \overload + + Sets \a icon as the item's icon in the icon view. If \a recalc is + TRUE, the icon view's layout is recalculated. If \a redraw is TRUE + (the default), the icon view is repainted. + + Note: Pixmaps with individual dimensions larger than 300 pixels may + not be displayed properly, depending on the \link TQIconView::Arrangement + arrangement in use\endlink. See the \link #pixmap-size-limit main class + documentation\endlink for details. + + \sa pixmap() +*/ + +void TQIconViewItem::setPixmap( const TQPixmap &icon, bool recalc, bool redraw ) +{ + if (isVisible() == FALSE) + return; + + if ( itemIcon && itemIcon == unknown_icon ) + itemIcon = 0; + + if ( itemIcon ) + *itemIcon = icon; + else + itemIcon = new TQPixmap( icon ); + + if ( redraw ) { + if ( recalc ) { + TQRect oR = rect(); + calcRect(); + oR = oR.unite( rect() ); + + if ( view ) { + if ( TQRect( view->contentsX(), view->contentsY(), + view->visibleWidthSB(), view->visibleHeightSB() ). + intersects( oR ) ) + view->repaintContents( oR.x() - 1, oR.y() - 1, + oR.width() + 2, oR.height() + 2, FALSE ); + } + } else { + repaint(); + } + } else if ( recalc ) { + calcRect(); + } +} + +/*! + If \a allow is TRUE, the user can rename the icon view item by + clicking on the text (or pressing F2) while the item is selected + (in-place renaming). If \a allow is FALSE, in-place renaming is + not possible. +*/ + +void TQIconViewItem::setRenameEnabled( bool allow ) +{ + allow_rename = (uint)allow; +} + +/*! + If \a allow is TRUE, the icon view permits the user to drag the + icon view item either to another position within the icon view or + to somewhere outside of it. If \a allow is FALSE, the item cannot + be dragged. +*/ + +void TQIconViewItem::setDragEnabled( bool allow ) +{ + allow_drag = (uint)allow; +} + +/*! + If \a allow is TRUE, the icon view lets the user drop something on + this icon view item. +*/ + +void TQIconViewItem::setDropEnabled( bool allow ) +{ + allow_drop = (uint)allow; +} + +/*! + Returns the text of the icon view item. Normally you set the text + of the item with setText(), but sometimes it's inconvenient to + call setText() for every item; so you can subclass TQIconViewItem, + reimplement this function, and return the text of the item. If you + do this, you must call calcRect() manually each time the text + (and therefore its size) changes. + + \sa setText() +*/ + +TQString TQIconViewItem::text() const +{ + return itemText; +} + +/*! + Returns the key of the icon view item or text() if no key has been + explicitly set. + + \sa setKey(), compare() +*/ + +TQString TQIconViewItem::key() const +{ + return itemKey; +} + +/*! + Returns the icon of the icon view item if it is a pixmap, or 0 if + it is a picture. In the latter case use picture() instead. + Normally you set the pixmap of the item with setPixmap(), but + sometimes it's inconvenient to call setPixmap() for every item. So + you can subclass TQIconViewItem, reimplement this function and + return a pointer to the item's pixmap. If you do this, you \e must + call calcRect() manually each time the size of this pixmap + changes. + + \sa setPixmap() +*/ + +TQPixmap *TQIconViewItem::pixmap() const +{ + return itemIcon; +} + +/*! + Returns the icon of the icon view item if it is a picture, or 0 if + it is a pixmap. In the latter case use pixmap() instead. Normally + you set the picture of the item with setPicture(), but sometimes + it's inconvenient to call setPicture() for every item. So you can + subclass TQIconViewItem, reimplement this function and return a + pointer to the item's picture. If you do this, you \e must call + calcRect() manually each time the size of this picture changes. + + \sa setPicture() +*/ + +#ifndef QT_NO_PICTURE +TQPicture *TQIconViewItem::picture() const +{ + return itemPic; +} +#endif + +/*! + Returns TRUE if the item can be renamed by the user with in-place + renaming; otherwise returns FALSE. + + \sa setRenameEnabled() +*/ + +bool TQIconViewItem::renameEnabled() const +{ + return (bool)allow_rename; +} + +/*! + Returns TRUE if the user is allowed to drag the icon view item; + otherwise returns FALSE. + + \sa setDragEnabled() +*/ + +bool TQIconViewItem::dragEnabled() const +{ + return (bool)allow_drag; +} + +/*! + Returns TRUE if the user is allowed to drop something onto the + item; otherwise returns FALSE. + + \sa setDropEnabled() +*/ + +bool TQIconViewItem::dropEnabled() const +{ + return (bool)allow_drop; +} + +/*! + Returns a pointer to this item's icon view parent. +*/ + +TQIconView *TQIconViewItem::iconView() const +{ + return view; +} + +/*! + Returns a pointer to the previous item, or 0 if this is the first + item in the icon view. + + \sa nextItem() TQIconView::firstItem() +*/ + +TQIconViewItem *TQIconViewItem::prevItem() const +{ + return prev; +} + +/*! + Returns a pointer to the next item, or 0 if this is the last item + in the icon view. + + To find the first item use TQIconView::firstItem(). + + Example: + \code + TQIconViewItem *item; + for ( item = iconView->firstItem(); item; item = item->nextItem() ) + do_something_with( item ); + \endcode + + \sa prevItem() +*/ + +TQIconViewItem *TQIconViewItem::nextItem() const +{ + return next; +} + +/*! + Returns the index of this item in the icon view, or -1 if an error + occurred. +*/ + +int TQIconViewItem::index() const +{ + if ( view ) + return view->index( this ); + + return -1; +} + + + +/*! + \overload + + This variant is equivalent to calling the other variant with \e cb + set to FALSE. +*/ + +void TQIconViewItem::setSelected( bool s ) +{ + setSelected( s, FALSE ); +} + +/*! + Selects or unselects the item, depending on \a s; it may also + unselect other items, depending on TQIconView::selectionMode() and + \a cb. + + If \a s is FALSE, the item is unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Single, the + item is selected and the item previously selected is unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Extended, the + item is selected. If \a cb is TRUE, the selection state of the + other items is left unchanged. If \a cb is FALSE (the default) all + other items are unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Multi, the + item is selected. + + Note that \a cb is used only if TQIconView::selectionMode() is \c + Extended; cb defaults to FALSE. + + All items whose selection status changes repaint themselves. +*/ + +void TQIconViewItem::setSelected( bool s, bool cb ) +{ + if ( !view ) + return; + if ( view->selectionMode() != TQIconView::NoSelection && + selectable && s != (bool)selected ) { + + if ( view->d->selectionMode == TQIconView::Single && this != view->d->currentItem ) { + TQIconViewItem *o = view->d->currentItem; + if ( o && o->selected ) + o->selected = FALSE; + view->d->currentItem = this; + if ( o ) + o->repaint(); + emit view->currentChanged( this ); + } + + if ( !s ) { + selected = FALSE; + } else { + if ( view->d->selectionMode == TQIconView::Single && view->d->currentItem ) { + view->d->currentItem->selected = FALSE; + } + if ( ( view->d->selectionMode == TQIconView::Extended && !cb ) || + view->d->selectionMode == TQIconView::Single ) { + bool b = view->signalsBlocked(); + view->blockSignals( TRUE ); + view->selectAll( FALSE ); + view->blockSignals( b ); + } + selected = s; + } + + repaint(); + if ( !view->signalsBlocked() ) { + bool emitIt = view->d->selectionMode == TQIconView::Single && s; + TQIconView *v = view; + emit v->selectionChanged(); + if ( emitIt ) + emit v->selectionChanged( this ); + } + } +} + +/*! + Sets this item to be selectable if \a enable is TRUE (the default) + or unselectable if \a enable is FALSE. + + The user is unable to select a non-selectable item using either + the keyboard or the mouse. (The application programmer can select + an item in code regardless of this setting.) + + \sa isSelectable() +*/ + +void TQIconViewItem::setSelectable( bool enable ) +{ + selectable = (uint)enable; +} + +/*! + Returns TRUE if the item is selected; otherwise returns FALSE. + + \sa setSelected() +*/ + +bool TQIconViewItem::isSelected() const +{ + return (bool)selected; +} + +/*! + Returns TRUE if the item is selectable; otherwise returns FALSE. + + \sa setSelectable() +*/ + +bool TQIconViewItem::isSelectable() const +{ + return (bool)selectable; +} + +/*! + Repaints the item. +*/ + +void TQIconViewItem::repaint() +{ + if ( view ) + view->repaintItem( this ); +} + +/*! + Moves the item to position (\a x, \a y) in the icon view (these + are contents coordinates). +*/ + +bool TQIconViewItem::move( int x, int y ) +{ + if ( x == this->x() && y == this->y() ) + return FALSE; + itemRect.setRect( x, y, itemRect.width(), itemRect.height() ); + checkRect(); + if ( view ) + view->updateItemContainer( this ); + return TRUE; +} + +/*! + Moves the item \a dx pixels in the x-direction and \a dy pixels in + the y-direction. +*/ + +void TQIconViewItem::moveBy( int dx, int dy ) +{ + itemRect.moveBy( dx, dy ); + checkRect(); + if ( view ) + view->updateItemContainer( this ); +} + +/*! + \overload + + Moves the item to the point \a pnt. +*/ + +bool TQIconViewItem::move( const TQPoint &pnt ) +{ + return move( pnt.x(), pnt.y() ); +} + +/*! + \overload + + Moves the item by the x, y values in point \a pnt. +*/ + +void TQIconViewItem::moveBy( const TQPoint &pnt ) +{ + moveBy( pnt.x(), pnt.y() ); +} + +/*! + Returns the bounding rectangle of the item (in contents + coordinates). +*/ + +TQRect TQIconViewItem::rect() const +{ + return itemRect; +} + +/*! + Returns the x-coordinate of the item (in contents coordinates). +*/ + +int TQIconViewItem::x() const +{ + return itemRect.x(); +} + +/*! + Returns the y-coordinate of the item (in contents coordinates). +*/ + +int TQIconViewItem::y() const +{ + return itemRect.y(); +} + +/*! + Returns the width of the item. +*/ + +int TQIconViewItem::width() const +{ + return TQMAX( itemRect.width(), TQApplication::globalStrut().width() ); +} + +/*! + Returns the height of the item. +*/ + +int TQIconViewItem::height() const +{ + return TQMAX( itemRect.height(), TQApplication::globalStrut().height() ); +} + +/*! + Returns the size of the item. +*/ + +TQSize TQIconViewItem::size() const +{ + return TQSize( itemRect.width(), itemRect.height() ); +} + +/*! + Returns the position of the item (in contents coordinates). +*/ + +TQPoint TQIconViewItem::pos() const +{ + return TQPoint( itemRect.x(), itemRect.y() ); +} + +/*! + Returns the bounding rectangle of the item's text. + + If \a relative is TRUE, (the default), the returned rectangle is + relative to the origin of the item's rectangle. If \a relative is + FALSE, the returned rectangle is relative to the origin of the + icon view's contents coordinate system. +*/ + +TQRect TQIconViewItem::textRect( bool relative ) const +{ + if ( relative ) + return itemTextRect; + else + return TQRect( x() + itemTextRect.x(), y() + itemTextRect.y(), itemTextRect.width(), itemTextRect.height() ); +} + +/*! + Returns the bounding rectangle of the item's icon. + + If \a relative is TRUE, (the default), the rectangle is relative to + the origin of the item's rectangle. If \a relative is FALSE, the + returned rectangle is relative to the origin of the icon view's + contents coordinate system. +*/ + +TQRect TQIconViewItem::pixmapRect( bool relative ) const +{ + if ( relative ) + return itemIconRect; + else + return TQRect( x() + itemIconRect.x(), y() + itemIconRect.y(), itemIconRect.width(), itemIconRect.height() ); +} + +/*! + Returns TRUE if the item contains the point \a pnt (in contents + coordinates); otherwise returns FALSE. +*/ + +bool TQIconViewItem::contains( const TQPoint& pnt ) const +{ + TQRect textArea = textRect( FALSE ); + TQRect pixmapArea = pixmapRect( FALSE ); + if ( iconView()->itemTextPos() == TQIconView::Bottom ) + textArea.setTop( pixmapArea.bottom() ); + else + textArea.setLeft( pixmapArea.right() ); + return textArea.contains( pnt ) || pixmapArea.contains( pnt ); +} + +/*! + Returns TRUE if the item intersects the rectangle \a r (in + contents coordinates); otherwise returns FALSE. +*/ + +bool TQIconViewItem::intersects( const TQRect& r ) const +{ + return ( textRect( FALSE ).intersects( r ) || + pixmapRect( FALSE ).intersects( r ) ); +} + +/*! + \fn bool TQIconViewItem::acceptDrop( const TQMimeSource *mime ) const + + Returns TRUE if you can drop things with a TQMimeSource of \a mime + onto this item; otherwise returns FALSE. + + The default implementation always returns FALSE. You must subclass + TQIconViewItem and reimplement acceptDrop() to accept drops. +*/ + +bool TQIconViewItem::acceptDrop( const TQMimeSource * ) const +{ + return FALSE; +} + +#ifndef QT_NO_TEXTEDIT +/*! + Starts in-place renaming of an icon, if allowed. + + This function sets up the icon view so that the user can edit the + item text, and then returns. When the user is done, setText() will + be called and TQIconView::itemRenamed() will be emitted (unless the + user canceled, e.g. by pressing the Escape key). + + \sa setRenameEnabled() +*/ + +void TQIconViewItem::rename() +{ + if ( !view ) + return; + if ( renameBox ) + removeRenameBox(); + oldRect = rect(); + renameBox = new TQIconViewItemLineEdit( itemText, view->viewport(), this, "qt_renamebox" ); + iconView()->ensureItemVisible( this ); + TQRect tr( textRect( FALSE ) ); + view->addChild( renameBox, tr.x() + ( tr.width() / 2 - renameBox->width() / 2 ), tr.y() - 3 ); + renameBox->selectAll(); + view->viewport()->setFocusProxy( renameBox ); + renameBox->setFocus(); + renameBox->show(); + Q_ASSERT( view->d->renamingItem == 0L ); + view->d->renamingItem = this; +} +#endif + +/*! + Compares this icon view item to \a i. Returns -1 if this item is + less than \a i, 0 if they are equal, and 1 if this icon view item + is greater than \a i. + + The default implementation compares the item keys (key()) using + TQString::localeAwareCompare(). A reimplementation may use + different values and a different comparison function. Here is a + reimplementation that uses plain Unicode comparison: + + \code + int MyIconViewItem::compare( TQIconViewItem *i ) const + { + return key().compare( i->key() ); + } + \endcode + + \sa key() TQString::localeAwareCompare() TQString::compare() +*/ + +int TQIconViewItem::compare( TQIconViewItem *i ) const +{ + return key().localeAwareCompare( i->key() ); +} + +#ifndef QT_NO_TEXTEDIT +/*! + This private function is called when the user pressed Return during + in-place renaming. +*/ + +void TQIconViewItem::renameItem() +{ + if ( !renameBox || !view ) + return; + + if ( !view->d->wordWrapIconText ) { + wordWrapDirty = TRUE; + calcRect(); + } + TQRect r = itemRect; + setText( renameBox->text() ); + view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE ); + view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE ); + removeRenameBox(); + + view->emitRenamed( this ); +} + +/*! + Cancels in-place renaming. +*/ + +void TQIconViewItem::cancelRenameItem() +{ + if ( !view ) + return; + + TQRect r = itemRect; + calcRect(); + view->repaintContents( oldRect.x() - 1, oldRect.y() - 1, oldRect.width() + 2, oldRect.height() + 2, FALSE ); + view->repaintContents( r.x() - 1, r.y() - 1, r.width() + 2, r.height() + 2, FALSE ); + + if ( !renameBox ) + return; + + removeRenameBox(); +} + +/*! + Removes the editbox that is used for in-place renaming. +*/ + +void TQIconViewItem::removeRenameBox() +{ + if ( !renameBox || !view ) + return; + + bool resetFocus = view->viewport()->focusProxy() == renameBox; + renameBox->hide(); + renameBox->deleteLater(); + renameBox = 0; + if ( resetFocus ) { + view->viewport()->setFocusProxy( view ); + view->setFocus(); + } + Q_ASSERT( view->d->renamingItem == this ); + view->d->renamingItem = 0L; +} +#endif + +/*! + This virtual function is responsible for calculating the + rectangles returned by rect(), textRect() and pixmapRect(). + setRect(), setTextRect() and setPixmapRect() are provided mainly + for reimplementations of this function. + + \a text_ is an internal parameter which defaults to TQString::null. +*/ + +void TQIconViewItem::calcRect( const TQString &text_ ) +{ + if ( !view ) // ##### + return; + + wordWrapDirty = TRUE; + int pw = 0; + int ph = 0; + +#ifndef QT_NO_PICTURE + if ( picture() ) { + TQRect br = picture()->boundingRect(); + pw = br.width() + 2; + ph = br.height() + 2; + } else +#endif + { + pw = ( pixmap() ? pixmap() : unknown_icon )->width() + 2; + ph = ( pixmap() ? pixmap() : unknown_icon )->height() + 2; + } + + itemIconRect.setWidth( pw ); + itemIconRect.setHeight( ph ); + + calcTmpText(); + + TQString t = text_; + if ( t.isEmpty() ) { + if ( view->d->wordWrapIconText ) + t = itemText; + else + t = tmpText; + } + + int tw = 0; + int th = 0; + // ##### TODO: fix font bearings! + TQRect r; + if ( view->d->wordWrapIconText ) { + r = TQRect( view->d->fm->boundingRect( 0, 0, iconView()->maxItemWidth() - + ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : + pixmapRect().width() ), + 0xFFFFFFFF, AlignHCenter | WordBreak | BreakAnywhere, t ) ); + r.setWidth( r.width() + 4 ); + } else { + r = TQRect( 0, 0, view->d->fm->width( t ), view->d->fm->height() ); + r.setWidth( r.width() + 4 ); + } + + if ( r.width() > iconView()->maxItemWidth() - + ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : + pixmapRect().width() ) ) + r.setWidth( iconView()->maxItemWidth() - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : + pixmapRect().width() ) ); + + tw = r.width(); + th = r.height(); + if ( tw < view->d->fm->width( "X" ) ) + tw = view->d->fm->width( "X" ); + + itemTextRect.setWidth( tw ); + itemTextRect.setHeight( th ); + + int w = 0; + int h = 0; + if ( view->itemTextPos() == TQIconView::Bottom ) { + w = TQMAX( itemTextRect.width(), itemIconRect.width() ); + h = itemTextRect.height() + itemIconRect.height() + 1; + + itemRect.setWidth( w ); + itemRect.setHeight( h ); + + itemTextRect = TQRect( ( width() - itemTextRect.width() ) / 2, height() - itemTextRect.height(), + itemTextRect.width(), itemTextRect.height() ); + itemIconRect = TQRect( ( width() - itemIconRect.width() ) / 2, 0, + itemIconRect.width(), itemIconRect.height() ); + } else { + h = TQMAX( itemTextRect.height(), itemIconRect.height() ); + w = itemTextRect.width() + itemIconRect.width() + 1; + + itemRect.setWidth( w ); + itemRect.setHeight( h ); + + itemTextRect = TQRect( width() - itemTextRect.width(), ( height() - itemTextRect.height() ) / 2, + itemTextRect.width(), itemTextRect.height() ); + itemIconRect = TQRect( 0, ( height() - itemIconRect.height() ) / 2, + itemIconRect.width(), itemIconRect.height() ); + } + if ( view ) + view->updateItemContainer( this ); +} + +/*! + Paints the item using the painter \a p and the color group \a cg. + If you want the item to be drawn with a different font or color, + reimplement this function, change the values of the color group or + the painter's font, and then call the TQIconViewItem::paintItem() + with the changed values. +*/ + +void TQIconViewItem::paintItem( TQPainter *p, const TQColorGroup &cg ) +{ + if ( !view ) + return; + + p->save(); + + if ( isSelected() ) { + p->setPen( cg.highlightedText() ); + } else { + p->setPen( cg.text() ); + } + + calcTmpText(); + +#ifndef QT_NO_PICTURE + if ( picture() ) { + TQPicture *pic = picture(); + if ( isSelected() ) { + p->setBrush( TQBrush( cg.highlight(), TQBrush::Dense4Pattern ) ); + p->setPen( TQPen( cg.highlight(), TQBrush::Dense4Pattern ) ); + p->drawRoundRect( pixmapRect( FALSE ), + 1000 / pixmapRect( FALSE ).width(), + 1000 / pixmapRect( FALSE ).height() ); + } + p->drawPicture( x()-pic->boundingRect().x(), y()-pic->boundingRect().y(), *pic ); + if ( isSelected() ) { + p->setBrush( TQBrush( cg.highlight() ) ); + p->setPen( TQPen( cg.highlight() ) ); + p->drawRoundRect( textRect( FALSE ), + 1000 / textRect( FALSE ).width(), + 1000 / textRect( FALSE ).height() ); + p->setPen( TQPen( cg.highlightedText() ) ); + } else if ( view->d->itemTextBrush != NoBrush ) { + p->setBrush( view->d->itemTextBrush ); + p->setPen( TQPen( view->d->itemTextBrush.color() ) ); + p->drawRoundRect( textRect( FALSE ), + 1000 / textRect( FALSE ).width(), + 1000 / textRect( FALSE ).height() ); + } + + int align = view->itemTextPos() == TQIconView::Bottom ? AlignHCenter : AlignAuto; + if ( view->d->wordWrapIconText ) + align |= WordBreak | BreakAnywhere; + p->drawText( textRect( FALSE ), align, view->d->wordWrapIconText ? itemText : tmpText ); + p->restore(); + return; + } +#endif + bool textOnBottom = ( view->itemTextPos() == TQIconView::Bottom ); + int dim; + if ( textOnBottom ) + dim = ( pixmap() ? pixmap() : unknown_icon)->width(); + else + dim = ( pixmap() ? pixmap() : unknown_icon)->height(); + if ( isSelected() ) { + TQPixmap *pix = pixmap() ? pixmap() : unknown_icon; + if ( pix && !pix->isNull() ) { + TQPixmap *buffer = get_qiv_buffer_pixmap( pix->size() ); + TQBitmap mask = view->mask( pix ); + + TQPainter p2( buffer ); + p2.fillRect( pix->rect(), white ); + p2.drawPixmap( 0, 0, *pix ); + p2.end(); + buffer->setMask( mask ); + p2.begin( buffer ); +#if defined(Q_WS_X11) + p2.fillRect( pix->rect(), TQBrush( cg.highlight(), TQBrush::Dense4Pattern) ); +#else // in WIN32 Dense4Pattern doesn't work correctly (transparency problem), so work around it + if ( iconView()->d->drawActiveSelection ) { + if ( !qiv_selection ) + createSelectionPixmap( cg ); + p2.drawTiledPixmap( 0, 0, pix->width(), pix->height(), + *qiv_selection ); + } +#endif + p2.end(); + TQRect cr = pix->rect(); + if ( textOnBottom ) + p->drawPixmap( x() + ( width() - dim ) / 2, y(), *buffer, 0, 0, + cr.width(), cr.height() ); + else + p->drawPixmap( x() , y() + ( height() - dim ) / 2, *buffer, 0, 0, + cr.width(), cr.height() ); + } + } else { + if ( textOnBottom ) + p->drawPixmap( x() + ( width() - dim ) / 2, y(), + *( pixmap() ? pixmap() : unknown_icon ) ); + else + p->drawPixmap( x() , y() + ( height() - dim ) / 2, + *( pixmap() ? pixmap() : unknown_icon ) ); + } + + p->save(); + if ( isSelected() ) { + p->setBrush( TQBrush( cg.highlight() ) ); + p->setPen( TQPen( cg.highlight() ) ); + p->drawRoundRect( textRect( FALSE ), + 1000 / textRect( FALSE ).width(), + 1000 / textRect( FALSE ).height() ); + p->setPen( TQPen( cg.highlightedText() ) ); + } else if ( view->d->itemTextBrush != NoBrush ) { + p->setBrush( view->d->itemTextBrush ); + p->setPen( TQPen( view->d->itemTextBrush.color() ) ); + p->drawRoundRect( textRect( FALSE ), + 1000 / textRect( FALSE ).width(), + 1000 / textRect( FALSE ).height() ); + } + + int align = AlignHCenter; + if ( view->d->wordWrapIconText ) + align |= WordBreak | BreakAnywhere; + p->drawText( textRect( FALSE ), align, + view->d->wordWrapIconText ? itemText : tmpText ); + + p->restore(); + + p->restore(); +} + +/*! + Paints the focus rectangle of the item using the painter \a p and + the color group \a cg. + + The default implementation does nothing; subclasses may + reimplement this function. +*/ + +void TQIconViewItem::paintFocus( TQPainter *, const TQColorGroup & ) +{ +} + +/*! + \fn void TQIconViewItem::dropped( TQDropEvent *e, const TQValueList &lst ) + + This function is called when something is dropped on the item. \a + e provides all the information about the drop. If the drag object + of the drop was a TQIconDrag, \a lst contains the list of the + dropped items. You can get the data by calling + TQIconDragItem::data() on each item. If the \a lst is empty, i.e. + the drag was not a TQIconDrag, you must decode the data in \a e and + work with that. + + The default implementation does nothing; subclasses may + reimplement this function. +*/ + +#ifndef QT_NO_DRAGANDDROP +void TQIconViewItem::dropped( TQDropEvent *, const TQValueList & ) +{ +} +#endif + +/*! + This function is called when a drag enters the item's bounding + rectangle. + + The default implementation does nothing; subclasses may + reimplement this function. +*/ + +void TQIconViewItem::dragEntered() +{ +} + +/*! + This function is called when a drag leaves the item's bounding + rectangle. + + The default implementation does nothing; subclasses may + reimplement this function. +*/ + +void TQIconViewItem::dragLeft() +{ +} + +/*! + Sets the bounding rectangle of the whole item to \a r. This + function is provided for subclasses which reimplement calcRect(), + so that they can set the calculated rectangle. \e{Any other use is + discouraged.} + + \sa calcRect() textRect() setTextRect() pixmapRect() setPixmapRect() +*/ + +void TQIconViewItem::setItemRect( const TQRect &r ) +{ + itemRect = r; + checkRect(); + if ( view ) + view->updateItemContainer( this ); +} + +/*! + Sets the bounding rectangle of the item's text to \a r. This + function is provided for subclasses which reimplement calcRect(), + so that they can set the calculated rectangle. \e{Any other use is + discouraged.} + + \sa calcRect() textRect() setItemRect() setPixmapRect() +*/ + +void TQIconViewItem::setTextRect( const TQRect &r ) +{ + itemTextRect = r; + if ( view ) + view->updateItemContainer( this ); +} + +/*! + Sets the bounding rectangle of the item's icon to \a r. This + function is provided for subclasses which reimplement calcRect(), + so that they can set the calculated rectangle. \e{Any other use is + discouraged.} + + \sa calcRect() pixmapRect() setItemRect() setTextRect() +*/ + +void TQIconViewItem::setPixmapRect( const TQRect &r ) +{ + itemIconRect = r; + if ( view ) + view->updateItemContainer( this ); +} + +/*! + \internal +*/ + +void TQIconViewItem::calcTmpText() +{ + if ( !view || view->d->wordWrapIconText || !wordWrapDirty ) + return; + wordWrapDirty = FALSE; + + int w = iconView()->maxItemWidth() - ( iconView()->itemTextPos() == TQIconView::Bottom ? 0 : + pixmapRect().width() ); + if ( view->d->fm->width( itemText ) < w ) { + tmpText = itemText; + return; + } + + tmpText = "..."; + int i = 0; + while ( view->d->fm->width( tmpText + itemText[ i ] ) < w ) + tmpText += itemText[ i++ ]; + tmpText.remove( (uint)0, 3 ); + tmpText += "..."; +} + +/*! \internal */ + +TQString TQIconViewItem::tempText() const +{ + return tmpText; +} + +void TQIconViewItem::checkRect() +{ + int x = itemRect.x(); + int y = itemRect.y(); + int w = itemRect.width(); + int h = itemRect.height(); + + bool changed = FALSE; + if ( x < 0 ) { + x = 0; + changed = TRUE; + } + if ( y < 0 ) { + y = 0; + changed = TRUE; + } + + if ( changed ) + itemRect.setRect( x, y, w, h ); +} + + +/*! \file iconview/simple_dd/main.h */ +/*! \file iconview/simple_dd/main.cpp */ + + +/*! + \class TQIconView ntqiconview.h + \brief The TQIconView class provides an area with movable labelled icons. + + \module iconview + \ingroup advanced + \mainclass + + A TQIconView can display and manage a grid or other 2D layout of + labelled icons. Each labelled icon is a TQIconViewItem. Items + (TQIconViewItems) can be added or deleted at any time; items can be + moved within the TQIconView. Single or multiple items can be + selected. Items can be renamed in-place. TQIconView also supports + \link #draganddrop drag and drop\endlink. + + Each item contains a label string, a pixmap or picture (the icon + itself) and optionally a sort key. The sort key is used for + sorting the items and defaults to the label string. The label + string can be displayed below or to the right of the icon (see \l + ItemTextPos). + + The simplest way to create a TQIconView is to create a TQIconView + object and create some TQIconViewItems with the TQIconView as their + parent, set the icon view's geometry and show it. + For example: + \code + TQIconView *iv = new TQIconView( this ); + TQDir dir( path, "*.xpm" ); + for ( uint i = 0; i < dir.count(); i++ ) { + (void) new TQIconViewItem( iv, dir[i], TQPixmap( path + dir[i] ) ); + } + iv->resize( 600, 400 ); + iv->show(); + \endcode + + The TQIconViewItem call passes a pointer to the TQIconView we wish to + populate, along with the label text and a TQPixmap. + + When an item is inserted the TQIconView allocates a position for it. + Existing items are rearranged if autoArrange() is TRUE. The + default arrangement is \c LeftToRight -- the TQIconView fills + the \e top-most row from left to right, then moves one row \e down + and fills that row from left to right and so on. The + arrangement can be modified with any of the following approaches: + \list + \i Call setArrangement(), e.g. with \c TopToBottom which will fill up + the \e left-most column from top to bottom, then moves one column + \e right and fills that from top to bottom and so on. + + \i Construct each TQIconViewItem using a constructor which allows + you to specify which item the new one is to follow. + \i Call setSorting() or sort() to sort the items. + \endlist + + The spacing between items is set with setSpacing(). Items can be + laid out using a fixed grid using setGridX() and setGridY(); by + default the TQIconView calculates a grid dynamically. The position + of items' label text is set with setItemTextPos(). The text's + background can be set with setItemTextBackground(). The maximum + width of an item and of its text are set with setMaxItemWidth() + and setMaxItemTextLength(). The label text will be word-wrapped if + it is too long; this is controlled by setWordWrapIconText(). If + the label text is truncated, the user can still see the entire + text in a tool tip if they hover the mouse over the item. This is + controlled with setShowToolTips(). + + Items which are \link TQIconViewItem::isSelectable() + selectable\endlink may be selected depending on the SelectionMode; + the default is \c Single. Because TQIconView offers multiple + selection it must display keyboard focus and selection state + separately. Therefore there are functions to set the selection + state of an item (setSelected()) and to select which item displays + keyboard focus (setCurrentItem()). When multiple items may be + selected the icon view provides a rubberband, too. + + When in-place renaming is enabled (it is disabled by default), the + user may change the item's label. They do this by selecting the item + (single clicking it or navigating to it with the arrow keys), then + single clicking it (or pressing F2), and entering their text. If no + key has been set with TQIconViewItem::setKey() the new text will also + serve as the key. (See TQIconViewItem::setRenameEnabled().) + + You can control whether users can move items themselves with + setItemsMovable(). + + Because the internal structure used to store the icon view items is + linear, no iterator class is needed to iterate over all the items. + Instead we iterate by getting the first item from the \e{icon view} + and then each subsequent (\l TQIconViewItem::nextItem()) from each + \e item in turn: + \code + for ( TQIconViewItem *item = iv->firstItem(); item; item = item->nextItem() ) + do_something( item ); + \endcode + TQIconView also provides currentItem(). You can search for an item + using findItem() (searching by position or for label text) and + with findFirstVisibleItem() and findLastVisibleItem(). The number + of items is returned by count(). An item can be removed from an + icon view using takeItem(); to delete an item use \c delete. All + the items can be deleted with clear(). + + The TQIconView emits a wide range of useful signals, including + selectionChanged(), currentChanged(), clicked(), moved() and + itemRenamed(). + + \target draganddrop + \section1 Drag and Drop + + TQIconView supports the drag and drop of items within the TQIconView + itself. It also supports the drag and drop of items out of or into + the TQIconView and drag and drop onto items themselves. The drag and + drop of items outside the TQIconView can be achieved in a simple way + with basic functionality, or in a more sophisticated way which + provides more power and control. + + The simple approach to dragging items out of the icon view is to + subclass TQIconView and reimplement TQIconView::dragObject(). + + \code + TQDragObject *MyIconView::dragObject() + { + return new TQTextDrag( currentItem()->text(), this ); + } + \endcode + + In this example we create a TQTextDrag object, (derived from + TQDragObject), containing the item's label and return it as the drag + object. We could just as easily have created a TQImageDrag from the + item's pixmap and returned that instead. + + TQIconViews and their TQIconViewItems can also be the targets of drag + and drops. To make the TQIconView itself able to accept drops connect + to the dropped() signal. When a drop occurs this signal will be + emitted with a TQDragEvent and a TQValueList of TQIconDragItems. To + make a TQIconViewItem into a drop target subclass TQIconViewItem and + reimplement TQIconViewItem::acceptDrop() and + TQIconViewItem::dropped(). + + \code + bool MyIconViewItem::acceptDrop( const TQMimeSource *mime ) const + { + if ( mime->provides( "text/plain" ) ) + return TRUE; + return FALSE; + } + + void MyIconViewItem::dropped( TQDropEvent *evt, const TQValueList& ) + { + TQString label; + if ( TQTextDrag::decode( evt, label ) ) + setText( label ); + } + \endcode + + See \l iconview/simple_dd/main.h and \l + iconview/simple_dd/main.cpp for a simple drag and drop example + which demonstrates drag and drop between a TQIconView and a + TQListBox. + + If you want to use extended drag-and-drop or have drag shapes drawn + you must take a more sophisticated approach. + + The first part is starting drags -- you should use a TQIconDrag (or a + class derived from it) for the drag object. In dragObject() create the + drag object, populate it with TQIconDragItems and return it. Normally + such a drag should offer each selected item's data. So in dragObject() + you should iterate over all the items, and create a TQIconDragItem for + each selected item, and append these items with TQIconDrag::append() to + the TQIconDrag object. You can use TQIconDragItem::setData() to set the + data of each item that should be dragged. If you want to offer the + data in additional mime-types, it's best to use a class derived from + TQIconDrag, which implements additional encoding and decoding + functions. + + When a drag enters the icon view, there is little to do. Simply + connect to the dropped() signal and reimplement + TQIconViewItem::acceptDrop() and TQIconViewItem::dropped(). If you've + used a TQIconDrag (or a subclass of it) the second argument to the + dropped signal contains a TQValueList of TQIconDragItems -- you can + access their data by calling TQIconDragItem::data() on each one. + + For an example implementation of complex drag-and-drop look at the + fileiconview example (qt/examples/fileiconview). + + \sa TQIconViewItem::setDragEnabled(), TQIconViewItem::setDropEnabled(), + TQIconViewItem::acceptDrop(), TQIconViewItem::dropped(). + + +*/ + +/*! \enum TQIconView::ResizeMode + + This enum type is used to tell TQIconView how it should treat the + positions of its icons when the widget is resized. The modes are: + + \value Fixed The icons' positions are not changed. + \value Adjust The icons' positions are adjusted to be within the + new geometry, if possible. +*/ + +/*! + \enum TQIconView::SelectionMode + + This enumerated type is used by TQIconView to indicate how it + reacts to selection by the user. It has four values: + + \value Single When the user selects an item, any already-selected + item becomes unselected and the user cannot unselect the selected + item. This means that the user can never clear the selection. (The + application programmer can, using TQIconView::clearSelection().) + + \value Multi When the user selects an item, e.g. by navigating + to it with the keyboard arrow keys or by clicking it, the + selection status of that item is toggled and the other items are + left alone. Also, multiple items can be selected by dragging the + mouse while the left mouse button stays pressed. + + \value Extended When the user selects an item the selection is + cleared and the new item selected. However, if the user presses + the Ctrl key when clicking on an item, the clicked item gets + toggled and all other items are left untouched. If the user + presses the Shift key while clicking on an item, all items between + the current item and the clicked item get selected or unselected, + depending on the state of the clicked item. Also, multiple items + can be selected by dragging the mouse while the left mouse button + stays pressed. + + \value NoSelection Items cannot be selected. + + To summarise: \c Single is a real single-selection icon view; \c + Multi a real multi-selection icon view; \c Extended is an icon + view in which users can select multiple items but usually want to + select either just one or a range of contiguous items; and \c + NoSelection mode is for an icon view where the user can look but + not touch. +*/ + +/*! + \enum TQIconView::Arrangement + + This enum type determines in which direction the items flow when + the view runs out of space. + + \value LeftToRight Items which don't fit into the view cause the + viewport to extend vertically (you get a vertical scrollbar). + + \value TopToBottom Items which don't fit into the view cause the + viewport to extend horizontally (you get a horizontal scrollbar). +*/ + +/*! + \enum TQIconView::ItemTextPos + + This enum type specifies the position of the item text in relation + to the icon. + + \value Bottom The text is drawn below the icon. + \value Right The text is drawn to the right of the icon. +*/ + +/*! + \fn void TQIconView::dropped ( TQDropEvent * e, const TQValueList &lst ) + + This signal is emitted when a drop event occurs in the viewport + (but not on any icon) which the icon view itself can't handle. + + \a e provides all the information about the drop. If the drag + object of the drop was a TQIconDrag, \a lst contains the list of + the dropped items. You can get the data using + TQIconDragItem::data() on each item. If the \a lst is empty, i.e. + the drag was not a TQIconDrag, you have to decode the data in \a e + and work with that. + + Note TQIconViewItems may be drop targets; if a drop event occurs on + an item the item handles the drop. +*/ + +/*! + \fn void TQIconView::moved() + + This signal is emitted after successfully dropping one (or more) + items of the icon view. If the items should be removed, it's best + to do so in a slot connected to this signal. +*/ + +/*! + \fn void TQIconView::doubleClicked(TQIconViewItem * item) + + This signal is emitted when the user double-clicks on \a item. +*/ + +/*! + \fn void TQIconView::returnPressed (TQIconViewItem * item) + + This signal is emitted if the user presses the Return or Enter + key. \a item is the currentItem() at the time of the keypress. +*/ + +/*! + \fn void TQIconView::selectionChanged() + + This signal is emitted when the selection has been changed. It's + emitted in each selection mode. +*/ + +/*! + \overload void TQIconView::selectionChanged( TQIconViewItem *item ) + + This signal is emitted when the selection changes. \a item is the + newly selected item. This signal is emitted only in single + selection mode. +*/ + +/*! + \fn void TQIconView::currentChanged( TQIconViewItem *item ) + + This signal is emitted when a new item becomes current. \a item is + the new current item (or 0 if no item is now current). + + \sa currentItem() +*/ + +/*! + \fn void TQIconView::onItem( TQIconViewItem *item ) + + This signal is emitted when the user moves the mouse cursor onto + an \a item, similar to the TQWidget::enterEvent() function. +*/ + +// ### bug here - enter/leave event aren't considered. move the mouse +// out of the window and back in, to the same item. + +/*! + \fn void TQIconView::onViewport() + + This signal is emitted when the user moves the mouse cursor from + an item to an empty part of the icon view. + + \sa onItem() +*/ + +/*! + \overload void TQIconView::itemRenamed (TQIconViewItem * item) + + This signal is emitted when \a item has been renamed, usually by + in-place renaming. + + \sa TQIconViewItem::setRenameEnabled() TQIconViewItem::rename() +*/ + +/*! + \fn void TQIconView::itemRenamed (TQIconViewItem * item, const TQString &name) + + This signal is emitted when \a item has been renamed to \a name, + usually by in-place renaming. + + \sa TQIconViewItem::setRenameEnabled() TQIconViewItem::rename() +*/ + +/*! + \fn void TQIconView::rightButtonClicked (TQIconViewItem * item, const TQPoint & pos) + + This signal is emitted when the user clicks the right mouse + button. If \a item is non-null, the cursor is on \a item. If \a + item is null, the mouse cursor isn't on any item. + + \a pos is the position of the mouse cursor in the global + coordinate system (TQMouseEvent::globalPos()). (If the click's + press and release differ by a pixel or two, \a pos is the + position at release time.) + + \sa rightButtonPressed() mouseButtonClicked() clicked() +*/ + +/*! + \fn void TQIconView::contextMenuRequested( TQIconViewItem *item, const TQPoint & pos ) + + This signal is emitted when the user invokes a context menu with + the right mouse button or with special system keys, with \a item + being the item under the mouse cursor or the current item, + respectively. + + \a pos is the position for the context menu in the global + coordinate system. +*/ + +/*! + \fn void TQIconView::mouseButtonPressed (int button, TQIconViewItem * item, const TQPoint & pos) + + This signal is emitted when the user presses mouse button \a + button. If \a item is non-null, the cursor is on \a item. If \a + item is null, the mouse cursor isn't on any item. + + \a pos is the position of the mouse cursor in the global + coordinate system (TQMouseEvent::globalPos()). + + \sa rightButtonClicked() mouseButtonPressed() pressed() +*/ + +/*! + \fn void TQIconView::mouseButtonClicked (int button, TQIconViewItem * item, const TQPoint & pos ) + + This signal is emitted when the user clicks mouse button \a + button. If \a item is non-null, the cursor is on \a item. If \a + item is null, the mouse cursor isn't on any item. + + \a pos is the position of the mouse cursor in the global + coordinate system (TQMouseEvent::globalPos()). (If the click's + press and release differ by a pixel or two, \a pos is the + position at release time.) + + \sa mouseButtonPressed() rightButtonClicked() clicked() +*/ + +/*! + \overload void TQIconView::clicked ( TQIconViewItem * item, const TQPoint & pos ) + + This signal is emitted when the user clicks any mouse button on an + icon view item. \a item is a pointer to the item that has been + clicked. + + \a pos is the position of the mouse cursor in the global coordinate + system (TQMouseEvent::globalPos()). (If the click's press and release + differ by a pixel or two, \a pos is the position at release time.) + + \sa mouseButtonClicked() rightButtonClicked() pressed() +*/ + +/*! + \overload void TQIconView::pressed ( TQIconViewItem * item, const TQPoint & pos ) + + This signal is emitted when the user presses any mouse button. If + \a item is non-null, the cursor is on \a item. If \a item is null, + the mouse cursor isn't on any item. + + \a pos is the position of the mouse cursor in the global + coordinate system (TQMouseEvent::globalPos()). (If the click's + press and release differ by a pixel or two, \a pos is the + position at release time.) + + \sa mouseButtonPressed() rightButtonPressed() clicked() +*/ + +/*! + \fn void TQIconView::clicked ( TQIconViewItem * item ) + + This signal is emitted when the user clicks any mouse button. If + \a item is non-null, the cursor is on \a item. If \a item is null, + the mouse cursor isn't on any item. + + \sa mouseButtonClicked() rightButtonClicked() pressed() +*/ + +/*! + \fn void TQIconView::pressed ( TQIconViewItem * item ) + + This signal is emitted when the user presses any mouse button. If + \a item is non-null, the cursor is on \a item. If \a item is null, + the mouse cursor isn't on any item. + + \sa mouseButtonPressed() rightButtonPressed() clicked() +*/ + +/*! + \fn void TQIconView::rightButtonPressed( TQIconViewItem * item, const TQPoint & pos ) + + This signal is emitted when the user presses the right mouse + button. If \a item is non-null, the cursor is on \a item. If \a + item is null, the mouse cursor isn't on any item. + + \a pos is the position of the mouse cursor in the global + coordinate system (TQMouseEvent::globalPos()). +*/ + +/*! + Constructs an empty icon view called \a name, with parent \a + parent and using the widget flags \a f. +*/ + +TQIconView::TQIconView( TQWidget *parent, const char *name, WFlags f ) + : TQScrollView( parent, name, WStaticContents | WNoAutoErase | f ) +{ + if ( !unknown_icon ) { + unknown_icon = new TQPixmap( (const char **)unknown_xpm ); + qiv_cleanup_pixmap.add( &unknown_icon ); + } + + d = new TQIconViewPrivate; + d->dragging = FALSE; + d->firstItem = 0; + d->lastItem = 0; + d->count = 0; + d->mousePressed = FALSE; + d->selectionMode = Single; + d->currentItem = 0; + d->highlightedItem = 0; + d->rubber = 0; + d->canStartRubber = FALSE; + d->backBuffer = 0; + d->scrollTimer = 0; + d->startDragItem = 0; + d->tmpCurrentItem = 0; + d->rastX = d->rastY = -1; + d->spacing = 5; + d->cleared = FALSE; + d->arrangement = LeftToRight; + d->resizeMode = Fixed; + d->dropped = FALSE; + d->adjustTimer = new TQTimer( this, "iconview adjust timer" ); + d->isIconDrag = FALSE; + d->inMenuMode = FALSE; +#ifndef QT_NO_DRAGANDDROP + d->iconDragData.clear(); +#endif + d->numDragItems = 0; + d->updateTimer = new TQTimer( this, "iconview update timer" ); + d->cachedW = d->cachedH = 0; + d->maxItemWidth = 100; + d->maxItemTextLength = 255; + d->inputTimer = new TQTimer( this, "iconview input timer" ); + d->currInputString = TQString::null; + d->dirty = FALSE; + d->rearrangeEnabled = TRUE; + d->itemTextPos = Bottom; + d->reorderItemsWhenInsert = TRUE; +#ifndef QT_NO_CURSOR + d->oldCursor = arrowCursor; +#endif + d->resortItemsWhenInsert = FALSE; + d->sortDirection = TRUE; + d->wordWrapIconText = TRUE; + d->cachedContentsX = d->cachedContentsY = -1; + d->clearing = FALSE; + d->fullRedrawTimer = new TQTimer( this, "iconview full redraw timer" ); + d->itemTextBrush = NoBrush; + d->drawAllBack = TRUE; + d->fm = new TQFontMetrics( font() ); + d->minLeftBearing = d->fm->minLeftBearing(); + d->minRightBearing = d->fm->minRightBearing(); + d->firstContainer = d->lastContainer = 0; + d->containerUpdateLocked = FALSE; + d->firstSizeHint = FALSE; + d->selectAnchor = 0; + d->renamingItem = 0; + d->drawActiveSelection = TRUE; + d->drawDragShapes = FALSE; + d->backrubber = 0; + + connect( d->adjustTimer, SIGNAL( timeout() ), + this, SLOT( adjustItems() ) ); + connect( d->updateTimer, SIGNAL( timeout() ), + this, SLOT( slotUpdate() ) ); + connect( d->fullRedrawTimer, SIGNAL( timeout() ), + this, SLOT( updateContents() ) ); + connect( this, SIGNAL( contentsMoving(int,int) ), + this, SLOT( movedContents(int,int) ) ); + + setAcceptDrops( TRUE ); + viewport()->setAcceptDrops( TRUE ); + + setMouseTracking( TRUE ); + viewport()->setMouseTracking( TRUE ); + + viewport()->setBackgroundMode( PaletteBase); + setBackgroundMode( PaletteBackground, PaletteBase ); + viewport()->setFocusProxy( this ); + viewport()->setFocusPolicy( TQWidget::WheelFocus ); + +#ifndef QT_NO_TOOLTIP + d->toolTip = new TQIconViewToolTip( viewport(), this ); +#endif + d->showTips = TRUE; +} + +/*! + \reimp +*/ + +void TQIconView::styleChange( TQStyle& old ) +{ + TQScrollView::styleChange( old ); + *d->fm = TQFontMetrics( font() ); + d->minLeftBearing = d->fm->minLeftBearing(); + d->minRightBearing = d->fm->minRightBearing(); + + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + item->wordWrapDirty = TRUE; + item->calcRect(); + } + +#if !defined(Q_WS_X11) + delete qiv_selection; + qiv_selection = 0; +#endif +} + +/*! + \reimp +*/ + +void TQIconView::setFont( const TQFont & f ) +{ + TQScrollView::setFont( f ); + *d->fm = TQFontMetrics( font() ); + d->minLeftBearing = d->fm->minLeftBearing(); + d->minRightBearing = d->fm->minRightBearing(); + + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + item->wordWrapDirty = TRUE; + item->calcRect(); + } +} + +/*! + \reimp +*/ + +void TQIconView::setPalette( const TQPalette & p ) +{ + TQScrollView::setPalette( p ); + *d->fm = TQFontMetrics( font() ); + d->minLeftBearing = d->fm->minLeftBearing(); + d->minRightBearing = d->fm->minRightBearing(); + + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + item->wordWrapDirty = TRUE; + item->calcRect(); + } +} + +/*! + Destroys the icon view and deletes all items. +*/ + +TQIconView::~TQIconView() +{ + TQIconViewItem *tmp, *item = d->firstItem; + d->clearing = TRUE; + TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; + while ( c ) { + tmpc = c->n; + delete c; + c = tmpc; + } + while ( item ) { + tmp = item->next; + delete item; + item = tmp; + } + delete d->backBuffer; + d->backBuffer = 0; + delete d->fm; + d->fm = 0; +#ifndef QT_NO_TOOLTIP + delete d->toolTip; + d->toolTip = 0; +#endif + delete d; + d = NULL; +} + +/*! + Inserts the icon view item \a item after \a after. If \a after is + 0, \a item is appended after the last item. + + \e{You should never need to call this function.} Instead create + TQIconViewItem's and associate them with your icon view like this: + + \code + (void) new TQIconViewItem( myIconview, "The text of the item", aPixmap ); + \endcode +*/ + +void TQIconView::insertItem( TQIconViewItem *item, TQIconViewItem *after ) +{ + if ( !item ) + return; + + if ( d->firstItem == item || item->prev || item->next) + return; + + if ( !item->view ) + item->view = this; + + if ( !d->firstItem ) { + d->firstItem = d->lastItem = item; + item->prev = 0; + item->next = 0; + } else { + if ( !after || after == d->lastItem ) { + d->lastItem->next = item; + item->prev = d->lastItem; + item->next = 0; + d->lastItem = item; + } else { + TQIconViewItem *i = d->firstItem; + while ( i != after ) + i = i->next; + + if ( i ) { + TQIconViewItem *next = i->next; + item->next = next; + item->prev = i; + i->next = item; + next->prev = item; + } + } + } + + if ( isVisible() ) { + if ( d->reorderItemsWhenInsert ) { + if ( d->updateTimer->isActive() ) + d->updateTimer->stop(); + d->fullRedrawTimer->stop(); + // #### uncomment this ASA insertInGrid uses cached values and is efficient + //insertInGrid( item ); + + d->cachedW = TQMAX( d->cachedW, item->x() + item->width() ); + d->cachedH = TQMAX( d->cachedH, item->y() + item->height() ); + + d->updateTimer->start( 0, TRUE ); + } else { + insertInGrid( item ); + + viewport()->update(item->x() - contentsX(), + item->y() - contentsY(), + item->width(), item->height()); + } + } else if ( !autoArrange() ) { + item->dirty = FALSE; + } + + d->count++; + d->dirty = TRUE; +} + +/*! + This slot is used for a slightly-delayed update. + + The icon view is not redrawn immediately after inserting a new item + but after a very small delay using a TQTimer. This means that when + many items are inserted in a loop the icon view is probably redrawn + only once at the end of the loop. This makes the insertions both + flicker-free and faster. +*/ + +void TQIconView::slotUpdate() +{ + d->updateTimer->stop(); + d->fullRedrawTimer->stop(); + + if ( !d->firstItem || !d->lastItem ) + return; + + // #### remove that ASA insertInGrid uses cached values and is efficient + if ( d->resortItemsWhenInsert ) + sort( d->sortDirection ); + else { + int y = d->spacing; + TQIconViewItem *item = d->firstItem; + int w = 0, h = 0; + while ( item ) { + bool changed; + TQIconViewItem *next = makeRowLayout( item, y, changed ); + if ( !next || !next->next ) + break; + + if( !TQApplication::reverseLayout() ) + item = next; + w = TQMAX( w, item->x() + item->width() ); + h = TQMAX( h, item->y() + item->height() ); + item = next; + if ( d->arrangement == LeftToRight ) + h = TQMAX( h, y ); + + item = item->next; + } + + if ( d->lastItem && d->arrangement == TopToBottom ) { + item = d->lastItem; + int x = item->x(); + while ( item && item->x() >= x ) { + w = TQMAX( w, item->x() + item->width() ); + h = TQMAX( h, item->y() + item->height() ); + item = item->prev; + } + } + + w = TQMAX( TQMAX( d->cachedW, w ), d->lastItem->x() + d->lastItem->width() ); + h = TQMAX( TQMAX( d->cachedH, h ), d->lastItem->y() + d->lastItem->height() ); + + if ( d->arrangement == TopToBottom ) + w += d->spacing; + else + h += d->spacing; + viewport()->setUpdatesEnabled( FALSE ); + resizeContents( w, h ); + viewport()->setUpdatesEnabled( TRUE ); + viewport()->repaint( FALSE ); + } + + int cx = d->cachedContentsX == -1 ? contentsX() : d->cachedContentsX; + int cy = d->cachedContentsY == -1 ? contentsY() : d->cachedContentsY; + + if ( cx != contentsX() || cy != contentsY() ) + setContentsPos( cx, cy ); + + d->cachedContentsX = d->cachedContentsY = -1; + d->cachedW = d->cachedH = 0; +} + +/*! + Takes the icon view item \a item out of the icon view and causes + an update of the screen display. The item is not deleted. You + should normally not need to call this function because + TQIconViewItem::~TQIconViewItem() calls it. The normal way to delete + an item is to delete it. +*/ + +void TQIconView::takeItem( TQIconViewItem *item ) +{ + if ( !item ) + return; + + if ( item->d->container1 ) + item->d->container1->items.removeRef( item ); + if ( item->d->container2 ) + item->d->container2->items.removeRef( item ); + item->d->container2 = 0; + item->d->container1 = 0; + + bool block = signalsBlocked(); + blockSignals( d->clearing ); + + TQRect r = item->rect(); + + if ( d->currentItem == item ) { + if ( item->prev ) { + d->currentItem = item->prev; + emit currentChanged( d->currentItem ); + repaintItem( d->currentItem ); + } else if ( item->next ) { + d->currentItem = item->next; + emit currentChanged( d->currentItem ); + repaintItem( d->currentItem ); + } else { + d->currentItem = 0; + emit currentChanged( d->currentItem ); + } + } + if ( item->isSelected() ) { + item->selected = FALSE; + emit selectionChanged(); + } + + if ( item == d->firstItem ) { + d->firstItem = d->firstItem->next; + if ( d->firstItem ) + d->firstItem->prev = 0; + } else if ( item == d->lastItem ) { + d->lastItem = d->lastItem->prev; + if ( d->lastItem ) + d->lastItem->next = 0; + } else { + TQIconViewItem *i = item; + if ( i ) { + if ( i->prev ) + i->prev->next = i->next; + if ( i->next ) + i->next->prev = i->prev; + } + } + + if ( d->selectAnchor == item ) + d->selectAnchor = d->currentItem; + + if ( !d->clearing ) + repaintContents( r.x(), r.y(), r.width(), r.height(), TRUE ); + + item->view = 0; + item->prev = 0; + item->next = 0; + d->count--; + + blockSignals( block ); +} + +/*! + Returns the index of \a item, or -1 if \a item doesn't exist in + this icon view. +*/ + +int TQIconView::index( const TQIconViewItem *item ) const +{ + if ( !item ) + return -1; + + if ( item == d->firstItem ) + return 0; + else if ( item == d->lastItem ) + return d->count - 1; + else { + TQIconViewItem *i = d->firstItem; + int j = 0; + while ( i && i != item ) { + i = i->next; + ++j; + } + + return i ? j : -1; + } +} + +/*! + Returns a pointer to the first item of the icon view, or 0 if + there are no items in the icon view. + + \sa lastItem() currentItem() +*/ + +TQIconViewItem *TQIconView::firstItem() const +{ + if (d) { + return d->firstItem; + } + else { + return NULL; + } +} + +/*! + Returns a pointer to the last item of the icon view, or 0 if there + are no items in the icon view. + + \sa firstItem() currentItem() +*/ + +TQIconViewItem *TQIconView::lastItem() const +{ + if (d) { + return d->lastItem; + } + else { + return NULL; + } +} + +/*! + Returns a pointer to the current item of the icon view, or 0 if no + item is current. + + \sa setCurrentItem() firstItem() lastItem() +*/ + +TQIconViewItem *TQIconView::currentItem() const +{ + if (d) { + return d->currentItem; + } + else { + return NULL; + } +} + +/*! + Makes \a item the new current item of the icon view. +*/ + +void TQIconView::setCurrentItem( TQIconViewItem *item ) +{ + if ( !item || item == d->currentItem ) + return; + + setMicroFocusHint( item->x(), item->y(), item->width(), item->height(), FALSE ); + + TQIconViewItem *old = d->currentItem; + d->currentItem = item; + emit currentChanged( d->currentItem ); + if ( d->selectionMode == Single ) { + bool changed = FALSE; + if ( old && old->selected ) { + old->selected = FALSE; + changed = TRUE; + } + if ( item && !item->selected && item->isSelectable() && d->selectionMode != NoSelection ) { + item->selected = TRUE; + changed = TRUE; + emit selectionChanged( item ); + } + if ( changed ) + emit selectionChanged(); + } + + if ( old ) + repaintItem( old ); + repaintItem( d->currentItem ); +} + +/*! + Selects or unselects \a item depending on \a s, and may also + unselect other items, depending on TQIconView::selectionMode() and + \a cb. + + If \a s is FALSE, \a item is unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Single, \a + item is selected, and the item which was selected is unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Extended, \a + item is selected. If \a cb is TRUE, the selection state of the + icon view's other items is left unchanged. If \a cb is FALSE (the + default) all other items are unselected. + + If \a s is TRUE and TQIconView::selectionMode() is \c Multi \a item + is selected. + + Note that \a cb is used only if TQIconView::selectionMode() is \c + Extended. \a cb defaults to FALSE. + + All items whose selection status is changed repaint themselves. +*/ + +void TQIconView::setSelected( TQIconViewItem *item, bool s, bool cb ) +{ + if ( !item ) + return; + item->setSelected( s, cb ); +} + +/*! + \property TQIconView::count + \brief the number of items in the icon view +*/ + +uint TQIconView::count() const +{ + return d->count; +} + +/*! + Performs autoscrolling when selecting multiple icons with the + rubber band. +*/ + +void TQIconView::doAutoScroll() +{ + TQRect oldRubber = *d->rubber; + + TQPoint vp = viewport()->mapFromGlobal( TQCursor::pos() ); + TQPoint pos = viewportToContents( vp ); + + if ( pos == d->rubber->bottomRight() ) + return; + + d->rubber->setRight( pos.x() ); + d->rubber->setBottom( pos.y() ); + + int minx = contentsWidth(), miny = contentsHeight(); + int maxx = 0, maxy = 0; + bool changed = FALSE; + bool block = signalsBlocked(); + + TQRect rr; + + blockSignals( TRUE ); + viewport()->setUpdatesEnabled( FALSE ); + bool alreadyIntersected = FALSE; + TQRect nr = d->rubber->normalize(); + TQRect rubberUnion = nr.unite( oldRubber.normalize() ); + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + for ( ; c; c = c->n ) { + if ( c->rect.intersects( rubberUnion ) ) { + alreadyIntersected = TRUE; + TQIconViewItem *item = c->items.first(); + for ( ; item; item = c->items.next() ) { + if ( d->selectedItems.find( item ) ) + continue; + if ( !item->intersects( nr ) ) { + if ( item->isSelected() ) { + item->setSelected( FALSE ); + changed = TRUE; + rr = rr.unite( item->rect() ); + } + } else if ( item->intersects( nr ) ) { + if ( !item->isSelected() && item->isSelectable() ) { + item->setSelected( TRUE, TRUE ); + changed = TRUE; + rr = rr.unite( item->rect() ); + } + + minx = TQMIN( minx, item->x() - 1 ); + miny = TQMIN( miny, item->y() - 1 ); + maxx = TQMAX( maxx, item->x() + item->width() + 1 ); + maxy = TQMAX( maxy, item->y() + item->height() + 1 ); + } + } + } else { + if ( alreadyIntersected ) + break; + } + } + viewport()->setUpdatesEnabled( TRUE ); + blockSignals( block ); + + // static bool drawAll; + if ( d->backrubber == 0 ) { + d->backrubber = new TQPixmap( viewport()->rect().size() ); + d->backrubber->fill( viewport(), viewport()->rect().topLeft() ); + // drawAll = true; + } + + // int oldX = 0, oldY = 0; + // if ( !drawAll && d->scrollTimer ) { + // oldX = contentsX(); + // oldY = contentsY(); + // } + ensureVisible( pos.x(), pos.y() ); + // if ( !drawAll && d->scrollTimer && ( oldX != contentsX() || oldY != contentsY() ) ) + // drawAll = true; + + TQRect allRect = oldRubber.normalize(); + if ( changed ) + allRect |= rr.normalize(); + allRect |= d->rubber->normalize(); + TQPoint point = contentsToViewport( allRect.topLeft() ); + allRect = TQRect( point.x(), point.y(), allRect.width(), allRect.height() ); + allRect &= viewport()->rect(); + + d->dragging = FALSE; + + TQPainter p( d->backrubber ); + p.translate( -contentsX(), -contentsY() ); +#if 0 + if ( !drawAll ) { + oldRubber = oldRubber.normalize(); + point = contentsToViewport( oldRubber.topLeft() ); + oldRubber = TQRect( point.x(), point.y(), oldRubber.width(), oldRubber.height() ); + oldRubber &= viewport()->rect(); + + point = contentsToViewport( nr.topLeft() ); + nr = TQRect( point.x(), point.y(), nr.width(), nr.height() ); + nr &= viewport()->rect(); + + TQRegion region; + if ( allRect != nr ) + region = TQRegion(allRect).subtract( TQRegion( nr ) ); + if ( allRect != oldRubber ) + region += TQRegion(allRect).subtract( TQRegion( oldRubber ) ); + + TQMemArray< TQRect > ar = region.rects(); + for ( uint i = 0; i < ar.size(); ++i ) { + ar[i].addCoords( -2, -2, 4, 4 ); + ar[i] = ar[i].normalize(); + + p.setClipRect( ar[i] ); + drawContents( &p, contentsX() + ar[i].left(), contentsY() + ar[i].top(), ar[i].width(), ar[i].height() ); + } + } + else +#endif + { + drawContents( &p, + contentsX() + allRect.left(), contentsY() + allRect.top(), + allRect.width(), allRect.height() ); + } + + p.end(); + // drawAll = false; + d->dragging = TRUE; + bitBlt( viewport(), allRect.topLeft(), d->backrubber, allRect ); + + if ( changed ) { + emit selectionChanged(); + if ( d->selectionMode == Single ) + emit selectionChanged( d->currentItem ); + } + + if ( !TQRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) && + !d->scrollTimer ) { + d->scrollTimer = new TQTimer( this ); + + connect( d->scrollTimer, SIGNAL( timeout() ), + this, SLOT( doAutoScroll() ) ); + d->scrollTimer->start( 100, FALSE ); + } else if ( TQRect( 50, 50, viewport()->width()-100, viewport()->height()-100 ).contains( vp ) && + d->scrollTimer ) { + disconnect( d->scrollTimer, SIGNAL( timeout() ), + this, SLOT( doAutoScroll() ) ); + d->scrollTimer->stop(); + delete d->scrollTimer; + d->scrollTimer = 0; + } + +} + +/*! + \reimp +*/ + +void TQIconView::drawContents( TQPainter *p, int cx, int cy, int cw, int ch ) +{ + p->save(); + TQRect r = TQRect( cx, cy, cw, ch ); + + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + TQRegion remaining( TQRect( cx, cy, cw, ch ) ); + bool alreadyIntersected = FALSE; + while ( c ) { + if ( c->rect.intersects( r ) ) { + p->save(); + p->resetXForm(); + TQRect r2 = c->rect; + r2 = r2.intersect( r ); + TQRect r3( contentsToViewport( TQPoint( r2.x(), r2.y() ) ), TQSize( r2.width(), r2.height() ) ); + if ( d->drawAllBack ) { + p->setClipRect( r3 ); + } else { + TQRegion reg = d->clipRegion.intersect( r3 ); + p->setClipRegion( reg ); + } + drawBackground( p, r3 ); + remaining = remaining.subtract( r3 ); + p->restore(); + + TQColorGroup cg; + d->drawActiveSelection = hasFocus() || d->inMenuMode + || !style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this ); + + if ( !d->drawActiveSelection ) + cg = palette().inactive(); + else + cg = colorGroup(); + + TQIconViewItem *item = c->items.first(); + // clip items to the container rect by default... this + // prevents icons with alpha channels from being painted + // twice when they are in 2 containers + // + // NOTE: the item could override this cliprect in it's + // paintItem() implementation, which makes this useless + p->setClipRect( TQRect( contentsToViewport( r2.topLeft() ), r2.size() ) ); + for ( ; item; item = c->items.next() ) { + if ( item->rect().intersects( r ) && !item->dirty ) { + p->save(); + p->setFont( font() ); + item->paintItem( p, cg ); + p->restore(); + } + } + alreadyIntersected = TRUE; + } else { + if ( alreadyIntersected ) + break; + } + c = c->n; + } + + if ( !remaining.isNull() && !remaining.isEmpty() ) { + p->save(); + p->resetXForm(); + if ( d->drawAllBack ) { + p->setClipRegion( remaining ); + } else { + remaining = d->clipRegion.intersect( remaining ); + p->setClipRegion( remaining ); + } + drawBackground( p, remaining.boundingRect() ); + p->restore(); + } + + if ( ( hasFocus() || viewport()->hasFocus() ) && d->currentItem && + d->currentItem->rect().intersects( r ) ) { + d->currentItem->paintFocus( p, colorGroup() ); + } + + p->restore(); + if ( d->rubber ) { + p->save(); + p->translate( contentsX(), contentsY() ); + p->setRasterOp( NotROP ); + p->setPen( TQPen( color0, 1 ) ); + p->setBrush( NoBrush ); + drawRubber( p ); + p->restore(); + } +} + +/*! + \overload + + Arranges all the items in the grid given by gridX() and gridY(). + + Even if sorting() is enabled, the items are not sorted by this + function. If you want to sort or rearrange the items, use + iconview->sort(iconview->sortDirection()). + + If \a update is TRUE (the default), the viewport is repainted as + well. + + \sa TQIconView::setGridX(), TQIconView::setGridY(), TQIconView::sort() +*/ + +void TQIconView::arrangeItemsInGrid( bool update ) +{ + if ( !d->firstItem || !d->lastItem ) + return; + + d->containerUpdateLocked = TRUE; + + int w = 0, h = 0, y = d->spacing; + + TQIconViewItem *item = d->firstItem; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + bool changedLayout = FALSE; + while ( item ) { + bool changed; + TQIconViewItem *next = makeRowLayout( item, y, changed ); + changedLayout = changed || changedLayout; + if( !TQApplication::reverseLayout() ) + item = next; + w = TQMAX( w, item->x() + item->width() ); + h = TQMAX( h, item->y() + item->height() ); + item = next; + if ( d->arrangement == LeftToRight ) + h = TQMAX( h, y ); + + if ( !item || !item->next ) + break; + + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + } + + if ( d->lastItem && d->arrangement == TopToBottom ) { + item = d->lastItem; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + int x = 0; + if (item) + x = item->x(); + while ( item && item->x() >= x ) { + w = TQMAX( w, item->x() + item->width() ); + h = TQMAX( h, item->y() + item->height() ); + item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + } + } + d->containerUpdateLocked = FALSE; + + TQIconViewItem *lastVisibleItem = d->lastItem; + while (lastVisibleItem->prev && (lastVisibleItem->isVisible() == FALSE)) { + lastVisibleItem = lastVisibleItem->prev; + } + + w = TQMAX( TQMAX( d->cachedW, w ), lastVisibleItem->x() + lastVisibleItem->width() ); + h = TQMAX( TQMAX( d->cachedH, h ), lastVisibleItem->y() + lastVisibleItem->height() ); + + if ( d->arrangement == TopToBottom ) + w += d->spacing; + else + h += d->spacing; + + bool ue = isUpdatesEnabled(); + viewport()->setUpdatesEnabled( FALSE ); + int vw = visibleWidth(); + int vh = visibleHeight(); + resizeContents( w, h ); + bool doAgain = FALSE; + if ( d->arrangement == LeftToRight ) + doAgain = visibleWidth() != vw; + if ( d->arrangement == TopToBottom ) + doAgain = visibleHeight() != vh; + if ( doAgain ) // in the case that the visibleExtend changed because of the resizeContents (scrollbar show/hide), redo layout again + arrangeItemsInGrid( FALSE ); + viewport()->setUpdatesEnabled( ue ); + d->dirty = !isVisible(); + rebuildContainers(); + if ( update && ( !optimize_layout || changedLayout ) ) + repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE ); +} + +/*! + This variant uses \a grid instead of (gridX(), gridY()). If \a + grid is invalid (see TQSize::isValid()), arrangeItemsInGrid() + calculates a valid grid itself and uses that. + + If \a update is TRUE (the default) the viewport is repainted. +*/ + +void TQIconView::arrangeItemsInGrid( const TQSize &grid, bool update ) +{ + d->containerUpdateLocked = TRUE; + TQSize grid_( grid ); + if ( !grid_.isValid() ) { + int w = 0, h = 0; + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + w = TQMAX( w, item->width() ); + h = TQMAX( h, item->height() ); + } + + grid_ = TQSize( TQMAX( d->rastX + d->spacing, w ), + TQMAX( d->rastY + d->spacing, h ) ); + } + + int w = 0, h = 0; + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + int nx = item->x() / grid_.width(); + int ny = item->y() / grid_.height(); + item->move( nx * grid_.width(), + ny * grid_.height() ); + w = TQMAX( w, item->x() + item->width() ); + h = TQMAX( h, item->y() + item->height() ); + item->dirty = FALSE; + } + d->containerUpdateLocked = FALSE; + + resizeContents( w, h ); + rebuildContainers(); + if ( update ) + repaintContents( contentsX(), contentsY(), viewport()->width(), viewport()->height(), FALSE ); +} + +/*! + \reimp +*/ + +void TQIconView::setContentsPos( int x, int y ) +{ + if ( d->updateTimer->isActive() ) { + d->cachedContentsX = x; + d->cachedContentsY = y; + } else { + d->cachedContentsY = d->cachedContentsX = -1; + TQScrollView::setContentsPos( x, y ); + } +} + +/*! + \reimp +*/ + +void TQIconView::showEvent( TQShowEvent * ) +{ + if ( d->dirty ) { + resizeContents( TQMAX( contentsWidth(), viewport()->width() ), + TQMAX( contentsHeight(), viewport()->height() ) ); + if ( d->resortItemsWhenInsert ) + sort( d->sortDirection ); + if ( autoArrange() ) + arrangeItemsInGrid( FALSE ); + } + TQScrollView::show(); +} + +/*! + \property TQIconView::selectionMode + \brief the selection mode of the icon view + + This can be \c Single (the default), \c Extended, \c Multi or \c + NoSelection. +*/ + +void TQIconView::setSelectionMode( SelectionMode m ) +{ + d->selectionMode = m; +} + +TQIconView::SelectionMode TQIconView::selectionMode() const +{ + return d->selectionMode; +} + +/*! + Returns a pointer to the item that contains point \a pos, which is + given in contents coordinates, or 0 if no item contains point \a + pos. +*/ + +TQIconViewItem *TQIconView::findItem( const TQPoint &pos ) const +{ + if ( !d->firstItem ) + return 0; + + TQIconViewPrivate::ItemContainer *c = d->lastContainer; + for ( ; c; c = c->p ) { + if ( c->rect.contains( pos ) ) { + TQIconViewItem *item = c->items.last(); + for ( ; item; item = c->items.prev() ) + if ( item->contains( pos ) ) + return item; + } + } + + return 0; +} + +/*! + \overload + + Returns a pointer to the first item whose text begins with \a + text, or 0 if no such item could be found. Use the \a compare flag + to control the comparison behaviour. (See \l + {TQt::StringComparisonMode}.) +*/ + +TQIconViewItem *TQIconView::findItem( const TQString &text, ComparisonFlags compare ) const +{ + if ( !d->firstItem ) + return 0; + + if ( compare == CaseSensitive || compare == 0 ) + compare |= ExactMatch; + + TQString itmtxt; + TQString comtxt = text; + if ( ! (compare & CaseSensitive) ) + comtxt = text.lower(); + + TQIconViewItem *item; + if ( d->currentItem ) + item = d->currentItem; + else + item = d->firstItem; + + TQIconViewItem *beginsWithItem = 0; + TQIconViewItem *endsWithItem = 0; + TQIconViewItem *containsItem = 0; + + if ( item ) { + for ( ; item; item = item->next ) { + if ( ! (compare & CaseSensitive) ) + itmtxt = item->text().lower(); + else + itmtxt = item->text(); + + if ( compare & ExactMatch && itmtxt == comtxt ) + return item; + if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) ) + beginsWithItem = containsItem = item; + if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) ) + endsWithItem = containsItem = item; + if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) ) + containsItem = item; + } + + if ( d->currentItem && d->firstItem ) { + item = d->firstItem; + for ( ; item && item != d->currentItem; item = item->next ) { + if ( ! (compare & CaseSensitive) ) + itmtxt = item->text().lower(); + else + itmtxt = item->text(); + + if ( compare & ExactMatch && itmtxt == comtxt ) + return item; + if ( compare & BeginsWith && !beginsWithItem && itmtxt.startsWith( comtxt ) ) + beginsWithItem = containsItem = item; + if ( compare & EndsWith && !endsWithItem && itmtxt.endsWith( comtxt ) ) + endsWithItem = containsItem = item; + if ( compare & Contains && !containsItem && itmtxt.contains( comtxt ) ) + containsItem = item; + } + } + } + + // Obey the priorities + if ( beginsWithItem ) + return beginsWithItem; + else if ( endsWithItem ) + return endsWithItem; + else if ( containsItem ) + return containsItem; + return 0; +} + +/*! + Unselects all the items. +*/ + +void TQIconView::clearSelection() +{ + selectAll( FALSE ); +} + +/*! + In Multi and Extended modes, this function sets all items to be + selected if \a select is TRUE, and to be unselected if \a select + is FALSE. + + In Single and NoSelection modes, this function only changes the + selection status of currentItem(). +*/ + +void TQIconView::selectAll( bool select ) +{ + if ( d->selectionMode == NoSelection ) + return; + + if ( d->selectionMode == Single ) { + if ( d->currentItem ) + d->currentItem->setSelected( select ); + return; + } + + bool b = signalsBlocked(); + blockSignals( TRUE ); + TQIconViewItem *item = d->firstItem; + TQIconViewItem *i = d->currentItem; + bool changed = FALSE; + bool ue = viewport()->isUpdatesEnabled(); + viewport()->setUpdatesEnabled( FALSE ); + TQRect rr; + for ( ; item; item = item->next ) { + if (item->isVisible()) { + if ( select != item->isSelected() ) { + item->setSelected( select, TRUE ); + rr = rr.unite( item->rect() ); + changed = TRUE; + } + else { + if ( FALSE != item->isSelected() ) { + item->setSelected( FALSE, TRUE ); + changed = TRUE; + } + } + } + } + viewport()->setUpdatesEnabled( ue ); + // we call updateContents not repaintContents because of possible previous updateContents + TQScrollView::updateContents( rr ); + TQApplication::sendPostedEvents( viewport(), TQEvent::Paint ); + if ( i ) + setCurrentItem( i ); + blockSignals( b ); + if ( changed ) { + emit selectionChanged(); + } +} + +/*! + Inverts the selection. Works only in Multi and Extended selection + mode. +*/ + +void TQIconView::invertSelection() +{ + if ( d->selectionMode == Single || + d->selectionMode == NoSelection ) + return; + + bool b = signalsBlocked(); + blockSignals( TRUE ); + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) + item->setSelected( !item->isSelected(), TRUE ); + blockSignals( b ); + emit selectionChanged(); +} + +/*! + Repaints the \a item. +*/ + +void TQIconView::repaintItem( TQIconViewItem *item ) +{ + if ( !item || item->dirty ) + return; + + if ( TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ). + intersects( TQRect( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2 ) ) ) + repaintContents( item->x() - 1, item->y() - 1, item->width() + 2, item->height() + 2, FALSE ); +} + +/*! + Repaints the selected items. +*/ +void TQIconView::repaintSelectedItems() +{ + if ( selectionMode() == NoSelection ) + return; + + if ( selectionMode() == Single ) { + if ( !currentItem() || !currentItem()->isSelected() ) + return; + TQRect itemRect = currentItem()->rect(); //rect in contents coordinates + itemRect.moveBy( -contentsX(), -contentsY() ); + viewport()->update( itemRect ); + } else { + // check if any selected items are visible + TQIconViewItem *item = firstItem(); + const TQRect vr = TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ); + + while ( item ) { + if ( item->isSelected() && item->rect().intersects( vr ) ) + repaintItem( item ); + item = item->nextItem(); + } + } +} + +/*! + Makes sure that \a item is entirely visible. If necessary, + ensureItemVisible() scrolls the icon view. + + \sa ensureVisible() +*/ + +void TQIconView::ensureItemVisible( TQIconViewItem *item ) +{ + if ( !item ) + return; + + if ( (d->updateTimer && d->updateTimer->isActive()) || + (d->fullRedrawTimer && d->fullRedrawTimer->isActive()) ) + slotUpdate(); + + int w = item->width(); + int h = item->height(); + ensureVisible( item->x() + w / 2, item->y() + h / 2, + w / 2 + 1, h / 2 + 1 ); +} + +/*! + Finds the first item whose bounding rectangle overlaps \a r and + returns a pointer to that item. \a r is given in content + coordinates. Returns 0 if no item overlaps \a r. + + If you want to find all items that touch \a r, you will need to + use this function and nextItem() in a loop ending at + findLastVisibleItem() and test TQIconViewItem::rect() for each of + these items. + + \sa findLastVisibleItem() TQIconViewItem::rect() +*/ + +TQIconViewItem* TQIconView::findFirstVisibleItem( const TQRect &r ) const +{ + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + TQIconViewItem *i = 0; + bool alreadyIntersected = FALSE; + for ( ; c; c = c->n ) { + if ( c->rect.intersects( r ) ) { + alreadyIntersected = TRUE; + TQIconViewItem *item = c->items.first(); + for ( ; item; item = c->items.next() ) { + if ( r.intersects( item->rect() ) ) { + if ( !i ) { + i = item; + } else { + TQRect r2 = item->rect(); + TQRect r3 = i->rect(); + if ( r2.y() < r3.y() ) + i = item; + else if ( r2.y() == r3.y() && + r2.x() < r3.x() ) + i = item; + } + } + } + } else { + if ( alreadyIntersected ) + break; + } + } + + return i; +} + +/*! + Finds the last item whose bounding rectangle overlaps \a r and + returns a pointer to that item. \a r is given in content + coordinates. Returns 0 if no item overlaps \a r. + + \sa findFirstVisibleItem() +*/ + +TQIconViewItem* TQIconView::findLastVisibleItem( const TQRect &r ) const +{ + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + TQIconViewItem *i = 0; + bool alreadyIntersected = FALSE; + for ( ; c; c = c->n ) { + if ( c->rect.intersects( r ) ) { + alreadyIntersected = TRUE; + TQIconViewItem *item = c->items.first(); + for ( ; item; item = c->items.next() ) { + if ( r.intersects( item->rect() ) ) { + if ( !i ) { + i = item; + } else { + TQRect r2 = item->rect(); + TQRect r3 = i->rect(); + if ( r2.y() > r3.y() ) + i = item; + else if ( r2.y() == r3.y() && + r2.x() > r3.x() ) + i = item; + } + } + } + } else { + if ( alreadyIntersected ) + break; + } + } + + return i; +} + +/*! + Clears the icon view. All items are deleted. +*/ + +void TQIconView::clear() +{ + setContentsPos( 0, 0 ); + d->clearing = TRUE; + bool block = signalsBlocked(); + blockSignals( TRUE ); + clearSelection(); + blockSignals( block ); + setContentsPos( 0, 0 ); + d->currentItem = 0; + + if ( !d->firstItem ) { + d->clearing = FALSE; + return; + } + + TQIconViewItem *item = d->firstItem, *tmp; + d->firstItem = 0; + while ( item ) { + tmp = item->next; + delete item; + item = tmp; + } + TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; + while ( c ) { + tmpc = c->n; + delete c; + c = tmpc; + } + d->firstContainer = d->lastContainer = 0; + + d->count = 0; + d->lastItem = 0; + setCurrentItem( 0 ); + d->highlightedItem = 0; + d->tmpCurrentItem = 0; + d->drawDragShapes = FALSE; + + resizeContents( 0, 0 ); + // maybe we don�t need this update, so delay it + d->fullRedrawTimer->start( 0, TRUE ); + + d->cleared = TRUE; + d->clearing = FALSE; +} + +/*! + \property TQIconView::gridX + \brief the horizontal grid of the icon view + + If the value is -1, (the default), TQIconView computes suitable + column widths based on the icon view's contents. + + Note that setting a grid width overrides setMaxItemWidth(). +*/ + +void TQIconView::setGridX( int rx ) +{ + d->rastX = rx >= 0 ? rx : -1; +} + +/*! + \property TQIconView::gridY + \brief the vertical grid of the icon view + + If the value is -1, (the default), TQIconView computes suitable + column heights based on the icon view's contents. +*/ + +void TQIconView::setGridY( int ry ) +{ + d->rastY = ry >= 0 ? ry : -1; +} + +int TQIconView::gridX() const +{ + return d->rastX; +} + +int TQIconView::gridY() const +{ + return d->rastY; +} + +/*! + \property TQIconView::spacing + \brief the space in pixels between icon view items + + The default is 5 pixels. + + Negative values for spacing are illegal. +*/ + +void TQIconView::setSpacing( int sp ) +{ + d->spacing = sp; +} + +int TQIconView::spacing() const +{ + return d->spacing; +} + +/*! + \property TQIconView::itemTextPos + \brief the position where the text of each item is drawn. + + Valid values are \c Bottom or \c Right. The default is \c Bottom. +*/ + +void TQIconView::setItemTextPos( ItemTextPos pos ) +{ + if ( pos == d->itemTextPos || ( pos != Bottom && pos != Right ) ) + return; + + d->itemTextPos = pos; + + TQIconViewItem *item = d->firstItem; + for ( ; item; item = item->next ) { + item->wordWrapDirty = TRUE; + item->calcRect(); + } + + arrangeItemsInGrid( TRUE ); +} + +TQIconView::ItemTextPos TQIconView::itemTextPos() const +{ + return d->itemTextPos; +} + +/*! + \property TQIconView::itemTextBackground + \brief the brush to use when drawing the background of an item's text. + + By default this brush is set to NoBrush, meaning that only the + normal icon view background is used. +*/ + +void TQIconView::setItemTextBackground( const TQBrush &brush ) +{ + d->itemTextBrush = brush; +} + +TQBrush TQIconView::itemTextBackground() const +{ + return d->itemTextBrush; +} + +/*! + \property TQIconView::arrangement + \brief the arrangement mode of the icon view + + This can be \c LeftToRight or \c TopToBottom. The default is \c + LeftToRight. +*/ + +void TQIconView::setArrangement( Arrangement am ) +{ + if ( d->arrangement == am ) + return; + + d->arrangement = am; + + viewport()->setUpdatesEnabled( FALSE ); + resizeContents( viewport()->width(), viewport()->height() ); + viewport()->setUpdatesEnabled( TRUE ); + arrangeItemsInGrid( TRUE ); +} + +TQIconView::Arrangement TQIconView::arrangement() const +{ + return d->arrangement; +} + +/*! + \property TQIconView::resizeMode + \brief the resize mode of the icon view + + This can be \c Fixed or \c Adjust. The default is \c Fixed. + See \l ResizeMode. +*/ + +void TQIconView::setResizeMode( ResizeMode rm ) +{ + if ( d->resizeMode == rm ) + return; + + d->resizeMode = rm; +} + +TQIconView::ResizeMode TQIconView::resizeMode() const +{ + return d->resizeMode; +} + +/*! + \property TQIconView::maxItemWidth + \brief the maximum width that an item may have. + + The default is 100 pixels. + + Note that if the gridX() value is set TQIconView will ignore + this property. +*/ + +void TQIconView::setMaxItemWidth( int w ) +{ + d->maxItemWidth = w; +} + +/*! + \property TQIconView::maxItemTextLength + \brief the maximum length (in characters) that an item's text may have. + + The default is 255 characters. +*/ + +void TQIconView::setMaxItemTextLength( int w ) +{ + d->maxItemTextLength = w; +} + +int TQIconView::maxItemWidth() const +{ + if ( d->rastX != -1 ) + return d->rastX - 2; + else + return d->maxItemWidth; +} + +int TQIconView::maxItemTextLength() const +{ + return d->maxItemTextLength; +} + +/*! + \property TQIconView::itemsMovable + \brief whether the user is allowed to move items around in the icon view + + The default is TRUE. +*/ + +void TQIconView::setItemsMovable( bool b ) +{ + d->rearrangeEnabled = b; +} + +bool TQIconView::itemsMovable() const +{ + return d->rearrangeEnabled; +} + +/*! + \property TQIconView::autoArrange + \brief whether the icon view rearranges its items when a new item is inserted. + + The default is TRUE. + + Note that if the icon view is not visible at the time of + insertion, TQIconView defers all position-related work until it is + shown and then calls arrangeItemsInGrid(). +*/ + +void TQIconView::setAutoArrange( bool b ) +{ + d->reorderItemsWhenInsert = b; +} + +bool TQIconView::autoArrange() const +{ + return d->reorderItemsWhenInsert; +} + +/*! + If \a sort is TRUE, this function sets the icon view to sort items + when a new item is inserted. If \a sort is FALSE, the icon view + will not be sorted. + + Note that autoArrange() must be TRUE for sorting to take place. + + If \a ascending is TRUE (the default), items are sorted in + ascending order. If \a ascending is FALSE, items are sorted in + descending order. + + TQIconViewItem::compare() is used to compare pairs of items. The + sorting is based on the items' keys; these default to the items' + text unless specifically set to something else. + + \sa TQIconView::setAutoArrange(), TQIconView::autoArrange(), + sortDirection(), sort(), TQIconViewItem::setKey() +*/ + +void TQIconView::setSorting( bool sort, bool ascending ) +{ + d->resortItemsWhenInsert = sort; + d->sortDirection = ascending; +} + +/*! + \property TQIconView::sorting + \brief whether the icon view sorts on insertion + + The default is FALSE, i.e. no sorting on insertion. + + To set the sorting, use setSorting(). +*/ + +bool TQIconView::sorting() const +{ + return d->resortItemsWhenInsert; +} + +/*! + \property TQIconView::sortDirection + \brief whether the sort direction for inserting new items is ascending; + + The default is TRUE (i.e. ascending). This sort direction is only + meaningful if both sorting() and autoArrange() are TRUE. + + To set the sort direction, use setSorting() +*/ + +bool TQIconView::sortDirection() const +{ + return d->sortDirection; +} + +/*! + \property TQIconView::wordWrapIconText + \brief whether the item text will be word-wrapped if it is too long + + The default is TRUE. + + If this property is FALSE, icon text that is too long is + truncated, and an ellipsis (...) appended to indicate that + truncation has occurred. The full text can still be seen by the + user if they hover the mouse because the full text is shown in a + tooltip; see setShowToolTips(). +*/ + +void TQIconView::setWordWrapIconText( bool b ) +{ + if ( d->wordWrapIconText == (uint)b ) + return; + + d->wordWrapIconText = b; + for ( TQIconViewItem *item = d->firstItem; item; item = item->next ) { + item->wordWrapDirty = TRUE; + item->calcRect(); + } + arrangeItemsInGrid( TRUE ); +} + +bool TQIconView::wordWrapIconText() const +{ + return d->wordWrapIconText; +} + +/*! + \property TQIconView::showToolTips + \brief whether the icon view will display a tool tip with the complete text for any truncated item text + + The default is TRUE. Note that this has no effect if + setWordWrapIconText() is TRUE, as it is by default. +*/ + +void TQIconView::setShowToolTips( bool b ) +{ + d->showTips = b; +} + +bool TQIconView::showToolTips() const +{ + return d->showTips; +} + +/*! + \reimp +*/ +void TQIconView::contentsMousePressEvent( TQMouseEvent *e ) +{ + contentsMousePressEventEx( e ); +} + +void TQIconView::contentsMousePressEventEx( TQMouseEvent *e ) +{ + if ( d->rubber ) { + TQRect r( d->rubber->normalize() ); + delete d->rubber; + d->rubber = 0; + + repaintContents( r, FALSE ); + d->dragging = FALSE; + + delete d->backrubber; + d->backrubber = 0; + + if ( d->scrollTimer ) { + disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) ); + d->scrollTimer->stop(); + delete d->scrollTimer; + d->scrollTimer = 0; + } + } + + d->dragStartPos = e->pos(); + TQIconViewItem *item = findItem( e->pos() ); + d->pressedItem = item; + + if ( item ) + d->selectAnchor = item; + +#ifndef QT_NO_TEXTEDIT + if ( d->renamingItem ) + d->renamingItem->renameItem(); +#endif + + if ( !d->currentItem && !item && d->firstItem ) { + d->currentItem = d->firstItem; + repaintItem( d->firstItem ); + } + + if (item && item->dragEnabled()) + d->startDragItem = item; + else + d->startDragItem = 0; + + if ( e->button() == LeftButton && !( e->state() & ShiftButton ) && + !( e->state() & ControlButton ) && item && item->isSelected() && + item->textRect( FALSE ).contains( e->pos() ) ) { + + if ( !item->renameEnabled() ) { + d->mousePressed = TRUE; +#ifndef QT_NO_TEXTEDIT + } else { + ensureItemVisible( item ); + setCurrentItem( item ); + item->rename(); + goto emit_signals; +#endif + } + } + + d->pressedSelected = item && item->isSelected(); + + if ( item && item->isSelectable() ) { + if ( d->selectionMode == Single ) + item->setSelected( TRUE, e->state() & ControlButton ); + else if ( d->selectionMode == Multi ) + item->setSelected( !item->isSelected(), e->state() & ControlButton ); + else if ( d->selectionMode == Extended ) { + if ( e->state() & ShiftButton ) { + d->pressedSelected = FALSE; + bool block = signalsBlocked(); + blockSignals( TRUE ); + viewport()->setUpdatesEnabled( FALSE ); + TQRect r; + bool select = TRUE; + if ( d->currentItem ) + r = TQRect( TQMIN( d->currentItem->x(), item->x() ), + TQMIN( d->currentItem->y(), item->y() ), + 0, 0 ); + else + r = TQRect( 0, 0, 0, 0 ); + if ( d->currentItem ) { + if ( d->currentItem->x() < item->x() ) + r.setWidth( item->x() - d->currentItem->x() + item->width() ); + else + r.setWidth( d->currentItem->x() - item->x() + d->currentItem->width() ); + if ( d->currentItem->y() < item->y() ) + r.setHeight( item->y() - d->currentItem->y() + item->height() ); + else + r.setHeight( d->currentItem->y() - item->y() + d->currentItem->height() ); + r = r.normalize(); + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + bool alreadyIntersected = FALSE; + TQRect redraw; + for ( ; c; c = c->n ) { + if ( c->rect.intersects( r ) ) { + alreadyIntersected = TRUE; + TQIconViewItem *i = c->items.first(); + for ( ; i; i = c->items.next() ) { + if ( r.intersects( i->rect() ) ) { + redraw = redraw.unite( i->rect() ); + i->setSelected( select, TRUE ); + } + } + } else { + if ( alreadyIntersected ) + break; + } + } + redraw = redraw.unite( item->rect() ); + viewport()->setUpdatesEnabled( TRUE ); + repaintContents( redraw, FALSE ); + } + blockSignals( block ); + viewport()->setUpdatesEnabled( TRUE ); + item->setSelected( select, TRUE ); + emit selectionChanged(); + } else if ( e->state() & ControlButton ) { + d->pressedSelected = FALSE; + item->setSelected( !item->isSelected(), e->state() & ControlButton ); + } else { + item->setSelected( TRUE, e->state() & ControlButton ); + } + } + } else if ( ( d->selectionMode != Single || e->button() == RightButton ) + && !( e->state() & ControlButton ) ) + selectAll( FALSE ); + + setCurrentItem( item ); + + d->canStartRubber = FALSE; + if ( e->button() == LeftButton ) { + if ( !item && ( d->selectionMode == Multi || d->selectionMode == Extended ) ) { + d->canStartRubber = TRUE; + d->rubberStartX = e->x(); + d->rubberStartY = e->y(); + } + + d->mousePressed = TRUE; + } + + emit_signals: + if ( !d->canStartRubber ) { + emit mouseButtonPressed( e->button(), item, e->globalPos() ); + emit pressed( item ); + emit pressed( item, e->globalPos() ); + + if ( e->button() == RightButton ) + emit rightButtonPressed( item, e->globalPos() ); + } +} + +/*! + \reimp +*/ + +void TQIconView::contentsContextMenuEvent( TQContextMenuEvent *e ) +{ + if ( !receivers( SIGNAL(contextMenuRequested(TQIconViewItem*,const TQPoint&)) ) ) { + e->ignore(); + return; + } + if ( e->reason() == TQContextMenuEvent::Keyboard ) { + TQIconViewItem *item = currentItem(); + TQRect r = item ? item->rect() : TQRect( 0, 0, visibleWidth(), visibleHeight() ); + emit contextMenuRequested( item, viewport()->mapToGlobal( contentsToViewport( r.center() ) ) ); + } else { + d->mousePressed = FALSE; + TQIconViewItem *item = findItem( e->pos() ); + emit contextMenuRequested( item, e->globalPos() ); + } +} + +/*! + \reimp +*/ + +void TQIconView::contentsMouseReleaseEvent( TQMouseEvent *e ) +{ + TQIconViewItem *item = findItem( e->pos() ); + d->selectedItems.clear(); + + bool emitClicked = TRUE; + d->mousePressed = FALSE; + d->startDragItem = 0; + + d->canStartRubber = FALSE; + if ( d->rubber ) { + TQRect r(d->rubber->normalize()); + + if ( ( d->rubber->topLeft() - d->rubber->bottomRight() ).manhattanLength() > + TQApplication::startDragDistance() ) + emitClicked = FALSE; + delete d->rubber; + d->rubber = 0; + repaintContents(r, FALSE); + d->dragging = FALSE; + delete d->backrubber; + d->backrubber = 0; + d->currentItem = d->tmpCurrentItem; + d->tmpCurrentItem = 0; + if ( d->currentItem ) + repaintItem( d->currentItem ); + } + + if ( d->scrollTimer ) { + disconnect( d->scrollTimer, SIGNAL( timeout() ), this, SLOT( doAutoScroll() ) ); + d->scrollTimer->stop(); + delete d->scrollTimer; + d->scrollTimer = 0; + } + + if ( d->selectionMode == Extended && + d->currentItem == d->pressedItem && + d->pressedSelected && d->currentItem ) { + bool block = signalsBlocked(); + blockSignals( TRUE ); + clearSelection(); + blockSignals( block ); + if ( d->currentItem->isSelectable() ) { + d->currentItem->selected = TRUE; + repaintItem( d->currentItem ); + } + emit selectionChanged(); + } + d->pressedItem = 0; + + if ( emitClicked ) { + emit mouseButtonClicked( e->button(), item, e->globalPos() ); + emit clicked( item ); + emit clicked( item, e->globalPos() ); + if ( e->button() == RightButton ) + emit rightButtonClicked( item, e->globalPos() ); + } +} + +/*! + \reimp +*/ + +void TQIconView::contentsMouseMoveEvent( TQMouseEvent *e ) +{ + TQIconViewItem *item = findItem( e->pos() ); + if ( d->highlightedItem != item ) { + if ( item ) + emit onItem( item ); + else + emit onViewport(); + d->highlightedItem = item; + } + + if ( d->mousePressed && e->state() == NoButton ) + d->mousePressed = FALSE; + + if ( d->startDragItem ) + item = d->startDragItem; + + if ( d->mousePressed && item && item == d->currentItem && + ( item->isSelected() || d->selectionMode == NoSelection ) && item->dragEnabled() ) { + if ( !d->startDragItem ) { + d->currentItem->setSelected( TRUE, TRUE ); + d->startDragItem = item; + } + if ( ( d->dragStartPos - e->pos() ).manhattanLength() > TQApplication::startDragDistance() ) { + d->mousePressed = FALSE; + d->cleared = FALSE; +#ifndef QT_NO_DRAGANDDROP + startDrag(); +#endif + if ( d->tmpCurrentItem ) + repaintItem( d->tmpCurrentItem ); + } + } else if ( d->mousePressed && ((!d->currentItem && d->rubber) || d->canStartRubber) ) { + if ( d->canStartRubber ) { + d->canStartRubber = FALSE; + d->tmpCurrentItem = d->currentItem; + d->currentItem = 0; + repaintItem( d->tmpCurrentItem ); + delete d->rubber; + d->rubber = new TQRect( d->rubberStartX, d->rubberStartY, 0, 0 ); + d->selectedItems.clear(); + if ( ( e->state() & ControlButton ) == ControlButton || + ( e->state() & ShiftButton ) == ShiftButton ) { + for ( TQIconViewItem *i = firstItem(); i; i = i->nextItem() ) + if ( i->isSelected() ) + d->selectedItems.insert( i, i ); + } + } + doAutoScroll(); + } +} + +/*! + \reimp +*/ + +void TQIconView::contentsMouseDoubleClickEvent( TQMouseEvent *e ) +{ + TQIconViewItem *item = findItem( e->pos() ); + if ( item ) { + selectAll( FALSE ); + item->setSelected( TRUE, TRUE ); + emit doubleClicked( item ); + } +} + +/*! + \reimp +*/ + +#ifndef QT_NO_DRAGANDDROP +void TQIconView::contentsDragEnterEvent( TQDragEnterEvent *e ) +{ + d->dragging = TRUE; + d->drawDragShapes = TRUE; + d->tmpCurrentItem = 0; + initDragEnter( e ); + d->oldDragPos = e->pos(); + d->oldDragAcceptAction = FALSE; + drawDragShapes( e->pos() ); + d->dropped = FALSE; +} + +/*! + \reimp +*/ + +void TQIconView::contentsDragMoveEvent( TQDragMoveEvent *e ) +{ + if ( e->pos() == d->oldDragPos ) { + if (d->oldDragAcceptAction) + e->acceptAction(); + else + e->ignore(); + return; + } + + drawDragShapes( d->oldDragPos ); + d->dragging = FALSE; + + TQIconViewItem *old = d->tmpCurrentItem; + d->tmpCurrentItem = 0; + + TQIconViewItem *item = findItem( e->pos() ); + + if ( item ) { + if ( old && + old->rect().contains(d->oldDragPos) && + !old->rect().contains(e->pos()) ) { + old->dragLeft(); + repaintItem( old ); + } + if ( !item->rect().contains(d->oldDragPos) ) + item->dragEntered(); + if (item->acceptDrop(e) || (item->isSelected() && e->source() == viewport())) { + d->oldDragAcceptAction = TRUE; + e->acceptAction(); + } else { + d->oldDragAcceptAction = FALSE; + e->ignore(); + } + + d->tmpCurrentItem = item; + TQPainter p; + p.begin( viewport() ); + p.translate( -contentsX(), -contentsY() ); + item->paintFocus( &p, colorGroup() ); + p.end(); + } else { + e->acceptAction(); + d->oldDragAcceptAction = TRUE; + if ( old ) { + old->dragLeft(); + repaintItem( old ); + } + } + + d->oldDragPos = e->pos(); + drawDragShapes( e->pos() ); + d->dragging = TRUE; +} + +/*! + \reimp +*/ + +void TQIconView::contentsDragLeaveEvent( TQDragLeaveEvent * ) +{ + if ( !d->dropped ) + drawDragShapes( d->oldDragPos ); + d->dragging = FALSE; + + if ( d->tmpCurrentItem ) { + repaintItem( d->tmpCurrentItem ); + d->tmpCurrentItem->dragLeft(); + } + + d->tmpCurrentItem = 0; + d->isIconDrag = FALSE; + d->iconDragData.clear(); +} + +/*! + \reimp +*/ + +void TQIconView::contentsDropEvent( TQDropEvent *e ) +{ + d->dropped = TRUE; + d->dragging = FALSE; + drawDragShapes( d->oldDragPos ); + + if ( d->tmpCurrentItem ) + repaintItem( d->tmpCurrentItem ); + + TQIconViewItem *i = findItem( e->pos() ); + + if ((!i || i->isSelected()) && e->source() == viewport() && d->currentItem && !d->cleared) { + if ( !d->rearrangeEnabled ) + return; + TQRect r = d->currentItem->rect(); + + d->currentItem->move( e->pos() - d->dragStart ); + + int w = d->currentItem->x() + d->currentItem->width() + 1; + int h = d->currentItem->y() + d->currentItem->height() + 1; + + repaintItem( d->currentItem ); + repaintContents( r.x(), r.y(), r.width(), r.height(), FALSE ); + + int dx = d->currentItem->x() - r.x(); + int dy = d->currentItem->y() - r.y(); + + TQIconViewItem *item = d->firstItem; + TQRect rr; + for ( ; item; item = item->next ) { + if ( item->isSelected() && item != d->currentItem ) { + rr = rr.unite( item->rect() ); + item->moveBy( dx, dy ); + rr = rr.unite( item->rect() ); + } + w = TQMAX( w, item->x() + item->width() + 1 ); + h = TQMAX( h, item->y() + item->height() + 1 ); + } + repaintContents( rr, FALSE ); + bool fullRepaint = FALSE; + if ( w > contentsWidth() || + h > contentsHeight() ) + fullRepaint = TRUE; + + int oldw = contentsWidth(); + int oldh = contentsHeight(); + + resizeContents( w, h ); + + + if ( fullRepaint ) { + repaintContents( oldw, 0, contentsWidth() - oldw, contentsHeight(), FALSE ); + repaintContents( 0, oldh, contentsWidth(), contentsHeight() - oldh, FALSE ); + } + e->acceptAction(); + } else if ( !i && ( e->source() != viewport() || d->cleared ) ) { + TQValueList lst; + if ( TQIconDrag::canDecode( e ) ) { + TQValueList l; + TQIconDragPrivate::decode( e, l ); + TQValueList::Iterator it = l.begin(); + for ( ; it != l.end(); ++it ) + lst << ( *it ).data; + } + emit dropped( e, lst ); + } else if ( i ) { + TQValueList lst; + if ( TQIconDrag::canDecode( e ) ) { + TQValueList l; + TQIconDragPrivate::decode( e, l ); + TQValueList::Iterator it = l.begin(); + for ( ; it != l.end(); ++it ) + lst << ( *it ).data; + } + i->dropped( e, lst ); + } + d->isIconDrag = FALSE; +} +#endif + +/*! + This function grabs all paintevents that otherwise would have been + processed by the TQScrollView::viewportPaintEvent(). Here we use a + doublebuffer to reduce 'on-paint' flickering on TQIconView + (and of course its children). + + \sa TQScrollView::viewportPaintEvent(), TQIconView::drawContents() +*/ + +void TQIconView::bufferedPaintEvent( TQPaintEvent* pe ) +{ + TQWidget* vp = viewport(); + TQRect r = pe->rect() & vp->rect(); + int ex = r.x() + contentsX(); + int ey = r.y() + contentsY(); + int ew = r.width(); + int eh = r.height(); + + if ( !d->backBuffer ) + d->backBuffer = new TQPixmap(vp->size()); + if ( d->backBuffer->size() != vp->size() ) { + // Resize function (with hysteresis). Uses a good compromise between memory + // consumption and speed (number) of resizes. + float newWidth = (float)vp->width(); + float newHeight = (float)vp->height(); + if ( newWidth > d->backBuffer->width() || newHeight > d->backBuffer->height() ) + { + newWidth *= 1.1892; + newHeight *= 1.1892; + d->backBuffer->resize( (int)newWidth, (int)newHeight ); + } else if ( 1.5*newWidth < d->backBuffer->width() || 1.5*newHeight < d->backBuffer->height() ) + d->backBuffer->resize( (int)newWidth, (int)newHeight ); + } + + TQPainter p; + p.begin(d->backBuffer, vp); + drawContentsOffset(&p, contentsX(), contentsY(), ex, ey, ew, eh); + p.end(); + bitBlt(vp, r.x(), r.y(), d->backBuffer, r.x(), r.y(), ew, eh); +} + +/*! + \reimp +*/ + +void TQIconView::resizeEvent( TQResizeEvent* e ) +{ + TQScrollView::resizeEvent( e ); + if ( d->resizeMode == Adjust ) { + optimize_layout = TRUE; + adjustItems(); + optimize_layout = FALSE; +#if 0 // no need for timer delay anymore + d->oldSize = e->oldSize(); + if ( d->adjustTimer->isActive() ) + d->adjustTimer->stop(); + d->adjustTimer->start( 0, TRUE ); +#endif + } +} + +/*! + Adjusts the positions of the items to the geometry of the icon + view. +*/ + +void TQIconView::adjustItems() +{ + d->adjustTimer->stop(); + if ( d->resizeMode == Adjust ) + arrangeItemsInGrid( TRUE ); +} + +/*! + \reimp +*/ + +void TQIconView::keyPressEvent( TQKeyEvent *e ) +{ + if ( !d->firstItem ) + return; + + if ( !d->currentItem ) { + setCurrentItem( d->firstItem ); + if ( d->selectionMode == Single ) + d->currentItem->setSelected( TRUE, TRUE ); + return; + } + + bool selectCurrent = TRUE; + + switch ( e->key() ) { + case Key_Escape: + e->ignore(); + break; +#ifndef QT_NO_TEXTEDIT + case Key_F2: { + if ( d->currentItem->renameEnabled() ) { + d->currentItem->renameItem(); + d->currentItem->rename(); + return; + } + } break; +#endif + case Key_Home: { + d->currInputString = TQString::null; + if ( !d->firstItem ) + break; + + selectCurrent = FALSE; + + TQIconViewItem *item = 0; + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + while ( !item && c ) { + TQPtrList &list = c->items; + TQIconViewItem *i = list.first(); + while ( i ) { + if ( !item ) { + item = i; + } else { + if ( d->arrangement == LeftToRight ) { + // we use pixmap so the items textlength are ignored + // find topmost, leftmost item + if ( i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() || + ( i->pixmapRect( FALSE ).y() == item->pixmapRect( FALSE ).y() && + i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() ) ) + item = i; + } else { + // find leftmost, topmost item + if ( i->pixmapRect( FALSE ).x() < item->pixmapRect( FALSE ).x() || + ( i->pixmapRect( FALSE ).x() == item->pixmapRect( FALSE ).x() && + i->pixmapRect( FALSE ).y() < item->pixmapRect( FALSE ).y() ) ) + item = i; + } + } + i = list.next(); + } + c = c->n; + } + + if ( item ) { + TQIconViewItem *old = d->currentItem; + setCurrentItem( item ); + ensureItemVisible( item ); + handleItemChange( old, e->state() & ShiftButton, + e->state() & ControlButton, TRUE ); + } + } break; + case Key_End: { + d->currInputString = TQString::null; + if ( !d->lastItem ) + break; + + selectCurrent = FALSE; + + TQIconViewItem *item = 0; + TQIconViewPrivate::ItemContainer *c = d->lastContainer; + while ( !item && c ) { + TQPtrList &list = c->items; + TQIconViewItem *i = list.first(); + while ( i ) { + if ( !item ) { + item = i; + } else { + if ( d->arrangement == LeftToRight ) { + // find bottommost, rightmost item + if ( i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() || + ( i->pixmapRect( FALSE ).bottom() == item->pixmapRect( FALSE ).bottom() && + i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() ) ) + item = i; + } else { + // find rightmost, bottommost item + if ( i->pixmapRect( FALSE ).right() > item->pixmapRect( FALSE ).right() || + ( i->pixmapRect( FALSE ).right() == item->pixmapRect( FALSE ).right() && + i->pixmapRect( FALSE ).bottom() > item->pixmapRect( FALSE ).bottom() ) ) + item = i; + } + } + i = list.next(); + } + c = c->p; + } + + if ( item ) { + TQIconViewItem *old = d->currentItem; + setCurrentItem( item ); + ensureItemVisible( item ); + handleItemChange( old, e->state() & ShiftButton, + e->state() & ControlButton, TRUE ); + } + } break; + case Key_Right: { + d->currInputString = TQString::null; + TQIconViewItem *item; + selectCurrent = FALSE; + Direction dir = DirRight; + + TQRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() ); + item = findItem( dir, d->currentItem->rect().center(), r ); + + // search the row below from the right + while ( !item && r.y() < contentsHeight() ) { + r.moveBy(0, d->currentItem->height() ); + item = findItem( dir, TQPoint( 0, r.center().y() ), r ); + } + + if ( item ) { + TQIconViewItem *old = d->currentItem; + setCurrentItem( item ); + ensureItemVisible( item ); + handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton ); + } + } break; + case Key_Left: { + d->currInputString = TQString::null; + TQIconViewItem *item; + selectCurrent = FALSE; + Direction dir = DirLeft; + + TQRect r( 0, d->currentItem->y(), contentsWidth(), d->currentItem->height() ); + item = findItem( dir, d->currentItem->rect().center(), r ); + + // search the row above from the left + while ( !item && r.y() >= 0 ) { + r.moveBy(0, - d->currentItem->height() ); + item = findItem( dir, TQPoint( contentsWidth(), r.center().y() ), r ); + } + + if ( item ) { + TQIconViewItem *old = d->currentItem; + setCurrentItem( item ); + ensureItemVisible( item ); + handleItemChange( old, e->state() & ShiftButton, e->state() & ControlButton ); + } + } break; + case Key_Space: { + d->currInputString = TQString::null; + if ( d->selectionMode == Single) + break; + + d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE ); + } break; + case Key_Enter: case Key_Return: + d->currInputString = TQString::null; + emit returnPressed( d->currentItem ); + break; + case Key_Down: { + d->currInputString = TQString::null; + TQIconViewItem *item; + selectCurrent = FALSE; + Direction dir = DirDown; + + TQRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() ); + item = findItem( dir, d->currentItem->rect().center(), r ); + + // finding the closest item below and to the right + while ( !item && r.x() < contentsWidth() ) { + r.moveBy( r.width() , 0 ); + item = findItem( dir, TQPoint( r.center().x(), 0 ), r ); + } + + + TQIconViewItem *i = d->currentItem; + setCurrentItem( item ); + item = i; + handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); + } break; + case Key_Up: { + d->currInputString = TQString::null; + TQIconViewItem *item; + selectCurrent = FALSE; + Direction dir = DirUp; + + TQRect r( d->currentItem->x(), 0, d->currentItem->width(), contentsHeight() ); + item = findItem( dir, d->currentItem->rect().center(), r ); + + // finding the closest item above and to the left + while ( !item && r.x() >= 0 ) { + r.moveBy(- r.width(), 0 ); + item = findItem( dir, TQPoint(r.center().x(), contentsHeight() ), r ); + } + + TQIconViewItem *i = d->currentItem; + setCurrentItem( item ); + item = i; + handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); + } break; + case Key_Next: { + d->currInputString = TQString::null; + selectCurrent = FALSE; + TQRect r; + if ( d->arrangement == LeftToRight ) + r = TQRect( 0, d->currentItem->y() + visibleHeight(), contentsWidth(), visibleHeight() ); + else + r = TQRect( d->currentItem->x() + visibleWidth(), 0, visibleWidth(), contentsHeight() ); + TQIconViewItem *item = d->currentItem; + TQIconViewItem *ni = findFirstVisibleItem( r ); + if ( !ni ) { + if ( d->arrangement == LeftToRight ) + r = TQRect( 0, d->currentItem->y() + d->currentItem->height(), contentsWidth(), contentsHeight() ); + else + r = TQRect( d->currentItem->x() + d->currentItem->width(), 0, contentsWidth(), contentsHeight() ); + ni = findLastVisibleItem( r ); + } + if ( ni ) { + setCurrentItem( ni ); + handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); + } + } break; + case Key_Prior: { + d->currInputString = TQString::null; + selectCurrent = FALSE; + TQRect r; + if ( d->arrangement == LeftToRight ) + r = TQRect( 0, d->currentItem->y() - visibleHeight(), contentsWidth(), visibleHeight() ); + else + r = TQRect( d->currentItem->x() - visibleWidth(), 0, visibleWidth(), contentsHeight() ); + TQIconViewItem *item = d->currentItem; + TQIconViewItem *ni = findFirstVisibleItem( r ); + if ( !ni ) { + if ( d->arrangement == LeftToRight ) + r = TQRect( 0, 0, contentsWidth(), d->currentItem->y() ); + else + r = TQRect( 0, 0, d->currentItem->x(), contentsHeight() ); + ni = findFirstVisibleItem( r ); + } + if ( ni ) { + setCurrentItem( ni ); + handleItemChange( item, e->state() & ShiftButton, e->state() & ControlButton ); + } + } break; + default: + if ( !e->text().isEmpty() && e->text()[ 0 ].isPrint() ) { + selectCurrent = FALSE; + TQIconViewItem *i = d->currentItem; + if ( !i ) + i = d->firstItem; + if ( !d->inputTimer->isActive() ) { + d->currInputString = e->text(); + i = i->next; + if ( !i ) + i = d->firstItem; + i = findItemByName( i ); + } else { + d->inputTimer->stop(); + d->currInputString += e->text(); + i = findItemByName( i ); + if ( !i ) { + d->currInputString = e->text(); + if (d->currentItem && d->currentItem->next) + i = d->currentItem->next; + else + i = d->firstItem; + i = findItemByName(i); + } + } + if ( i ) { + setCurrentItem( i ); + if ( d->selectionMode == Extended ) { + bool changed = FALSE; + bool block = signalsBlocked(); + blockSignals( TRUE ); + selectAll( FALSE ); + blockSignals( block ); + if ( !i->selected && i->isSelectable() ) { + changed = TRUE; + i->selected = TRUE; + repaintItem( i ); + } + if ( changed ) + emit selectionChanged(); + } + } + d->inputTimer->start( 400, TRUE ); + } else { + selectCurrent = FALSE; + d->currInputString = TQString::null; + if ( e->state() & ControlButton ) { + switch ( e->key() ) { + case Key_A: + selectAll( TRUE ); + break; + } + } + e->ignore(); + return; + } + } + + if ( !( e->state() & ShiftButton ) || !d->selectAnchor ) + d->selectAnchor = d->currentItem; + + if ( d->currentItem && !d->currentItem->isSelected() && + d->selectionMode == Single && selectCurrent ) { + d->currentItem->setSelected( TRUE ); + } + + ensureItemVisible( d->currentItem ); +} + +/* + Finds the closest item in the Direction \a dir relative from the point \a relativeTo + which intersects with the searchRect. + + The function choses the closest item with its center in the searchRect. +*/ +TQIconViewItem* TQIconView::findItem( Direction dir, + const TQPoint &relativeTo, + const TQRect &searchRect ) const +{ + TQIconViewItem *item; + TQIconViewItem *centerMatch = 0; + int centerMatchML = 0; + + // gets list of containers with potential items + TQPtrList* cList = + d->findContainers( dir, relativeTo, searchRect); + + cList->first(); + while ( cList->current() && !centerMatch ) { + TQPtrList &list = (cList->current())->items; + for ( item = list.first(); item; item = list.next() ) { + if ( neighbourItem( dir, relativeTo, item ) && + searchRect.contains( item->rect().center() ) && + item != currentItem() ) { + int ml = (relativeTo - item->rect().center()).manhattanLength(); + if ( centerMatch ) { + if ( ml < centerMatchML ) { + centerMatch = item; + centerMatchML = ml; + } + } else { + centerMatch = item; + centerMatchML = ml; + } + } + } + cList->next(); + } + delete cList; + return centerMatch; +} + + +/* + Returns TRUE if the items orientation compared to + the point \a relativeTo is correct. +*/ +bool TQIconView::neighbourItem( Direction dir, + const TQPoint &relativeTo, + const TQIconViewItem *item ) const +{ + switch ( dir ) { + case DirUp: + if ( item->rect().center().y() < relativeTo.y() ) + return TRUE; + break; + case DirDown: + if ( item->rect().center().y() > relativeTo.y() ) + return TRUE; + break; + case DirLeft: + if ( item->rect().center().x() < relativeTo.x() ) + return TRUE; + break; + case DirRight: + if ( item->rect().center().x() > relativeTo.x() ) + return TRUE; + break; + default: + // nothing + break; + } + return FALSE; +} + +/*! + \reimp +*/ + +void TQIconView::focusInEvent( TQFocusEvent* ) +{ + d->mousePressed = FALSE; + d->inMenuMode = FALSE; + if ( d->currentItem ) { + repaintItem( d->currentItem ); + } else if ( d->firstItem && TQFocusEvent::reason() != TQFocusEvent::Mouse ) { + d->currentItem = d->firstItem; + emit currentChanged( d->currentItem ); + repaintItem( d->currentItem ); + } + + if ( style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this ) ) + repaintSelectedItems(); + + if ( d->currentItem ) + setMicroFocusHint( d->currentItem->x(), d->currentItem->y(), d->currentItem->width(), d->currentItem->height(), FALSE ); +} + +/*! + \reimp +*/ + +void TQIconView::focusOutEvent( TQFocusEvent* ) +{ + if (style().styleHint( TQStyle::SH_ItemView_ChangeHighlightOnFocus, this )) { + d->inMenuMode = + TQFocusEvent::reason() == TQFocusEvent::Popup || + (tqApp->focusWidget() && tqApp->focusWidget()->inherits("TQMenuBar")); + if ( !d->inMenuMode ) + repaintSelectedItems(); + } + if ( d->currentItem ) + repaintItem( d->currentItem ); +} + +/*! + Draws the rubber band using the painter \a p. +*/ + +void TQIconView::drawRubber( TQPainter *p ) +{ + if ( !p || !d->rubber ) + return; + + TQPoint pnt( d->rubber->x(), d->rubber->y() ); + pnt = contentsToViewport( pnt ); + + style().drawPrimitive( TQStyle::PE_RubberBand, p, + TQRect( pnt.x(), pnt.y(), d->rubber->width(), d->rubber->height() ).normalize(), + colorGroup(), TQStyle::Style_Default, TQStyleOption(colorGroup().base()) ); +} + +/*! + Returns the TQDragObject that should be used for drag-and-drop. + This function is called by the icon view when starting a drag to + get the dragobject that should be used for the drag. Subclasses + may reimplement this. + + \sa TQIconDrag +*/ + +#ifndef QT_NO_DRAGANDDROP +TQDragObject *TQIconView::dragObject() +{ + if ( !d->currentItem ) + return 0; + + TQPoint orig = d->dragStartPos; + + TQIconDrag *drag = new TQIconDrag( viewport() ); + drag->setPixmap( ( d->currentItem->pixmap() ? + *d->currentItem->pixmap() : TQPixmap() ), // ### TQPicture + TQPoint( d->currentItem->pixmapRect().width() / 2, + d->currentItem->pixmapRect().height() / 2 ) ); + + if ( d->selectionMode == NoSelection ) { + TQIconViewItem *item = d->currentItem; + drag->append( TQIconDragItem(), + TQRect( item->pixmapRect( FALSE ).x() - orig.x(), + item->pixmapRect( FALSE ).y() - orig.y(), + item->pixmapRect().width(), item->pixmapRect().height() ), + TQRect( item->textRect( FALSE ).x() - orig.x(), + item->textRect( FALSE ).y() - orig.y(), + item->textRect().width(), item->textRect().height() ) ); + } else { + for ( TQIconViewItem *item = d->firstItem; item; item = item->next ) { + if ( item->isSelected() ) { + drag->append( TQIconDragItem(), + TQRect( item->pixmapRect( FALSE ).x() - orig.x(), + item->pixmapRect( FALSE ).y() - orig.y(), + item->pixmapRect().width(), item->pixmapRect().height() ), + TQRect( item->textRect( FALSE ).x() - orig.x(), + item->textRect( FALSE ).y() - orig.y(), + item->textRect().width(), item->textRect().height() ) ); + } + } + } + + return drag; +} + +/*! + Starts a drag. +*/ + +void TQIconView::startDrag() +{ + if ( !d->startDragItem ) + return; + + TQPoint orig = d->dragStartPos; + d->dragStart = TQPoint( orig.x() - d->startDragItem->x(), + orig.y() - d->startDragItem->y() ); + d->startDragItem = 0; + d->mousePressed = FALSE; + d->pressedItem = 0; + d->pressedSelected = 0; + + TQDragObject *drag = dragObject(); + if ( !drag ) + return; + + if ( drag->drag() ) + if ( drag->target() != viewport() ) + emit moved(); +} + +#endif + +/*! + Inserts the TQIconViewItem \a item in the icon view's grid. \e{You + should never need to call this function.} Instead, insert + TQIconViewItems by creating them with a pointer to the TQIconView + that they are to be inserted into. +*/ + +void TQIconView::insertInGrid( TQIconViewItem *item ) +{ + if ( !item ) + return; + + if ( d->reorderItemsWhenInsert ) { + // #### make this efficient - but it's not too dramatic + int y = d->spacing; + + item->dirty = FALSE; + if ( item == d->firstItem ) { + bool dummy; + makeRowLayout( item, y, dummy ); + return; + } + + TQIconViewItem *begin = rowBegin( item ); + y = begin->y(); + while ( begin ) { + bool dummy; + begin = makeRowLayout( begin, y, dummy ); + + if ( !begin || !begin->next ) + break; + + begin = begin->next; + } + item->dirty = FALSE; + } else { + TQRegion r( TQRect( 0, 0, TQMAX( contentsWidth(), visibleWidthSB() ), + TQMAX( contentsHeight(), visibleHeightSB() ) ) ); + + TQIconViewItem *i = d->firstItem; + int y = -1; + for ( ; i; i = i->next ) { + r = r.subtract( i->rect() ); + y = TQMAX( y, i->y() + i->height() ); + } + + TQMemArray rects = r.rects(); + TQMemArray::Iterator it = rects.begin(); + bool foundPlace = FALSE; + for ( ; it != rects.end(); ++it ) { + TQRect rect = *it; + if ( rect.width() >= item->width() && + rect.height() >= item->height() ) { + int sx = 0, sy = 0; + if ( rect.width() >= item->width() + d->spacing ) + sx = d->spacing; + if ( rect.height() >= item->height() + d->spacing ) + sy = d->spacing; + item->move( rect.x() + sx, rect.y() + sy ); + foundPlace = TRUE; + break; + } + } + + if ( !foundPlace ) + item->move( d->spacing, y + d->spacing ); + + resizeContents( TQMAX( contentsWidth(), item->x() + item->width() ), + TQMAX( contentsHeight(), item->y() + item->height() ) ); + item->dirty = FALSE; + } +} + +/*! + Emits a signal to indicate selection changes. \a i is the + TQIconViewItem that was selected or de-selected. + + \e{You should never need to call this function.} +*/ + +void TQIconView::emitSelectionChanged( TQIconViewItem *i ) +{ + emit selectionChanged(); + if ( d->selectionMode == Single ) + emit selectionChanged( i ? i : d->currentItem ); +} + +/*! + \internal +*/ + +void TQIconView::emitRenamed( TQIconViewItem *item ) +{ + if ( !item ) + return; + + emit itemRenamed( item, item->text() ); + emit itemRenamed( item ); +} + +/*! + If a drag enters the icon view the shapes of the objects which the + drag contains are drawn, usnig \a pos as origin. +*/ + +void TQIconView::drawDragShapes( const TQPoint &pos ) +{ +#ifndef QT_NO_DRAGANDDROP + if ( pos == TQPoint( -1, -1 ) ) + return; + + if ( !d->drawDragShapes ) { + d->drawDragShapes = TRUE; + return; + } + + TQStyleOption opt(colorGroup().base()); + + TQPainter p; + p.begin( viewport() ); + p.translate( -contentsX(), -contentsY() ); + p.setRasterOp( NotROP ); + p.setPen( TQPen( color0 ) ); + + if ( d->isIconDrag ) { + TQValueList::Iterator it = d->iconDragData.begin(); + for ( ; it != d->iconDragData.end(); ++it ) { + TQRect ir = (*it).item.pixmapRect(); + TQRect tr = (*it).item.textRect(); + tr.moveBy( pos.x(), pos.y() ); + ir.moveBy( pos.x(), pos.y() ); + if ( !ir.intersects( TQRect( contentsX(), contentsY(), visibleWidth(), visibleHeight() ) ) ) + continue; + + style().drawPrimitive(TQStyle::PE_FocusRect, &p, ir, colorGroup(), + TQStyle::Style_Default, opt); + style().drawPrimitive(TQStyle::PE_FocusRect, &p, tr, colorGroup(), + TQStyle::Style_Default, opt); + } + } else if ( d->numDragItems > 0 ) { + for ( int i = 0; i < d->numDragItems; ++i ) { + TQRect r( pos.x() + i * 40, pos.y(), 35, 35 ); + style().drawPrimitive(TQStyle::PE_FocusRect, &p, r, colorGroup(), + TQStyle::Style_Default, opt); + } + + } + p.end(); +#endif +} + +/*! + When a drag enters the icon view, this function is called to + initialize it. Initializing in this context means getting + information about the drag, for example so that the icon view + knows enough about the drag to be able to draw drag shapes for the + drag data (e.g. shapes of icons which are dragged), etc. +*/ + +#ifndef QT_NO_DRAGANDDROP +void TQIconView::initDragEnter( TQDropEvent *e ) +{ + if ( TQIconDrag::canDecode( e ) ) { + TQIconDragPrivate::decode( e, d->iconDragData ); + d->isIconDrag = TRUE; + } else if ( TQUriDrag::canDecode( e ) ) { + TQStrList lst; + TQUriDrag::decode( e, lst ); + d->numDragItems = lst.count(); + } else { + d->numDragItems = 0; + } + +} +#endif + +/*! + This function is called to draw the rectangle \a r of the + background using the painter \a p. + + The default implementation fills \a r with the viewport's + backgroundBrush(). Subclasses may reimplement this to draw custom + backgrounds. + + \sa contentsX() contentsY() drawContents() +*/ + +void TQIconView::drawBackground( TQPainter *p, const TQRect &r ) +{ + p->fillRect( r, viewport()->backgroundBrush() ); +} + +/*! + \reimp +*/ + +bool TQIconView::eventFilter( TQObject * o, TQEvent * e ) +{ + if ( o == viewport() ) { + switch( e->type() ) { + case TQEvent::FocusIn: + focusInEvent( (TQFocusEvent*)e ); + return TRUE; + case TQEvent::FocusOut: + focusOutEvent( (TQFocusEvent*)e ); + return TRUE; + case TQEvent::Enter: + enterEvent( e ); + return TRUE; + case TQEvent::Paint: + if ( o == viewport() ) { + if ( d->dragging ) { + if ( !d->rubber ) + drawDragShapes( d->oldDragPos ); + viewportPaintEvent( (TQPaintEvent*)e ); + if ( !d->rubber ) + drawDragShapes( d->oldDragPos ); + } else { + bufferedPaintEvent( (TQPaintEvent*)e ); + } + } + return TRUE; + default: + // nothing + break; + } + } + + return TQScrollView::eventFilter( o, e ); +} + + +/*! + \reimp +*/ + +TQSize TQIconView::minimumSizeHint() const +{ + return TQScrollView::minimumSizeHint(); +} + +/*! + \internal + Finds the next item after the start item beginning + with \a text. +*/ + +TQIconViewItem* TQIconView::findItemByName( TQIconViewItem *start ) +{ + if ( !start ) + return 0; + TQString match = d->currInputString.lower(); + if ( match.length() < 1 ) + return start; + TQString curText; + TQIconViewItem *i = start; + do { + curText = i->text().lower(); + if ( curText.startsWith( match ) ) + return i; + i = i->next; + if ( !i ) + i = d->firstItem; + } while ( i != start ); + return 0; +} + +/*! + Lays out a row of icons (if Arrangement == \c TopToBottom this is + a column). Starts laying out with the item \a begin. \a y is the + starting coordinate. Returns the last item of the row (column) and + sets the new starting coordinate to \a y. The \a changed parameter + is used internally. + + \warning This function may be made private in a future version of + TQt. We do not recommend calling it. +*/ + +TQIconViewItem *TQIconView::makeRowLayout( TQIconViewItem *begin, int &y, bool &changed ) +{ + TQIconViewItem *end = 0; + + // Find the first visible item + while (begin->next && (begin->isVisible() == FALSE)) { + begin = begin->next; + } + + bool reverse = TQApplication::reverseLayout(); + changed = FALSE; + + if ( d->arrangement == LeftToRight ) { + + if ( d->rastX == -1 ) { + // first calculate the row height + int h = 0; + int x = 0; + int ih = 0; + TQIconViewItem *item = begin; + for (;;) { + x += d->spacing + item->width(); + if ( x > visibleWidthSB() && item != begin ) { + item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + break; + } + h = TQMAX( h, item->height() ); + ih = TQMAX( ih, item->pixmapRect().height() ); + TQIconViewItem *old = item; + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + if ( !item ) { + item = old; + break; + } + } + end = item; + + if ( d->rastY != -1 ) + h = TQMAX( h, d->rastY ); + + // now move the items + item = begin; + for (;;) { + item->dirty = FALSE; + int x; + if ( item == begin ) { + if ( reverse ) + x = visibleWidthSB() - d->spacing - item->width(); + else + x = d->spacing; + } else { + if ( reverse ) + x = item->prev->x() - item->width() - d->spacing; + else + x = item->prev->x() + item->prev->width() + d->spacing; + } + changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed; + if ( y + h < item->y() + item->height() ) + h = TQMAX( h, ih + item->textRect().height() ); + if ( item == end ) + break; + item = item->next; + } + y += h + d->spacing; + } else { + // first calculate the row height + int h = begin->height(); + int x = d->spacing; + int ih = begin->pixmapRect().height(); + TQIconViewItem *item = begin; + int i = 0; + int sp = 0; + for (;;) { + int r = calcGridNum( item->width(), d->rastX ); + if ( item == begin ) { + i += r; + sp += r; + x = d->spacing + d->rastX * r; + } else { + sp += r; + i += r; + x = i * d->rastX + sp * d->spacing; + } + if ( x > visibleWidthSB() && item != begin ) { + item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + break; + } + h = TQMAX( h, item->height() ); + ih = TQMAX( ih, item->pixmapRect().height() ); + TQIconViewItem *old = item; + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + if ( !item ) { + item = old; + break; + } + } + end = item; + + if ( d->rastY != -1 ) + h = TQMAX( h, d->rastY ); + + // now move the items + item = begin; + i = 0; + sp = 0; + for (;;) { + item->dirty = FALSE; + int r = calcGridNum( item->width(), d->rastX ); + if ( item == begin ) { + if ( d->itemTextPos == Bottom ) + changed = item->move( d->spacing + ( r * d->rastX - item->width() ) / 2, + y + ih - item->pixmapRect().height() ) || changed; + else + changed = item->move( d->spacing, y + ih - item->pixmapRect().height() ) || changed; + i += r; + sp += r; + } else { + sp += r; + int x = i * d->rastX + sp * d->spacing; + if ( d->itemTextPos == Bottom ) + changed = item->move( x + ( r * d->rastX - item->width() ) / 2, + y + ih - item->pixmapRect().height() ) || changed; + else + changed = item->move( x, y + ih - item->pixmapRect().height() ) || changed; + i += r; + } + if ( y + h < item->y() + item->height() ) + h = TQMAX( h, ih + item->textRect().height() ); + if ( item == end ) + break; + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + } + y += h + d->spacing; + } + + + } else { // -------------------------------- TopToBottom ------------------------------ + + int x = y; + + { + int w = 0; + int y = 0; + TQIconViewItem *item = begin; + for (;;) { + y += d->spacing + item->height(); + if ( y > visibleHeightSB() && item != begin ) { + item = item->prev; + while (item && (item->isVisible() == FALSE)) { + item = item->prev; + } + break; + } + w = TQMAX( w, item->width() ); + TQIconViewItem *old = item; + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + if ( !item ) { + item = old; + break; + } + } + end = item; + + if ( d->rastX != -1 ) + w = TQMAX( w, d->rastX ); + + // now move the items + item = begin; + TQIconViewItem *prevVisibleItem = NULL; + for (;;) { + item->dirty = FALSE; + if ( d->itemTextPos == Bottom ) { + if ( item == begin ) + changed = item->move( x + ( w - item->width() ) / 2, d->spacing ) || changed; + else + changed = item->move( x + ( w - item->width() ) / 2, + prevVisibleItem->y() + prevVisibleItem->height() + d->spacing ) || changed; + } else { + if ( item == begin ) + changed = item->move( x, d->spacing ) || changed; + else + changed = item->move( x, prevVisibleItem->y() + prevVisibleItem->height() + d->spacing ) || changed; + } + if ( item == end ) + break; + prevVisibleItem = item; + item = item->next; + while (item && (item->isVisible() == FALSE)) { + item = item->next; + } + } + x += w + d->spacing; + } + + y = x; + } + + return end; +} + +/*! + \internal + Calculates how many cells an item of width \a w needs in a grid with of + \a x and returns the result. +*/ + +int TQIconView::calcGridNum( int w, int x ) const +{ + float r = (float)w / (float)x; + if ( ( w / x ) * x != w ) + r += 1.0; + return (int)r; +} + +/*! + \internal + Returns the first item of the row which contains \a item. +*/ + +TQIconViewItem *TQIconView::rowBegin( TQIconViewItem * ) const +{ + // #### todo + return d->firstItem; +} + +/*! + Sorts and rearranges all the items in the icon view. If \a + ascending is TRUE, the items are sorted in increasing order, + otherwise they are sorted in decreasing order. + + TQIconViewItem::compare() is used to compare pairs of items. The + sorting is based on the items' keys; these default to the items' + text unless specifically set to something else. + + Note that this function sets the sort order to \a ascending. + + \sa TQIconViewItem::key(), TQIconViewItem::setKey(), + TQIconViewItem::compare(), TQIconView::setSorting(), + TQIconView::sortDirection() +*/ + +void TQIconView::sort( bool ascending ) +{ + if ( count() == 0 ) + return; + + d->sortDirection = ascending; + TQIconViewPrivate::SortableItem *items = new TQIconViewPrivate::SortableItem[ count() ]; + + TQIconViewItem *item = d->firstItem; + int i = 0; + for ( ; item; item = item->next ) + items[ i++ ].item = item; + + qsort( items, count(), sizeof( TQIconViewPrivate::SortableItem ), cmpIconViewItems ); + + TQIconViewItem *prev = 0; + item = 0; + if ( ascending ) { + for ( i = 0; i < (int)count(); ++i ) { + item = items[ i ].item; + if ( item ) { + item->prev = prev; + if ( item->prev ) + item->prev->next = item; + item->next = 0; + } + if ( i == 0 ) + d->firstItem = item; + if ( i == (int)count() - 1 ) + d->lastItem = item; + prev = item; + } + } else { + for ( i = (int)count() - 1; i >= 0 ; --i ) { + item = items[ i ].item; + if ( item ) { + item->prev = prev; + if ( item->prev ) + item->prev->next = item; + item->next = 0; + } + if ( i == (int)count() - 1 ) + d->firstItem = item; + if ( i == 0 ) + d->lastItem = item; + prev = item; + } + } + + delete [] items; + + arrangeItemsInGrid( TRUE ); +} + +/*! + \reimp +*/ + +TQSize TQIconView::sizeHint() const +{ + constPolish(); + + if ( !d->firstItem ) + return TQScrollView::sizeHint(); + + if ( d->dirty && d->firstSizeHint ) { + ( (TQIconView*)this )->resizeContents( TQMAX( 400, contentsWidth() ), + TQMAX( 400, contentsHeight() ) ); + if ( autoArrange() ) + ( (TQIconView*)this )->arrangeItemsInGrid( FALSE ); + d->firstSizeHint = FALSE; + } + + d->dirty = TRUE; // ######## warwick: I'm sure this is wrong. Fixed in 2.3. + int extra = style().pixelMetric(TQStyle::PM_ScrollBarExtent, + verticalScrollBar()) + 2*frameWidth(); + TQSize s( TQMIN(400, contentsWidth() + extra), + TQMIN(400, contentsHeight() + extra) ); + return s; +} + +/*! + \internal +*/ + +void TQIconView::updateContents() +{ + viewport()->update(); +} + +/*! + \reimp +*/ + +void TQIconView::enterEvent( TQEvent *e ) +{ + TQScrollView::enterEvent( e ); + emit onViewport(); +} + +/*! + \internal + This function is always called when the geometry of an item changes. + This function moves the item into the correct area in the internal + data structure. +*/ + +void TQIconView::updateItemContainer( TQIconViewItem *item ) +{ + if ( !item || d->containerUpdateLocked || (!isVisible() && autoArrange()) ) + return; + + if ( item->d->container1 && d->firstContainer ) { + //Special-case to check if we can use removeLast otherwise use removeRef (slower) + if (item->d->container1->items.last() == item) + item->d->container1->items.removeLast(); + else + item->d->container1->items.removeRef( item ); + } + item->d->container1 = 0; + if ( item->d->container2 && d->firstContainer ) { + //Special-case to check if we can use removeLast otherwise use removeRef (slower) + if (item->d->container2->items.last() == item) + item->d->container2->items.removeLast(); + else + item->d->container2->items.removeRef( item ); + } + item->d->container2 = 0; + + TQIconViewPrivate::ItemContainer *c = d->firstContainer; + if ( !c ) { + appendItemContainer(); + c = d->firstContainer; + } + + const TQRect irect = item->rect(); + bool contains = FALSE; + for (;;) { + if ( c->rect.intersects( irect ) ) { + contains = c->rect.contains( irect ); + break; + } + + c = c->n; + if ( !c ) { + appendItemContainer(); + c = d->lastContainer; + } + } + + if ( !c ) { +#if defined(QT_CHECK_RANGE) + tqWarning( "TQIconViewItem::updateItemContainer(): No fitting container found!" ); +#endif + return; + } + + if (item->isVisible()) { + c->items.append( item ); + item->d->container1 = c; + + if ( !contains ) { + c = c->n; + if ( !c ) { + appendItemContainer(); + c = d->lastContainer; + } + c->items.append( item ); + item->d->container2 = c; + } + } + if ( contentsWidth() < irect.right() || contentsHeight() < irect.bottom() ) + resizeContents( TQMAX( contentsWidth(), irect.right() ), TQMAX( contentsHeight(), irect.bottom() ) ); +} + +/*! + \internal + Appends a new rect area to the internal data structure of the items. +*/ + +void TQIconView::appendItemContainer() +{ + TQSize s; + // #### We have to find out which value is best here + if ( d->arrangement == LeftToRight ) + s = TQSize( INT_MAX - 1, RECT_EXTENSION ); + else + s = TQSize( RECT_EXTENSION, INT_MAX - 1 ); + + if ( !d->firstContainer ) { + d->firstContainer = new TQIconViewPrivate::ItemContainer( 0, 0, TQRect( TQPoint( 0, 0 ), s ) ); + d->lastContainer = d->firstContainer; + } else { + if ( d->arrangement == LeftToRight ) + d->lastContainer = new TQIconViewPrivate::ItemContainer( + d->lastContainer, 0, TQRect( d->lastContainer->rect.bottomLeft(), s ) ); + else + d->lastContainer = new TQIconViewPrivate::ItemContainer( + d->lastContainer, 0, TQRect( d->lastContainer->rect.topRight(), s ) ); + } +} + +/*! \internal + + Rebuilds the whole internal data structure. This is done when it's + likely that most/all items change their geometry (e.g. in + arrangeItemsInGrid()), because calling this is then more efficient + than calling updateItemContainer() for each item. +*/ + +void TQIconView::rebuildContainers() +{ + TQIconViewPrivate::ItemContainer *c = d->firstContainer, *tmpc; + while ( c ) { + tmpc = c->n; + delete c; + c = tmpc; + } + d->firstContainer = d->lastContainer = 0; + + TQIconViewItem *item = d->firstItem; + appendItemContainer(); + c = d->lastContainer; + while ( item ) { + if (item->isVisible()) { + if ( c->rect.contains( item->rect() ) ) { + item->d->container1 = c; + item->d->container2 = 0; + c->items.append( item ); + item = item->next; + } else if ( c->rect.intersects( item->rect() ) ) { + item->d->container1 = c; + c->items.append( item ); + c = c->n; + if ( !c ) { + appendItemContainer(); + c = d->lastContainer; + } + c->items.append( item ); + item->d->container2 = c; + item = item->next; + c = c->p; + } else { + if ( d->arrangement == LeftToRight ) { + if ( item->y() < c->rect.y() && c->p ) { + c = c->p; + continue; + } + } else { + if ( item->x() < c->rect.x() && c->p ) { + c = c->p; + continue; + } + } + + c = c->n; + if ( !c ) { + appendItemContainer(); + c = d->lastContainer; + } + } + } + else { + // Skip this hidden item + item = item->next; + } + } +} + +/*! + \internal +*/ + +void TQIconView::movedContents( int, int ) +{ + if ( d->drawDragShapes ) { + drawDragShapes( d->oldDragPos ); + d->oldDragPos = TQPoint( -1, -1 ); + } +} + +void TQIconView::handleItemChange( TQIconViewItem *old, bool shift, + bool control, bool homeend ) +{ + if ( d->selectionMode == Single ) { + bool block = signalsBlocked(); + blockSignals( TRUE ); + if ( old ) + old->setSelected( FALSE ); + blockSignals( block ); + d->currentItem->setSelected( TRUE, TRUE ); + } else if ( d->selectionMode == Extended ) { + if ( shift ) { + if ( !d->selectAnchor ) { + if ( old && !old->selected && old->isSelectable() ) { + old->selected = TRUE; + repaintItem( old ); + } + d->currentItem->setSelected( TRUE, TRUE ); + } else { + TQIconViewItem *from = d->selectAnchor, *to = d->currentItem; + if ( !from || !to ) + return; + + // checking if it's downwards and if we span rows + bool downwards = FALSE; + bool spanning = FALSE; + if ( d->arrangement == LeftToRight) { + if ( from->rect().center().y() < to->rect().center().y() ) + downwards = TRUE; + } else { + if ( from->rect().center().x() < to->rect().center().x() ) + downwards = TRUE; + } + + TQRect fr = from->rect(); + TQRect tr = to->rect(); + if ( d->arrangement == LeftToRight ) { + fr.moveTopLeft( TQPoint( tr.x(), fr.y() ) ); + if ( !tr.intersects( fr ) ) + spanning = TRUE; + } else { + fr.moveTopLeft( TQPoint( fr.x(), tr.y() ) ); + if ( !tr.intersects( fr ) ) + spanning = TRUE; + } + + + // finding the rectangles + TQRect topRect, bottomRect, midRect; + if ( !spanning ) { + midRect = from->rect().unite( to->rect() ); + } else { + if ( downwards ) { + topRect = from->rect(); + bottomRect = to->rect(); + } else { + topRect = to->rect(); + bottomRect = from->rect(); + } + if ( d->arrangement == LeftToRight ) { + topRect.setRight( contentsWidth() ); + bottomRect.setLeft( 0 ); + midRect.setRect( 0, topRect.bottom(), + contentsWidth(), + bottomRect.top() - topRect.bottom() ); + } else { + topRect.setBottom( contentsHeight() ); + bottomRect.setTop( 0 ); + midRect.setRect( topRect.right(), + 0, + bottomRect.left() - topRect.right(), + contentsHeight() ); + } + } + + // finding contained items and selecting them + TQIconViewItem *item = 0; + bool changed = FALSE; + bool midValid = midRect.isValid(); + bool topValid = topRect.isValid(); + bool bottomValid = bottomRect.isValid(); + TQRect selectedRect, unselectedRect; + for ( item = d->firstItem; item; item = item->next ) { + bool contained = FALSE; + TQPoint itemCenter = item->rect().center(); + if ( midValid && midRect.contains( itemCenter ) ) + contained = TRUE; + if ( !contained && topValid && topRect.contains( itemCenter ) ) + contained = TRUE; + if ( !contained && bottomValid && bottomRect.contains( itemCenter ) ) + contained = TRUE; + + if ( contained ) { + if ( !item->selected && item->isSelectable() ) { + changed = TRUE; + item->selected = TRUE; + selectedRect = selectedRect.unite( item->rect() ); + } + } else if ( item->selected && !control ) { + item->selected = FALSE; + unselectedRect = unselectedRect.unite( item->rect() ); + changed = TRUE; + } + } + + TQRect viewRect( contentsX(), contentsY(), + visibleWidth(), visibleHeight() ); + + if ( viewRect.intersects( selectedRect ) ) { + if ( homeend ) + TQScrollView::updateContents( viewRect.intersect( selectedRect ) ); + else + repaintContents( viewRect.intersect( selectedRect ) ); + } + if ( viewRect.intersects( unselectedRect ) ) { + if ( homeend ) + TQScrollView::updateContents( viewRect.intersect( unselectedRect ) ); + else + repaintContents( viewRect.intersect( unselectedRect ) ); + } + + if ( changed ) + emit selectionChanged(); + } + } else if ( !control ) { + blockSignals( TRUE ); + selectAll( FALSE ); + blockSignals( FALSE ); + d->currentItem->setSelected( TRUE, TRUE ); + } + } else { + if ( shift ) + d->currentItem->setSelected( !d->currentItem->isSelected(), TRUE ); + } +} + +TQBitmap TQIconView::mask( TQPixmap *pix ) const +{ + TQBitmap m; + if ( d->maskCache.find( TQString::number( pix->serialNumber() ), m ) ) + return m; + m = pix->createHeuristicMask(); + d->maskCache.insert( TQString::number( pix->serialNumber() ), m ); + return m; +} + +/*! + \reimp + \internal + + (Implemented to get rid of a compiler warning.) +*/ +void TQIconView::drawContents( TQPainter * ) +{ +} + +/*! + \reimp +*/ +void TQIconView::windowActivationChange( bool oldActive ) +{ + if ( oldActive && d->scrollTimer ) + d->scrollTimer->stop(); + + if ( !isVisible() ) + return; + + if ( palette().active() == palette().inactive() ) + return; + + repaintSelectedItems(); +} + +/*! + Returns TRUE if an iconview item is being renamed; otherwise + returns FALSE. +*/ + +bool TQIconView::isRenaming() const +{ +#ifndef QT_NO_TEXTEDIT + return d->renamingItem && d->renamingItem->renameBox; +#else + return FALSE; +#endif +} + +int TQIconView::visibleWidthSB() const +{ + if ( vScrollBarMode() != Auto ) + return visibleWidth(); + + int offset = verticalScrollBar()->isVisible() ? 0 + : style().pixelMetric( TQStyle::PM_ScrollBarExtent, verticalScrollBar() ); + return TQMAX( 0, visibleWidth() - offset ); +} + +int TQIconView::visibleHeightSB() const +{ + if ( hScrollBarMode() != Auto ) + return visibleHeight(); + + int offset = horizontalScrollBar()->isVisible() ? 0 + : style().pixelMetric( TQStyle::PM_ScrollBarExtent, horizontalScrollBar() ); + return TQMAX( 0, visibleHeight() - offset ); +} + +#endif // QT_NO_ICONVIEW diff --git a/src/widgets/qlistview.cpp b/src/widgets/qlistview.cpp index 79d338120..774c97306 100644 --- a/src/widgets/qlistview.cpp +++ b/src/widgets/qlistview.cpp @@ -2351,7 +2351,7 @@ void TQListViewItem::ignoreDoubleClick() item \a i, similar to the TQWidget::enterEvent() function. */ -// ### bug here too? see qiconview.cppp onItem/onViewport +// ### bug here too? see qiconview.cpp onItem/onViewport /*! \fn void TQListView::onViewport() diff --git a/src/widgets/qt_widgets.pri b/src/widgets/qt_widgets.pri index 9410e3e4a..6da724613 100644 --- a/src/widgets/qt_widgets.pri +++ b/src/widgets/qt_widgets.pri @@ -20,6 +20,7 @@ widgets { $$WIDGETS_H/ntqheader.h \ $$WIDGETS_H/ntqhgroupbox.h \ $$WIDGETS_H/ntqhbox.h \ + $$WIDGETS_H/ntqiconview.h \ $$WIDGETS_H/ntqlabel.h \ $$WIDGETS_H/ntqlcdnumber.h \ $$WIDGETS_H/ntqlineedit.h \ @@ -81,6 +82,7 @@ widgets { $$WIDGETS_CPP/qheader.cpp \ $$WIDGETS_CPP/qhgroupbox.cpp \ $$WIDGETS_CPP/qhbox.cpp \ + $$WIDGETS_CPP/qiconview.cpp \ $$WIDGETS_CPP/qlabel.cpp \ $$WIDGETS_CPP/qlcdnumber.cpp \ $$WIDGETS_CPP/qlineedit.cpp \ -- cgit v1.2.1