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