diff options
-rw-r--r-- | src/codeeditor.cc | 47 | ||||
-rw-r--r-- | src/codeeditor.h | 28 | ||||
-rw-r--r-- | src/kaiman.cc | 26 | ||||
-rw-r--r-- | src/luascript.cc | 673 | ||||
-rw-r--r-- | src/luascript.h | 66 | ||||
-rw-r--r-- | src/mainwindow.cc | 72 | ||||
-rw-r--r-- | src/mainwindow.h | 25 | ||||
-rw-r--r-- | src/outputwindow.cc | 317 | ||||
-rw-r--r-- | src/outputwindow.h | 72 | ||||
-rw-r--r-- | src/soundplayer.cc | 158 | ||||
-rw-r--r-- | src/soundplayer.h | 36 |
11 files changed, 798 insertions, 722 deletions
diff --git a/src/codeeditor.cc b/src/codeeditor.cc index 44b0e9b..d639953 100644 --- a/src/codeeditor.cc +++ b/src/codeeditor.cc @@ -60,13 +60,12 @@ CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent) highlightCurrentLine(); } - - int CodeEditor::lineNumberAreaWidth() { int digits = 1; int max = qMax(1, blockCount()); - while (max >= 10) { + while(max >= 10) + { max /= 10; ++digits; } @@ -76,44 +75,43 @@ int CodeEditor::lineNumberAreaWidth() return space; } - - void CodeEditor::updateLineNumberAreaWidth(int /* newBlockCount */) { setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); } - - void CodeEditor::updateLineNumberArea(const QRect &rect, int dy) { - if (dy) + if(dy) + { lineNumberArea->scroll(0, dy); + } else + { lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height()); + } - if (rect.contains(viewport()->rect())) + if(rect.contains(viewport()->rect())) + { updateLineNumberAreaWidth(0); + } } - - void CodeEditor::resizeEvent(QResizeEvent *e) { QPlainTextEdit::resizeEvent(e); QRect cr = contentsRect(); lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), - cr.height())); + cr.height())); } - - void CodeEditor::highlightCurrentLine() { QList<QTextEdit::ExtraSelection> extraSelections; - if (!isReadOnly()) { + if(!isReadOnly()) + { QTextEdit::ExtraSelection selection; QColor lineColor = QColor(Qt::yellow).lighter(160); @@ -139,20 +137,27 @@ void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event) QPainter painter(lineNumberArea); painter.fillRect(event->rect(), Qt::lightGray); - QTextBlock block = firstVisibleBlock(); int blockNumber = block.blockNumber(); int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top(); int bottom = top + (int) blockBoundingRect(block).height(); - while (block.isValid() && top <= event->rect().bottom()) { - if (block.isVisible() && bottom >= event->rect().top()) { + while(block.isValid() && top <= event->rect().bottom()) + { + if(block.isVisible() && bottom >= event->rect().top()) + { QString number = QString::number(blockNumber + 1); - if(blockNumber + 1 == lineNumber) painter.setPen(Qt::green); - else painter.setPen(Qt::black); + if(blockNumber + 1 == lineNumber) + { + painter.setPen(Qt::green); + } + else + { + painter.setPen(Qt::black); + } painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(), - Qt::AlignRight, number); + Qt::AlignRight, number); } block = block.next(); diff --git a/src/codeeditor.h b/src/codeeditor.h index 1f0274a..a470a52 100644 --- a/src/codeeditor.h +++ b/src/codeeditor.h @@ -39,9 +39,7 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - -#ifndef __CODEEDITOR_H__ -#define __CODEEDITOR_H__ +#pragma once #include <QPlainTextEdit> #include <QObject> @@ -53,11 +51,12 @@ class QWidget; class LineNumberArea; -class CodeEditor : public QPlainTextEdit +class CodeEditor + : public QPlainTextEdit { Q_OBJECT - public: +public: CodeEditor(QWidget *parent = 0); void lineNumberAreaPaintEvent(QPaintEvent *event); @@ -67,7 +66,7 @@ protected: void resizeEvent(QResizeEvent *event); public slots: - void runningLine(int lineno); + void runningLine(int lineno); private slots: void updateLineNumberAreaWidth(int newBlockCount); @@ -76,28 +75,29 @@ private slots: private: QWidget *lineNumberArea; - int lineNumber; + int lineNumber; }; - -class LineNumberArea : public QWidget +class LineNumberArea + : public QWidget { public: - LineNumberArea(CodeEditor *editor) : QWidget(editor) { + LineNumberArea(CodeEditor *editor) : QWidget(editor) + { codeEditor = editor; } - QSize sizeHint() const { + QSize sizeHint() const + { return QSize(codeEditor->lineNumberAreaWidth(), 0); } protected: - void paintEvent(QPaintEvent *event) { + void paintEvent(QPaintEvent *event) + { codeEditor->lineNumberAreaPaintEvent(event); } private: CodeEditor *codeEditor; }; - -#endif/*__CODEEDITOR_H__*/ diff --git a/src/kaiman.cc b/src/kaiman.cc index 75d3035..8a605e1 100644 --- a/src/kaiman.cc +++ b/src/kaiman.cc @@ -34,24 +34,24 @@ void __attribute__ ((constructor)) premain() { - printf("premain()\n"); - printf("locale: %s\n", setlocale(LC_ALL, "da_DK")); + printf("premain()\n"); + printf("locale: %s\n", setlocale(LC_ALL, "da_DK")); } int main(int argc, char *argv[]) { - if(argc != 2) { - printf("Usage: %s script\n", argv[0]); - return 1; - } + if(argc != 2) + { + printf("Usage: %s script\n", argv[0]); + return 1; + } - // QLocale::setDefault(QLocale(QLocale::Danish, QLocale::Denmark)); - - QApplication app(argc, argv); + // QLocale::setDefault(QLocale(QLocale::Danish, QLocale::Denmark)); - MainWindow wnd(argv[1]); - wnd.showMaximized(); + QApplication app(argc, argv); - return app.exec(); -} + MainWindow wnd(argv[1]); + wnd.showMaximized(); + return app.exec(); +} diff --git a/src/luascript.cc b/src/luascript.cc index ecbed53..e023a1d 100644 --- a/src/luascript.cc +++ b/src/luascript.cc @@ -31,6 +31,7 @@ // For atoi #include <stdlib.h> +#include <unistd.h> //#include "luautil.h" @@ -40,420 +41,474 @@ #define ERR(x, fmt...) printf(fmt) static int _debug(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - std::string msg = lua_tostring(L, lua_gettop(L)); +{ + + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + std::string msg = lua_tostring(L, lua_gettop(L)); - printf("%s\n", msg.c_str()); + printf("%s\n", msg.c_str()); - return 0; + return 0; } static int _forward(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - double x = lua_tonumber(L, lua_gettop(L)); +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + double x = lua_tonumber(L, lua_gettop(L)); - printf("forward %f\n", x); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + printf("forward %f\n", x); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - lua->out->forward(x * 5); + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } - return 0; + lua->out->forward(x * 5); + + return 0; } static int _coord(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } + + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } + + lua_pushnumber(L, lua->out->coordX()); + lua_pushnumber(L, lua->out->coordY()); + + return 2; +} + +static int _loadpen(lua_State *L) +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + const char *pen = lua_tostring(L, lua_gettop(L)); + + printf("load pen %s\n", pen); + + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } - lua_pushnumber(L, lua->out->coordX()); - lua_pushnumber(L, lua->out->coordY()); + lua->out->loadPen(pen); - return 2; + return 0; } -static int _loadpen(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - const char *pen = lua_tostring(L, lua_gettop(L)); +static int _speed(lua_State *L) +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + int x = lua_tonumber(L, lua_gettop(L)); + + printf("speed %d\n", x); - printf("load pen %s\n", pen); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } - lua->out->loadPen(pen); + lua->out->setSpeed(x); - return 0; + return 0; } -static int _speed(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - int x = lua_tonumber(L, lua_gettop(L)); +static int _sleep(lua_State *L) +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); - printf("speed %d\n", x); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + int s = lua_tonumber(L, lua_gettop(L)); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + printf("sleep %d\n", s); - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - lua->out->setSpeed(x); + lua->sleep(s); - return 0; + return 0; } static int _scale(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - double x = lua_tonumber(L, lua_gettop(L)); +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + double x = lua_tonumber(L, lua_gettop(L)); + + printf("scale %f\n", x); - printf("scale %f\n", x); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } - lua->out->setScale(x); + lua->out->setScale(x); - return 0; + return 0; } static int _colour(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - int r = luaL_checknumber(L, 1); - int g = luaL_checknumber(L, 2); - int b = luaL_checknumber(L, 3); - int a = luaL_checknumber(L, 4); - - printf("colour %d %d %d %d\n", r,b,g,a); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } - - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } - - lua->out->setColour(r,g,b,a); - - return 0; +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + int r = luaL_checknumber(L, 1); + int g = luaL_checknumber(L, 2); + int b = luaL_checknumber(L, 3); + int a = luaL_checknumber(L, 4); + + printf("colour %d %d %d %d\n", r,b,g,a); + + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } + + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } + + lua->out->setColour(r,g,b,a); + + return 0; } static int _turn(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - double x = lua_tonumber(L, lua_gettop(L)); +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); + + double x = lua_tonumber(L, lua_gettop(L)); - printf("turn %f\n", x); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + printf("turn %f\n", x); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(lua->lua_stop) { - printf("stopping...\n"); - lua_pushstring(L, "stop"); - lua_error(L); - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - lua->out->turn(-x * 10); + if(lua->lua_stop) + { + printf("stopping...\n"); + lua_pushstring(L, "stop"); + lua_error(L); + } - return 0; + lua->out->turn(-x * 10); + + return 0; } static int _playsound(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ - QString file = lua_tostring(L, lua_gettop(L)); +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + QString file = lua_tostring(L, lua_gettop(L)); - lua->playSound(file); + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - return 0; + lua->playSound(file); + + return 0; } static int _reset(lua_State *L) -{/* - Pracro::checkParameters(L, - Pracro::T_STRING, - Pracro::T_END); - */ +{ + //Pracro::checkParameters(L, + // Pracro::T_STRING, + // Pracro::T_END); - printf("reset\n"); + printf("reset\n"); - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return 1; - } + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } - if(lua->lua_stop) { - lua_pushstring(L, "stop"); - lua_error(L); - } + if(lua->lua_stop) + { + lua_pushstring(L, "stop"); + lua_error(L); + } - lua->out->reset(); + lua->out->reset(); - return 0; + return 0; } void hook(lua_State *L, lua_Debug *ar) { - lua_getinfo(L, "Snl", ar); - - lua_getglobal(L, GLOBAL_POINTER); - LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); - - if(!lua) { - lua_pushstring(L, "No LUA pointer!"); - lua_error(L); - return; - } - - // printf("kaiman file: %s\n", lua->file.toStdString().c_str()); - - if(lua->file == QString(ar->short_src)) { - // printf(" ---- currentline: %d\n", ar->currentline); - lua->lineChange(ar->currentline); - qApp->processEvents(); - } - /* - printf("HOOK:\n"); - printf(" what: %s\n", ar->what); - printf(" name: %s\n", ar->name); - printf(" source: %s\n", ar->source); - printf(" short_src: %s\n", ar->short_src); - printf(" currentline: %d\n", ar->currentline); - */ + lua_getinfo(L, "Snl", ar); + + lua_getglobal(L, GLOBAL_POINTER); + LUAScript *lua = (LUAScript*)lua_touserdata(L, lua_gettop(L)); + + if(!lua) + { + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return; + } + + //printf("kaiman file: %s\n", lua->file.toStdString().c_str()); + + if(lua->file == QString(ar->short_src)) + { + // printf(" ---- currentline: %d\n", ar->currentline); + lua->lineChange(ar->currentline); + qApp->processEvents(); + } + + //printf("HOOK:\n"); + //printf(" what: %s\n", ar->what); + //printf(" name: %s\n", ar->name); + //printf(" source: %s\n", ar->source); + //printf(" short_src: %s\n", ar->short_src); + //printf(" currentline: %d\n", ar->currentline); } LUAScript::LUAScript(OutputWindow *o, QString f) { - DEBUG(luascript, "LUAScript()\n"); - file = f; - L = NULL; - out = o; + DEBUG(luascript, "LUAScript()\n"); + file = f; + L = NULL; + out = o; - // Don't call init from here, it need to be done in the thread. + // Don't call init from here, it need to be done in the thread. - lua_stop = false; - lua_stopped = true; + lua_stop = true; + lua_stopped = true; } LUAScript::~LUAScript() { - DEBUG(luascript, "~LUAScript()\n"); + DEBUG(luascript, "~LUAScript()\n"); } void LUAScript::lineChange(int lineno) { - emit lineChanged(lineno); + emit lineChanged(lineno); } void LUAScript::init() - throw(Exception) { - if(L) return; - - L = luaL_newstate(); - if(L == NULL) { - ERR(luascript, "Could not create LUA state.\n"); - throw Exception("Could not create LUA state."); - } - - luaL_openlibs(L); - - lua_pushlightuserdata(L, this); // Push the pointer to 'this' instance - lua_setglobal(L, GLOBAL_POINTER); // Assign it to a global lua var. - - lua_register(L, "debug", _debug); - lua_register(L, "forward", _forward); - lua_register(L, "turn", _turn); - lua_register(L, "speed", _speed); - lua_register(L, "scale", _scale); - lua_register(L, "reset", _reset); - lua_register(L, "colour", _colour); - lua_register(L, "loadpen", _loadpen); - lua_register(L, "coord", _coord); - lua_register(L, "playsound", _playsound); - - lua_sethook(L, hook, LUA_MASKLINE, 0); + if(L) + { + return; + } + + L = luaL_newstate(); + if(L == NULL) + { + ERR(luascript, "Could not create LUA state.\n"); + throw Exception("Could not create LUA state."); + } + + luaL_openlibs(L); + + lua_pushlightuserdata(L, this); // Push the pointer to 'this' instance + lua_setglobal(L, GLOBAL_POINTER); // Assign it to a global lua var. + + lua_register(L, "debug", _debug); + lua_register(L, "forward", _forward); + lua_register(L, "turn", _turn); + lua_register(L, "speed", _speed); + lua_register(L, "scale", _scale); + lua_register(L, "reset", _reset); + lua_register(L, "colour", _colour); + lua_register(L, "loadpen", _loadpen); + lua_register(L, "coord", _coord); + lua_register(L, "playsound", _playsound); + lua_register(L, "sleep", _sleep); + + lua_sethook(L, hook, LUA_MASKLINE, 0); } void LUAScript::cleanup() { - if(L) { - lua_close(L); - L = NULL; - } + if(L) + { + lua_close(L); + L = NULL; + } } void LUAScript::run() { - lua_stopped = false; - try { - init(); - runScript(); - } catch(Exception &e) { - printf("LUA Error: %s\n", e.msg.c_str()); - } - cleanup(); - lua_stopped = true; - printf("LUA Thread Stopped!\n"); + lua_stopped = false; + try + { + init(); + runScript(); + } + catch(Exception &e) + { + printf("LUA Error: %s\n", e.msg.c_str()); + } + cleanup(); + lua_stopped = true; + printf("LUA Thread Stopped!\n"); } void LUAScript::playSound(QString file) { - player.playFile(file); + player.playFile(file); } void LUAScript::stopScript() { - lua_stop = true; - while(!lua_stopped) { - wait(25); - qApp->processEvents(); - printf("!\n"); - } + lua_stop = true; + while(!lua_stopped) + { + wait(25); + qApp->processEvents(); + printf("!\n"); + } } void LUAScript::runScript() - throw(Exception) { - lua_stop = false; - - try { - init(); - } catch(Exception &e) { - throw Exception(e.msg); - } - - if(L == NULL) { - ERR(luascript, "LUA state not initialized!"); - return; - } - - top = lua_gettop(L); - - // DEBUG(luascript, "Running %s\n", file); - - if(luaL_loadfile(L, file.toStdString().c_str())) { - ERR(luascript, "loadbuffer: %s\n", lua_tostring(L, lua_gettop(L))); - throw Exception(lua_tostring(L, lua_gettop(L))); - } - - // Run the loaded code - if(lua_pcall(L, 0, LUA_MULTRET, 0)) { - ERR(luascript, "pcall: %s\n" , lua_tostring(L, lua_gettop(L))); - throw Exception(lua_tostring(L, lua_gettop(L))); - } + lua_stop = false; + + try + { + init(); + } + catch(Exception &e) + { + throw Exception(e.msg); + } + + if(L == NULL) + { + ERR(luascript, "LUA state not initialized!"); + return; + } + + top = lua_gettop(L); + + // DEBUG(luascript, "Running %s\n", file); + + if(luaL_loadfile(L, file.toStdString().c_str())) + { + ERR(luascript, "loadbuffer: %s\n", lua_tostring(L, lua_gettop(L))); + throw Exception(lua_tostring(L, lua_gettop(L))); + } + + // Run the loaded code + if(lua_pcall(L, 0, LUA_MULTRET, 0)) + { + ERR(luascript, "pcall: %s\n" , lua_tostring(L, lua_gettop(L))); + throw Exception(lua_tostring(L, lua_gettop(L))); + } +} + +void LUAScript::sleep(int n) +{ + ::sleep(n); } diff --git a/src/luascript.h b/src/luascript.h index 93478df..c7ea9b7 100644 --- a/src/luascript.h +++ b/src/luascript.h @@ -25,8 +25,7 @@ * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __PRACRO_LUASCRIPT_H__ -#define __PRACRO_LUASCRIPT_H__ +#pragma once #include <lua.hpp> #include <lauxlib.h> @@ -40,54 +39,55 @@ #include <QThread> -class LUAScript : public QThread { -Q_OBJECT +class LUAScript + : public QThread +{ + Q_OBJECT public: - class Exception { - public: - Exception(std::string m) : msg(m) {} - std::string msg; - }; + class Exception + { + public: + Exception(std::string m) : msg(m) {} + std::string msg; + }; - LUAScript(OutputWindow *out, QString file); - ~LUAScript(); + LUAScript(OutputWindow *out, QString file); + ~LUAScript(); - void init() throw(Exception); - void cleanup(); + void init(); + void cleanup(); - void run(); - void runScript() throw(Exception); + void run(); + void runScript(); - OutputWindow *out; + OutputWindow *out; - void lineChange(int lineno); + void lineChange(int lineno); - void playSound(QString file); + void playSound(QString file); + void sleep(int n); - volatile bool lua_stop; - volatile bool lua_stopped; - QString file; + volatile bool lua_stop; + volatile bool lua_stopped; + QString file; public slots: - void stopScript(); + void stopScript(); signals: - void reset(); - void lineChanged(int lineno); + void reset(); + void lineChanged(int lineno); protected: - lua_State *L; + lua_State *L; private: - std::vector<std::pair<std::string, std::string> > scripts; - std::map<std::string, std::string> values; + std::vector<std::pair<std::string, std::string> > scripts; + std::map<std::string, std::string> values; - int top; + int top; - bool running; + bool running; - SoundPlayer player; + SoundPlayer player; }; - - -#endif/*__PRACRO_LUASCRIPT_H__*/ diff --git a/src/mainwindow.cc b/src/mainwindow.cc index 8271eb6..bd52c0c 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -37,53 +37,51 @@ MainWindow::MainWindow(QString p) { - program = p; + program = p; - /* // Watch file on disk? - connect(&watcher, SIGNAL(fileChanged(const QString &)), - this, SLOT(reset())); + // Watch file on disk? + //connect(&watcher, SIGNAL(fileChanged(const QString &)), + // this, SLOT(reset())); + //watcher.addPath(program); - watcher.addPath(program); - */ + QSplitter *splitter = new QSplitter(); + setCentralWidget(splitter); - QSplitter *splitter = new QSplitter(); - setCentralWidget(splitter); + editor = new CodeEditor(); + splitter->addWidget(editor); + QFile file(program); + file.open(QIODevice::ReadOnly); + editor->setPlainText(file.readAll()); + file.close(); - editor = new CodeEditor(); - splitter->addWidget(editor); - QFile file(program); - file.open(QIODevice::ReadOnly); - editor->setPlainText(file.readAll()); - file.close(); + out = new OutputWindow(); + splitter->addWidget(out); - out = new OutputWindow(); - splitter->addWidget(out); + l = new LUAScript(out, program); + connect(l, SIGNAL(lineChanged(int)), editor, SLOT(runningLine(int))); - l = new LUAScript(out, program); - connect(l, SIGNAL(lineChanged(int)), editor, SLOT(runningLine(int))); + QToolBar *toolbar = new QToolBar(); + addToolBar(Qt::TopToolBarArea, toolbar); + QAction *act_run = toolbar->addAction("Run"); + connect(act_run, SIGNAL(triggered()), this, SLOT(reset())); - QToolBar *toolbar = new QToolBar(); - addToolBar(Qt::TopToolBarArea, toolbar); - QAction *act_run = toolbar->addAction("Run"); - connect(act_run, SIGNAL(triggered()), this, SLOT(reset())); + QAction *act_stop = toolbar->addAction("Stop"); + connect(act_stop, SIGNAL(triggered()), l, SLOT(stopScript())); - QAction *act_stop = toolbar->addAction("Stop"); - connect(act_stop, SIGNAL(triggered()), l, SLOT(stopScript())); - - reset(); + reset(); } void MainWindow::reset() { - printf("Resetting...\n"); - QFile file(program); - file.open(QIODevice::WriteOnly); - QString code = editor->toPlainText(); - file.write(code.toLocal8Bit()); - file.close(); - out->stopScript(); - l->stopScript(); - out->reset(); - l->start(); - printf("Reset done\n"); + printf("Resetting...\n"); + QFile file(program); + file.open(QIODevice::WriteOnly); + QString code = editor->toPlainText(); + file.write(code.toLocal8Bit()); + file.close(); + out->stopScript(); + l->stopScript(); + out->reset(); + l->start(); + printf("Reset done\n"); } diff --git a/src/mainwindow.h b/src/mainwindow.h index c9a1844..1138dfb 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -25,8 +25,7 @@ * along with Kaiman; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __KAIMAN_MAINWINDOW_H__ -#define __KAIMAN_MAINWINDOW_H__ +#pragma once #include <QMainWindow> @@ -36,21 +35,21 @@ #include "outputwindow.h" #include "luascript.h" -class MainWindow : public QMainWindow { -Q_OBJECT +class MainWindow + : public QMainWindow +{ + Q_OBJECT public: - MainWindow(QString program); + MainWindow(QString program); private slots: - void reset(); + void reset(); private: - CodeEditor *editor; + CodeEditor *editor; - QFileSystemWatcher watcher; - QString program; - OutputWindow *out; - LUAScript *l; + QFileSystemWatcher watcher; + QString program; + OutputWindow *out; + LUAScript *l; }; - -#endif/*__KAIMAN_MAINWINDOW_H__*/ diff --git a/src/outputwindow.cc b/src/outputwindow.cc index 498af23..815da8c 100644 --- a/src/outputwindow.cc +++ b/src/outputwindow.cc @@ -34,216 +34,233 @@ OutputWindow::OutputWindow() { - resize(1000, 1000); - - /* - QTransform t; - t.scale(0.2, 0.2); - kaiman = kaiman.transformed(t, Qt::SmoothTransformation); - */ - connect(&timer, SIGNAL(timeout()), this, SLOT(timeout())); - timer.setSingleShot(true); - timer.start(25); - - reset(); + resize(1000, 1000); + + //QTransform t; + //t.scale(0.2, 0.2); + //kaiman = kaiman.transformed(t, Qt::SmoothTransformation); + + connect(&timer, SIGNAL(timeout()), this, SLOT(timeout())); + timer.setSingleShot(true); + timer.start(25); + + reset(); } double OutputWindow::coordX() { - return x; + return x; } double OutputWindow::coordY() { - return y; + return y; } void OutputWindow::stopScript() { - stop = true; + stop = true; } void OutputWindow::loadPen(QString file) { - sem.acquire(); - penfile = file; - loadpen = true; + sem.acquire(); + penfile = file; + loadpen = true; } void OutputWindow::setScale(double s) { - scale = s; - sem.acquire(); + scale = s; + sem.acquire(); } void OutputWindow::setSpeed(int s) { - if(s < 1) speed = 100; - else if(s > 100) speed = 1; - else speed = 101 - s; - sem.acquire(); + if(s < 1) + { + speed = 100; + } + else if(s > 100) + { + speed = 1; + } + else + { + speed = 101 - s; + } + sem.acquire(); } void OutputWindow::setColour(int r, int g, int b, int a) { - colour = QColor(r, g, b, a); - sem.acquire(); + colour = QColor(r, g, b, a); + sem.acquire(); } void OutputWindow::timeout() { - /* - x++; - y++; - r++; - */ - repaint(); - timer.start(25); + //x++; + //y++; + //r++; + repaint(); + timer.start(25); } void OutputWindow::paintEvent(QPaintEvent *) { - // sem.acquire(); - QPainter p(this); - // QTransform tp; tp.scale(3, 3); p.setTransform(tp); - - if(loadpen) { - QPixmap img(penfile); - kaiman = img.toImage(); - loadpen = false; - } - - QTransform t; - t.rotate(-r + 90); - t.scale((100.0 / kaiman.width() * scale), - (100.0 / kaiman.width() * scale) ); - QImage img = kaiman.transformed(t, Qt::SmoothTransformation); - p.drawImage((x * scale) - img.width()/2 + width() / 2, - (y * scale) - img.height()/2 + height() / 2, img); - - QTransform gt; - gt.translate(width() / 2, height() / 2); - gt.scale(scale, scale); - p.setTransform(gt); - - QPen pen; - pen.setWidth(4); - /* - p.setPen(pen); - p.drawLines(points); - */ - for(int i = 0; i < lines.size(); i++) { - ColLine l = lines[i]; - pen.setColor(l.colour); - p.setPen(pen); - QLineF line = l.line; - line.setP1(line.p1()); - line.setP2(line.p2()); - p.drawLine(line); - } - - pen.setWidth(2); - pen.setStyle(Qt::DotLine); - // pen.setCapStyle(Qt::RoundCap); - pen.setColor(Qt::black); - - // pen.setColor(colour); - p.setPen(pen); - for(int i = 0; i < current_points.size(); i+=2) { - QPointF p1 = current_points[i]; - QPointF p2 = current_points[i + 1]; - p.drawLine(QLineF(p1, p2)); - } - - QColor c = colour; - c.setAlpha(c.alpha() / 4); - pen.setStyle(Qt::SolidLine); - pen.setWidth(4); - pen.setColor(c); - p.setPen(pen); - for(int i = 0; i < current_points.size(); i+=2) { - QPointF p1 = current_points[i]; - QPointF p2 = current_points[i + 1]; - p.drawLine(QLineF(p1, p2)); - } - - sem.release(); + //sem.acquire(); + QPainter p(this); + //QTransform tp; tp.scale(3, 3); p.setTransform(tp); + + if(loadpen) + { + QPixmap img(penfile); + kaiman = img.toImage(); + loadpen = false; + } + + QTransform t; + t.rotate(-r + 90); + t.scale((100.0 / kaiman.width() * scale), + (100.0 / kaiman.width() * scale) ); + QImage img = kaiman.transformed(t, Qt::SmoothTransformation); + p.drawImage((x * scale) - img.width()/2 + width() / 2, + (y * scale) - img.height()/2 + height() / 2, img); + + QTransform gt; + gt.translate(width() / 2, height() / 2); + gt.scale(scale, scale); + p.setTransform(gt); + + QPen pen; + pen.setWidth(4); + //p.setPen(pen); + //p.drawLines(points); + for(int i = 0; i < lines.size(); i++) + { + ColLine l = lines[i]; + pen.setColor(l.colour); + p.setPen(pen); + QLineF line = l.line; + line.setP1(line.p1()); + line.setP2(line.p2()); + p.drawLine(line); + } + + pen.setWidth(2); + pen.setStyle(Qt::DotLine); + // pen.setCapStyle(Qt::RoundCap); + pen.setColor(Qt::black); + + // pen.setColor(colour); + p.setPen(pen); + for(int i = 0; i < current_points.size(); i+=2) + { + QPointF p1 = current_points[i]; + QPointF p2 = current_points[i + 1]; + p.drawLine(QLineF(p1, p2)); + } + + QColor c = colour; + c.setAlpha(c.alpha() / 4); + pen.setStyle(Qt::SolidLine); + pen.setWidth(4); + pen.setColor(c); + p.setPen(pen); + for(int i = 0; i < current_points.size(); i+=2) + { + QPointF p1 = current_points[i]; + QPointF p2 = current_points[i + 1]; + p.drawLine(QLineF(p1, p2)); + } + + sem.release(); } void OutputWindow::reset() { - scale = 2.0; - speed = 50; - penfile = "gfx/kaiman.png"; - loadpen = true; - - lines.clear(); - current_points.clear(); - x = 0;//(width() / 2) / scale; - y = 0;//(height() / 2) / scale; - r = 0; - colour = QColor(150, 0, 0, 150); - stop = false; - while(sem.tryAcquire()) {} + scale = 2.0; + speed = 50; + penfile = "gfx/kaiman.png"; + loadpen = true; + + lines.clear(); + current_points.clear(); + x = 0;//(width() / 2) / scale; + y = 0;//(height() / 2) / scale; + r = 0; + colour = QColor(150, 0, 0, 150); + stop = false; + while(sem.tryAcquire()) + { + } } static inline int sign(int x) { - if(x > 0) return 1; - return -1; + if(x > 0) + { + return 1; + } + return -1; } void OutputWindow::forward(double dist) { - sem.acquire(); + sem.acquire(); - float target_x = sin(r * (M_PI / 180.0)) * dist; - float target_y = cos(r * (M_PI / 180.0)) * dist; + float target_x = sin(r * (M_PI / 180.0)) * dist; + float target_y = cos(r * (M_PI / 180.0)) * dist; - float source_x = x; - float source_y = y; - - int spd = abs(dist * speed) / 60;//28; - for(int i = 0; i < spd; i++) { - if(stop) return; - float d = (float)i / (float)spd; + float source_x = x; + float source_y = y; - current_points.clear(); - current_points.append(QPointF(source_x, source_y)); + int spd = abs(dist * speed) / 60;//28; + for(int i = 0; i < spd; i++) + { + if(stop) return; + float d = (float)i / (float)spd; - x = source_x * (1 - d) + (source_x + target_x) * d; - y = source_y * (1 - d) + (source_y + target_y) * d; + current_points.clear(); + current_points.append(QPointF(source_x, source_y)); - current_points.append(QPointF(x, y)); + x = source_x * (1 - d) + (source_x + target_x) * d; + y = source_y * (1 - d) + (source_y + target_y) * d; - sem.acquire(); - } - x = source_x + target_x; - y = source_y + target_y; + current_points.append(QPointF(x, y)); - ColLine l; - l.colour = colour; - l.line = QLine(QPoint(source_x, source_y), - QPoint(x, y)); - lines.append(l); + sem.acquire(); + } + x = source_x + target_x; + y = source_y + target_y; + ColLine l; + l.colour = colour; + l.line = QLine(QPoint(source_x, source_y), + QPoint(x, y)); + lines.append(l); - current_points.clear(); - sem.acquire(); + current_points.clear(); + sem.acquire(); } // Turn x degrees void OutputWindow::turn(double x) { - double spd = (speed * abs(x) / 80.0); - double offset = this->r; - sem.acquire(); - for(int i = 0; i < spd; i++) { - if(stop) return; - double p = (double)i / spd; - this->r = offset + x * p; - sem.acquire(); - } - this->r = offset + x; - sem.acquire(); + double spd = (speed * abs(x) / 80.0); + double offset = this->r; + sem.acquire(); + for(int i = 0; i < spd; i++) + { + if(stop) + { + return; + } + double p = (double)i / spd; + this->r = offset + x * p; + sem.acquire(); + } + this->r = offset + x; + sem.acquire(); } diff --git a/src/outputwindow.h b/src/outputwindow.h index bd8bf27..5e91f71 100644 --- a/src/outputwindow.h +++ b/src/outputwindow.h @@ -25,8 +25,7 @@ * along with Kaiman; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __KAIMAN_OUTPUTWINDOW_H__ -#define __KAIMAN_OUTPUTWINDOW_H__ +#pragma once #include <QGLWidget> #include <QTimer> @@ -35,53 +34,54 @@ #include <QPoint> #include <QSemaphore> -class OutputWindow : public QGLWidget { -Q_OBJECT +class OutputWindow + : public QGLWidget +{ + Q_OBJECT public: - OutputWindow(); + OutputWindow(); - void forward(double x); - void turn(double x); + void forward(double x); + void turn(double x); - void stopScript(); + void stopScript(); - void setSpeed(int s); - void setScale(double s); - void setColour(int r, int g, int b, int a); + void setSpeed(int s); + void setScale(double s); + void setColour(int r, int g, int b, int a); - void loadPen(QString file); + void loadPen(QString file); - double coordX(); - double coordY(); + double coordX(); + double coordY(); public slots: - void timeout(); - void reset(); + void timeout(); + void reset(); protected: - void paintEvent(QPaintEvent * event); + void paintEvent(QPaintEvent * event); private: - class ColLine { - public: - QColor colour; - QLine line; - }; - QImage kaiman; - double x, y, r; - QTimer timer; - QSemaphore sem; - QVector<ColLine> lines; - QVector<QPointF> current_points; - QColor colour; - volatile bool stop; + class ColLine + { + public: + QColor colour; + QLine line; + }; + QImage kaiman; + double x, y, r; + QTimer timer; + QSemaphore sem; + QVector<ColLine> lines; + QVector<QPointF> current_points; + QColor colour; + volatile bool stop; - volatile int speed; + volatile int speed; - volatile bool loadpen; - QString penfile; + volatile bool loadpen; + QString penfile; - volatile float scale; + volatile float scale; }; - -#endif/*__KAIMAN_OUTPUTWINDOW_H__*/ diff --git a/src/soundplayer.cc b/src/soundplayer.cc index c59e84e..e5feebc 100644 --- a/src/soundplayer.cc +++ b/src/soundplayer.cc @@ -34,101 +34,103 @@ SoundPlayer::SoundPlayer() { - start(); + start(); } SoundPlayer::~SoundPlayer() { - running = false; + running = false; wait(); } void SoundPlayer::run() { - - printf("SoundPlayer running\n"); - - ao_initialize(); - - ao_sample_format sf; - memset(&sf, 0, sizeof(sf)); - sf.bits = 16; - sf.rate = 44100; - sf.channels = 2; - sf.byte_format = AO_FMT_NATIVE; - - ao_device *dev = ao_open_live(ao_default_driver_id(), &sf, 0); - - running = true; - - short s[BUFSZ]; - while(running) { - - { // Check for new Selection. - QMutexLocker lock(&mutex); - while(queue.size()) { - printf(" - New sound\n"); - active.append(queue.front()); - queue.pop_front(); - } - } - - memset(s, 0, BUFSZ * sizeof(short)); - - QList<QueueItem>::iterator it = active.begin(); - while(it != active.end()) { - QueueItem &item = *it; - - for(size_t i = 0; i < BUFSZ; i++) { - if(item.pos >= item.size) { - it = active.erase(it); - goto nextitem; - } - s[i] += item.samples[item.pos] * 32536; - item.pos++; - } - - it++; - - nextitem: - int a = 1;(void)a; - } - - ao_play(dev, (char*)s, BUFSZ * sizeof(short)); - } - - ao_close(dev); - ao_shutdown(); + printf("SoundPlayer running\n"); + + ao_initialize(); + + ao_sample_format sf; + memset(&sf, 0, sizeof(sf)); + sf.bits = 16; + sf.rate = 44100; + sf.channels = 2; + sf.byte_format = AO_FMT_NATIVE; + + ao_device *dev = ao_open_live(ao_default_driver_id(), &sf, 0); + + running = true; + + short s[BUFSZ]; + while(running) + { + { // Check for new Selection. + QMutexLocker lock(&mutex); + while(queue.size()) + { + printf(" - New sound\n"); + active.append(queue.front()); + queue.pop_front(); + } + } + + memset(s, 0, BUFSZ * sizeof(short)); + + QList<QueueItem>::iterator it = active.begin(); + while(it != active.end()) + { + QueueItem &item = *it; + + for(size_t i = 0; i < BUFSZ; i++) + { + if(item.pos >= item.size) + { + it = active.erase(it); + goto nextitem; + } + s[i] += item.samples[item.pos] * 32536 * 0.5; + item.pos++; + } + + it++; + + nextitem: + int a = 1;(void)a; + } + + ao_play(dev, (char*)s, BUFSZ * sizeof(short)); + } + + ao_close(dev); + ao_shutdown(); } void SoundPlayer::playFile(QString file) { + printf(" - playFile(%s)\n", file.toStdString().c_str()); - printf(" - playFile(%s)\n", file.toStdString().c_str()); - - SNDFILE *fh; - SF_INFO sf_info; + SNDFILE *fh; + SF_INFO sf_info; - fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info); - if(!fh) { - printf("Load error '%s'\n", file.toStdString().c_str()); - return; - } - - size_t size = sf_info.frames * sf_info.channels; - float *data = new float[size]; - sf_read_float(fh, data, size); + fh = sf_open(file.toStdString().c_str(), SFM_READ, &sf_info); + if(!fh) + { + printf("Load error '%s'\n", file.toStdString().c_str()); + return; + } - sf_close(fh); + size_t size = sf_info.frames * sf_info.channels; + float *data = new float[size]; + sf_read_float(fh, data, size); - QueueItem qi; - qi.samples = data; - qi.pos = 0; - qi.size = size; + sf_close(fh); - { - QMutexLocker lock(&mutex); - queue.append(qi); - } + QueueItem qi; + qi.samples = data; + qi.pos = 0; + qi.size = size; + { + QMutexLocker lock(&mutex); + queue.append(qi); + } } diff --git a/src/soundplayer.h b/src/soundplayer.h index c5b36d4..8502e6e 100644 --- a/src/soundplayer.h +++ b/src/soundplayer.h @@ -25,36 +25,36 @@ * along with Kaiman; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#ifndef __KAIMAN_SOUNDPLAYER_H__ -#define __KAIMAN_SOUNDPLAYER_H__ +#pragma once #include <QThread> #include <QString> #include <QList> #include <QMutex> -class QueueItem { +class QueueItem +{ public: - float *samples; - size_t pos; - size_t size; + float *samples; + size_t pos; + size_t size; }; -class SoundPlayer : public QThread { +class SoundPlayer + : public QThread +{ public: - SoundPlayer(); - ~SoundPlayer(); - - void playFile(QString file); + SoundPlayer(); + ~SoundPlayer(); - void run(); + void playFile(QString file); + + void run(); private: - volatile bool running; - QMutex mutex; + volatile bool running; + QMutex mutex; - QList<QueueItem> queue; - QList<QueueItem> active; + QList<QueueItem> queue; + QList<QueueItem> active; }; - -#endif/*__KAIMAN_SOUNDPLAYER_H__*/ |