]> git.sesse.net Git - vlc/blob - modules/gui/qt4/components/preferences_widgets.cpp
Skeleton for simple prefs
[vlc] / modules / gui / qt4 / components / preferences_widgets.cpp
1 /*****************************************************************************
2  * preferences_widgets.cpp : Widgets for preferences displays
3  ****************************************************************************
4  * Copyright (C) 2006 the VideoLAN team
5  * $Id$
6  *
7  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 /**
25  * Todo:
26  *  - Finish implementation (see WX)
27  *  - Improvements over WX
28  *      - Password field implementation (through "pwd" bool param
29  *      - Validator for modulelist
30  *  - Implement update stuff using a general Updated signal
31  */
32
33 #include "components/preferences_widgets.hpp"
34 #include "qt4.hpp"
35 #include <QLineEdit>
36 #include <QString>
37 #include <QSpinBox>
38 #include <QDoubleSpinBox>
39 #include <QVariant>
40 #include <QComboBox>
41
42 ConfigControl *ConfigControl::createControl( vlc_object_t *p_this,
43                                              module_config_t *p_item,
44                                              QWidget *parent )
45 {
46     ConfigControl *p_control = NULL;
47     if( p_item->psz_current ) return NULL;
48
49     switch( p_item->i_type )
50     {
51     case CONFIG_ITEM_MODULE:
52         p_control = new ModuleConfigControl( p_this, p_item, parent, false );
53         break;
54     case CONFIG_ITEM_MODULE_CAT:
55         p_control = new ModuleConfigControl( p_this, p_item, parent, true );
56         break;
57     case CONFIG_ITEM_STRING:
58         if( !p_item->i_list )
59             p_control = new StringConfigControl( p_this, p_item, parent,false );
60         else
61             fprintf(stderr, "TODO\n" );
62         break;
63     default:
64         break;
65     }
66     return p_control;
67 }
68
69 /**************************************************************************
70  * String-based controls
71  *************************************************************************/
72
73 /*********** String **************/
74 StringConfigControl::StringConfigControl( vlc_object_t *_p_this,
75                                           module_config_t *_p_item,
76                                           QWidget *_parent, bool pwd ) :
77                            VStringConfigControl( _p_this, _p_item, _parent )
78 {
79     QLabel *label = new QLabel( qfu(p_item->psz_text) );
80     text = new QLineEdit( qfu(p_item->psz_value) );
81     finish(label);
82
83     QHBoxLayout *layout = new QHBoxLayout();
84     layout->addWidget( label, 0 ); layout->addWidget( text, 1 );
85     widget->setLayout( layout );
86 }
87
88 StringConfigControl::StringConfigControl( vlc_object_t *_p_this,
89                                    module_config_t *_p_item,
90                                    QLabel *label, QLineEdit *_text, bool pwd ):
91                            VStringConfigControl( _p_this, _p_item )
92 {
93     text = _text;
94     finish( label );
95 }
96
97 void StringConfigControl::finish( QLabel *label )
98 {
99     text->setToolTip( qfu(p_item->psz_longtext) );
100     label->setToolTip( qfu(p_item->psz_longtext) );
101 }
102
103 /********* Module **********/
104 ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
105                 module_config_t *_p_item, QWidget *_parent,
106                 bool bycat ) : VStringConfigControl( _p_this, _p_item, _parent )
107 {
108     QLabel *label = new QLabel( qfu(p_item->psz_text) );
109     combo = new QComboBox();
110     finish( label, bycat );
111     QHBoxLayout *layout = new QHBoxLayout();
112     layout->addWidget( label ); layout->addWidget( combo );
113     widget->setLayout( layout );
114 }
115 ModuleConfigControl::ModuleConfigControl( vlc_object_t *_p_this,
116                 module_config_t *_p_item, QLabel *label, QComboBox *_combo,
117                 bool bycat ) : VStringConfigControl( _p_this, _p_item )
118 {
119     fprintf( stderr, "%p %p\n", _p_item, p_item );
120     combo = _combo;
121     finish( label, bycat );
122 }
123
124 void ModuleConfigControl::finish( QLabel *label, bool bycat )
125 {
126     vlc_list_t *p_list;
127     module_t *p_parser;
128
129     combo->setEditable( false );
130
131     /* build a list of available modules */
132     p_list = vlc_list_find( p_this, VLC_OBJECT_MODULE, FIND_ANYWHERE );
133     combo->addItem( qtr("Default") );
134     for( int i_index = 0; i_index < p_list->i_count; i_index++ )
135     {
136         p_parser = (module_t *)p_list->p_values[i_index].p_object ;
137
138         if( bycat )
139         {
140             if( !strcmp( p_parser->psz_object_name, "main" ) ) continue;
141
142             module_config_t *p_config = p_parser->p_config;
143             if( p_config ) do
144             {
145                 /* Hack: required subcategory is stored in i_min */
146                 if( p_config->i_type == CONFIG_SUBCATEGORY &&
147                     p_config->i_value == p_item->i_min )
148                     combo->addItem( qfu(p_parser->psz_longname),
149                                     QVariant( p_parser->psz_object_name ) );
150                 if( p_item->psz_value && !strcmp( p_item->psz_value,
151                                                   p_parser->psz_object_name) )
152                     combo->setCurrentIndex( combo->count() - 1 );
153             } while( p_config->i_type != CONFIG_HINT_END && p_config++ );
154         }
155         else if( !strcmp( p_parser->psz_capability, p_item->psz_type ) )
156         {
157             combo->addItem( qfu(p_parser->psz_longname),
158                             QVariant( p_parser->psz_object_name ) );
159             if( p_item->psz_value && !strcmp( p_item->psz_value,
160                                               p_parser->psz_object_name) )
161                 combo->setCurrentIndex( combo->count() - 1 );
162         }
163     }
164     vlc_list_release( p_list );
165     combo->setToolTip( qfu(p_item->psz_longtext) );
166     label->setToolTip( qfu(p_item->psz_longtext) );
167 }
168
169 ModuleConfigControl::~ModuleConfigControl() {};
170
171 QString ModuleConfigControl::getValue()
172 {
173     return combo->itemData( combo->currentIndex() ).toString();
174 }