clicking packages work! so the package selector is now
[duncan/yast2-qt4.git] / src / YQTable.cc
1 /*---------------------------------------------------------------------\
2 |                                                                      |
3 |                      __   __    ____ _____ ____                      |
4 |                      \ \ / /_ _/ ___|_   _|___ \                     |
5 |                       \ V / _` \___ \ | |   __) |                    |
6 |                        | | (_| |___) || |  / __/                     |
7 |                        |_|\__,_|____/ |_| |_____|                    |
8 |                                                                      |
9 |                               core system                            |
10 |                                                        (C) SuSE GmbH |
11 \----------------------------------------------------------------------/
12
13   File:       YQTable.cc
14
15   Author:     Stefan Hundhammer <sh@suse.de>
16
17 /-*/
18
19 #include <QHeaderView>
20 #include <QVBoxLayout>
21 #include <QString>
22 #define y2log_component "qt-ui"
23 #include <ycp/y2log.h>
24
25 #include "utf8.h"
26 #include "YQUI.h"
27 #include "YEvent.h"
28 #include "YQSignalBlocker.h"
29 #include "YUIException.h"
30
31 #include "QY2ListView.h"
32 #include "YQTable.h"
33
34
35 YQTable::YQTable( YWidget * parent, YTableHeader * tableHeader )
36     : QFrame( (QWidget *) parent->widgetRep() )
37     , YTable( parent, tableHeader )
38 {
39     setWidgetRep( this );
40     QVBoxLayout* layout = new QVBoxLayout( this );
41     layout->setSpacing( 0 );
42     setLayout( layout );
43
44     layout->setMargin( YQWidgetMargin );
45
46     _qt_listView = new QY2ListView( this );
47     YUI_CHECK_NEW( _qt_listView );
48     layout->addWidget( _qt_listView );
49     _qt_listView->setAllColumnsShowFocus( true );
50
51
52     //
53     // Add columns
54     //
55
56     QStringList headers;
57     _qt_listView->setColumnCount(columns());
58     for ( int i=0; i < columns(); i++ )
59     {
60         headers << QString::fromUtf8(header(i).c_str());
61
62         int qt_alignment = Qt::AlignLeft;
63
64         switch ( alignment( i ) )
65         {
66             case YAlignBegin:   qt_alignment = Qt::AlignLeft;   break;
67             case YAlignCenter:  qt_alignment = Qt::AlignCenter; break;
68             case YAlignEnd:     qt_alignment = Qt::AlignRight;  break;
69
70             case YAlignUnchanged: break;
71         }
72
73         //FIXME _qt_listView->setColumnAlignment( i, qt_alignment );
74         // _qt_listView->adjustColumn( column );
75     }
76     _qt_listView->setHeaderLabels( headers );
77
78     //
79     // Connect signals and slots
80     //
81
82     connect( _qt_listView,      SIGNAL( itemDoubleClicked    ( QTreeWidgetItem *, int ) ),
83              this,              SLOT  ( slotActivated    ( QTreeWidgetItem * ) ) );
84
85     connect( _qt_listView,      SIGNAL( itemActivated    ( QTreeWidgetItem *, int ) ),
86              this,              SLOT  ( slotActivated    ( QTreeWidgetItem * ) ) );
87
88     connect( _qt_listView,      SIGNAL( currentItemChanged ( QTreeWidgetItem *, QTreeWidgetItem * ) ),
89              this,              SLOT  ( slotSelected     ( QTreeWidgetItem * ) ) );
90 }
91
92
93 YQTable::~YQTable()
94 {
95     // NOP
96 }
97
98
99 void
100 YQTable::setKeepSorting( bool keepSorting )
101 {
102     YTable::setKeepSorting( keepSorting );
103     _qt_listView->setSortByInsertionSequence( keepSorting );
104 }
105
106
107 void
108 YQTable::addItem( YItem * yitem )
109 {
110     YTableItem * item = dynamic_cast<YTableItem *> (yitem);
111     YUI_CHECK_PTR( item );
112
113     YTable::addItem( item );
114
115     YQTableListViewItem * clone = new YQTableListViewItem( this, _qt_listView, item );
116     YUI_CHECK_NEW( clone );
117
118     if ( item->selected() )
119     {
120         YQSignalBlocker sigBlocker( _qt_listView );
121         clone->setSelected(true);
122     }
123 }
124
125
126 void
127 YQTable::selectItem( YItem * yitem, bool selected )
128 {
129     YQSignalBlocker sigBlocker( _qt_listView );
130
131     YTableItem * item = dynamic_cast<YTableItem *> (yitem);
132     YUI_CHECK_PTR( item );
133
134     YQTableListViewItem * clone = (YQTableListViewItem *) item->data();
135     YUI_CHECK_PTR( clone );
136
137     //FIXME selected first
138     if ( ! selected && clone == _qt_listView->currentItem() )
139     {
140         deselectAllItems();
141     }
142     else
143     {
144         clone->setSelected( true );
145         YTable::selectItem( item, selected );
146     }
147 }
148
149
150 void
151 YQTable::deselectAllItems()
152 {
153     YQSignalBlocker sigBlocker( _qt_listView );
154
155     YTable::deselectAllItems();
156     _qt_listView->clearSelection();
157 }
158
159
160 void
161 YQTable::deleteAllItems()
162 {
163     _qt_listView->clear();
164     YTable::deleteAllItems();
165 }
166
167
168 void
169 YQTable::cellChanged( const YTableCell * cell )
170 {
171     YTableItem * item = cell->parent();
172     YUI_CHECK_PTR( item );
173
174     YQTableListViewItem * clone = (YQTableListViewItem *) item->data();
175     YUI_CHECK_PTR( clone );
176
177     clone->updateCell( cell );
178 }
179
180
181 void
182 YQTable::selectOrigItem( QTreeWidgetItem * listViewItem )
183 {
184     if ( listViewItem )
185     {
186         YQTableListViewItem * tableListViewItem = dynamic_cast<YQTableListViewItem *> (listViewItem);
187         YUI_CHECK_PTR( tableListViewItem );
188
189         YTable::selectItem( tableListViewItem->origItem(), true );
190     }
191 }
192
193
194 void
195 YQTable::slotSelected( QTreeWidgetItem * listViewItem  )
196 {
197     selectOrigItem( listViewItem );
198
199     if ( immediateMode() )
200     {
201         if ( ! YQUI::ui()->eventPendingFor( this ) )
202         {
203             // Avoid overwriting a (more important) Activated event with a SelectionChanged event
204
205             YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::SelectionChanged ) );
206         }
207     }
208 }
209
210
211 void
212 YQTable::slotActivated( QTreeWidgetItem * listViewItem )
213 {
214     selectOrigItem( listViewItem );
215
216     if ( notify() )
217         YQUI::ui()->sendEvent( new YWidgetEvent( this, YEvent::Activated ) );
218 }
219
220
221 void
222 YQTable::setEnabled( bool enabled )
223 {
224     _qt_listView->setEnabled( enabled );
225     //FIXME _qt_listView->triggerUpdate();
226     YWidget::setEnabled( enabled );
227 }
228
229
230
231 int
232 YQTable::preferredWidth()
233 {
234     // Arbitrary value.
235     // Use a MinSize widget to set a size that is useful for the application.
236
237     return 30;
238 }
239
240
241 int
242 YQTable::preferredHeight()
243 {
244     // Arbitrary value.
245     // Use a MinSize widget to set a size that is useful for the application.
246
247     return 30;
248 }
249
250
251 void
252 YQTable::setSize( int newWidth, int newHeight )
253 {
254     resize( newWidth, newHeight );
255 }
256
257
258 bool
259 YQTable::setKeyboardFocus()
260 {
261     _qt_listView->setFocus();
262
263     return true;
264 }
265
266
267
268
269
270
271 YQTableListViewItem::YQTableListViewItem( YQTable *     table,
272                                           QY2ListView * parent,
273                                           YTableItem *  origItem )
274     : QY2ListViewItem( parent )
275     , _table( table )
276     , _origItem( origItem )
277 {
278     YUI_CHECK_PTR( _table );
279     YUI_CHECK_PTR( _origItem );
280
281     _origItem->setData( this );
282
283     for ( YTableCellIterator it = _origItem->cellsBegin();
284           it != _origItem->cellsEnd();
285           ++it )
286     {
287         updateCell( *it );
288     }
289
290     if ( _origItem->selected() )
291         QY2ListViewItem::setSelected( true );
292 }
293
294
295 void
296 YQTableListViewItem::updateCell( const YTableCell * cell )
297 {
298     if ( ! cell )
299         return;
300
301     int column = cell->column();
302
303     //
304     // Set label text
305     //
306
307     setText( column, fromUTF8( cell->label() ) );
308
309
310     //
311     // Set icon (if specified)
312     //
313
314     if ( cell->hasIconName() )
315     {
316         // _table is checked against 0 in the constructor
317
318         string  iconName = _table->iconFullPath( cell->iconName() );
319         QPixmap icon     = QPixmap( iconName.c_str() );
320
321         if ( icon.isNull() )
322             y2warning( "Can't load icon %s", iconName.c_str() );
323         else
324             setData( column, Qt::DecorationRole, icon );
325     }
326     else // No pixmap name
327     {
328         if ( ! data( column, Qt::DecorationRole ).isNull() ) // Was there a pixmap before?
329         {
330             setData( column, Qt::DecorationRole, QPixmap() ); // Set empty pixmap
331         }
332     }
333 }
334
335
336 #include "YQTable.moc"