diff --git a/modules/gui/src/python_shell/output_redirector.cc b/modules/gui/src/python_shell/output_redirector.cc index ec052e0d3a34330d79b6b13124578d91b84d09cd..fa72516c4b37b3d70608ba558ea6cd0bff892df4 100644 --- a/modules/gui/src/python_shell/output_redirector.cc +++ b/modules/gui/src/python_shell/output_redirector.cc @@ -28,18 +28,37 @@ namespace ost { namespace gui { OutputRedirector::OutputRedirector(): - QObject() + QObject(), + buffer_(), + timer_() { } void OutputRedirector::Write( String const& str ) { - //buffer_.append(str); - emit OnOutput(QString::fromStdString(str)); + if(timer_.isValid()){ + if(timer_.elapsed()>1000){ + QString output = buffer_+QString::fromStdString(str); + buffer_=""; + emit OnOutput(output); + timer_.restart(); + }else{ + buffer_+=QString::fromStdString(str); + } + }else{ + buffer_+=QString::fromStdString(str); + timer_.start(); + } +} +void OutputRedirector::Flush() +{ + timer_=QTime(); + QString output = buffer_; + buffer_=""; + emit OnOutput(output); } -String OutputRedirector::buffer_; diff --git a/modules/gui/src/python_shell/output_redirector.hh b/modules/gui/src/python_shell/output_redirector.hh index c19426505339b2be7eec2959984217328df92775..7a1217297a7ea7113917d3a71d620d723469e77b 100644 --- a/modules/gui/src/python_shell/output_redirector.hh +++ b/modules/gui/src/python_shell/output_redirector.hh @@ -26,6 +26,7 @@ Author: Andreas Schenk */ +#include <QTime> #include <QString> #include <QObject> #include <ost/gui/module_config.hh> @@ -38,10 +39,12 @@ Q_OBJECT public: OutputRedirector(); void Write(const String& str); + void Flush(); signals: void OnOutput(const QString& output); private: - static String buffer_; + QString buffer_; + QTime timer_; }; }}//ns diff --git a/modules/gui/src/python_shell/python_interpreter_worker.cc b/modules/gui/src/python_shell/python_interpreter_worker.cc index 8f1688804c2013406cf2a093be0431c5d665873a..494df6c0bca61cd5b4a67791d55128c7d27a5ab9 100644 --- a/modules/gui/src/python_shell/python_interpreter_worker.cc +++ b/modules/gui/src/python_shell/python_interpreter_worker.cc @@ -93,6 +93,8 @@ void PythonInterpreterWorker::run_command_(std::pair<unsigned int,QString> pair) } else { bp::exec(bp::str(command.toStdString()),main_namespace_,main_namespace_); } + output_redirector_->Flush(); + error_redirector_->Flush(); emit Finished(pair.first,true); return; }catch(bp::error_already_set){ @@ -103,6 +105,8 @@ void PythonInterpreterWorker::run_command_(std::pair<unsigned int,QString> pair) PyErr_Print(); } } + output_redirector_->Flush(); + error_redirector_->Flush(); emit Finished(pair.first,false); return; } diff --git a/modules/gui/src/python_shell/python_shell_widget.cc b/modules/gui/src/python_shell/python_shell_widget.cc index 534afecdab0c6cb0078f9be26bef2d83afda8496..e41fa8a1e8a8c00eea7f8c7e5fac8f633898be51 100644 --- a/modules/gui/src/python_shell/python_shell_widget.cc +++ b/modules/gui/src/python_shell/python_shell_widget.cc @@ -115,27 +115,90 @@ PythonShellWidget::PythonShellWidget(QWidget* parent): void PythonShellWidget::setup_readonly_state_machine_() { State* readonly=new State; + State* mixed=new State; + readonly_machine_->addState(mixed); readonly_machine_->addState(readonly); readonly_machine_->addState(readwrite_state_); - readonly->addTransition((new SignalTransition(this, + readonly->addTransition(new SignalTransition(this, SIGNAL(cursorPositionChanged()), readwrite_state_, - new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER)))); - readonly->addTransition((new KeyEventTransition(QEvent::KeyPress, + new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER, + EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER))); + readonly->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + mixed, + new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER, + EditPositionGuard::ANCHORSMALLER))); + readonly->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + mixed, + new EditPositionGuard(this,EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER, + EditPositionGuard::SMALLER))); + + readonly->addTransition(new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Backspace, + Qt::NoModifier, + readwrite_state_, + true)); + + readonly->addTransition(new KeyEventTransition(QEvent::KeyPress, Qt::Key_Any, Qt::NoModifier, readwrite_state_, - false))); - readwrite_state_->addTransition((new SignalTransition(this, + false)); + + readwrite_state_->addTransition(new SignalTransition(this, SIGNAL(cursorPositionChanged()), readonly, - new EditPositionGuard(this,EditPositionGuard::SMALLER)))); - readwrite_state_->addTransition((new KeyEventTransition(QEvent::KeyPress, + new EditPositionGuard(this,EditPositionGuard::SMALLER | EditPositionGuard::EQUAL, + EditPositionGuard::ANCHORSMALLER))); + readwrite_state_->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + readonly, + new EditPositionGuard(this,EditPositionGuard::ANCHORSMALLER | EditPositionGuard::ANCHOREQUAL, + EditPositionGuard::SMALLER))); + + readwrite_state_->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + mixed, + new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER, + EditPositionGuard::ANCHORSMALLER))); + readwrite_state_->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + mixed, + new EditPositionGuard(this,EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER, + EditPositionGuard::SMALLER))); + + readwrite_state_->addTransition(new KeyEventTransition(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier, readwrite_state_, true, - new EditPositionGuard(this,EditPositionGuard::EQUAL|EditPositionGuard::SELECTION)))); + new EditPositionGuard(this,EditPositionGuard::EQUAL, + EditPositionGuard::ANCHOREQUAL))); + + mixed->addTransition(new SignalTransition(this, + SIGNAL(cursorPositionChanged()), + readwrite_state_, + new EditPositionGuard(this,EditPositionGuard::EQUAL |EditPositionGuard::BIGGER, + EditPositionGuard::ANCHOREQUAL |EditPositionGuard::ANCHORBIGGER))); + + KeyEventTransition* kt1=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Backspace, + Qt::NoModifier, + readwrite_state_, + true); + mixed->addTransition(kt1); + connect(kt1,SIGNAL(triggered()),this,SLOT(OnMixedToReadwrite())); + + KeyEventTransition* kt2=new KeyEventTransition(QEvent::KeyPress, + Qt::Key_Any, + Qt::NoModifier, + readwrite_state_, + false); + mixed->addTransition(kt2); + connect(kt2,SIGNAL(triggered()),this,SLOT(OnMixedToReadwrite())); + connect(readonly,SIGNAL(entered()),this,SLOT(OnReadonlyEntered())); connect(readwrite_state_,SIGNAL(entered()),this,SLOT(OnReadwriteEntered())); readonly_machine_->setInitialState(readwrite_state_); @@ -253,6 +316,19 @@ void PythonShellWidget::OnReadwriteEntered() } setReadOnly(false); } +void PythonShellWidget::OnMixedToReadwrite() +{ + QTextCursor tc=textCursor(); + if(tc.position()< GetEditStartBlock().position()){ + tc.setPosition(GetEditStartBlock().position(),QTextCursor::KeepAnchor); + setTextCursor(tc); + }else{ + tc.setPosition(GetEditStartBlock().position(),QTextCursor::MoveAnchor); + tc.setPosition(textCursor().position(),QTextCursor::KeepAnchor); + setTextCursor(tc); + } + +} void PythonShellWidget::OnEnterTransition() { diff --git a/modules/gui/src/python_shell/python_shell_widget.hh b/modules/gui/src/python_shell/python_shell_widget.hh index 3bcb20f77191ebd52a4bbc671584c64a41bc8c77..60a3ba30da460127afa8a49d9d75e93e4085f512 100644 --- a/modules/gui/src/python_shell/python_shell_widget.hh +++ b/modules/gui/src/python_shell/python_shell_widget.hh @@ -83,6 +83,7 @@ public slots: void OnEnterTransition(); void OnReadonlyEntered(); void OnReadwriteEntered(); + void OnMixedToReadwrite(); protected: virtual void mouseReleaseEvent (QMouseEvent* event ); diff --git a/modules/gui/src/python_shell/transition_guard.cc b/modules/gui/src/python_shell/transition_guard.cc index 765cb5f67d359ab718f08f343a8601016e6655fe..c32898964cf3a17c7375b5824b9fa0343cd538e1 100644 --- a/modules/gui/src/python_shell/transition_guard.cc +++ b/modules/gui/src/python_shell/transition_guard.cc @@ -27,27 +27,43 @@ bool HistoryGuard::check() return history_->GetCommandMode()==mode_; } -EditPositionGuard::EditPositionGuard(PythonShellWidget* shell, int flags): +EditPositionGuard::EditPositionGuard(PythonShellWidget* shell, int flags1, int flags2): TransitionGuard(), shell_(shell), - flags_(flags) + flags1_(flags1), + flags2_(flags2) { } bool EditPositionGuard::check() { + return check_flag(flags1_) && check_flag(flags2_); +} + +bool EditPositionGuard::check_flag(int flags) +{ + if(flags==0){ + return true; + } bool returnflag=false; QTextCursor tc=shell_->textCursor(); - if(flags_ & SMALLER){ - returnflag|=tc.selectionStart()<shell_->GetEditStartBlock().position(); + if(flags & SMALLER){ + returnflag|=tc.position()<shell_->GetEditStartBlock().position(); + } + if(flags & EQUAL){ + returnflag|=tc.position()==shell_->GetEditStartBlock().position(); } - if(flags_ & EQUAL){ - if (!(flags_ & SELECTION && tc.hasSelection())) { - returnflag|=tc.selectionStart()==shell_->GetEditStartBlock().position(); - } + if(flags & BIGGER){ + returnflag |= tc.position()> shell_->GetEditStartBlock().position(); } - if(flags_ & BIGGER){ - returnflag |= tc.selectionStart()> shell_->GetEditStartBlock().position(); + if(flags & ANCHORSMALLER){ + returnflag|=tc.anchor()<shell_->GetEditStartBlock().position(); + } + if(flags & ANCHOREQUAL){ + returnflag|=tc.anchor()==shell_->GetEditStartBlock().position(); + } + if(flags & ANCHORBIGGER){ + returnflag |= tc.anchor()> shell_->GetEditStartBlock().position(); } return returnflag; } @@ -64,4 +80,7 @@ bool BlockStatusGuard::check() QString command=shell_->GetCommand(); return PythonInterpreter::Instance().GetCodeBlockStatus(command) & status_; } + + + }} //ns diff --git a/modules/gui/src/python_shell/transition_guard.hh b/modules/gui/src/python_shell/transition_guard.hh index 5ae202ca56a8131fc1e3589ffd8c63d330602c4e..e9534326db06414c167b617bd67d53e437b13dea 100644 --- a/modules/gui/src/python_shell/transition_guard.hh +++ b/modules/gui/src/python_shell/transition_guard.hh @@ -38,16 +38,21 @@ class EditPositionGuard : public TransitionGuard { public: enum FLAGS{ + ALWAYSTRUE=0, SMALLER=1, EQUAL=2, BIGGER=4, - SELECTION=8 + ANCHORSMALLER=8, + ANCHOREQUAL=16, + ANCHORBIGGER=32 }; - EditPositionGuard(PythonShellWidget* shell,int flags); + EditPositionGuard(PythonShellWidget* shell,int flags1, int flags2=ALWAYSTRUE); virtual bool check(); protected: + virtual bool check_flag(int flag); PythonShellWidget* shell_; - int flags_; + int flags1_; + int flags2_; }; class BlockStatusGuard : public TransitionGuard @@ -60,6 +65,8 @@ protected: int status_; }; + + }} //ns