use ',' as "Escape to Application" schortcut

This commit is contained in:
hjk
2009-01-09 12:51:10 +01:00
parent e83cf9727c
commit 816b83feed

View File

@@ -84,6 +84,7 @@ enum Mode
ExMode, ExMode,
SearchForwardMode, SearchForwardMode,
SearchBackwardMode, SearchBackwardMode,
PassingMode, // lets keyevents to be passed to the main application
}; };
enum SubMode enum SubMode
@@ -200,6 +201,7 @@ public:
public: public:
QTextEdit *m_textedit; QTextEdit *m_textedit;
QPlainTextEdit *m_plaintextedit; QPlainTextEdit *m_plaintextedit;
bool m_wasReadOnly; // saves read-only state of document
private: private:
FakeVimHandler *q; FakeVimHandler *q;
@@ -284,8 +286,13 @@ FakeVimHandler::Private::Private(FakeVimHandler *parent)
bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev) bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
{ {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(ev); int key = ev->key();
int key = keyEvent->key();
if (m_mode == PassingMode && key != Qt::Key_Control && key != Qt::Key_Shift) {
enterCommandMode();
return false;
}
if (key == Key_Shift || key == Key_Alt || key == Key_Control if (key == Key_Shift || key == Key_Alt || key == Key_Control
|| key == Key_Alt || key == Key_AltGr || key == Key_Meta) || key == Key_Alt || key == Key_AltGr || key == Key_Meta)
return false; return false;
@@ -297,11 +304,11 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
m_tc.movePosition(Right, MoveAnchor, 1); m_tc.movePosition(Right, MoveAnchor, 1);
if (key >= Key_A && key <= Key_Z if (key >= Key_A && key <= Key_Z
&& (keyEvent->modifiers() & Qt::ShiftModifier) == 0) && (ev->modifiers() & Qt::ShiftModifier) == 0)
key += 32; key += 32;
if ((keyEvent->modifiers() & Qt::ControlModifier) != 0) if ((ev->modifiers() & Qt::ControlModifier) != 0)
key += 256; key += 256;
bool handled = handleKey(key, keyEvent->text()); bool handled = handleKey(key, ev->text());
// We fake vi-style end-of-line behaviour // We fake vi-style end-of-line behaviour
m_fakeEnd = (atEol() && m_mode == CommandMode); m_fakeEnd = (atEol() && m_mode == CommandMode);
@@ -316,8 +323,8 @@ bool FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
bool FakeVimHandler::Private::handleKey(int key, const QString &text) bool FakeVimHandler::Private::handleKey(int key, const QString &text)
{ {
qDebug() << "KEY: " << key << text << "POS: " << m_tc.position(); //qDebug() << "KEY: " << key << text << "POS: " << m_tc.position();
qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack; //qDebug() << "\nUNDO: " << m_undoStack << "\nREDO: " << m_redoStack;
if (m_mode == InsertMode) if (m_mode == InsertMode)
return handleInsertMode(key, text); return handleInsertMode(key, text);
if (m_mode == CommandMode) if (m_mode == CommandMode)
@@ -422,7 +429,9 @@ void FakeVimHandler::Private::updateSelection()
void FakeVimHandler::Private::updateMiniBuffer() void FakeVimHandler::Private::updateMiniBuffer()
{ {
QString msg; QString msg;
if (!m_currentMessage.isEmpty()) { if (m_mode == PassingMode) {
msg = "-- PASSING --";
} else if (!m_currentMessage.isEmpty()) {
msg = m_currentMessage; msg = m_currentMessage;
m_currentMessage.clear(); m_currentMessage.clear();
} else if (m_mode == CommandMode && m_visualMode != NoVisualMode) { } else if (m_mode == CommandMode && m_visualMode != NoVisualMode) {
@@ -580,6 +589,10 @@ bool FakeVimHandler::Private::handleCommandMode(int key, const QString &text)
} else if (key == '$' || key == Key_End) { } else if (key == '$' || key == Key_End) {
m_tc.movePosition(EndOfLine, KeepAnchor); m_tc.movePosition(EndOfLine, KeepAnchor);
finishMovement(); finishMovement();
} else if (key == ',') {
// FIXME: use some other mechanism
m_mode = PassingMode;
updateMiniBuffer();
} else if (key == '.') { } else if (key == '.') {
qDebug() << "REPEATING" << m_dotCommand; qDebug() << "REPEATING" << m_dotCommand;
for (int i = count(); --i >= 0; ) for (int i = count(); --i >= 0; )
@@ -1482,13 +1495,12 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) { if (ev->type() == QEvent::ShortcutOverride && ob == d->editor()) {
QKeyEvent *kev = static_cast<QKeyEvent *>(ev); QKeyEvent *kev = static_cast<QKeyEvent *>(ev);
bool handleIt = kev->key() == Qt::Key_Escape int key = kev->key();
|| (kev->key() == Key_B && kev->modifiers() == Qt::ControlModifier) int mods = kev->modifiers();
|| (kev->key() == Key_F && kev->modifiers() == Qt::ControlModifier) bool handleIt = (key == Qt::Key_Escape)
|| (kev->key() == Key_R && kev->modifiers() == Qt::ControlModifier) || (key >= Key_A && key <= Key_Z && mods == Qt::ControlModifier);
|| (kev->key() == Key_V && kev->modifiers() == Qt::ControlModifier); if (handleIt && d->handleEvent(kev)) {
if (handleIt) { d->enterCommandMode();
d->handleEvent(kev);
ev->accept(); ev->accept();
return true; return true;
} }
@@ -1505,20 +1517,27 @@ void FakeVimHandler::addWidget(QWidget *widget)
if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) { if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
ed->setLineWrapMode(QTextEdit::NoWrap); ed->setLineWrapMode(QTextEdit::NoWrap);
d->m_wasReadOnly = ed->isReadOnly();
} else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) { } else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
//ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x'))); //ed->setCursorWidth(QFontMetrics(ed->font()).width(QChar('x')));
ed->setLineWrapMode(QPlainTextEdit::NoWrap); ed->setLineWrapMode(QPlainTextEdit::NoWrap);
d->m_wasReadOnly = ed->isReadOnly();
} }
//d->showBlackMessage("vi emulation mode. Hit <Shift+Esc>:q<Return> to quit");
d->showBlackMessage("vi emulation mode."); d->showBlackMessage("vi emulation mode.");
d->updateMiniBuffer(); d->updateMiniBuffer();
} }
void FakeVimHandler::removeWidget(QWidget *widget) void FakeVimHandler::removeWidget(QWidget *widget)
{ {
d->setWidget(widget);
d->showBlackMessage(QString()); d->showBlackMessage(QString());
d->updateMiniBuffer(); d->updateMiniBuffer();
widget->removeEventFilter(this); widget->removeEventFilter(this);
if (QTextEdit *ed = qobject_cast<QTextEdit *>(widget)) {
ed->setReadOnly(d->m_wasReadOnly);
} else if (QPlainTextEdit *ed = qobject_cast<QPlainTextEdit *>(widget)) {
ed->setReadOnly(d->m_wasReadOnly);
}
} }
void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd) void FakeVimHandler::handleCommand(QWidget *widget, const QString &cmd)