Add (and install) svg for the new krunner interface.
[kdebase/uwolfer.git] / workspace / khotkeys / kcontrol / triggers_tab.cpp
blob152c166f27a60062db4c788e045c6be760067ea1
1 /****************************************************************************
3 KHotKeys
5 Copyright (C) 1999-2001 Lubos Lunak <l.lunak@kde.org>
7 Distributed under the terms of the GNU General Public License version 2.
9 ****************************************************************************/
11 #define _TRIGGERS_TAB_CPP_
13 #include <config-khotkeys.h>
15 #include "triggers_tab.h"
17 #include <assert.h>
18 #include <QPushButton>
19 #include <QLineEdit>
20 #include <QMenu>
21 #include <QLayout>
22 #include <QLabel>
23 #include <Qt3Support/Q3Header>
24 #include <QVBoxLayout>
26 #include <kdebug.h>
27 #include <klocale.h>
28 #include <kapplication.h>
29 #include <kshortcut.h>
30 #include <kconfig.h>
31 #include <kkeysequencewidget.h>
32 #include <kvbox.h>
34 #include "kcmkhotkeys.h"
35 #include "windowdef_list_widget.h"
36 #include "window_trigger_widget.h"
37 #include "gesturerecordpage.h"
38 #include "voicerecordpage.h"
40 namespace KHotKeys
43 // Triggers_tab
45 Triggers_tab::Triggers_tab( QWidget* parent_P, const char* name_P )
46 : Triggers_tab_ui( parent_P ), selected_item( NULL )
48 setObjectName(name_P);
49 QMenu* popup = new QMenu; // CHECKME looks like setting parent doesn't work
50 QAction *action = popup->addAction( i18n( "Shortcut Trigger..." ) );
51 action->setData( TYPE_SHORTCUT_TRIGGER );
53 action = popup->addAction( i18n( "Gesture Trigger..." ) );
54 action->setData( TYPE_GESTURE_TRIGGER );
56 action = popup->addAction( i18n( "Window Trigger..." ) );
57 action->setData( TYPE_WINDOW_TRIGGER );
59 #ifdef HAVE_ARTS
60 if( haveArts())
62 action = popup->addAction( i18n( "Voice Trigger..." ) );
63 action->setData( TYPE_VOICE_TRIGGER );
65 #endif
68 connect( popup, SIGNAL( triggered( QAction* )), SLOT( new_selected( QAction* )));
69 connect( triggers_listview, SIGNAL( doubleClicked ( Q3ListViewItem *, const QPoint &, int ) ),
70 this, SLOT( modify_pressed() ) );
71 connect(modify_button, SIGNAL(clicked()),this,SLOT(modify_pressed()));
72 connect(delete_button, SIGNAL(clicked()),this,SLOT(delete_pressed()));
73 connect(copy_button, SIGNAL(clicked()),this,SLOT(copy_pressed()));
74 connect(triggers_listview,SIGNAL(current_changed(Q3ListViewItem*)),this,SLOT(current_changed(Q3ListViewItem*)));
76 new_button->setMenu( popup );
77 copy_button->setEnabled( false );
78 modify_button->setEnabled( false );
79 delete_button->setEnabled( false );
80 triggers_listview->header()->hide();
81 triggers_listview->addColumn( "" );
82 triggers_listview->setSorting( -1 );
83 triggers_listview->setForceSelect( true );
84 clear_data();
85 // KHotKeys::Module::changed()
86 connect( new_button, SIGNAL( clicked()),
87 module, SLOT( changed()));
88 connect( copy_button, SIGNAL( clicked()),
89 module, SLOT( changed()));
90 connect( modify_button, SIGNAL( clicked()),
91 module, SLOT( changed()));
92 connect( delete_button, SIGNAL( clicked()),
93 module, SLOT( changed()));
94 connect( comment_lineedit, SIGNAL( textChanged( const QString& )),
95 module, SLOT( changed()));
98 Triggers_tab::~Triggers_tab()
100 delete new_button->menu(); // CHECKME
103 void Triggers_tab::clear_data()
105 comment_lineedit->clear();
106 triggers_listview->clear();
109 void Triggers_tab::set_data( const Trigger_list* data_P )
111 if( data_P == NULL )
113 clear_data();
114 return;
116 comment_lineedit->setText( data_P->comment());
117 Trigger_list_item* after = NULL;
118 triggers_listview->clear();
119 for( Trigger_list::Iterator it( *data_P );
120 *it;
121 ++it )
122 after = create_listview_item( *it, triggers_listview, after, true );
125 Trigger_list* Triggers_tab::get_data( Action_data* data_P ) const
127 Trigger_list* list = new Trigger_list( comment_lineedit->text());
128 for( Q3ListViewItem* pos = triggers_listview->firstChild();
129 pos != NULL;
130 pos = pos->nextSibling())
131 list->append( static_cast< Trigger_list_item* >( pos )->trigger()->copy( data_P ));
132 return list;
135 void Triggers_tab::new_selected( QAction *action )
137 Trigger_dialog* dlg = NULL;
139 int type_P = action->data().toInt();
140 switch( type_P )
142 case TYPE_SHORTCUT_TRIGGER: // Shortcut_trigger
143 dlg = new Shortcut_trigger_dialog(
144 new Shortcut_trigger( NULL, KShortcut())); // CHECKME NULL ?
145 break;
146 case TYPE_GESTURE_TRIGGER: // Gesture trigger
147 dlg = new Gesture_trigger_dialog(
148 new Gesture_trigger( NULL, QString() )); // CHECKME NULL ?
149 break;
150 case TYPE_WINDOW_TRIGGER: // Window trigger
151 dlg = new Window_trigger_dialog( new Window_trigger( NULL, new Windowdef_list( "" ),
152 0 )); // CHECKME NULL ?
153 break;
154 case TYPE_VOICE_TRIGGER: // Voice trigger
155 dlg = new Voice_trigger_dialog( new Voice_trigger(NULL,QString(),VoiceSignature(),VoiceSignature())); // CHECKME NULL ?
156 break;
158 if( dlg != NULL )
160 Trigger* trg = dlg->edit_trigger();
161 if( trg != NULL )
162 triggers_listview->setSelected( create_listview_item( trg, triggers_listview,
163 selected_item, false ), true );
164 delete dlg;
168 void Triggers_tab::copy_pressed()
170 triggers_listview->setSelected( create_listview_item( selected_item->trigger(),
171 triggers_listview, selected_item, true ), true );
174 void Triggers_tab::delete_pressed()
176 delete selected_item; // CHECKME snad vyvola signaly pro enable()
179 void Triggers_tab::modify_pressed()
181 edit_listview_item( selected_item );
184 void Triggers_tab::current_changed( Q3ListViewItem* item_P )
186 // if( item_P == selected_item )
187 // return;
188 selected_item = static_cast< Trigger_list_item* >( item_P );
189 // triggers_listview->setSelected( item_P, true );
190 copy_button->setEnabled( item_P != NULL );
191 modify_button->setEnabled( item_P != NULL );
192 delete_button->setEnabled( item_P != NULL );
195 Trigger_list_item* Triggers_tab::create_listview_item( Trigger* trigger_P,
196 Q3ListView* parent_P, Q3ListViewItem* after_P, bool copy_P )
198 Trigger* new_trg = copy_P ? trigger_P->copy( NULL ) : trigger_P; // CHECKME NULL ?
199 // CHECKME uz by nemelo byt treba if( after_P == NULL )
200 // return new Trigger_list_item( parent_P, new_trg );
201 // else
202 return new Trigger_list_item( parent_P, after_P, new_trg );
205 void Triggers_tab::edit_listview_item( Trigger_list_item* item_P )
207 Trigger_dialog* dlg = NULL;
208 if( Shortcut_trigger* trg = dynamic_cast< Shortcut_trigger* >( item_P->trigger()))
209 dlg = new Shortcut_trigger_dialog( trg );
210 else if( Gesture_trigger* trg = dynamic_cast< Gesture_trigger* >( item_P->trigger()))
211 dlg = new Gesture_trigger_dialog( trg );
212 else if( Window_trigger* trg = dynamic_cast< Window_trigger* >( item_P->trigger()))
213 dlg = new Window_trigger_dialog( trg );
214 else if( Voice_trigger* trg = dynamic_cast< Voice_trigger* >( item_P->trigger()))
215 dlg = new Voice_trigger_dialog( trg );
216 // CHECKME TODO dalsi
217 else
218 assert( false );
219 Trigger* new_trigger = dlg->edit_trigger();
220 if( new_trigger != NULL )
221 item_P->set_trigger( new_trigger );
222 delete dlg;
225 // Trigger_list_item
227 QString Trigger_list_item::text( int column_P ) const
229 return column_P == 0 ? trigger()->description() : QString();
232 // Shortcut_trigger_widget
234 Shortcut_trigger_widget::Shortcut_trigger_widget( QWidget* parent_P, const char* )
235 : QWidget( parent_P )
237 QVBoxLayout* lay = new QVBoxLayout( this );
238 lay->setMargin( 11 );
239 lay->setSpacing( 6 );
240 QLabel* lbl = new QLabel( i18n( "Select keyboard shortcut:" ), this );
241 lay->addWidget( lbl );
242 lay->addSpacing( 10 );
243 ksw = new KKeySequenceWidget( this );
244 lay->addWidget( ksw, 0 , Qt::AlignHCenter );
245 lay->addStretch();
246 clear_data();
247 connect( ksw, SIGNAL( keySequenceChanged( const QKeySequence& )),
248 this, SLOT( capturedShortcut( const QKeySequence& )));
251 void Shortcut_trigger_widget::clear_data()
253 ksw->clearKeySequence();
256 void Shortcut_trigger_widget::capturedShortcut( const QKeySequence& s_P )
258 /*if( KKeyChooser::checkGlobalShortcutsConflict( s_P, true, window())
259 || KKeyChooser::checkStandardShortcutsConflict( s_P, true, window()))
260 return;*/
261 // KHotKeys::Module::changed()
262 module->changed();
263 //bt->setShortcut( s_P );
266 void Shortcut_trigger_widget::set_data( const Shortcut_trigger* data_P )
268 if( data_P == NULL )
270 clear_data();
271 return;
273 ksw->setKeySequence( data_P->shortcut().primary() );
276 Shortcut_trigger* Shortcut_trigger_widget::get_data( Action_data* data_P ) const
278 return new Shortcut_trigger( data_P, KShortcut( ksw->keySequence() ) );
281 // Shortcut_trigger_dialog
283 Shortcut_trigger_dialog::Shortcut_trigger_dialog( Shortcut_trigger* trigger_P )
284 : KDialog( 0 ), // CHECKME caption
285 trigger( NULL )
287 setModal( true );
288 setButtons( Ok | Cancel );
289 widget = new Shortcut_trigger_widget( this );
290 widget->set_data( trigger_P );
291 setMainWidget( widget );
294 Trigger* Shortcut_trigger_dialog::edit_trigger()
296 exec();
297 return trigger;
300 void Shortcut_trigger_dialog::accept()
302 KDialog::accept();
303 trigger = widget->get_data( NULL ); // CHECKME NULL ?
306 // Window_trigger_dialog
308 Window_trigger_dialog::Window_trigger_dialog( Window_trigger* trigger_P )
309 : KDialog( 0 ), // CHECKME caption
310 trigger( NULL )
312 setModal( true );
313 setButtons( Ok | Cancel );
314 widget = new Window_trigger_widget( this );
315 widget->set_data( trigger_P );
316 setMainWidget( widget );
319 Trigger* Window_trigger_dialog::edit_trigger()
321 exec();
322 return trigger;
325 void Window_trigger_dialog::accept()
327 KDialog::accept();
328 trigger = widget->get_data( NULL ); // CHECKME NULL ?
331 // Gesture_trigger_dialog
333 Gesture_trigger_dialog::Gesture_trigger_dialog( Gesture_trigger* trigger_P )
334 : KDialog( 0 ), // CHECKME caption
335 _trigger( trigger_P ), _page( NULL )
337 setModal( true );
338 setButtons( Ok | Cancel );
339 _page = new GestureRecordPage( _trigger->gesturecode(),
340 this, "GestureRecordPage");
342 connect(_page, SIGNAL(gestureRecorded(bool)),
343 this, SLOT(enableButtonOk(bool)));
345 setMainWidget( _page );
348 Trigger* Gesture_trigger_dialog::edit_trigger()
350 if( exec())
351 return new Gesture_trigger( NULL, _page->getGesture()); // CHECKME NULL?
352 else
353 return NULL;
357 // Voice_trigger_dialog
359 Voice_trigger_dialog::Voice_trigger_dialog( Voice_trigger* trigger_P )
360 : KDialog( ),
361 _trigger( trigger_P ), _page( NULL )
363 setButtons( Ok | Cancel );
364 // CHECKME caption
365 _page = new VoiceRecordPage( _trigger ? _trigger->voicecode() : QString() , this);
366 _page->setObjectName("VoiceRecordPage");
368 connect(_page, SIGNAL(voiceRecorded(bool)), this, SLOT(enableButtonOK(bool)));
370 setMainWidget( _page );
373 Trigger* Voice_trigger_dialog::edit_trigger()
375 if( exec())
376 return new Voice_trigger(NULL, _page->getVoiceId(),
377 (_page->isModifiedSignature(1) || !_trigger) ? _page->getVoiceSignature(1) : _trigger->voicesignature(1) ,
378 (_page->isModifiedSignature(2) || !_trigger) ? _page->getVoiceSignature(2) : _trigger->voicesignature(2) );
379 else
380 return NULL;
386 } // namespace KHotKeys
388 #include "triggers_tab.moc"