]> git.sesse.net Git - vlc/blob - modules/gui/qt4/util/customwidgets.cpp
Qt4 - Open Capture Panel and file Panel: Don't build by hand the ComboChoices...
[vlc] / modules / gui / qt4 / util / customwidgets.cpp
1 /*****************************************************************************
2  * customwidgets.cpp: Custom widgets
3  ****************************************************************************
4  * Copyright (C) 2006 the VideoLAN team
5  * Copyright (C) 2004 Daniel Molkentin <molkentin@kde.org>
6  * $Id: qvlcframe.hpp 16283 2006-08-17 18:16:09Z zorglub $
7  *
8  * Authors: ClĂ©ment Stenac <zorglub@videolan.org>
9  * The "ClickLineEdit" control is based on code by  Daniel Molkentin
10  * <molkentin@kde.org> for libkdepim
11  *
12  * This program is free software; you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation; either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/
25
26 #include "customwidgets.hpp"
27 #include <QPainter>
28 #include <QLineEdit>
29 #include <QPainter>
30 #include <QColorGroup>
31 #include <QRect>
32 #include <QKeyEvent>
33 #include <QWheelEvent>
34
35 #include <vlc_keys.h>
36
37 ClickLineEdit::ClickLineEdit( const QString &msg, QWidget *parent) : QLineEdit( parent )
38 {
39     mDrawClickMsg = true;
40     setClickMessage( msg );
41 }
42
43 void ClickLineEdit::setClickMessage( const QString &msg )
44 {
45     mClickMessage = msg;
46     repaint();
47 }
48
49
50 void ClickLineEdit::setText( const QString &txt )
51 {
52     mDrawClickMsg = txt.isEmpty();
53     repaint();
54     QLineEdit::setText( txt );
55 }
56
57 void ClickLineEdit::paintEvent( QPaintEvent *pe )
58 {
59     QPainter p( this );
60     QLineEdit::paintEvent( pe );
61     if ( mDrawClickMsg == true && !hasFocus() ) {
62         QPen tmp = p.pen();
63         p.setPen( palette().color( QPalette::Disabled, QPalette::Text ) );
64         QRect cr = contentsRect();
65         // Add two pixel margin on the left side
66         cr.setLeft( cr.left() + 3 );
67         p.drawText( cr, Qt::AlignLeft | Qt::AlignVCenter, mClickMessage );
68         p.setPen( tmp );
69     }
70 }
71
72 void ClickLineEdit::dropEvent( QDropEvent *ev )
73 {
74     mDrawClickMsg = false;
75     QLineEdit::dropEvent( ev );
76 }
77
78
79 void ClickLineEdit::focusInEvent( QFocusEvent *ev )
80 {
81     if ( mDrawClickMsg == true ) {
82         mDrawClickMsg = false;
83         repaint();
84     }
85     QLineEdit::focusInEvent( ev );
86 }
87
88
89 void ClickLineEdit::focusOutEvent( QFocusEvent *ev )
90 {
91     if ( text().isEmpty() ) {
92         mDrawClickMsg = true;
93         repaint();
94     }
95     QLineEdit::focusOutEvent( ev );
96 }
97
98 /***************************************************************************
99  * Hotkeys converters
100  ***************************************************************************/
101 int qtKeyModifiersToVLC( QInputEvent* e )
102 {
103     int i_keyModifiers = 0;
104     if( e->modifiers() & Qt::ShiftModifier ) i_keyModifiers |= KEY_MODIFIER_SHIFT;
105     if( e->modifiers() & Qt::AltModifier ) i_keyModifiers |= KEY_MODIFIER_ALT;
106     if( e->modifiers() & Qt::ControlModifier ) i_keyModifiers |= KEY_MODIFIER_CTRL;
107     if( e->modifiers() & Qt::MetaModifier ) i_keyModifiers |= KEY_MODIFIER_META;
108     return i_keyModifiers;
109 }
110
111 int qtEventToVLCKey( QKeyEvent *e )
112 {
113     int i_vlck = 0;
114     /* Handle modifiers */
115     i_vlck |= qtKeyModifiersToVLC( e );
116
117     bool found = false;
118     /* Look for some special keys */
119 #define HANDLE( qt, vk ) case Qt::qt : i_vlck |= vk; found = true;break
120     switch( e->key() )
121     {
122         HANDLE( Key_Left, KEY_LEFT );
123         HANDLE( Key_Right, KEY_RIGHT );
124         HANDLE( Key_Up, KEY_UP );
125         HANDLE( Key_Down, KEY_DOWN );
126         HANDLE( Key_Space, KEY_SPACE );
127         HANDLE( Key_Escape, KEY_ESC );
128         HANDLE( Key_Enter, KEY_ENTER );
129         HANDLE( Key_F1, KEY_F1 );
130         HANDLE( Key_F2, KEY_F2 );
131         HANDLE( Key_F3, KEY_F3 );
132         HANDLE( Key_F4, KEY_F4 );
133         HANDLE( Key_F5, KEY_F5 );
134         HANDLE( Key_F6, KEY_F6 );
135         HANDLE( Key_F7, KEY_F7 );
136         HANDLE( Key_F8, KEY_F8 );
137         HANDLE( Key_F9, KEY_F9 );
138         HANDLE( Key_F10, KEY_F10 );
139         HANDLE( Key_F11, KEY_F11 );
140         HANDLE( Key_F12, KEY_F12 );
141         HANDLE( Key_PageUp, KEY_PAGEUP );
142         HANDLE( Key_PageDown, KEY_PAGEDOWN );
143         HANDLE( Key_Home, KEY_HOME );
144         HANDLE( Key_End, KEY_END );
145         HANDLE( Key_Insert, KEY_INSERT );
146         HANDLE( Key_Delete, KEY_DELETE );
147         HANDLE( Key_VolumeDown, KEY_VOLUME_DOWN);
148         HANDLE( Key_VolumeUp, KEY_VOLUME_UP );
149         HANDLE( Key_MediaPlay, KEY_MEDIA_PLAY_PAUSE );
150         HANDLE( Key_MediaStop, KEY_MEDIA_STOP );
151         HANDLE( Key_MediaPrevious, KEY_MEDIA_PREV_TRACK );
152         HANDLE( Key_MediaNext, KEY_MEDIA_NEXT_TRACK );
153
154     }
155     if( !found )
156     {
157         /* Force lowercase */
158         if( e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
159             i_vlck += e->key() + 32;
160         /* Rest of the ascii range */
161         else if( e->key() >= Qt::Key_Space && e->key() <= Qt::Key_AsciiTilde )
162             i_vlck += e->key();
163     }
164     return i_vlck;
165 }
166
167 int qtWheelEventToVLCKey( QWheelEvent *e )
168 {
169     int i_vlck = 0;
170     /* Handle modifiers */
171     i_vlck |= qtKeyModifiersToVLC( e );
172     if ( e->delta() > 0 )
173         i_vlck |= KEY_MOUSEWHEELUP;
174     else
175         i_vlck |= KEY_MOUSEWHEELDOWN;
176     return i_vlck;
177 }
178
179 QString VLCKeyToString( int val )
180 {
181     QString r = "";
182     if( val & KEY_MODIFIER_CTRL )
183         r+= "Ctrl+";
184     if( val & KEY_MODIFIER_ALT )
185         r+= "Alt+";
186     if( val & KEY_MODIFIER_SHIFT )
187         r+= "Shift+";
188
189     unsigned int i_keys = sizeof(vlc_keys)/sizeof(key_descriptor_t);
190     for( unsigned int i = 0; i< i_keys; i++ )
191     {
192         if( vlc_keys[i].i_key_code == (val& ~KEY_MODIFIER) )
193         {
194             r+= vlc_keys[i].psz_key_string;
195         }
196     }
197     return r;
198 }
199
200 #include <QComboBox>
201
202 void setfillVLCConfigCombo( const char *configname, intf_thread_t *p_intf,
203                         QComboBox *combo, QWidget *parent )
204 {
205     module_config_t *p_config =
206                       config_FindConfig( VLC_OBJECT(p_intf), configname );
207     if( p_config )
208     {
209         for ( int i_index = 0; i_index < p_config->i_list; i_index++ )
210         {
211             combo->addItem( qfu( p_config->ppsz_list_text[i_index] ),
212                     QVariant( p_config->pi_list[i_index] ) );
213             if( p_config->value.i == p_config->pi_list[i_index] )
214             {
215                 combo->setCurrentIndex( i_index );
216             }
217         }
218         combo->setToolTip( qfu( p_config->psz_longtext ) );
219     }
220 }