Subversion Repositories Scribus

Rev

Rev 20219 | Rev 21762 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5352 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
7
/***************************************************************************
8
*   Copyright (C) 2006 by Craig Bradney                                   *
9
*   cbradney@zip.com.au                                                   *
10
*                                                                         *
11
*   This program is free software; you can redistribute it and/or modify  *
12
*   it under the terms of the GNU General Public License as published by  *
13
*   the Free Software Foundation; either version 2 of the License, or     *
14
*   (at your option) any later version.                                   *
15
*                                                                         *
16
*   This program is distributed in the hope that it will be useful,       *
17
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
*   GNU General Public License for more details.                          *
20
*                                                                         *
21
*   You should have received a copy of the GNU General Public License     *
22
*   along with this program; if not, write to the                         *
23
*   Free Software Foundation, Inc.,                                       *
18123 mrdocs 24
*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             *
5352 cbradney 25
***************************************************************************/
26
#include "tabkeyboardshortcutswidget.h"
27
 
9947 cbradney 28
#include <QComboBox>
9949 cbradney 29
#include <QDataStream>
9947 cbradney 30
#include <QDir>
31
#include <QDomDocument>
32
#include <QFile>
33
#include <QFileInfo>
34
#include <QFileDialog>
35
#include <QInputDialog>
36
#include <QKeySequence>
37
#include <QLabel>
38
#include <QListWidget>
39
#include <QMessageBox>
40
#include <QPushButton>
41
#include <QRadioButton>
9949 cbradney 42
#include <QTextStream>
9947 cbradney 43
#include <QList>
8501 cbradney 44
#include <QEvent>
5352 cbradney 45
 
46
#include "actionmanager.h"
47
#include "commonstrings.h"
11174 fschmid 48
#include "pluginmanager.h"
5352 cbradney 49
#include "prefsmanager.h"
50
#include "prefsfile.h"
51
#include "prefscontext.h"
52
#include "scpaths.h"
11174 fschmid 53
#include "scplugin.h"
5352 cbradney 54
#include "scraction.h"
55
#include "util.h"
10200 cbradney 56
#include "util_icon.h"
5352 cbradney 57
 
58
TabKeyboardShortcutsWidget::TabKeyboardShortcutsWidget(QMap<QString, Keys> oldKeyMap, QWidget *parent, const char *name)
10585 fschmid 59
    :QWidget(parent)
5352 cbradney 60
{
8524 subik 61
        setupUi(this);
10585 fschmid 62
        setObjectName(name);
12940 cbradney 63
//      ActionManager::createDefaultMenus();
64
//      ActionManager::createDefaultNonMenuActions();
5367 cbradney 65
        defMenus=ActionManager::defaultMenus();
5956 cbradney 66
        defNonMenuActions=ActionManager::defaultNonMenuActions();
11174 fschmid 67
 
68
        QVector< QPair<QString, QStringList> >::Iterator itnmenua = defNonMenuActions->begin();
69
        PluginManager& pluginManager(PluginManager::instance());
70
        QStringList pluginNames(pluginManager.pluginNames(false));
71
        ScPlugin* plugin;
72
        ScActionPlugin* ixplug;
73
        QString pName;
74
        for (int i = 0; i < pluginNames.count(); ++i)
75
        {
76
                pName = pluginNames.at(i);
77
                plugin = pluginManager.getPlugin(pName, true);
78
                Q_ASSERT(plugin); // all the returned names should represent loaded plugins
79
                if (plugin->inherits("ScActionPlugin"))
80
                {
81
                        ixplug = dynamic_cast<ScActionPlugin*>(plugin);
82
                        Q_ASSERT(ixplug);
83
                        ScActionPlugin::ActionInfo ai(ixplug->actionInfo());
84
                        itnmenua->second << ai.name;
85
                }
86
        }
87
 
5367 cbradney 88
        Q_CHECK_PTR(defMenus);
5352 cbradney 89
        lviToActionMap.clear();
5378 cbradney 90
        lviToMenuMap.clear();
5352 cbradney 91
        keyTable->clear();
92
        keyMap.clear();
93
        keyMap = oldKeyMap;
94
        Part0 = "";
95
        Part1 = "";
96
        Part2 = "";
97
        Part3 = "";
98
        Part4 = "";
99
        keyCode = 0;
100
        keyDisplay->setMinimumWidth(fontMetrics().width("CTRL+ALT+SHIFT+W"));
101
        keyDisplay->setText("");
102
 
10585 fschmid 103
        clearSearchButton->setIcon(loadIcon("clear_right.png"));
5352 cbradney 104
        // signals and slots connections
9346 subik 105
        connect( keyTable, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
106
                         this, SLOT(dispKey(QTreeWidgetItem *, QTreeWidgetItem *)));
5352 cbradney 107
        connect( noKey, SIGNAL(clicked()), this, SLOT(setNoKey()));
108
        connect( setKeyButton, SIGNAL(clicked()), this, SLOT(setKeyText()));
109
        connect( loadSetButton, SIGNAL(clicked()), this, SLOT(loadKeySetFile()));
110
        connect( importSetButton, SIGNAL(clicked()), this, SLOT(importKeySetFile()));
111
        connect( exportSetButton, SIGNAL(clicked()), this, SLOT(exportKeySetFile()));
112
        connect( resetSetButton, SIGNAL(clicked()), this, SLOT(resetKeySet()));
5367 cbradney 113
        connect( clearSearchButton, SIGNAL(clicked()), this, SLOT(clearSearchString()));
5378 cbradney 114
        connect( searchTextLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(applySearch(const QString&)));
5352 cbradney 115
}
116
 
5556 subik 117
void TabKeyboardShortcutsWidget::restoreDefaults()
118
{
119
        loadableSets->clear();
10585 fschmid 120
        loadableSets->addItems(scanForSets());
5556 subik 121
        insertActions();
122
        dispKey(0);
123
}
5352 cbradney 124
 
125
const QMap<QString, Keys> TabKeyboardShortcutsWidget::getNewKeyMap()
126
{
127
        return keyMap;
128
}
129
 
130
void TabKeyboardShortcutsWidget::setNoKey()
131
{
132
        if (noKey->isChecked())
133
        {
134
                if (selectedLVI!=0)
135
                {
136
                        selectedLVI->setText(1,"");
137
                        keyMap[lviToActionMap[selectedLVI]].keySequence=QKeySequence();
138
                }
139
                keyDisplay->setText("");
140
                noKey->setChecked(true);
141
        }
142
}
143
 
144
void TabKeyboardShortcutsWidget::loadKeySetFile()
145
{
8627 subik 146
        if (keySetList.contains(loadableSets->currentText()))
5352 cbradney 147
                importKeySet(keySetList[loadableSets->currentText()]);
148
}
149
 
150
void TabKeyboardShortcutsWidget::importKeySetFile()
151
{
152
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
10977 cbradney 153
        QString currentPath = dirs->get("keymapprefs_import", ScPaths::instance().shareDir() + "keysets/");
154
        QString s = QFileDialog::getOpenFileName(this, tr("Select a Key set file to read"), currentPath, tr("Key Set XML Files (*.xml)"));
5352 cbradney 155
        if (!s.isEmpty())
156
                importKeySet(s);
157
}
158
void TabKeyboardShortcutsWidget::exportKeySetFile()
159
{  
160
        PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
161
        QString currentPath= dirs->get("keymapprefs_export", ".");
10977 cbradney 162
        QString s = QFileDialog::getSaveFileName(this, tr("Select a Key set file to save to"), currentPath, tr("Key Set XML Files (*.xml)") );
5352 cbradney 163
        if (!s.isEmpty())
164
                exportKeySet(s);
165
}
166
 
167
void TabKeyboardShortcutsWidget::importKeySet(QString filename)
168
{
5378 cbradney 169
        searchTextLineEdit->clear();
5352 cbradney 170
        QFileInfo fi = QFileInfo(filename);
171
        if (fi.exists())
172
        {
173
                //import the file into qdomdoc
174
                QDomDocument doc( "keymapentries" );
9949 cbradney 175
                QFile file1( filename );
176
                if ( !file1.open( QIODevice::ReadOnly ) )
5352 cbradney 177
                        return;
9949 cbradney 178
                QTextStream ts(&file1);
10585 fschmid 179
                ts.setCodec("UTF-8");
5352 cbradney 180
                QString errorMsg;
181
                int eline;
182
                int ecol;
10585 fschmid 183
                if ( !doc.setContent( ts.readAll(), &errorMsg, &eline, &ecol ))
5352 cbradney 184
                {
10585 fschmid 185
                        qDebug("%s", QString("Could not open key set file: %1\nError:%2 at line: %3, row: %4").arg(filename).arg(errorMsg).arg(eline).arg(ecol).toAscii().constData());
9949 cbradney 186
                        file1.close();
5352 cbradney 187
                        return;
188
                }
9949 cbradney 189
                file1.close();
5352 cbradney 190
                //load the file now
191
                QDomElement docElem = doc.documentElement();
192
                if (docElem.tagName()=="shortcutset" && docElem.hasAttribute("name"))
193
                {
194
                        QDomAttr keysetAttr = docElem.attributeNode( "name" );
195
 
196
                        //clear current menu entries
197
                        for (QMap<QString,Keys>::Iterator it=keyMap.begin(); it!=keyMap.end(); ++it)
10516 cbradney 198
                                it.value().keySequence = QKeySequence();
5352 cbradney 199
 
200
                        //load in new set
201
                        QDomNode n = docElem.firstChild();
202
                        while( !n.isNull() )
203
                        {
204
                                QDomElement e = n.toElement(); // try to convert the node to an element.
205
                                if( !e.isNull() )
206
                                {
207
                                        if (e.hasAttribute("name")  && e.hasAttribute( "shortcut" ))
208
                                        {
209
                                                QDomAttr nameAttr = e.attributeNode( "name" );
210
                                                QDomAttr shortcutAttr = e.attributeNode( "shortcut" );
211
                                                if (keyMap.contains(nameAttr.value()))
212
                                                        keyMap[nameAttr.value()].keySequence=QKeySequence(shortcutAttr.value());
213
                                        }
214
                                }
215
                                n = n.nextSibling();
216
                        }
217
                }
218
        }
219
        insertActions();
220
}
221
 
222
bool TabKeyboardShortcutsWidget::exportKeySet(QString filename)
223
{
224
        QFileInfo fi = QFileInfo(filename);
225
        QString exportFileName;
10977 cbradney 226
        if (filename.endsWith(".xml"))
5352 cbradney 227
                exportFileName = filename;
228
        else
10977 cbradney 229
                exportFileName = filename+".xml";
5352 cbradney 230
        if (overwrite(this, exportFileName))
231
        {
232
                bool ok;
10585 fschmid 233
                QString setName = QInputDialog::getText(this, tr("Export Keyboard Shortcuts to File"), tr("Enter the name of the shortcut set:"), QLineEdit::Normal, QString::null, &ok);
5352 cbradney 234
                if (!( ok && !setName.isEmpty()) )
235
                        return false;
236
 
237
                QDomDocument doc( "keymapentries" );
238
                QString keyset=QString("<shortcutset name=\"%1\"></shortcutset>").arg(setName);
239
                doc.setContent(keyset);
240
                QDomElement keySetElement=doc.documentElement();
241
                QMap<QString,Keys>::Iterator itEnd=keyMap.end();
242
                for (QMap<QString,Keys>::Iterator it=keyMap.begin(); it!=itEnd; ++it)
243
                {
10516 cbradney 244
                        if (it.value().keySequence.isEmpty() && it.key().isEmpty())
5352 cbradney 245
                                continue;
246
                        QDomElement function_shortcut=doc.createElement("function");
247
                        function_shortcut.setAttribute("name",it.key());
10516 cbradney 248
                        function_shortcut.setAttribute("shortcut",getKeyText(it.value().keySequence));
5352 cbradney 249
                        keySetElement.appendChild(function_shortcut);
250
                }
251
                QFile f(filename);
8501 cbradney 252
                if(!f.open(QIODevice::WriteOnly))
5352 cbradney 253
                        return false;
9949 cbradney 254
                QDataStream s(&f);
10585 fschmid 255
                QByteArray xmltag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
256
                s.writeRawData(xmltag.data(), xmltag.length());
257
                QByteArray xmldoc = doc.toByteArray(4);
258
                s.writeRawData(xmldoc, xmldoc.length());
5352 cbradney 259
                f.close();
260
        }
261
        return true;
262
}
263
 
264
void TabKeyboardShortcutsWidget::resetKeySet()
265
{
10977 cbradney 266
        QString location=ScPaths::instance().shareDir();
16848 craig 267
        QString defaultKeySetFileName=QDir::toNativeSeparators(location+"keysets/scribus14.xml");
5352 cbradney 268
        importKeySet(defaultKeySetFileName);   
269
}
270
 
271
QStringList TabKeyboardShortcutsWidget::scanForSets()
272
{
273
        keySetList.clear();
10977 cbradney 274
        QString location=ScPaths::instance().shareDir();
16576 craig 275
        QString keySetLocation=QDir::toNativeSeparators(location+"keysets/");
10977 cbradney 276
        QDir keySetsDir(keySetLocation, "*.xml", QDir::Name, QDir::Files | QDir::NoSymLinks);
5352 cbradney 277
        if ((keySetsDir.exists()) && (keySetsDir.count() != 0))
278
        {
279
                QStringList appNames;
280
                for (uint fileCounter = 0; fileCounter < keySetsDir.count(); ++fileCounter)
281
                {
16576 craig 282
                        QString filename=QDir::toNativeSeparators(location+"keysets/"+keySetsDir[fileCounter]);
5352 cbradney 283
 
284
                        QDomDocument doc( "keymapentries" );
285
                        QFile file( filename );
8501 cbradney 286
                        if ( !file.open( QIODevice::ReadOnly ) )
5352 cbradney 287
                                continue;
288
                        QString errorMsg;
289
                        int eline;
290
                        int ecol;
291
 
292
                        if ( !doc.setContent( &file, &errorMsg, &eline, &ecol ))
293
                        {
10585 fschmid 294
                                qDebug("%s", QString("Could not open key set file: %1\nError:%2 at line: %3, row: %4").arg(keySetsDir[fileCounter]).arg(errorMsg).arg(eline).arg(ecol).toAscii().constData());
5352 cbradney 295
                                file.close();
296
                                continue;
297
                        }
298
                        file.close();
299
 
300
                        QDomElement docElem = doc.documentElement();
301
                        if (docElem.tagName()=="shortcutset" && docElem.hasAttribute("name"))
302
                        {
303
                                QDomAttr nameAttr = docElem.attributeNode( "name" );
304
                                appNames.append(nameAttr.value());
305
                                keySetList.insert(nameAttr.value(), filename);
306
                        }
307
                }
308
                return QStringList(appNames);
309
        }
8627 subik 310
        return QStringList();
5352 cbradney 311
}
312
 
313
QString TabKeyboardShortcutsWidget::getKeyText(int KeyC)
314
{
315
        if ((KeyC & ~(Qt::META | Qt::CTRL | Qt::ALT | Qt::SHIFT)) == 0)
316
                return "";
317
        // on OSX Qt translates modifiers to forsaken symbols, arrows and the like
318
        // we prefer plain English
319
        QString res;
320
        if ((KeyC & Qt::META) != 0)
321
                res += "Meta+";
322
        if ((KeyC & Qt::CTRL) != 0)
323
                res += "Ctrl+";
324
        if ((KeyC & Qt::ALT) != 0)
325
                res += "Alt+";
326
        if ((KeyC & Qt::SHIFT) != 0)
327
                res += "Shift+";
328
        return res + QString(QKeySequence(KeyC & ~(Qt::META | Qt::CTRL | Qt::ALT | Qt::SHIFT)));
329
}
330
 
331
void TabKeyboardShortcutsWidget::setKeyText()
332
{
9789 cbradney 333
        if (keyTable->currentItem()==0)
334
        {
10581 cbradney 335
                setKeyButton->setChecked(false);
9789 cbradney 336
                return;
337
        }
10581 cbradney 338
        if (setKeyButton->isChecked())
5352 cbradney 339
        {
340
                keyCode = 0;
341
                Part0 = "";
342
                Part1 = "";
343
                Part2 = "";
344
                Part3 = "";
345
                Part4 = "";
346
                grabKeyboard();
347
        }
348
        else
349
                releaseKeyboard();
350
}
351
 
352
void TabKeyboardShortcutsWidget::insertActions()
353
{
354
        lviToActionMap.clear();
5378 cbradney 355
        lviToMenuMap.clear();
5352 cbradney 356
        keyTable->clear();
357
        bool first, firstMenu=true;
9346 subik 358
        QTreeWidgetItem *currLVI = NULL;
359
        QTreeWidgetItem *currMenuLVI = NULL;
360
        QTreeWidgetItem *prevLVI = NULL;
361
        QTreeWidgetItem *prevMenuLVI = NULL;
9949 cbradney 362
        for (QVector< QPair<QString, QStringList> >::Iterator itmenu = defMenus->begin(); itmenu != defMenus->end(); ++itmenu )
5352 cbradney 363
        {
364
                if (firstMenu)
365
                {
9346 subik 366
                        currMenuLVI = new QTreeWidgetItem(keyTable);
367
                        firstMenu = false;
5352 cbradney 368
                }
369
                else
9346 subik 370
                        currMenuLVI = new QTreeWidgetItem(keyTable, prevMenuLVI);
5352 cbradney 371
                Q_CHECK_PTR(currMenuLVI);
5378 cbradney 372
                lviToMenuMap.append(currMenuLVI);
5352 cbradney 373
                currMenuLVI->setText(0, itmenu->first);
9346 subik 374
                currMenuLVI->setExpanded(true);
20219 craig 375
                currMenuLVI->setFlags(Qt::ItemIsEnabled);
5352 cbradney 376
                prevMenuLVI=currMenuLVI;
377
                first=true;
378
                currLVI=0;
379
                prevLVI=0;
380
                for ( QStringList::Iterator it = itmenu->second.begin(); it != itmenu->second.end(); ++it )
381
                {
382
                        if (first)
383
                        {
9346 subik 384
                                currLVI = new QTreeWidgetItem(currMenuLVI);
385
                                first = false;
5352 cbradney 386
                        }
387
                        else
9346 subik 388
                                currLVI = new QTreeWidgetItem(currMenuLVI, prevLVI);
5367 cbradney 389
                        Q_CHECK_PTR(currLVI);
5378 cbradney 390
                        lviToActionMap.insert(currLVI, *it);
5352 cbradney 391
                        currLVI->setText(0, keyMap[*it].cleanMenuText);
392
                        currLVI->setText(1, keyMap[*it].keySequence);
393
                        prevLVI=currLVI;
394
                }
395
        }
5956 cbradney 396
        //Non menu actions
9346 subik 397
        for (QVector< QPair<QString, QStringList> >::Iterator itmenu = defNonMenuActions->begin(); itmenu != defNonMenuActions->end(); ++itmenu )
5956 cbradney 398
        {
399
                if (firstMenu)
400
                {
9346 subik 401
                        currMenuLVI = new QTreeWidgetItem(keyTable);
402
                        firstMenu = false;
5956 cbradney 403
                }
404
                else
9346 subik 405
                        currMenuLVI = new QTreeWidgetItem(keyTable, prevMenuLVI);
5956 cbradney 406
                Q_CHECK_PTR(currMenuLVI);
407
                lviToMenuMap.append(currMenuLVI);
408
                currMenuLVI->setText(0, itmenu->first);
9346 subik 409
                currMenuLVI->setExpanded(true);
20219 craig 410
                currMenuLVI->setFlags(Qt::ItemIsEnabled);
5956 cbradney 411
                prevMenuLVI=currMenuLVI;
412
                first=true;
413
                currLVI=0;
414
                prevLVI=0;
415
                for ( QStringList::Iterator it = itmenu->second.begin(); it != itmenu->second.end(); ++it )
416
                {
417
                        if (first)
418
                        {
9346 subik 419
                                currLVI=new QTreeWidgetItem(currMenuLVI);
5956 cbradney 420
                                first=false;
421
                        }
422
                        else
9346 subik 423
                                currLVI=new QTreeWidgetItem(currMenuLVI, prevLVI);
5956 cbradney 424
                        Q_CHECK_PTR(currLVI);
425
                        lviToActionMap.insert(currLVI, *it);
426
                        currLVI->setText(0, keyMap[*it].cleanMenuText);
427
                        currLVI->setText(1, keyMap[*it].keySequence);
428
                        prevLVI=currLVI;
429
                }
430
        }
13479 pierre 431
        keyTable->resizeColumnToContents(0);
5352 cbradney 432
}
433
 
5378 cbradney 434
void TabKeyboardShortcutsWidget::applySearch( const QString & newss )
435
{
436
        //Must run this as if newss is not empty and we go to the next for loop, the set visible doesnt work
9346 subik 437
        for (QList<QTreeWidgetItem*>::iterator it=lviToMenuMap.begin(); it!=lviToMenuMap.end(); ++it)
438
                (*it)->setHidden(false);
5378 cbradney 439
        if (newss.isEmpty())
440
        {                      
9346 subik 441
                for (QMap<QTreeWidgetItem*, QString>::iterator it=lviToActionMap.begin(); it!=lviToActionMap.end(); ++it)
442
                        it.key()->setHidden(false);
5378 cbradney 443
                return;
444
        }
445
        //Seem to need to do this.. isOpen doesnt seem to do what it says
9346 subik 446
        for (QMap<QTreeWidgetItem*, QString>::iterator it=lviToActionMap.begin(); it!=lviToActionMap.end(); ++it)
5378 cbradney 447
        {
10585 fschmid 448
                if (it.key()->text(0).contains(newss, Qt::CaseInsensitive))
9346 subik 449
                        it.key()->setHidden(false);
5378 cbradney 450
                else
9346 subik 451
                        it.key()->setHidden(true);
5378 cbradney 452
        }
453
}
454
 
9346 subik 455
void TabKeyboardShortcutsWidget::dispKey(QTreeWidgetItem* qlvi, QTreeWidgetItem*)
5352 cbradney 456
{
21760 jghali 457
        if (setKeyButton->isChecked())
458
        {
459
                releaseKeyboard();
460
                setKeyButton->setChecked(false);
461
        }
5352 cbradney 462
        if (qlvi!=0 && lviToActionMap.contains(qlvi))
463
        {
21760 jghali 464
                selectedLVI = qlvi;
5352 cbradney 465
                QString actionName=lviToActionMap[qlvi];
466
                if (actionName.isEmpty())
467
                        return;
468
                keyDisplay->setText(keyMap[actionName].keySequence);
469
                if (keyMap[actionName].keySequence.isEmpty())
470
                        noKey->setChecked(true);
471
                else
472
                        userDef->setChecked(true);
473
        }
474
        else
475
        {
476
                noKey->setChecked(true);
477
                keyDisplay->setText("");
21760 jghali 478
                selectedLVI = 0;
5352 cbradney 479
        }
21760 jghali 480
        noKey->setEnabled(selectedLVI != 0);
481
        userDef->setEnabled(selectedLVI != 0);
482
        setKeyButton->setEnabled(selectedLVI != 0);
483
        keyDisplay->setEnabled(selectedLVI != 0);
5352 cbradney 484
}
485
 
486
bool TabKeyboardShortcutsWidget::event( QEvent* ev )
487
{
488
        bool ret = QWidget::event( ev );
489
        if ( ev->type() == QEvent::KeyPress )
490
                keyPressEvent((QKeyEvent*)ev);
491
        if ( ev->type() == QEvent::KeyRelease )
492
                keyReleaseEvent((QKeyEvent*)ev);
493
        return ret;
494
}
495
 
496
void TabKeyboardShortcutsWidget::keyPressEvent(QKeyEvent *k)
497
{
10581 cbradney 498
        if (setKeyButton->isChecked())
5352 cbradney 499
        {
500
                QStringList tl;
13049 jghali 501
                Part4 = "";
5352 cbradney 502
                if (!keyDisplay->text().isEmpty())
503
                {
10603 fschmid 504
                        tl = keyDisplay->text().split("+", QString::SkipEmptyParts);
13049 jghali 505
                        if (tl.count() > 0)
506
                        {
17294 jghali 507
                                Part4 = tl.last();
13049 jghali 508
                                if (Part4 == tr("Alt") || Part4 == tr("Ctrl") || Part4 == tr("Shift") || Part4 == tr("Meta"))
509
                                        Part4 = "";
510
                        }
511
                }              
5352 cbradney 512
                switch (k->key())
513
                {
8523 cbradney 514
                        case Qt::Key_Meta:
5352 cbradney 515
                                Part0 = tr("Meta+");
516
                                keyCode |= Qt::META;
517
                                break;
8523 cbradney 518
                        case Qt::Key_Shift:
5352 cbradney 519
                                Part3 = tr("Shift+");
520
                                keyCode |= Qt::SHIFT;
521
                                break;
8523 cbradney 522
                        case Qt::Key_Alt:
5352 cbradney 523
                                Part2 = tr("Alt+");
524
                                keyCode |= Qt::ALT;
525
                                break;
8523 cbradney 526
                        case Qt::Key_Control:
5352 cbradney 527
                                Part1 = tr("Ctrl+");
528
                                keyCode |= Qt::CTRL;
529
                                break;
530
                        default:
531
                                keyCode |= k->key();
532
                                keyDisplay->setText(getKeyText(keyCode));
10262 cbradney 533
                                releaseKeyboard();
21760 jghali 534
                                if (selectedLVI)
5352 cbradney 535
                                {
21760 jghali 536
                                        QString actionName = lviToActionMap[selectedLVI];
537
                                        if (checkKey(keyCode))
538
                                        {
539
                                                QMessageBox::information(this, CommonStrings::trWarning,
540
                                                                                                tr("This key sequence is already in use"),
541
                                                                                                CommonStrings::tr_OK);
542
                                                selectedLVI->setText(1,keyMap[actionName].keySequence);
543
                                                keyDisplay->setText(keyMap[actionName].keySequence);
544
                                        }
545
                                        else
546
                                        {
547
                                                QKeySequence newKeySequence(keyCode);
548
                                                selectedLVI->setText(1, QString(newKeySequence));
549
                                                keyMap[actionName].keySequence = newKeySequence;
550
                                                userDef->setChecked(true);
551
                                        }
5352 cbradney 552
                                }
10581 cbradney 553
                                setKeyButton->setChecked(false);
5352 cbradney 554
                }
555
        }
10581 cbradney 556
        if (setKeyButton->isChecked())
5352 cbradney 557
                keyDisplay->setText(Part0+Part1+Part2+Part3+Part4);
558
}
559
 
560
void TabKeyboardShortcutsWidget::keyReleaseEvent(QKeyEvent *k)
561
{
10581 cbradney 562
        if (setKeyButton->isChecked())
5352 cbradney 563
        {
13049 jghali 564
                Part4 = "";
5352 cbradney 565
                if (!keyDisplay->text().isEmpty())
566
                {
567
                        QStringList tl;
10603 fschmid 568
                        tl = keyDisplay->text().split("+", QString::SkipEmptyParts);
13049 jghali 569
                        if (tl.count() > 0)
570
                        {
17294 jghali 571
                                Part4 = tl.last();
13049 jghali 572
                                if (Part4 == tr("Alt") || Part4 == tr("Ctrl") || Part4 == tr("Shift") || Part4 == tr("Meta"))
573
                                        Part4 = "";
574
                        }
5352 cbradney 575
                }
576
                if (k->key() == Qt::Key_Meta)
577
                {
578
                        Part0 = "";
579
                        keyCode &= ~Qt::META;
580
                }
581
                if (k->key() == Qt::Key_Shift)
582
                {
583
                        Part3 = "";
584
                        keyCode &= ~Qt::SHIFT;
585
                }
586
                if (k->key() == Qt::Key_Alt)
587
                {
588
                        Part2 = "";
8528 cbradney 589
                        keyCode &= ~Qt::ALT;
5352 cbradney 590
                }
591
                if (k->key() == Qt::Key_Control)
592
                {
593
                        Part1 = "";
594
                        keyCode &= ~Qt::CTRL;
595
                }
596
                keyDisplay->setText(Part0+Part1+Part2+Part3+Part4);
597
        }
598
}
599
 
600
bool TabKeyboardShortcutsWidget::checkKey(int code)
601
{
602
        bool ret = false;
603
        QKeySequence key = QKeySequence(code);
604
        for (QMap<QString,Keys>::Iterator it=keyMap.begin(); it!=keyMap.end(); ++it)
605
        {
10516 cbradney 606
                if (key.matches(it.value().keySequence) != QKeySequence::NoMatch)
5352 cbradney 607
                {
608
                        ret = true;
609
                        break;
610
                }
611
        }
612
        return ret;
613
}
5367 cbradney 614
 
615
void TabKeyboardShortcutsWidget::clearSearchString( )
616
{
617
        searchTextLineEdit->clear();
618
}