1 //
2 // file QT4SelectItems.H
3 // Dave Cosgrove
4 // AstraZeneca
5 // 27th June 2006
6 //
7 // Puts up a QListWidget in a box allowing selections from a list of strings.
8 // Similar to QTSelectItems.H but in Qt4 speak.
9 // This must always be used as a modal dialog, since the address of the vector
10 // holding the selections is kept, and this must be in scope when it is filled.
11 // It is filled when either the ok or cancel buttons are pressed.
12 
13 #include <QLabel>
14 #include <QLayout>
15 #include <QListWidget>
16 #include <QListWidgetItem>
17 #include <QPushButton>
18 
19 #include "QT4SelectItems.H"
20 
21 #include <iostream>
22 
23 using namespace std;
24 
25 namespace DACLIB {
26 
27 // ***************************************************************************
QT4SelectItems(const string & label,vector<QString> & item_labels,vector<char> & selected_items,bool radio_box,QWidget * parent)28 QT4SelectItems::QT4SelectItems( const string &label ,
29                                 vector<QString> &item_labels ,
30                                 vector<char> &selected_items , bool radio_box ,
31                                 QWidget *parent ) : QDialog( parent ) {
32 
33   setWindowTitle( "Select Items" );
34 
35   QWidget *vbox = new QWidget( this );
36 
37   list_widget_ = new QListWidget();
38 
39   if( radio_box )
40     list_widget_->setSelectionMode( QAbstractItemView::SingleSelection );
41   else
42     list_widget_->setSelectionMode( QAbstractItemView::ExtendedSelection );
43 
44   vector<QString>::iterator p , ps;
45   int i = 0;
46   for( p = item_labels.begin() , ps = item_labels.end() ; p != ps ; ++p , ++i ) {
47     QListWidgetItem *item = new QListWidgetItem( *p , list_widget_ );
48     list_widget_->setItemSelected( item , selected_items[i] );
49   }
50 
51   connect( list_widget_ , SIGNAL( itemDoubleClicked( QListWidgetItem * ) ) ,
52            this , SLOT( slot_list_double_clicked( QListWidgetItem * ) ) );
53 
54   build_action_box();
55 
56   vlayout_ = new QVBoxLayout();
57   vlayout_->setDirection( QBoxLayout::BottomToTop );
58   vlayout_->addWidget( action_box_ );
59   vlayout_->addWidget( list_widget_ );
60   vlayout_->addWidget( new QLabel( label.c_str() ) );
61 
62   vbox->setLayout( vlayout_ );
63   vbox->show();
64 
65 }
66 
67 // *****************************************************************************
get_results(vector<char> & selected_items) const68 void QT4SelectItems::get_results( vector<char> &selected_items ) const {
69 
70   selected_items = vector<char>( list_widget_->count() , 0 );
71   for( int i = 0 , is = list_widget_->count() ; i < is ; ++i ) {
72     selected_items[i] = list_widget_->isItemSelected( list_widget_->item( i ) );
73   }
74 
75 }
76 
77 // *****************************************************************************
build_action_box()78 void QT4SelectItems::build_action_box() {
79 
80   action_box_ = new QWidget( this );
81   QHBoxLayout *hlayout = new QHBoxLayout();
82 
83   QPushButton *button = new QPushButton( "Ok" );
84   button->setDefault( true );
85   hlayout->addWidget( button );
86   connect( button , SIGNAL( clicked() ) , this , SLOT( accept() ) );
87 
88   button = new QPushButton( "Cancel" );
89   hlayout->addWidget( button );
90   connect( button , SIGNAL( clicked() ) , this , SLOT( reject() ) );
91 
92   action_box_->setLayout( hlayout );
93 
94 }
95 
96 // *****************************************************************************
97 // select item and out
slot_list_double_clicked(QListWidgetItem * item)98 void QT4SelectItems::slot_list_double_clicked( QListWidgetItem *item ) {
99 
100   item->setSelected( true );
101   accept();
102 
103 }
104 
105 } // EO namespace DACLIB
106