I adapt Edwin's patch to lyx, with two glitches

1. I need to record multiple keystrokes.
2. I need to write A-, instead of Alt+

Abdel, am I adding the ShortcutEdit correctly? I remove the lineedit
from the ui file, and copy the original code from blah_ui.h to
GuiPrefs.cpp.

Cheers,
Bo
Index: src/frontends/qt4/GuiPrefs.cpp
===================================================================
--- src/frontends/qt4/GuiPrefs.cpp	(revision 21127)
+++ src/frontends/qt4/GuiPrefs.cpp	(working copy)
@@ -1692,6 +1692,135 @@
 //
 /////////////////////////////////////////////////////////////////////
 
+ShortcutEdit::ShortcutEdit(QWidget * parent)
+: QLineEdit(parent)
+{
+	reset();
+}
+
+void ShortcutEdit::keyPressEvent(QKeyEvent * e)
+{
+	int keyQt = e->key();
+
+	if (e->modifiers() == Qt::NoModifier) {
+		if (keyQt == Qt::Key_Backspace || keyQt == Qt::Key_Delete)
+			clear();
+		return;
+	} else // start new shortcut
+		if (keySequence.isEmpty())
+			clear();
+
+
+	uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
+	if (nKey == 0)
+		modifierKeys = newModifiers;
+
+	switch(keyQt) {
+		 case Qt::Key_AltGr: //or else we get unicode salad
+			return;
+		 case Qt::Key_Shift:
+		 case Qt::Key_Control:
+		 case Qt::Key_Alt:
+		 case Qt::Key_Meta:
+			// If we are editing the first key in the sequence,
+			// display modifier keys which are held down
+			if(nKey == 0)
+				setText(keySequence.toString(QKeySequence::NativeText));
+			 break;
+		 default:
+			if (keyQt) {
+				if (nKey == 0) {
+					keySequence = appendToSequence(keySequence, keyQt | modifierKeys);
+				} else {
+					keySequence = appendToSequence(keySequence, keyQt);
+				}
+
+				nKey++;
+				if (nKey >= 4) {
+					shortcut(keySequence.toString());
+					reset();
+					return;
+				 }
+				 setText(keySequence.toString(QKeySequence::NativeText));
+			}
+	}
+}
+
+
+QKeySequence ShortcutEdit::appendToSequence(const QKeySequence& seq, int keyQt)
+{
+	switch (seq.count()) {
+		 case 0:
+			 return QKeySequence(keyQt);
+		 case 1:
+			 return QKeySequence(seq[0], keyQt);
+		 case 2:
+			 return QKeySequence(seq[0], seq[1], keyQt);
+		 case 3:
+			 return QKeySequence(seq[0], seq[1], seq[2], keyQt);
+		 default:
+			 return seq;
+	}
+}
+
+
+void ShortcutEdit::keyReleaseEvent(QKeyEvent *e)
+{
+	uint newModifiers = e->modifiers() & (Qt::SHIFT | Qt::CTRL | Qt::ALT | Qt::META);
+
+	//if a modifier that belongs to the shortcut was released...
+	if ((newModifiers & modifierKeys) < modifierKeys) {
+		if (nKey == 0) {
+			modifierKeys = newModifiers;
+			setText(keySequence.toString(QKeySequence::NativeText));
+		} else {
+			shortcut(keySequence.toString());
+			reset();
+		}
+	}
+}
+
+
+//prevent Qt from special casing Tab and Backtab
+bool ShortcutEdit::event(QEvent* e)
+{
+	if (e->type() == QEvent::ShortcutOverride)
+		return false;
+
+	if (e->type() == QEvent::KeyPress) {
+		keyPressEvent(static_cast<QKeyEvent *>(e));
+		return true;
+	}
+
+	return QLineEdit::event(e);
+}
+
+
+void ShortcutEdit::reset()
+{
+	nKey = 0;
+	modifierKeys = 0;
+	keySequence = QKeySequence();
+}
+
+
+GuiShortcutDialog::GuiShortcutDialog(QWidget * parent) : QDialog(parent)
+{
+	Ui::ShortcutUi::setupUi(this);
+	QDialog::setModal(true);
+	// adapted from ui_ShortcutUi.h
+	shortcutLE = new ShortcutEdit(parent);
+	shortcutLE->setObjectName(QString::fromUtf8("shortcutLE"));
+    QSizePolicy sizePolicy2(static_cast<QSizePolicy::Policy>(7), static_cast<QSizePolicy::Policy>(0));
+    sizePolicy2.setHorizontalStretch(0);
+    sizePolicy2.setVerticalStretch(0);
+    sizePolicy2.setHeightForWidth(shortcutLE->sizePolicy().hasHeightForWidth());
+    shortcutLE->setSizePolicy(sizePolicy2);
+	gridLayout->addWidget(shortcutLE, 1, 1, 1, 1);
+	QWidget::setTabOrder(shortcutLE, okPB);
+}
+
+
 PrefShortcuts::PrefShortcuts(GuiPreferences * form, QWidget * parent)
 	: PrefModule(_("Shortcuts"), form, parent)
 {
Index: src/frontends/qt4/ui/ShortcutUi.ui
===================================================================
--- src/frontends/qt4/ui/ShortcutUi.ui	(revision 21127)
+++ src/frontends/qt4/ui/ShortcutUi.ui	(working copy)
@@ -93,21 +93,6 @@
      </property>
     </widget>
    </item>
-   <item row="1" column="1" >
-    <widget class="QLineEdit" name="shortcutLE" >
-     <property name="sizePolicy" >
-      <sizepolicy>
-       <hsizetype>7</hsizetype>
-       <vsizetype>0</vsizetype>
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="toolTip" >
-      <string>Enter BibTeX database name</string>
-     </property>
-    </widget>
-   </item>
    <item row="0" column="1" >
     <widget class="QLineEdit" name="lfunLE" >
      <property name="sizePolicy" >
Index: src/frontends/qt4/GuiPrefs.h
===================================================================
--- src/frontends/qt4/GuiPrefs.h	(revision 21127)
+++ src/frontends/qt4/GuiPrefs.h	(working copy)
@@ -347,14 +347,33 @@
 };
 
 
+/**
+ * A lineedit for inputting shortcuts
+ */
+class ShortcutEdit : public QLineEdit {
+	Q_OBJECT
+public:
+	ShortcutEdit(QWidget * parent);
+protected Q_SLOTS:
+	void keyPressEvent(QKeyEvent * e);
+	void keyReleaseEvent(QKeyEvent *e);
+	bool event(QEvent* e);
+Q_SIGNALS:
+	void shortcut(const QString &);
+private:
+	QKeySequence appendToSequence(const QKeySequence & seq, int keyQt);
+	void reset();
+	QKeySequence keySequence;
+	uint nKey;
+	uint modifierKeys;
+};
+
+
 class GuiShortcutDialog : public QDialog, public Ui::ShortcutUi
 {
 public:
-	GuiShortcutDialog(QWidget * parent) : QDialog(parent)
-	{
-		Ui::ShortcutUi::setupUi(this);
-		QDialog::setModal(true);
-	}
+	GuiShortcutDialog(QWidget * parent);
+	ShortcutEdit * shortcutLE;
 };
 
 

Reply via email to