summaryrefslogtreecommitdiffstats
path: root/adept/libadept/extendablelist.h
blob: c36d5fb63eb0c402ca834f705c31d904b92071d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
// -*- C++ -*-
#include <klistview.h>
#include <tqpixmap.h>
#include <tqlayout.h>
#include <kglobalsettings.h>
#include <vector>

#include <apt-front/utils/range.h>

#ifndef EPT_EXTENDABLELIST_H
#define EPT_EXTENDABLELIST_H
namespace adept {

using namespace aptFront;

class ExtendableItem;
class ExtendableList;
class ItemExtender;

class ExtendableList : public TDEListView {
    Q_OBJECT
  
public:
    typedef bool(*ItemCompare)( const ExtendableItem *,
                                const ExtendableItem * );
    ExtendableList( TQWidget *p = 0, const char *n = 0 );
    virtual ~ExtendableList();
    TQPixmap extendedIcon() { return m_extendedIcon; }
    TQPixmap baseIcon() { return m_baseIcon; }
    TQPixmap unextendableIcon() { return m_unextendableIcon; }
    int extenderOffset( ExtendableItem *i );
    void setExtenderHighlight( bool e ) { m_extenderHighlight = e; }
    bool extenderHighlight() { return m_extenderHighlight; }
public slots:
    void addExtender( ExtendableItem *i );
    void removeExtender( ExtendableItem *i );
    void updateExtender( ExtendableItem *i );
    void delayedUpdateExtenders();
    void updateExtenders();
    void setToggleColumn( int c ) {
        m_toggleColumn = c;
    }
    unsigned toggleColumn() { return m_toggleColumn; }
    virtual void show();
    virtual void clear();
    utils::Range< ExtendableItem * > extenders() {
        return utils::range( m_extenders.begin(), m_extenders.end() ); }
    void openToplevel();
protected slots:
    void processClick( TQListViewItem *, const TQPoint &, int );
signals:
    void extendersChanged();
protected:
    virtual void resizeEvent( TQResizeEvent * );
    virtual void showEvent( TQShowEvent * );
    virtual void keyPressEvent( TQKeyEvent * );
    std::vector< ExtendableItem * > m_extenders;
    TQPixmap m_extendedIcon;
    TQPixmap m_baseIcon;
    TQPixmap m_unextendableIcon;
    int m_toggleColumn;
    bool m_inDtor:1;
    bool m_extenderUpdateScheduled:1;
    bool m_needSort:1;
    bool m_extenderHighlight:1;
};

class ExtendableItem : public TDEListViewItem {
public:

    ExtendableItem( ExtendableList *l )
        : TDEListViewItem( l ), m_extender( 0 ) {
    }

    ExtendableItem( ExtendableList *l, ExtendableItem *prev )
        : TDEListViewItem( l, prev ), m_extender( 0 ) {
    }

    ExtendableItem( ExtendableItem *p, ExtendableItem *prev )
        : TDEListViewItem( p, prev ), m_extender( 0 ) {
    }

    ExtendableItem( ExtendableItem *p )
        : TDEListViewItem( p ), m_extender( 0 ) {
    }

    virtual void setup() {
        TDEListViewItem::setup();
        updateIcon();
    }
    void toggleExtender();

    void hideExtender() {
        if (extender())
            toggleExtender();
    }

    void showExtender() {
        if (!extender())
            toggleExtender();
    }

    ItemExtender *extender() { return m_extender; }

    static bool s_less( const ExtendableItem *a, const ExtendableItem *b );

    ExtendableList *list();

    virtual void updateIcon();

    virtual void paintBranches( TQPainter *, const TQColorGroup &, int, int, int );

    virtual ItemExtender *createExtender() = 0;
    virtual bool extendable() const { return false; }
    virtual bool less( const ExtendableItem * ) const = 0;
    virtual int compare( TQListViewItem *other, int col, bool ascending ) const;

    virtual ~ExtendableItem();
    virtual void setHeight( int h ) { TDEListViewItem::setHeight( h ); }
protected:
    ItemExtender *m_extender;
};

class ItemExtender : public TQWidget {
    Q_OBJECT
  
public:
    // ItemExtender( ExtendableItem *item );
    ItemExtender( TQWidget *parent, const char *n )
        : TQWidget( parent, n ), m_item( 0 )
        {}

    virtual void setItem( ExtendableItem *i ) {
        m_item = i;
    }

    virtual void polish() {
        setupColors();
    }

    ExtendableItem *item() {
        return m_item;
    }

    void resize( int w, int h ) {
        setUpdatesEnabled( false );
        TQWidget::resize( w, h );
        setUpdatesEnabled( true );
        TQWidget::resize( w, layout()->minimumSize().height() );
    }

    void resize( const TQSize &s ) {
        resize( s.width(), s.height() );
    }

public slots:
    void setupColors();
protected:
    virtual void mouseReleaseEvent( TQMouseEvent *e ) {
        e->accept();
    } // throw away mouse clicks :-)
    ExtendableItem *m_item;
};

}

#endif