• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • applications API Reference
  • KDE Home
  • Contact Us
 

Konsole

  • kde-4.14
  • applications
  • konsole
  • src
KeyBindingEditor.cpp
Go to the documentation of this file.
1 /*
2  Copyright 2008 by Robert Knight <robertknight@gmail.com>
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301 USA.
18 */
19 
20 // Own
21 #include "KeyBindingEditor.h"
22 
23 // Qt
24 #include <QtGui/QKeyEvent>
25 
26 // Konsole
27 #include "ui_KeyBindingEditor.h"
28 #include "KeyboardTranslator.h"
29 
30 using namespace Konsole;
31 
32 KeyBindingEditor::KeyBindingEditor(QWidget* parent)
33  : QWidget(parent)
34  , _translator(new KeyboardTranslator(QString()))
35 {
36  _ui = new Ui::KeyBindingEditor();
37  _ui->setupUi(this);
38 
39  // description edit
40  connect(_ui->descriptionEdit , SIGNAL(textChanged(QString)) ,
41  this , SLOT(setTranslatorDescription(QString)));
42 
43  // key bindings table
44  _ui->keyBindingTable->setColumnCount(2);
45 
46  QStringList labels;
47  labels << i18n("Key Combination") << i18n("Output");
48 
49  _ui->keyBindingTable->setHorizontalHeaderLabels(labels);
50  _ui->keyBindingTable->horizontalHeader()->setStretchLastSection(true);
51  _ui->keyBindingTable->verticalHeader()->hide();
52  _ui->keyBindingTable->setSelectionBehavior(QAbstractItemView::SelectRows);
53 
54  // add and remove buttons
55  _ui->addEntryButton->setIcon(KIcon("list-add"));
56  _ui->removeEntryButton->setIcon(KIcon("list-remove"));
57 
58  connect(_ui->removeEntryButton , SIGNAL(clicked()) , this , SLOT(removeSelectedEntry()));
59  connect(_ui->addEntryButton , SIGNAL(clicked()) , this , SLOT(addNewEntry()));
60 
61  // test area
62  _ui->testAreaInputEdit->installEventFilter(this);
63 }
64 
65 KeyBindingEditor::~KeyBindingEditor()
66 {
67  delete _ui;
68  delete _translator;
69 }
70 
71 void KeyBindingEditor::removeSelectedEntry()
72 {
73  QList<QTableWidgetItem*> uniqueList;
74 
75  foreach(QTableWidgetItem* item, _ui->keyBindingTable->selectedItems()) {
76  if (item->column() == 1) //Select item at the first column
77  item = _ui->keyBindingTable->item(item->row(), 0);
78 
79  if (!uniqueList.contains(item))
80  uniqueList.append(item);
81  }
82 
83  foreach(QTableWidgetItem* item, uniqueList) {
84  // get the first item in the row which has the entry
85 
86  KeyboardTranslator::Entry existing = item->data(Qt::UserRole).
87  value<KeyboardTranslator::Entry>();
88 
89  _translator->removeEntry(existing);
90 
91  _ui->keyBindingTable->removeRow(item->row());
92  }
93 }
94 
95 void KeyBindingEditor::addNewEntry()
96 {
97  _ui->keyBindingTable->insertRow(_ui->keyBindingTable->rowCount());
98 
99  int newRowCount = _ui->keyBindingTable->rowCount();
100 
101  // block signals here to avoid triggering bindingTableItemChanged() slot call
102  _ui->keyBindingTable->blockSignals(true);
103 
104  _ui->keyBindingTable->setItem(newRowCount - 1, 0, new QTableWidgetItem());
105  _ui->keyBindingTable->setItem(newRowCount - 1, 1, new QTableWidgetItem());
106 
107  _ui->keyBindingTable->blockSignals(false);
108 
109  // make sure user can see new row
110  _ui->keyBindingTable->scrollToItem(_ui->keyBindingTable->item(newRowCount - 1, 0));
111 }
112 
113 bool KeyBindingEditor::eventFilter(QObject* watched , QEvent* event)
114 {
115  if (watched == _ui->testAreaInputEdit) {
116  if (event->type() == QEvent::KeyPress) {
117  QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
118 
119  // The state here is currently set to the state that a newly started
120  // terminal in Konsole will be in ( which is also the same as the
121  // state just after a reset ), this has 'ANSI' turned on and all other
122  // states off.
123  //
124  // TODO: It may be useful to be able to specify the state in the 'test input'
125  // area, but preferably not in a way which clutters the UI with lots of
126  // checkboxes.
127  //
128  const KeyboardTranslator::States states = KeyboardTranslator::AnsiState;
129 
130  KeyboardTranslator::Entry entry = _translator->findEntry(keyEvent->key() ,
131  keyEvent->modifiers(),
132  states);
133 
134  if (!entry.isNull()) {
135  _ui->testAreaInputEdit->setText(entry.conditionToString());
136  _ui->testAreaOutputEdit->setText(entry.resultToString(true, keyEvent->modifiers()));
137  } else {
138  _ui->testAreaInputEdit->setText(keyEvent->text());
139  _ui->testAreaOutputEdit->setText(keyEvent->text());
140  }
141 
142  keyEvent->accept();
143  return true;
144  }
145  }
146  return false;
147 }
148 
149 void KeyBindingEditor::setDescription(const QString& newDescription)
150 {
151  _ui->descriptionEdit->setText(newDescription);
152 
153  setTranslatorDescription(newDescription);
154 }
155 
156 void KeyBindingEditor::setTranslatorDescription(const QString& newDescription)
157 {
158  if (_translator)
159  _translator->setDescription(newDescription);
160 }
161 
162 QString KeyBindingEditor::description() const
163 {
164  return _ui->descriptionEdit->text();
165 }
166 
167 void KeyBindingEditor::setup(const KeyboardTranslator* translator)
168 {
169  delete _translator;
170 
171  _translator = new KeyboardTranslator(*translator);
172 
173  // setup description edit
174  _ui->descriptionEdit->setClearButtonShown(true);
175  _ui->descriptionEdit->setText(translator->description());
176 
177  // setup key binding table
178  setupKeyBindingTable(translator);
179 }
180 
181 KeyboardTranslator* KeyBindingEditor::translator() const
182 {
183  return _translator;
184 }
185 
186 void KeyBindingEditor::bindingTableItemChanged(QTableWidgetItem* item)
187 {
188  QTableWidgetItem* key = _ui->keyBindingTable->item(item->row() , 0);
189  KeyboardTranslator::Entry existing = key->data(Qt::UserRole).value<KeyboardTranslator::Entry>();
190 
191  QString condition = key->text();
192  QString result = _ui->keyBindingTable->item(item->row() , 1)->text();
193 
194  KeyboardTranslator::Entry entry = KeyboardTranslatorReader::createEntry(condition, result);
195  _translator->replaceEntry(existing, entry);
196 
197  // block signals to prevent this slot from being called repeatedly
198  _ui->keyBindingTable->blockSignals(true);
199 
200  key->setData(Qt::UserRole, QVariant::fromValue(entry));
201 
202  _ui->keyBindingTable->blockSignals(false);
203 }
204 
205 void KeyBindingEditor::setupKeyBindingTable(const KeyboardTranslator* translator)
206 {
207  disconnect(_ui->keyBindingTable , SIGNAL(itemChanged(QTableWidgetItem*)) , this ,
208  SLOT(bindingTableItemChanged(QTableWidgetItem*)));
209 
210  QList<KeyboardTranslator::Entry> entries = translator->entries();
211  _ui->keyBindingTable->setRowCount(entries.count());
212 
213  for (int row = 0 ; row < entries.count() ; row++) {
214  const KeyboardTranslator::Entry& entry = entries.at(row);
215 
216  QTableWidgetItem* keyItem = new QTableWidgetItem(entry.conditionToString());
217  keyItem->setData(Qt::UserRole , QVariant::fromValue(entry));
218 
219  QTableWidgetItem* textItem = new QTableWidgetItem(QString(entry.resultToString()));
220 
221  _ui->keyBindingTable->setItem(row, 0, keyItem);
222  _ui->keyBindingTable->setItem(row, 1, textItem);
223  }
224  _ui->keyBindingTable->sortItems(0);
225 
226  connect(_ui->keyBindingTable , SIGNAL(itemChanged(QTableWidgetItem*)) , this ,
227  SLOT(bindingTableItemChanged(QTableWidgetItem*)));
228 }
229 
230 #include "KeyBindingEditor.moc"
231 
Konsole::KeyboardTranslator
A converter which maps between key sequences pressed by the user and the character strings which shou...
Definition: KeyboardTranslator.h:52
QEvent
QWidget
QKeyEvent::modifiers
Qt::KeyboardModifiers modifiers() const
QEvent::type
Type type() const
Konsole::KeyBindingEditor::eventFilter
virtual bool eventFilter(QObject *watched, QEvent *event)
Definition: KeyBindingEditor.cpp:113
QTableWidgetItem
Konsole::KeyboardTranslator::removeEntry
void removeEntry(const Entry &entry)
Removes an entry from the table.
Definition: KeyboardTranslator.cpp:675
Konsole::KeyboardTranslator::description
QString description() const
Returns the descriptive name of this keyboard translator.
Definition: KeyboardTranslator.cpp:641
Konsole::KeyboardTranslator::Entry::resultToString
QString resultToString(bool expandWildCards=false, Qt::KeyboardModifiers modifiers=Qt::NoModifier) const
Returns this entry's result ( ie.
Definition: KeyboardTranslator.cpp:577
QList::at
const T & at(int i) const
Konsole::KeyboardTranslator::Entry
Represents an association between a key sequence pressed by the user and the character sequence and c...
Definition: KeyboardTranslator.h:121
QVariant::value
T value() const
Konsole::KeyboardTranslator::entries
QList< Entry > entries() const
Returns a list of all entries in the translator.
Definition: KeyboardTranslator.cpp:656
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QTableWidgetItem::data
virtual QVariant data(int role) const
Konsole::KeyboardTranslatorReader::createEntry
static KeyboardTranslator::Entry createEntry(const QString &condition, const QString &result)
Parses a condition and result string for a translator entry and produces a keyboard translator entry...
Definition: KeyboardTranslator.cpp:305
Konsole::KeyBindingEditor::translator
KeyboardTranslator * translator() const
Returns the modified translator describing the changes to the bindings and other settings which the u...
Definition: KeyBindingEditor.cpp:181
QTableWidgetItem::setData
virtual void setData(int role, const QVariant &value)
Konsole::KeyBindingEditor::~KeyBindingEditor
virtual ~KeyBindingEditor()
Definition: KeyBindingEditor.cpp:65
QList::count
int count(const T &value) const
QList::append
void append(const T &value)
Konsole::KeyBindingEditor::setDescription
void setDescription(const QString &description)
Sets the text of the editor's description field.
Definition: KeyBindingEditor.cpp:149
KeyboardTranslator.h
Konsole::KeyboardTranslator::AnsiState
Indicates that the terminal is in 'ANSI' mode.
Definition: KeyboardTranslator.h:74
KeyBindingEditor.h
QObject
QTableWidgetItem::column
int column() const
Konsole::KeyBindingEditor::setup
void setup(const KeyboardTranslator *translator)
Initializes the dialog with the bindings and other settings from the specified translator.
Definition: KeyBindingEditor.cpp:167
QKeyEvent::text
QString text() const
QString
Konsole::KeyboardTranslator::findEntry
Entry findEntry(int keyCode, Qt::KeyboardModifiers modifiers, States state=NoState) const
Looks for an entry in this keyboard translator which matches the given key code, keyboard modifiers a...
Definition: KeyboardTranslator.cpp:680
QList
QTableWidgetItem::row
int row() const
QStringList
Konsole::KeyBindingEditor::description
QString description() const
Returns the text of the editor's description field.
Definition: KeyBindingEditor.cpp:162
QKeyEvent::key
int key() const
QEvent::accept
void accept()
QList::contains
bool contains(const T &value) const
QVariant::fromValue
QVariant fromValue(const T &value)
QTableWidgetItem::text
QString text() const
QKeyEvent
Konsole::KeyboardTranslator::Entry::isNull
bool isNull() const
Returns true if this entry is null.
Definition: KeyboardTranslator.h:469
Konsole::KeyBindingEditor::KeyBindingEditor
KeyBindingEditor(QWidget *parent=0)
Constructs a new key bindings editor with the specified parent.
Definition: KeyBindingEditor.cpp:32
Konsole::KeyboardTranslator::Entry::conditionToString
QString conditionToString() const
Returns the key code and modifiers associated with this entry as a QKeySequence.
Definition: KeyboardTranslator.cpp:599
Konsole::KeyboardTranslator::replaceEntry
void replaceEntry(const Entry &existing, const Entry &replacement)
Replaces an entry in the translator.
Definition: KeyboardTranslator.cpp:667
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QWidget::event
virtual bool event(QEvent *event)
Konsole::KeyboardTranslator::setDescription
void setDescription(const QString &description)
Sets the descriptive name of this keyboard translator.
Definition: KeyboardTranslator.cpp:636
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Sat May 9 2020 03:56:27 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Konsole

Skip menu "Konsole"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

applications API Reference

Skip menu "applications API Reference"
  •   kate
  •       kate
  •   KTextEditor
  •   Kate
  • Konsole

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal