diff options
Diffstat (limited to 'khotkeys/kcontrol/triggers_tab.cpp')
-rw-r--r-- | khotkeys/kcontrol/triggers_tab.cpp | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/khotkeys/kcontrol/triggers_tab.cpp b/khotkeys/kcontrol/triggers_tab.cpp new file mode 100644 index 000000000..8c4a13fda --- /dev/null +++ b/khotkeys/kcontrol/triggers_tab.cpp @@ -0,0 +1,366 @@ +/**************************************************************************** + + KHotKeys + + Copyright (C) 1999-2001 Lubos Lunak <l.lunak@kde.org> + + Distributed under the terms of the GNU General Public License version 2. + +****************************************************************************/ + +#define _TRIGGERS_TAB_CPP_ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "triggers_tab.h" + +#include <assert.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qpopupmenu.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qheader.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kapplication.h> +#include <kshortcut.h> +#include <kconfig.h> +#include <kshortcutlist.h> +#include <kkeybutton.h> +#include <kkeydialog.h> + +#include "kcmkhotkeys.h" +#include "windowdef_list_widget.h" +#include "window_trigger_widget.h" +#include "gesturerecordpage.h" +#include "voicerecordpage.h" + +namespace KHotKeys +{ + +// Triggers_tab + +Triggers_tab::Triggers_tab( QWidget* parent_P, const char* name_P ) + : Triggers_tab_ui( parent_P, name_P ), selected_item( NULL ) + { + QPopupMenu* popup = new QPopupMenu; // CHECKME looks like setting parent doesn't work + popup->insertItem( i18n( "Shortcut Trigger..." ), TYPE_SHORTCUT_TRIGGER ); + popup->insertItem( i18n( "Gesture Trigger..." ), TYPE_GESTURE_TRIGGER ); + popup->insertItem( i18n( "Window Trigger..." ), TYPE_WINDOW_TRIGGER ); +#ifdef HAVE_ARTS + if( haveArts()) + popup->insertItem( i18n( "Voice Trigger..." ), TYPE_VOICE_TRIGGER ); +#endif + connect( popup, SIGNAL( activated( int )), SLOT( new_selected( int ))); + connect( triggers_listview, SIGNAL( doubleClicked ( QListViewItem *, const QPoint &, int ) ), + this, SLOT( modify_pressed() ) ); + + new_button->setPopup( popup ); + copy_button->setEnabled( false ); + modify_button->setEnabled( false ); + delete_button->setEnabled( false ); + triggers_listview->header()->hide(); + triggers_listview->addColumn( "" ); + triggers_listview->setSorting( -1 ); + triggers_listview->setForceSelect( true ); + clear_data(); + // KHotKeys::Module::changed() + connect( new_button, SIGNAL( clicked()), + module, SLOT( changed())); + connect( copy_button, SIGNAL( clicked()), + module, SLOT( changed())); + connect( modify_button, SIGNAL( clicked()), + module, SLOT( changed())); + connect( delete_button, SIGNAL( clicked()), + module, SLOT( changed())); + connect( comment_lineedit, SIGNAL( textChanged( const QString& )), + module, SLOT( changed())); + } + +Triggers_tab::~Triggers_tab() + { + delete new_button->popup(); // CHECKME + } + +void Triggers_tab::clear_data() + { + comment_lineedit->clear(); + triggers_listview->clear(); + } + +void Triggers_tab::set_data( const Trigger_list* data_P ) + { + if( data_P == NULL ) + { + clear_data(); + return; + } + comment_lineedit->setText( data_P->comment()); + Trigger_list_item* after = NULL; + triggers_listview->clear(); + for( Trigger_list::Iterator it( *data_P ); + *it; + ++it ) + after = create_listview_item( *it, triggers_listview, after, true ); + } + +Trigger_list* Triggers_tab::get_data( Action_data* data_P ) const + { + Trigger_list* list = new Trigger_list( comment_lineedit->text()); + for( QListViewItem* pos = triggers_listview->firstChild(); + pos != NULL; + pos = pos->nextSibling()) + list->append( static_cast< Trigger_list_item* >( pos )->trigger()->copy( data_P )); + return list; + } + +void Triggers_tab::new_selected( int type_P ) + { + Trigger_dialog* dlg = NULL; + switch( type_P ) + { + case TYPE_SHORTCUT_TRIGGER: // Shortcut_trigger + dlg = new Shortcut_trigger_dialog( + new Shortcut_trigger( NULL, KShortcut())); // CHECKME NULL ? + break; + case TYPE_GESTURE_TRIGGER: // Gesture trigger + dlg = new Gesture_trigger_dialog( + new Gesture_trigger( NULL, QString::null )); // CHECKME NULL ? + break; + case TYPE_WINDOW_TRIGGER: // Window trigger + dlg = new Window_trigger_dialog( new Window_trigger( NULL, new Windowdef_list( "" ), + 0 )); // CHECKME NULL ? + break; + case TYPE_VOICE_TRIGGER: // Voice trigger + dlg = new Voice_trigger_dialog( new Voice_trigger(NULL,QString::null,VoiceSignature(),VoiceSignature())); // CHECKME NULL ? + break; + } + if( dlg != NULL ) + { + Trigger* trg = dlg->edit_trigger(); + if( trg != NULL ) + triggers_listview->setSelected( create_listview_item( trg, triggers_listview, + selected_item, false ), true ); + delete dlg; + } + } + +void Triggers_tab::copy_pressed() + { + if ( selected_item ) + { + triggers_listview->setSelected( create_listview_item( selected_item->trigger(),triggers_listview, selected_item, true ), true ); + } + } + +void Triggers_tab::delete_pressed() + { + delete selected_item; // CHECKME snad vyvola signaly pro enable() + selected_item = NULL; + } + +void Triggers_tab::modify_pressed() +{ + if ( selected_item ) + edit_listview_item( selected_item ); +} + +void Triggers_tab::current_changed( QListViewItem* item_P ) + { +// if( item_P == selected_item ) +// return; + selected_item = static_cast< Trigger_list_item* >( item_P ); +// triggers_listview->setSelected( item_P, true ); + copy_button->setEnabled( item_P != NULL ); + modify_button->setEnabled( item_P != NULL ); + delete_button->setEnabled( item_P != NULL ); + } + +Trigger_list_item* Triggers_tab::create_listview_item( Trigger* trigger_P, + QListView* parent_P, QListViewItem* after_P, bool copy_P ) + { + Trigger* new_trg = copy_P ? trigger_P->copy( NULL ) : trigger_P; // CHECKME NULL ? +// CHECKME uz by nemelo byt treba if( after_P == NULL ) +// return new Trigger_list_item( parent_P, new_trg ); +// else + return new Trigger_list_item( parent_P, after_P, new_trg ); + } + +void Triggers_tab::edit_listview_item( Trigger_list_item* item_P ) + { + Trigger_dialog* dlg = NULL; + if( Shortcut_trigger* trg = dynamic_cast< Shortcut_trigger* >( item_P->trigger())) + dlg = new Shortcut_trigger_dialog( trg ); + else if( Gesture_trigger* trg = dynamic_cast< Gesture_trigger* >( item_P->trigger())) + dlg = new Gesture_trigger_dialog( trg ); + else if( Window_trigger* trg = dynamic_cast< Window_trigger* >( item_P->trigger())) + dlg = new Window_trigger_dialog( trg ); + else if( Voice_trigger* trg = dynamic_cast< Voice_trigger* >( item_P->trigger())) + dlg = new Voice_trigger_dialog( trg ); +// CHECKME TODO dalsi + else + assert( false ); + Trigger* new_trigger = dlg->edit_trigger(); + if( new_trigger != NULL ) + item_P->set_trigger( new_trigger ); + delete dlg; + } + +// Trigger_list_item + +QString Trigger_list_item::text( int column_P ) const + { + return column_P == 0 ? trigger()->description() : QString::null; + } + +// Shortcut_trigger_widget + +Shortcut_trigger_widget::Shortcut_trigger_widget( QWidget* parent_P, const char* ) + : QWidget( parent_P ) + { + QVBoxLayout* lay = new QVBoxLayout( this, 11, 6 ); + QLabel* lbl = new QLabel( i18n( "Select keyboard shortcut:" ), this ); + lay->addWidget( lbl ); + lay->addSpacing( 10 ); + bt = new KKeyButton( this ); + lay->addWidget( bt, 0 , Qt::AlignHCenter ); + lay->addStretch(); + clear_data(); + connect( bt, SIGNAL( capturedShortcut( const KShortcut& )), + this, SLOT( capturedShortcut( const KShortcut& ))); + } + +void Shortcut_trigger_widget::clear_data() + { + bt->setShortcut( KShortcut(), false ); + } + +void Shortcut_trigger_widget::capturedShortcut( const KShortcut& s_P ) + { + if( KKeyChooser::checkGlobalShortcutsConflict( s_P, true, topLevelWidget()) + || KKeyChooser::checkStandardShortcutsConflict( s_P, true, topLevelWidget())) + return; + // KHotKeys::Module::changed() + module->changed(); + bt->setShortcut( s_P, false ); + } + +void Shortcut_trigger_widget::set_data( const Shortcut_trigger* data_P ) + { + if( data_P == NULL ) + { + clear_data(); + return; + } + bt->setShortcut( data_P->shortcut(), false ); + } + +Shortcut_trigger* Shortcut_trigger_widget::get_data( Action_data* data_P ) const + { + return !bt->shortcut().isNull() + ? new Shortcut_trigger( data_P, bt->shortcut()) : NULL; + } + +// Shortcut_trigger_dialog + +Shortcut_trigger_dialog::Shortcut_trigger_dialog( Shortcut_trigger* trigger_P ) + : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption + trigger( NULL ) + { + widget = new Shortcut_trigger_widget( this ); + widget->set_data( trigger_P ); + setMainWidget( widget ); + } + +Trigger* Shortcut_trigger_dialog::edit_trigger() + { + exec(); + return trigger; + } + +void Shortcut_trigger_dialog::accept() + { + KDialogBase::accept(); + trigger = widget->get_data( NULL ); // CHECKME NULL ? + } + +// Window_trigger_dialog + +Window_trigger_dialog::Window_trigger_dialog( Window_trigger* trigger_P ) + : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption + trigger( NULL ) + { + widget = new Window_trigger_widget( this ); + widget->set_data( trigger_P ); + setMainWidget( widget ); + } + +Trigger* Window_trigger_dialog::edit_trigger() + { + exec(); + return trigger; + } + +void Window_trigger_dialog::accept() + { + KDialogBase::accept(); + trigger = widget->get_data( NULL ); // CHECKME NULL ? + } + +// Gesture_trigger_dialog + +Gesture_trigger_dialog::Gesture_trigger_dialog( Gesture_trigger* trigger_P ) + : KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption + _trigger( trigger_P ), _page( NULL ) + { + _page = new GestureRecordPage( _trigger->gesturecode(), + this, "GestureRecordPage"); + + connect(_page, SIGNAL(gestureRecorded(bool)), + this, SLOT(enableButtonOK(bool))); + + setMainWidget( _page ); + } + +Trigger* Gesture_trigger_dialog::edit_trigger() + { + if( exec()) + return new Gesture_trigger( NULL, _page->getGesture()); // CHECKME NULL? + else + return NULL; + } + + +// Voice_trigger_dialog + +Voice_trigger_dialog::Voice_trigger_dialog( Voice_trigger* trigger_P ) +: KDialogBase( NULL, NULL, true, "", Ok | Cancel ), // CHECKME caption +_trigger( trigger_P ), _page( NULL ) +{ + _page = new VoiceRecordPage( _trigger ? _trigger->voicecode() : QString::null , this, "VoiceRecordPage"); + + connect(_page, SIGNAL(voiceRecorded(bool)), this, SLOT(enableButtonOK(bool))); + + setMainWidget( _page ); +} + +Trigger* Voice_trigger_dialog::edit_trigger() +{ + if( exec()) + return new Voice_trigger(NULL, _page->getVoiceId(), + (_page->isModifiedSignature(1) || !_trigger) ? _page->getVoiceSignature(1) : _trigger->voicesignature(1) , + (_page->isModifiedSignature(2) || !_trigger) ? _page->getVoiceSignature(2) : _trigger->voicesignature(2) ); + else + return NULL; +} + + + + +} // namespace KHotKeys + +#include "triggers_tab.moc" |