diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc index 2f91995fb4945147957dd6288c8cb8a793da94a0..905f133f01eb7534396af6e09e8059d5705ee8a1 100644 --- a/modules/gui/src/python_shell/python_shell_widget.cc +++ b/modules/gui/src/python_shell/python_shell_widget.cc @@ -23,7 +23,6 @@ #include <iostream> #include <QApplication> -#include <QDebug> #include <QFontMetrics> #include <QClipboard> #include <QPainter> @@ -247,6 +246,40 @@ void PythonShellWidget::setup_state_machine_() true, new BlockStatusGuard(this,CODE_BLOCK_INCOMPLETE)); single_line->addTransition(tr3); + KeyEventTransition* keypad_enter1=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::NoModifier, + multiline_active_state_, + true); + single_line->addTransition(keypad_enter1); + connect(keypad_enter1,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter2=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::ShiftModifier, + multiline_active_state_, + true); + single_line->addTransition(keypad_enter2); + connect(keypad_enter2,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter3=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::MetaModifier, + multiline_active_state_, + true); + single_line->addTransition(keypad_enter3); + connect(keypad_enter3,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + + single_line->addTransition(new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Return, + Qt::ControlModifier, + multiline_active_state_, + false)); + // just to make OSX happy we also add the transitions with Meta (-> Ctrl o OSX) + single_line->addTransition(new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Return, + Qt::MetaModifier, + multiline_active_state_, + false)); + connect(tr3,SIGNAL(triggered()),this,SLOT(OnEnterTransition())); single_line->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Up,DNG_ARROW_MODIFIERS,history_up)); single_line->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Down,DNG_ARROW_MODIFIERS,history_down)); @@ -271,6 +304,38 @@ void PythonShellWidget::setup_state_machine_() multi_line_inactive->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Return,Qt::ControlModifier,multiline_active_state_)); multi_line_inactive->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Up,DNG_ARROW_MODIFIERS,history_up)); multi_line_inactive->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Down,DNG_ARROW_MODIFIERS,history_down)); + KeyEventTransition* keypad_enter4=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::NoModifier, + multiline_active_state_, + true); + multi_line_inactive->addTransition(keypad_enter4); + connect(keypad_enter4,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter5=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::ShiftModifier, + multiline_active_state_, + true); + multi_line_inactive->addTransition(keypad_enter5); + connect(keypad_enter5,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter6=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::MetaModifier, + multiline_active_state_, + true); + multi_line_inactive->addTransition(keypad_enter6); + connect(keypad_enter6,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + multi_line_inactive->addTransition(new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Return, + Qt::ControlModifier, + multiline_active_state_, + false)); + // just to make OSX happy we also add the transitions with Meta (-> Ctrl o OSX) + multi_line_inactive->addTransition(new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Return, + Qt::MetaModifier, + multiline_active_state_, + false)); KeyEventTransition* tr7=new KeyEventTransition(QEvent::KeyPress, Qt::Key_Return, @@ -291,6 +356,27 @@ void PythonShellWidget::setup_state_machine_() multiline_active_state_->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Escape,Qt::NoModifier,multi_line_inactive)); multiline_active_state_->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Up,Qt::ControlModifier | DNG_ARROW_MODIFIERS,history_up)); multiline_active_state_->addTransition(new KeyEventTransition(QEvent::KeyPress,Qt::Key_Down,Qt::ControlModifier | DNG_ARROW_MODIFIERS,history_down)); + KeyEventTransition* keypad_enter7=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::NoModifier, + multiline_active_state_, + true); + multiline_active_state_->addTransition(keypad_enter7); + connect(keypad_enter7,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter8=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::ShiftModifier, + multiline_active_state_, + true); + multiline_active_state_->addTransition(keypad_enter8); + connect(keypad_enter8,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); + KeyEventTransition* keypad_enter9=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Enter, + Qt::MetaModifier, + multiline_active_state_, + true); + multiline_active_state_->addTransition(keypad_enter9); + connect(keypad_enter9,SIGNAL(triggered()),this,SLOT(OnKeypadEnterTransition())); history_up->addTransition(new AutomaticTransition(multi_line_inactive,new HistoryGuard(&history_,EDITMODE_MULTILINE_INACTIVE))); history_up->addTransition(new AutomaticTransition(single_line,new HistoryGuard(&history_,EDITMODE_SINGLELINE))); @@ -330,6 +416,10 @@ void PythonShellWidget::OnMixedToReadwrite() } +void PythonShellWidget::OnKeypadEnterTransition() +{ + insertPlainText(QString(QChar::LineSeparator)); +} void PythonShellWidget::OnEnterTransition() { QTextCursor cursor=textCursor(); @@ -382,13 +472,13 @@ void PythonShellWidget::OnExecuteStateEntered() set_block_type_(block_edit_start_,textCursor().block(),BLOCKTYPE_CODE); insertPlainText(QString(QChar::ParagraphSeparator)); QString command=GetCommand(); - unsigned int id=PythonInterpreter::Instance().RunCommand(command); - output_blocks_.insert(id,textCursor().block()); - command=command.trimmed(); - if (command.size()>0) { - history_.AppendCommand(command,get_block_edit_mode_()); + QString command_trimmed=command.trimmed(); + if (command_trimmed.size()>0) { + unsigned int id=PythonInterpreter::Instance().RunCommand(command); + output_blocks_.insert(id,textCursor().block()); + history_.AppendCommand(command_trimmed,get_block_edit_mode_()); + insertPlainText(QString(QChar::ParagraphSeparator)); } - insertPlainText(QString(QChar::ParagraphSeparator)); block_edit_start_=textCursor().block(); } @@ -439,11 +529,12 @@ void PythonShellWidget::InsertCompletion(const QString& completion) } void PythonShellWidget::InsertPathCompletion(const QString& completion) { - InsertCompletion(completion); + QString path=completion; // append dir separator for directories if none present (Windows adds it already for the inline completion) - if(QFileInfo(completion).isDir() && ! completion.endsWith(QDir::separator())){ - textCursor().insertText(QDir::separator()); + if(QFileInfo(path).isDir() && ! completion.endsWith(QDir::separator())){ + path+=QDir::separator(); } + InsertCompletion(QDir::toNativeSeparators(path)); } diff --git a/modules/gui/src/python_shell/python_shell_widget.hh b/modules/gui/src/python_shell/python_shell_widget.hh index 60a3ba30da460127afa8a49d9d75e93e4085f512..364e60bb775c589c86648883125100b9775002f3 100644 --- a/modules/gui/src/python_shell/python_shell_widget.hh +++ b/modules/gui/src/python_shell/python_shell_widget.hh @@ -81,6 +81,7 @@ public slots: void OnHistoryDownStateEntered(); void OnExecuteStateEntered(); void OnEnterTransition(); + void OnKeypadEnterTransition(); void OnReadonlyEntered(); void OnReadwriteEntered(); void OnMixedToReadwrite();