1 /****************************************************************************
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"
18 #include <QPushButton>
23 #include <Qt3Support/Q3Header>
24 #include <QVBoxLayout>
28 #include <kapplication.h>
29 #include <kshortcut.h>
31 #include <kkeysequencewidget.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"
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
);
62 action
= popup
->addAction( i18n( "Voice Trigger..." ) );
63 action
->setData( TYPE_VOICE_TRIGGER
);
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 );
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
)
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
);
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();
130 pos
= pos
->nextSibling())
131 list
->append( static_cast< Trigger_list_item
* >( pos
)->trigger()->copy( data_P
));
135 void Triggers_tab::new_selected( QAction
*action
)
137 Trigger_dialog
* dlg
= NULL
;
139 int type_P
= action
->data().toInt();
142 case TYPE_SHORTCUT_TRIGGER
: // Shortcut_trigger
143 dlg
= new Shortcut_trigger_dialog(
144 new Shortcut_trigger( NULL
, KShortcut())); // CHECKME NULL ?
146 case TYPE_GESTURE_TRIGGER
: // Gesture trigger
147 dlg
= new Gesture_trigger_dialog(
148 new Gesture_trigger( NULL
, QString() )); // CHECKME NULL ?
150 case TYPE_WINDOW_TRIGGER
: // Window trigger
151 dlg
= new Window_trigger_dialog( new Window_trigger( NULL
, new Windowdef_list( "" ),
152 0 )); // CHECKME NULL ?
154 case TYPE_VOICE_TRIGGER
: // Voice trigger
155 dlg
= new Voice_trigger_dialog( new Voice_trigger(NULL
,QString(),VoiceSignature(),VoiceSignature())); // CHECKME NULL ?
160 Trigger
* trg
= dlg
->edit_trigger();
162 triggers_listview
->setSelected( create_listview_item( trg
, triggers_listview
,
163 selected_item
, false ), true );
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 )
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 );
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
219 Trigger
* new_trigger
= dlg
->edit_trigger();
220 if( new_trigger
!= NULL
)
221 item_P
->set_trigger( new_trigger
);
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
);
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()))
261 // KHotKeys::Module::changed()
263 //bt->setShortcut( s_P );
266 void Shortcut_trigger_widget::set_data( const Shortcut_trigger
* data_P
)
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
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()
300 void Shortcut_trigger_dialog::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
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()
325 void Window_trigger_dialog::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
)
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()
351 return new Gesture_trigger( NULL
, _page
->getGesture()); // CHECKME NULL?
357 // Voice_trigger_dialog
359 Voice_trigger_dialog::Voice_trigger_dialog( Voice_trigger
* trigger_P
)
361 _trigger( trigger_P
), _page( NULL
)
363 setButtons( Ok
| Cancel
);
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()
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) );
386 } // namespace KHotKeys
388 #include "triggers_tab.moc"