author | wazlaf <wazlaf> | 2002-10-13 13:49:11 (UTC) |
---|---|---|
committer | wazlaf <wazlaf> | 2002-10-13 13:49:11 (UTC) |
commit | 68c37a3412ef4609ba0209318ef2b06f7dd1aaf1 (patch) (side-by-side diff) | |
tree | f81ee5460dd49c4fcb8a61bf50911c5036742bed | |
parent | 0e6d241e26211a8ffff07ba8e23f4a3cec9065be (diff) | |
download | opie-68c37a3412ef4609ba0209318ef2b06f7dd1aaf1.zip opie-68c37a3412ef4609ba0209318ef2b06f7dd1aaf1.tar.gz opie-68c37a3412ef4609ba0209318ef2b06f7dd1aaf1.tar.bz2 |
Scripting functionality added. What this currently does is catch keys in the emulation_layer
and store them in a "Script" instance. This can later be saved to a file and on request
"replayed" by sending the typed keys to the associated IOLayer
-rw-r--r-- | noncore/apps/opie-console/emulation_layer.cpp | 36 | ||||
-rw-r--r-- | noncore/apps/opie-console/emulation_layer.h | 19 | ||||
-rw-r--r-- | noncore/apps/opie-console/mainwindow.cpp | 56 | ||||
-rw-r--r-- | noncore/apps/opie-console/mainwindow.h | 8 | ||||
-rw-r--r-- | noncore/apps/opie-console/opie-console.pro | 4 | ||||
-rw-r--r-- | noncore/apps/opie-console/script.cpp | 30 | ||||
-rw-r--r-- | noncore/apps/opie-console/script.h | 30 |
7 files changed, 178 insertions, 5 deletions
diff --git a/noncore/apps/opie-console/emulation_layer.cpp b/noncore/apps/opie-console/emulation_layer.cpp index 5baf05c..265c11f 100644 --- a/noncore/apps/opie-console/emulation_layer.cpp +++ b/noncore/apps/opie-console/emulation_layer.cpp @@ -104,12 +104,13 @@ EmulationLayer::EmulationLayer( WidgetLayer* gui ) screen[1] = new Screen(gui->lines(),gui->columns()); scr = screen[0]; bulk_nlcnt = 0; // reset bulk newline counter bulk_incnt = 0; // reset bulk counter connected = FALSE; + m_script = 0; QObject::connect(&bulk_timer, SIGNAL( timeout() ), this, SLOT( showBulk() ) ); QObject::connect(gui,SIGNAL( imageSizeChanged( int, int ) ), this,SLOT( onImageSizeChange( int, int ) ) ); QObject::connect(gui,SIGNAL( changedHistoryCursor( int ) ), this,SLOT( historyCursorChange( int ) ) ); @@ -129,12 +130,14 @@ EmulationLayer::EmulationLayer( WidgetLayer* gui ) */ EmulationLayer::~EmulationLayer() { delete screen[0]; delete screen[1]; + if (isRecording()) + clearScript(); bulk_timer.stop(); } /*! change between primary and alternate screen */ @@ -225,12 +228,16 @@ void EmulationLayer::onKeyPress( QKeyEvent* ev ) } else if (ev->ascii()>0) { QByteArray c = QByteArray( 1 ); c.at( 0 ) = ev->ascii(); // ibot: qbytearray is emited not char* + + /* Are we currently recording a script? If so, store the typed character */ + if (isRecording()) + m_script->appendString(ev->text()); emit sndBlock( (QByteArray) c ); } } // Unblocking, Byte to Unicode translation --------------------------------- -- @@ -251,12 +258,41 @@ void EmulationLayer::onRcvBlock(const QByteArray &s ) onRcvChar(result[j].unicode()); if (s[i] == '\n') bulkNewline(); } bulkEnd(); } +// Scripts ----------------------------------------------------------------- -- + + +Script *EmulationLayer::script() { + return m_script; +} + +bool EmulationLayer::isRecording() { + return (m_script != 0); +} + +void EmulationLayer::startRecording() { + if (!isRecording()) + m_script = new Script(); +} + +void EmulationLayer::clearScript() { + if (isRecording()) { + + } +} + +void EmulationLayer::runScript(const Script *script) { + QByteArray a = QByteArray(); + QString str = script->script(); + a.setRawData(str.ascii(), str.length()); + emit sndBlock(a); +} + // Selection --------------------------------------------------------------- -- void EmulationLayer::onSelectionBegin(const int x, const int y) { if (!connected) return; scr->setSelBeginXY(x,y); showBulk(); diff --git a/noncore/apps/opie-console/emulation_layer.h b/noncore/apps/opie-console/emulation_layer.h index 91a4856..928ad04 100644 --- a/noncore/apps/opie-console/emulation_layer.h +++ b/noncore/apps/opie-console/emulation_layer.h @@ -29,12 +29,13 @@ #include "widget_layer.h" #include "screen.h" #include <qtimer.h> #include <stdio.h> #include <qtextcodec.h> #include "keytrans.h" +#include "script.h" class EmulationLayer : public QObject { Q_OBJECT public: @@ -101,12 +102,28 @@ public: virtual void setConnect(bool r); void setColumns(int columns); void setKeytrans(int no); void setKeytrans(const char * no); + /* Scripts */ + + /* Create a new script and record all typed characters */ + void startRecording(); + + /* Return whether we are currently recording a script */ + bool isRecording(); + + /* Return the current script (or NULL) */ + Script *script(); + + /* Stop recording and remove the current script from memory */ + void clearScript(); + + /* Run a script by forwarding its keys to the EmulationLayer */ + void runScript(const Script *); protected: WidgetLayer* gui; Screen* scr; // referes to one `screen' Screen* screen[2]; // 0 = primary, 1 = alternate void setScreen(int n); // set `scr' to `screen[n]' @@ -136,11 +153,11 @@ private: private: QTimer bulk_timer; int bulk_nlcnt; // bulk newline counter char* SelectedText; int bulk_incnt; // bulk counter - + Script *m_script; }; #endif // ifndef EMULATION_H diff --git a/noncore/apps/opie-console/mainwindow.cpp b/noncore/apps/opie-console/mainwindow.cpp index 8f5d56b..46c5bed 100644 --- a/noncore/apps/opie-console/mainwindow.cpp +++ b/noncore/apps/opie-console/mainwindow.cpp @@ -2,24 +2,25 @@ #include <qaction.h> #include <qmenubar.h> #include <qlabel.h> #include <qpopupmenu.h> #include <qtoolbar.h> #include <qpe/resource.h> - +#include <opie/ofiledialog.h> #include "profileeditordialog.h" #include "configdialog.h" #include "default.h" #include "metafactory.h" #include "profile.h" #include "profilemanager.h" #include "mainwindow.h" #include "tabwidget.h" #include "transferdialog.h" #include "function_keyboard.h" +#include "script.h" MainWindow::MainWindow() { m_factory = new MetaFactory(); Default def(m_factory); m_sessions.setAutoDelete( TRUE ); m_curSession = 0; @@ -35,12 +36,13 @@ void MainWindow::initUI() { /* tool bar for the menu */ m_tool = new QToolBar( this ); m_tool->setHorizontalStretchable( TRUE ); m_bar = new QMenuBar( m_tool ); m_console = new QPopupMenu( this ); + m_scripts = new QPopupMenu( this ); m_sessionsPop= new QPopupMenu( this ); m_settings = new QPopupMenu( this ); /* add a toolbar for icons */ m_icons = new QToolBar(this); @@ -103,12 +105,27 @@ void MainWindow::initUI() { m_setProfiles->addTo( m_settings ); m_setProfiles->addTo( m_icons ); connect( m_setProfiles, SIGNAL(activated() ), this, SLOT(slotConfigure() ) ); /* + * script actions + */ + m_recordScript = new QAction(tr("Record Script"), QString::null, 0, this, 0); + m_recordScript->addTo(m_scripts); + connect(m_recordScript, SIGNAL(activated()), this, SLOT(slotRecordScript())); + + m_saveScript = new QAction(tr("Save Script"), QString::null, 0, this, 0); + m_saveScript->addTo(m_scripts); + connect(m_saveScript, SIGNAL(activated()), this, SLOT(slotSaveScript())); + + m_runScript = new QAction(tr("Run Script"), QString::null, 0, this, 0); + m_runScript->addTo(m_scripts); + connect(m_runScript, SIGNAL(activated()), this, SLOT(slotRunScript())); + + /* * action that open/closes the keyboard */ m_openKeys = new QAction (tr("Open Keyboard..."), Resource::loadPixmap( "down" ), QString::null, 0, this, 0); @@ -123,12 +140,15 @@ void MainWindow::initUI() { m_console->insertItem(tr("New from Profile"), m_sessionsPop, -1, 0); /* insert the connection menu */ m_bar->insertItem( tr("Connection"), m_console ); + /* the scripts menu */ + m_bar->insertItem( tr("Scripts"), m_scripts ); + /* the settings menu */ m_bar->insertItem( tr("Settings"), m_settings ); /* and the keyboard */ m_keyBar = new QToolBar(this); addToolBar( m_keyBar, "Keyboard", QMainWindow::Top, TRUE ); @@ -186,12 +206,46 @@ void MainWindow::slotNew() { if ( ret == QDialog::Accepted ) { create( dlg.profile() ); } } +void MainWindow::slotRecordScript() { + if (currentSession()) { + currentSession()->emulationLayer()->startRecording(); + } +} + +void MainWindow::slotSaveScript() { + if (currentSession() && currentSession()->emulationLayer()->isRecording()) { + MimeTypes types; + QStringList script; + script << "text/plain"; + types.insert("Script", script); + QString filename = OFileDialog::getSaveFileName(2, "/", QString::null, types); + if (!filename.isEmpty()) { + currentSession()->emulationLayer()->script()->saveTo(filename); + currentSession()->emulationLayer()->clearScript(); + } + } +} + +void MainWindow::slotRunScript() { + if (currentSession()) { + MimeTypes types; + QStringList script; + script << "text/plain"; + types.insert("Script", script); + QString filename = OFileDialog::getOpenFileName(2, "/", QString::null, types); + if (!filename.isEmpty()) { + Script script(DocLnk(filename).file()); + currentSession()->emulationLayer()->runScript(&script); + } + } +} + void MainWindow::slotConnect() { if ( currentSession() ) currentSession()->layer()->open(); } void MainWindow::slotDisconnect() { diff --git a/noncore/apps/opie-console/mainwindow.h b/noncore/apps/opie-console/mainwindow.h index 73bb285..94144a4 100644 --- a/noncore/apps/opie-console/mainwindow.h +++ b/noncore/apps/opie-console/mainwindow.h @@ -56,13 +56,15 @@ private slots: void slotTerminate(); void slotConfigure(); void slotClose(); void slotProfile(int); void slotTransfer(); void slotOpenKeb(bool); - + void slotRecordScript(); + void slotSaveScript(); + void slotRunScript(); private: void initUI(); void populateProfiles(); void create( const Profile& ); /** * the current session @@ -85,18 +87,22 @@ private: QToolBar* m_icons; QToolBar* m_keyBar; QMenuBar* m_bar; QPopupMenu* m_console; QPopupMenu* m_settings; QPopupMenu* m_sessionsPop; + QPopupMenu* m_scripts; QAction* m_connect; QAction* m_disconnect; QAction* m_terminate; QAction* m_transfer; QAction* m_setProfiles; QAction* m_openKeys; + QAction* m_recordScript; + QAction* m_saveScript; + QAction* m_runScript; FunctionKeyboard *m_kb; }; #endif diff --git a/noncore/apps/opie-console/opie-console.pro b/noncore/apps/opie-console/opie-console.pro index b07f10a..8e39a48 100644 --- a/noncore/apps/opie-console/opie-console.pro +++ b/noncore/apps/opie-console/opie-console.pro @@ -27,13 +27,13 @@ HEADERS = io_layer.h io_serial.h io_irda.h io_bt.h\ terminalwidget.h \ iolayerbase.h \ serialconfigwidget.h irdaconfigwidget.h \ btconfigwidget.h modemconfigwidget.h \ atconfigdialog.h dialdialog.h \ emulation_widget.h procctl.h \ - function_keyboard.h + function_keyboard.h script.h SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ file_layer.cpp filetransfer.cpp \ main.cpp \ metafactory.cpp \ session.cpp \ @@ -55,13 +55,13 @@ SOURCES = io_layer.cpp io_serial.cpp io_irda.cpp io_bt.cpp \ terminalwidget.cpp \ iolayerbase.cpp \ serialconfigwidget.cpp irdaconfigwidget.cpp \ btconfigwidget.cpp modemconfigwidget.cpp \ atconfigdialog.cpp dialdialog.cpp \ emulation_widget.cpp default.cpp procctl.cpp \ - function_keyboard.cpp + function_keyboard.cpp script.cpp INTERFACES = configurebase.ui editbase.ui INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie TARGET = opie-console diff --git a/noncore/apps/opie-console/script.cpp b/noncore/apps/opie-console/script.cpp new file mode 100644 index 0000000..a09fab6 --- a/dev/null +++ b/noncore/apps/opie-console/script.cpp @@ -0,0 +1,30 @@ +#include <qfile.h> +#include <qtextstream.h> +#include "script.h" + +Script::Script() { +} + +Script::Script(const QString fileName) { + QFile file(fileName); + QTextStream stream(&file); + while (!stream.atEnd()) { + appendString(stream.readLine()); + } +} + +void Script::saveTo(const QString fileName) const { + QFile file(fileName); + file.open(IO_WriteOnly); + file.writeBlock(m_script.ascii(), m_script.length()); + file.close(); +} + + +void Script::appendString(const QString string) { + m_script += string; +} + +QString Script::script() const { + return m_script; +} diff --git a/noncore/apps/opie-console/script.h b/noncore/apps/opie-console/script.h new file mode 100644 index 0000000..dc2351b --- a/dev/null +++ b/noncore/apps/opie-console/script.h @@ -0,0 +1,30 @@ +#ifndef CONSOLE_SCRIPT_H +#define CONSOLE_SCRIPT_H + +#include <qstring.h> + +/* Very simple scripting - this class stores keys received + * by emulation_layer */ + +class Script { +public: + /* Construct an empty script */ + Script(); + + /* Load a script from a text file */ + Script(const QString fileName); + + /* Append a line to the script */ + void appendString(const QString string); + + /* Save this script to a file */ + void saveTo(const QString fileName) const; + + /* Return the script's content */ + QString script() const; +protected: + QString m_script; +}; + + +#endif /* CONSOLE_SCRIPT_H */ |