You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
523 lines
13 KiB
523 lines
13 KiB
/*
|
|
kopetelistviewitem.h - Kopete's modular TQListViewItems
|
|
|
|
Copyright (c) 2005 by Engin AYDOGAN <engin@bzzzt.biz>
|
|
Copyright (c) 2004 by Richard Smith <kde@metafoo.co.uk>
|
|
|
|
Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
|
|
|
|
*************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
*************************************************************************
|
|
*/
|
|
|
|
#ifndef KOPETE_LISTVIEWITEM_H
|
|
#define KOPETE_LISTVIEWITEM_H
|
|
|
|
#include <klistview.h>
|
|
#include <kopetecontact.h>
|
|
|
|
#include <utility>
|
|
#include <tqimage.h>
|
|
|
|
class TQPixmap;
|
|
|
|
namespace Kopete {
|
|
namespace UI {
|
|
namespace ListView {
|
|
|
|
class Component;
|
|
|
|
class ComponentBase
|
|
{
|
|
public:
|
|
ComponentBase();
|
|
virtual ~ComponentBase() = 0;
|
|
|
|
uint components();
|
|
Component *component( uint n );
|
|
Component *componentAt( const TQPoint &pt );
|
|
|
|
/** Repaint this item */
|
|
virtual void repaint() = 0;
|
|
/** Relayout this item */
|
|
virtual void relayout() = 0;
|
|
|
|
/**
|
|
* Get the tool tip string and rectangle for a tip request at position
|
|
* relativePos relative to this item. Queries the appropriate child component.
|
|
*
|
|
* @return a pair where the first element is the tooltip, and the second is
|
|
* the rectangle within the item for which the tip should be displayed.
|
|
*/
|
|
virtual std::pair<TQString,TQRect> toolTip( const TQPoint &relativePos );
|
|
|
|
protected:
|
|
/** A child item has been added to this item */
|
|
virtual void componentAdded( Component *component );
|
|
/** A child item has been removed from this item */
|
|
virtual void componentRemoved( Component *component );
|
|
/** A child item has been resized */
|
|
virtual void componentResized( Component *component );
|
|
/** Remove all children */
|
|
virtual void clear();
|
|
|
|
/** @internal animate items */
|
|
void updateAnimationPosition( int p, int s );
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
|
|
// calls componentAdded and componentRemoved
|
|
friend class Component;
|
|
};
|
|
|
|
/**
|
|
* @author Richard Smith <kde@metafoo.co.uk>
|
|
*/
|
|
class ToolTipSource
|
|
{
|
|
public:
|
|
/**
|
|
* Get the tooltip string and rect for a component
|
|
*
|
|
* @param component The component to get a tip for
|
|
* @param pt The point (relative to the list item) the mouse is at
|
|
* @param rect The tip will be removed when the mouse leaves this rect.
|
|
* Will initially be set to \p component's rect().
|
|
*/
|
|
virtual TQString operator() ( ComponentBase *component, const TQPoint &pt, TQRect &rect ) = 0;
|
|
};
|
|
|
|
/**
|
|
* This class represents a rectangular subsection of a ListItem.
|
|
*
|
|
* @author Richard Smith <kde@metafoo.co.uk>
|
|
*/
|
|
class Component : public ComponentBase
|
|
{
|
|
protected:
|
|
Component( ComponentBase *parent );
|
|
public:
|
|
virtual ~Component() = 0;
|
|
|
|
/**
|
|
* Set the size and position of this item relative to the list view item. Should
|
|
* only be called by the containing item.
|
|
* @param rect the new rectangle this component will paint in, relative to the painter
|
|
* passed to the paint() function by the parent item.
|
|
*/
|
|
virtual void layout( const TQRect &rect );
|
|
|
|
/**
|
|
* Paint this item, inside the rectangle returned by rect().
|
|
* The default implementation calls paint on all children.
|
|
*/
|
|
virtual void paint( TQPainter *painter, const TQColorGroup &cg );
|
|
|
|
void repaint();
|
|
void relayout();
|
|
|
|
/**
|
|
* @return the rect this component was allocated last time it was laid out
|
|
*/
|
|
TQRect rect();
|
|
/**
|
|
* Prevents this component to be drawn
|
|
*/
|
|
void hide();
|
|
|
|
/**
|
|
* Makes this component to be drawn
|
|
*/
|
|
void show();
|
|
|
|
bool isShown();
|
|
bool isHidden();
|
|
|
|
/**
|
|
* Returns the smallest this component can become horizontally while still
|
|
* being useful.
|
|
*/
|
|
int minWidth();
|
|
/**
|
|
* Returns the smallest this component can become vertically while still
|
|
* being useful.
|
|
*/
|
|
int minHeight();
|
|
|
|
/**
|
|
* Returns the width this component desires for a given @a height. By default
|
|
* this function returns minWidth().
|
|
*/
|
|
virtual int widthForHeight( int height );
|
|
/**
|
|
* Returns the height this component desires for a given @a width. By default
|
|
* this function returns minHeight().
|
|
*/
|
|
virtual int heightForWidth( int width );
|
|
|
|
/**
|
|
* Set a tool tip source for this item. The tool tip source object is
|
|
* still owned by the caller, and must live for at least as long as
|
|
* this component.
|
|
*/
|
|
void setToolTipSource( ToolTipSource *source = 0 );
|
|
|
|
/**
|
|
* Get the tool tip string and rectangle for a tip request at position
|
|
* relativePos relative to this item. If a tooltip source is set, it will
|
|
* be used. Otherwise calls the base class.
|
|
*
|
|
* @return a pair where the first element is the tooltip, and the second is
|
|
* the rectangle within the item for which the tip should be displayed.
|
|
*/
|
|
std::pair<TQString,TQRect> toolTip( const TQPoint &relativePos );
|
|
|
|
/**
|
|
* RTTI: Runtime Type Information
|
|
* Exactly the same as TQt's approach to identify types of
|
|
* TQCanvasItems.
|
|
*/
|
|
|
|
enum RttiValues {
|
|
Rtti_Component, Rtti_BoxComponent, Rtti_TextComponent,
|
|
Rtti_ImageComponent, Rtti_DisplayNameComponent,
|
|
Rtti_HSpacerComponent, Rtti_VSpacerComponent
|
|
};
|
|
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
protected:
|
|
/**
|
|
* Change the minimum width, in pixels, this component requires in order
|
|
* to be at all useful. Note: do not call this from your layout() function.
|
|
* @param width the minimum width
|
|
* @return true if the size has actually changed, false if it's been set to
|
|
* the existing values. if it returns true, you do not need to relayout,
|
|
* since the parent component will do that for you.
|
|
*/
|
|
bool setMinWidth( int width );
|
|
/**
|
|
* Change the minimum height, in pixels, this component requires in order
|
|
* to be at all useful. Note: do not call this from your layout() function.
|
|
* @param height the minimum height
|
|
* @return true if the size has actually changed, false if it's been set to
|
|
* the existing values. If it returns true, you do not need to relayout,
|
|
* since the parent component will do that for you.
|
|
*/
|
|
bool setMinHeight( int height );
|
|
|
|
void componentAdded( Component *component );
|
|
void componentRemoved( Component *component );
|
|
|
|
private:
|
|
// calls the three functions below
|
|
friend void ComponentBase::updateAnimationPosition( int p, int s );
|
|
|
|
// used for animation
|
|
void setRect( const TQRect &rect );
|
|
TQRect startRect();
|
|
TQRect targetRect();
|
|
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
class BoxComponent : public Component
|
|
{
|
|
public:
|
|
enum Direction {Horizontal,Vertical };
|
|
BoxComponent( ComponentBase *parent, Direction dir =Horizontal );
|
|
~BoxComponent();
|
|
|
|
virtual void layout( const TQRect &rect );
|
|
|
|
virtual int widthForHeight( int height );
|
|
virtual int heightForWidth( int width );
|
|
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
|
|
protected:
|
|
void componentAdded( Component *component );
|
|
void componentRemoved( Component *component );
|
|
void componentResized( Component *component );
|
|
|
|
private:
|
|
void calcMinSize();
|
|
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
/**
|
|
* ContactBoxComponent
|
|
*/
|
|
class ContactBoxComponent : public BoxComponent
|
|
{
|
|
public:
|
|
ContactBoxComponent(ComponentBase *parent, Direction dir =Horizontal);
|
|
~ContactBoxComponent();
|
|
|
|
virtual void reloadTheme();
|
|
|
|
virtual void layout(const TQRect &rect);
|
|
|
|
virtual int widthForHeight(int height);
|
|
virtual int heightForWidth(int width);
|
|
|
|
virtual void paint(TQPainter *painter, const TQColorGroup &cg);
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
/**
|
|
* GroupBoxComponent
|
|
*/
|
|
class GroupBoxComponent : public BoxComponent
|
|
{
|
|
public:
|
|
GroupBoxComponent(ComponentBase *parent, Direction dir =Horizontal);
|
|
~GroupBoxComponent();
|
|
|
|
virtual void reloadTheme();
|
|
|
|
virtual void layout(const TQRect &rect);
|
|
|
|
virtual int widthForHeight(int height);
|
|
virtual int heightForWidth(int width);
|
|
|
|
virtual void paint(TQPainter *painter, const TQColorGroup &cg);
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
class TextComponent : public Component
|
|
{
|
|
public:
|
|
TextComponent( ComponentBase *parent, const TQFont &font = TQFont(), const TQString &text = TQString() );
|
|
~TextComponent();
|
|
|
|
TQString text();
|
|
void setText( const TQString &text );
|
|
|
|
TQFont font();
|
|
void setFont( const TQFont &font );
|
|
|
|
TQColor color();
|
|
void setColor( const TQColor &color );
|
|
void setDefaultColor();
|
|
|
|
int widthForHeight( int );
|
|
|
|
void paint( TQPainter *painter, const TQColorGroup &cg );
|
|
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
|
|
private:
|
|
void calcMinSize();
|
|
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
class ImageComponent : public Component
|
|
{
|
|
public:
|
|
ImageComponent( ComponentBase *parent );
|
|
ImageComponent( ComponentBase *parent, int minW, int minH );
|
|
~ImageComponent();
|
|
|
|
virtual void setPixmap( const TQPixmap &img, bool adjustSize = true);
|
|
TQPixmap pixmap( void );
|
|
|
|
virtual void paint( TQPainter *painter, const TQColorGroup &cg );
|
|
|
|
virtual void scale( int w, int h, TQ_ScaleMode );
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
protected:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
/**
|
|
* FaceComponent
|
|
*/
|
|
class FaceComponent : public ImageComponent
|
|
{
|
|
public:
|
|
FaceComponent(ComponentBase *parent): ImageComponent(parent) {}
|
|
FaceComponent(ComponentBase *parent, int minW, int minH): ImageComponent(parent, minH, minW) {}
|
|
|
|
void setPixmap(const TQPixmap &img, bool adjustSize = true);
|
|
void paint(TQPainter *painter, const TQColorGroup &cg);
|
|
};
|
|
|
|
/**
|
|
* ContactComponent
|
|
*/
|
|
class ContactComponent : public ImageComponent
|
|
{
|
|
public:
|
|
ContactComponent( ComponentBase *parent, Kopete::Contact *contact, int iconSize);
|
|
~ContactComponent();
|
|
void updatePixmap();
|
|
Kopete::Contact *contact();
|
|
std::pair<TQString,TQRect> toolTip( const TQPoint &relativePos );
|
|
protected:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
/**
|
|
* SpacerComponent
|
|
*/
|
|
class SpacerComponent : public Component
|
|
{
|
|
public:
|
|
SpacerComponent( ComponentBase *parent, int w, int h );
|
|
};
|
|
|
|
/**
|
|
* DisplayNameComponent
|
|
*/
|
|
|
|
class DisplayNameComponent : public BoxComponent
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor
|
|
*/
|
|
DisplayNameComponent( ComponentBase *parent );
|
|
|
|
/**
|
|
* Dtor
|
|
*/
|
|
~DisplayNameComponent();
|
|
void layout( const TQRect& rect );
|
|
|
|
TQString text();
|
|
void setText( const TQString& text );
|
|
void setFont( const TQFont& font );
|
|
void setColor( const TQColor& color );
|
|
void setDefaultColor();
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
/**
|
|
* reparse again for emoticon (call this when emoticon theme change)
|
|
*/
|
|
void redraw();
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
class HSpacerComponent : public Component
|
|
{
|
|
public:
|
|
HSpacerComponent( ComponentBase *parent );
|
|
int widthForHeight( int );
|
|
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
};
|
|
|
|
class VSpacerComponent : public Component
|
|
{
|
|
public:
|
|
VSpacerComponent( ComponentBase *parent );
|
|
int heightForWidth( int );
|
|
|
|
static int RTTI;
|
|
virtual int rtti() const { return RTTI; }
|
|
};
|
|
|
|
/**
|
|
* List-view item composed of Component items. Supports height-for-width, tooltips and
|
|
* some animation effects.
|
|
*
|
|
* @author Richard Smith <kde@metafoo.co.uk>
|
|
*/
|
|
class Item : public TQObject, public KListViewItem, public ComponentBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
Item( TQListView *parent, TQObject *owner = 0, const char *name = 0 );
|
|
Item( TQListViewItem *parent, TQObject *owner = 0, const char *name = 0 );
|
|
~Item();
|
|
|
|
void repaint();
|
|
void relayout();
|
|
|
|
void setup();
|
|
virtual void paintCell( TQPainter *p, const TQColorGroup &cg, int column, int width, int align );
|
|
//TODO: startRename(...)
|
|
|
|
float opacity();
|
|
void setOpacity( float alpha );
|
|
|
|
bool targetVisibility();
|
|
void setTargetVisibility( bool vis );
|
|
|
|
/**
|
|
* Turn on and off certain visual effects for all Items.
|
|
* @param animation whether changes to items should be animated.
|
|
* @param fading whether requests to setTargetVisibility should cause fading of items.
|
|
* @param folding whether requests to setTargetVisibility should cause folding of items.
|
|
*/
|
|
static void setEffects( bool animation, bool fading, bool folding );
|
|
|
|
int width( const TQFontMetrics & fm, const TQListView * lv, int c ) const;
|
|
|
|
/**
|
|
* Show or hide this item in a clean way depending on whether it matches
|
|
* the current quick search
|
|
* @param match If true, show or hide the item as normal. If false, hide the item immediately.
|
|
*/
|
|
virtual void setSearchMatch( bool match );
|
|
|
|
protected:
|
|
void componentAdded( Component *component );
|
|
void componentRemoved( Component *component );
|
|
void componentResized( Component *component );
|
|
|
|
void setHeight( int );
|
|
|
|
private:
|
|
void initLVI();
|
|
void recalcHeight();
|
|
void scheduleLayout();
|
|
|
|
private slots:
|
|
void slotColumnResized();
|
|
void slotLayoutItems();
|
|
void slotLayoutAnimateItems();
|
|
void slotUpdateVisibility();
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
} // END namespace ListView
|
|
} // END namespace UI
|
|
} // END namespace Kopete
|
|
|
|
#endif
|
|
|
|
// vim: set noet ts=4 sts=4 sw=4:
|