diff options
Diffstat (limited to 'src/app/Dialogs/krkeydialog.cpp')
-rw-r--r-- | src/app/Dialogs/krkeydialog.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/app/Dialogs/krkeydialog.cpp b/src/app/Dialogs/krkeydialog.cpp new file mode 100644 index 0000000..30f5dda --- /dev/null +++ b/src/app/Dialogs/krkeydialog.cpp @@ -0,0 +1,157 @@ +// +// C++ Implementation: krkeydialog +// +// Description: +// +// +// Author: Jonas Bähr <http://jonas-baehr.de/>, (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// +#include "krkeydialog.h" + +#include <tqlayout.h> +#include <tqwhatsthis.h> +#include <tdelocale.h> +#include <kpushbutton.h> +#include <tdemessagebox.h> +#include <tdefiledialog.h> +#include <tdeglobal.h> +#include <tdestandarddirs.h> +#include <tdeconfig.h> +#include <tdeactionshortcutlist.h> +#include <kdebug.h> + +#include "../krusader.h" + +//This is the filter in the KFileDialog of Import/Export: +static const char* FILE_FILTER = I18N_NOOP("*.keymap|Krusader keymaps\n*|all files"); + + +KrKeyDialog::KrKeyDialog( TQWidget * parent ) : KKeyDialog( false /* allow letter shortcuts */, parent ) { + insert( krApp->actionCollection() ); + + // HACK This fetches the layout of the buttonbox from KDialogBase, although it is not accessable with KDialogBase's API + // None the less it's quite save to use since this implementation hasn't changed since KDE-3.3 (I haven't looked at earlier + // versions since we don't support them) and now all work is done in KDE-4. + TQWidget* buttonBox = static_cast<TQWidget*>( actionButton(KDialogBase::Ok)->parent() ); + TQBoxLayout* buttonBoxLayout = static_cast<TQBoxLayout*>( buttonBox->layout() ); + + KPushButton* importButton = new KPushButton( i18n("Import shortcuts"), buttonBox ); + TQWhatsThis::add( importButton, i18n( "Load a keybinding profile, e.g., total_commander.keymap" ) ); + buttonBoxLayout->insertWidget( 1, importButton ); // the defaults-button should stay on position 0 + connect( importButton, TQ_SIGNAL( clicked() ), TQ_SLOT( slotImportShortcuts() ) ); + + KPushButton* exportButton = new KPushButton( i18n("Export shortcuts"), buttonBox ); + TQWhatsThis::add( exportButton, i18n( "Save current keybindings in a keymap file." ) ); + buttonBoxLayout->insertWidget( 2, exportButton ); + connect( exportButton, TQ_SIGNAL( clicked() ), TQ_SLOT( slotExportShortcuts() ) ); + + // Also quite HACK 'isch but unfortunately KKeyDialog don't giveus access to this widget + _chooser = static_cast<KKeyChooser*>( mainWidget() ); + + configure( true /* SaveSettings */ ); // this runs the dialog +} + +KrKeyDialog::~KrKeyDialog() { +} + +void KrKeyDialog::slotImportShortcuts() { + // find $TDEDIR/share/apps/krusader + TQString basedir = TDEGlobal::dirs()->findResourceDir("appdata", "total_commander.keymap"); + // let the user select a file to load + TQString filename = KFileDialog::getOpenFileName(basedir, i18n(FILE_FILTER), 0, i18n("Select a keymap file")); + if ( filename.isEmpty() ) + return; + + TDEConfig conf( filename, true /*read only*/, false /*no KDEGlobal*/ ); + if ( ! conf.hasGroup("Shortcuts") ) { + int answer = KMessageBox::warningContinueCancel( this, //parent + i18n("This file does not seem to be a valid keymap.\n" + "It may be a keymap using a legacy format. The import can't be undone!"), //text + i18n("Try to import legacy format?"), //caption + i18n("Import anyway"), //Label for the continue-button + "Confirm Import Legacy Shortcuts" //dontAskAgainName (for the config-file) + ); + if ( answer == KMessageBox::Continue ) + importLegacyShortcuts( filename ); + else + return; + } + else + _chooser->syncToConfig( "Shortcuts", &conf, false /* don't delete shortcuts of actions not listed in conf */ ); +} + +void KrKeyDialog::importLegacyShortcuts( const TQString& file ) { +/* + * This is basicaly Shie's code. It's copied from Kronfigurator's loog&feel page and adapted to the dialog + */ + // check if there's an info file with the keymap + TQFile info(file+".info"); + if (info.open(IO_ReadOnly)) { + TQTextStream stream(&info); + TQStringList infoText = TQStringList::split("\n", stream.read()); + if (KMessageBox::questionYesNoList(krApp, i18n("The following information was attached to the keymap. Do you really want to import this keymap?"), infoText)!=KMessageBox::Yes) + return; + } + + // ok, import away + TQFile f(file); + if (!f.open(IO_ReadOnly)) { + krOut << "Error opening " << file << endl; + return; + } + char *actionName; + TQDataStream stream(&f); + int key; + TDEAction *action; + while (!stream.atEnd()) { + stream >> actionName >> key; + action = krApp->actionCollection()->action(actionName); + if (action) { + action->setShortcut(key); +// krOut << "set shortcut for " << actionName <<endl; + } else { + krOut << "unknown action " << actionName << endl; + } + } + f.close(); + + KMessageBox::information( this, // parent + i18n("Please restart this dialog in order to see the changes"), // text + i18n("Legacy import completed") // caption + ); +} + +void KrKeyDialog::slotExportShortcuts() { + TQString filename = KFileDialog::getSaveFileName( TQString(), i18n(FILE_FILTER), 0, i18n("Select a keymap file") ); + if ( filename.isEmpty() ) + return; + TQFile f( filename ); + if ( f.exists() && + KMessageBox::warningContinueCancel( this, + i18n("<qt>File <b>%1</b> already exists. Do you really want to overwrite it?</qt>").arg(filename), + i18n("Warning"), i18n("Overwrite") ) + != KMessageBox::Continue) + return; + if ( f.open( IO_WriteOnly ) ) + // This is the only way to detect if the file is writable since we don't get feetback from TDEConfig's sync + // Additionaly this prevents merging if the file already contains some shortcuts + f.close(); + else { + KMessageBox::error( this, i18n("<qt>Can't open <b>%1</b> for writing!</qt>").arg(filename) ); + return; + } + + TDEConfig conf( filename, false /*read only*/, false /*no KDEGlobal*/ ); + + // unfortunately we can't use this function since it only writes the actions which are different from default. + //krApp->actionCollection()->writeShortcutSettings( "Shortcuts", &conf ); + TDEActionShortcutList list( krApp->actionCollection() ); + list.writeSettings( "Shortcuts", &conf, true /* write all actions */ ); + // That does TDEActionShortcutList::writeSettings for us + //conf.sync(); // write back all changes +} + +#include "krkeydialog.moc" |