From 0febf6ea9cbd1a6e04e41339fc46d2e6b07da5e7 Mon Sep 17 00:00:00 2001 From: deva Date: Tue, 3 Jun 2008 14:45:48 +0000 Subject: LUA rocks --- client/NOTES | 66 +++++++++++++++++++++ client/lua.cc | 128 +++++++++++++++++++++++++++++++---------- client/lua.h | 12 +++- client/macrowindow.cc | 58 +++++++++++++++---- client/macrowindow.h | 12 +++- client/variables.h | 35 ----------- client/widgets/checkbox.cc | 4 +- client/widgets/checkbox.h | 2 +- client/widgets/combobox.cc | 4 +- client/widgets/combobox.h | 2 +- client/widgets/frame.cc | 4 +- client/widgets/frame.h | 2 +- client/widgets/groupbox.cc | 4 +- client/widgets/groupbox.h | 2 +- client/widgets/label.cc | 4 +- client/widgets/label.h | 2 +- client/widgets/lineedit.cc | 9 ++- client/widgets/lineedit.h | 3 +- client/widgets/listbox.cc | 4 +- client/widgets/listbox.h | 2 +- client/widgets/pushbutton.cc | 4 +- client/widgets/pushbutton.h | 2 +- client/widgets/radiobuttons.cc | 4 +- client/widgets/radiobuttons.h | 2 +- client/widgets/textedit.cc | 4 +- client/widgets/textedit.h | 2 +- client/widgets/widget.cc | 30 +++++----- client/widgets/widget.h | 10 +++- client/widgets/window.cc | 4 +- client/widgets/window.h | 2 +- server/xml/example2.xml | 12 ++-- 31 files changed, 298 insertions(+), 137 deletions(-) create mode 100644 client/NOTES delete mode 100644 client/variables.h diff --git a/client/NOTES b/client/NOTES new file mode 100644 index 0000000..34b730b --- /dev/null +++ b/client/NOTES @@ -0,0 +1,66 @@ +-*- auto-fill -*- +############################# +# LUA programmer i klienten # +############################# +OnChanged eventen kan som udgangspunkt daekke alle behov for +udfoerelse af LUA kode. + +OnChanged lua koden skal returnere en boolean som er true hvis feltet +er valid, eller false hvis det ikke er. + +Der skal stilles en raekke metoder til raadighed for programmerne, som +kan interagere med felterne i makroen. + - getValue(feltnavn) + - setValue(feltnavn) + +Feltets egen vaerdig skal vaere tilknyttet lua variables 'value' saa +det er let at lave simpel validering af feltets vaerdi. + +Der skal som udgangspunkt kun vaere et LUA objekt pr. macro, for at +sikre gode svartider. Naar et nyt program skal udfoeres skal stakken +saaledes kunne genbruges (tidligere vaerdier skal fjernes og nye skal +indsaettes). + +LUA programmerne i XML'en: + + +eller maaske + + + if( tonumber(value) == 42 ) + then + return true + else + return false + end + + +eller en loesning inspireret af query/maps paa serveren: + + + if( tonumber(value) == 42 ) + then + return true + else + return false + end + + + + +Det skal helt klart vaere sidstnaevnte! + +Der kan laves sanity checks paa runtime for at sikre at der ikke +opstaar uendelige ulykker. +F.eks kan man checke om man er i gang med setValue paa feltet selv. \ No newline at end of file diff --git a/client/lua.cc b/client/lua.cc index c803e23..2299acc 100644 --- a/client/lua.cc +++ b/client/lua.cc @@ -26,40 +26,91 @@ */ #include "lua.h" -LUA::LUA(Variables &variables) +#include "macrowindow.h" + +#define GLOBAL_POINTER "_pracroGlobalLUAObjectPointer" + +LUA *glua; + +static int _getValue(lua_State *L) { - L = luaL_newstate(); - if(L == NULL) { - // throw LUADataParserException("Could not create LUA state."); + int n = lua_gettop(L); // number of arguments + if(n != 1) { + char errstr[512]; + sprintf(errstr, "Number of args expected 0, got %d", n); + fprintf(stderr, errstr); + lua_pushstring(L, errstr); + lua_error(L); + return 1; } - luaL_openlibs(L); + QString name = lua_tostring(L, lua_gettop(L)); - std::string preload; - Variables::iterator var = variables.begin(); - while(var != variables.end()) { - preload += (*var).first + " = \"" + (*var).second + "\"\n"; - var++; + lua_getglobal(L, GLOBAL_POINTER); + LUA *lua = glua;//(LUA*)lua_touserdata(L, 1); + + if(!lua) { + printf("No LUA pointer!\n"); + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; } - - // printf("preload: [%s]\n", preload.c_str()); - int s = luaL_loadbuffer(L, preload.c_str(), preload.size(), "preload"); - switch(s) { - case 0: //no errors; - break; - case LUA_ERRSYNTAX: //syntax error during pre-compilation; - case LUA_ERRMEM: //memory allocation error. - case LUA_ERRFILE: //cannot open/read the file. - //throw LUADataParserException(lua_tostring(L, lua_gettop(L))); - break; - default: - //throw LUADataParserException("Unknown return value of luaL_loadfile."); - break; + QString value = lua->getValue(name); + lua_pushstring(L, value.toStdString().c_str()); + + return 1; +} + +static int _setValue(lua_State *L) +{ + int n = lua_gettop(L); // number of arguments + if(n != 2) { + char errstr[512]; + sprintf(errstr, "Number of args expected 0, got %d", n); + fprintf(stderr, errstr); + lua_pushstring(L, errstr); + lua_error(L); + return 0; } - // Run program (init) - lua_pcall(L, 0, LUA_MULTRET, 0); + QString value = lua_tostring(L, lua_gettop(L)); + lua_pop(L, 1); + QString name = lua_tostring(L, lua_gettop(L)); + lua_pop(L, 1); + + lua_getglobal(L, GLOBAL_POINTER); + LUA *lua = glua;//(LUA*)lua_touserdata(L, 1); + + if(!lua) { + printf("No LUA pointer!\n"); + lua_pushstring(L, "No LUA pointer!"); + lua_error(L); + return 1; + } + + lua->setValue(name, value); + + return 0; +} + +LUA::LUA(MacroWindow *macrowindow) +{ + glua = this; + this->macrowindow = macrowindow; + + L = luaL_newstate(); + if(L == NULL) { + // throw LUADataParserException("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, "getValue", _getValue); + lua_register(L, "setValue", _setValue); } LUA::~LUA() @@ -67,9 +118,28 @@ LUA::~LUA() lua_close(L); } -std::string LUA::run(std::string &program) +QString LUA::getValue(QString name) +{ + return macrowindow->getValue(name); +} + +void LUA::setValue(QString name, QString value) +{ + macrowindow->setValue(name, value); +} + +bool LUA::run(QString program, QString value) { - int s = luaL_loadbuffer(L, program.c_str(), program.size(), "program"); + if(macrowindow->luaprograms.contains(program) == false) return false; + + QString luacode = "value = " + value + "\n"; + QString luaprogram = macrowindow->luaprograms.value(program); + luacode += luaprogram; + + int s = luaL_loadbuffer(L, + luacode.toStdString().c_str(), + luacode.size(), + program.toStdString().c_str()); switch(s) { case 0: //no errors; break; @@ -86,7 +156,7 @@ std::string LUA::run(std::string &program) // Run the loaded code lua_pcall(L, 0, LUA_MULTRET, 0); - std::string res = lua_tostring(L, lua_gettop(L)); + bool res = lua_toboolean(L, lua_gettop(L)); lua_pop(L, 1); return res; diff --git a/client/lua.h b/client/lua.h index 0c69b04..92ae809 100644 --- a/client/lua.h +++ b/client/lua.h @@ -30,17 +30,23 @@ #include #include -#include "variables.h" +#include + +class MacroWindow; class LUA { public: - LUA(Variables &variables); + LUA(MacroWindow *macrowindow); ~LUA(); - std::string run(std::string &program); + bool run(QString program, QString value); + + QString getValue(QString name); + void setValue(QString name, QString value); private: lua_State *L; + MacroWindow *macrowindow; }; #endif/*__PRACRO_LUA_H__*/ diff --git a/client/macrowindow.cc b/client/macrowindow.cc index 74e8d54..aab9857 100644 --- a/client/macrowindow.cc +++ b/client/macrowindow.cc @@ -35,6 +35,8 @@ #include #include +#include "lua.h" + extern QString cpr; extern QString user; extern QString host; @@ -45,12 +47,15 @@ MacroWindow::MacroWindow(QDomDocument *xml_doc) { isclosed = false; + this->lua = new LUA(this); + // Execute the recursive function with documentElement recurser(xml_doc->documentElement(), NULL); } MacroWindow::~MacroWindow() { + delete lua; } void MacroWindow::recurser(QDomNode xml_node, QWidget *parent) @@ -63,31 +68,39 @@ void MacroWindow::recurser(QDomNode xml_node, QWidget *parent) if(xml_elem.hasAttribute("name")) macro = xml_elem.attribute("name"); if(xml_elem.hasAttribute("version")) version = xml_elem.attribute("version"); + } else if(xml_elem.tagName() == "luaprograms") { + // Nothing to do here + } else if(xml_elem.tagName() == "luaprogram") { + + if(xml_elem.hasAttribute("name")) { + luaprograms[xml_elem.attribute("name")] = xml_elem.text(); + } + } else if(xml_elem.tagName() == "window") { - Window *window = new Window(xml_elem); + Window *window = new Window(xml_elem, this); widget = window; mainwidget = window; } else if(xml_elem.tagName() == "frame") { if(xml_elem.hasAttribute("caption")) { - GroupBox *frame = new GroupBox(xml_elem); + GroupBox *frame = new GroupBox(xml_elem, this); widget = frame; } else { - Frame *frame = new Frame(xml_elem); + Frame *frame = new Frame(xml_elem, this); widget = frame; } } else if(xml_elem.tagName() == "label") { - Label *label = new Label(xml_elem); + Label *label = new Label(xml_elem, this); widget = label; } else if(xml_elem.tagName() == "lineedit") { - LineEdit *lineedit = new LineEdit(xml_elem); + LineEdit *lineedit = new LineEdit(xml_elem, this); widgets.push_back(lineedit); widget = lineedit; } else if(xml_elem.tagName() == "button") { - PushButton *pushbutton = new PushButton(xml_elem); + PushButton *pushbutton = new PushButton(xml_elem, this); //connect(pushbutton, SIGNAL(act_continue()), main, SLOT(get_macro())); connect(pushbutton, SIGNAL(act_commit()), this, SLOT(commit())); connect(pushbutton, SIGNAL(act_reset()), this, SLOT(reset())); @@ -96,29 +109,29 @@ void MacroWindow::recurser(QDomNode xml_node, QWidget *parent) widget = pushbutton; } else if(xml_elem.tagName() == "textedit") { - TextEdit *textedit = new TextEdit(xml_elem); + TextEdit *textedit = new TextEdit(xml_elem, this); widgets.push_back(textedit); widget = textedit; } else if(xml_elem.tagName() == "checkbox") { - CheckBox *checkbox = new CheckBox(xml_elem); + CheckBox *checkbox = new CheckBox(xml_elem, this); widgets.push_back(checkbox); widget = checkbox; } else if(xml_elem.tagName() == "radiobuttons") { - RadioButtons *radiobuttons = new RadioButtons(xml_elem); + RadioButtons *radiobuttons = new RadioButtons(xml_elem, this); widgets.push_back(radiobuttons); widget = radiobuttons; //return; // Don't iterate children } else if(xml_elem.tagName() == "combobox") { - ComboBox *combobox = new ComboBox(xml_elem); + ComboBox *combobox = new ComboBox(xml_elem, this); widgets.push_back(combobox); widget = combobox; //return; // Don't iterate children } else if(xml_elem.tagName() == "listbox") { - ListBox *listbox = new ListBox(xml_elem); + ListBox *listbox = new ListBox(xml_elem, this); widgets.push_back(listbox); widget = listbox; //return; // Don't iterate children @@ -254,3 +267,26 @@ bool MacroWindow::isClosed() { return isclosed; } + +QString MacroWindow::getValue(QString name) +{ + // Iterate the different entries, and append their results to the commit string + QVector< Widget* >::iterator i=widgets.begin(); + while (i != widgets.end()) { + Widget* w = *i; + if(name == w->getName()) return w->getValue(); + i++; + } + return name + " - No such field!"; +} + +void MacroWindow::setValue(QString name, QString value) +{ + // Iterate the different entries, and append their results to the commit string + QVector< Widget* >::iterator i = widgets.begin(); + while (i != widgets.end()) { + Widget* w = *i; + if(name == w->getName()) w->setValue(value); + i++; + } +} diff --git a/client/macrowindow.h b/client/macrowindow.h index cad6124..7138464 100644 --- a/client/macrowindow.h +++ b/client/macrowindow.h @@ -27,12 +27,15 @@ #ifndef __PRACRO_MACROWINDOW_H__ #define __PRACRO_MACROWINDOW_H__ -#include "widgets/widget.h" #include #include #include #include #include +#include + +class LUA; +class Widget; class MacroWindow : public QObject { @@ -42,7 +45,14 @@ public: ~MacroWindow(); bool isClosed(); + + QMap< QString, QString > luaprograms; + LUA *lua; + + QString getValue(QString name); + void setValue(QString name, QString value); + public slots: void commit(); void reset(); diff --git a/client/variables.h b/client/variables.h deleted file mode 100644 index b58ab72..0000000 --- a/client/variables.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * variables.h - * - * Mon Jun 2 09:58:52 CEST 2008 - * Copyright 2008 Bent Bisballe Nyeng - * deva@aasimon.org - ****************************************************************************/ - -/* - * This file is part of Pracro. - * - * Pracro is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Pracro is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Pracro; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ -#ifndef __PRACRO_VARIABLES_H__ -#define __PRACRO_VARIABLES_H__ - -#include -#include - -typedef std::map< std::string, std::string > Variables; - -#endif/*__PRACRO_VARIABLES_H__*/ diff --git a/client/widgets/checkbox.cc b/client/widgets/checkbox.cc index 2ce3802..6b6f0e8 100644 --- a/client/widgets/checkbox.cc +++ b/client/widgets/checkbox.cc @@ -26,8 +26,8 @@ */ #include "checkbox.h" -CheckBox::CheckBox(QDomNode &node) - : QCheckBox(), Widget(node) +CheckBox::CheckBox(QDomNode &node, MacroWindow *macrowindow) + : QCheckBox(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/checkbox.h b/client/widgets/checkbox.h index 228723e..e24792c 100644 --- a/client/widgets/checkbox.h +++ b/client/widgets/checkbox.h @@ -34,7 +34,7 @@ class CheckBox : public QCheckBox, public Widget { public: - CheckBox(QDomNode &node); + CheckBox(QDomNode &node, MacroWindow *macrowindow); bool isValid(); diff --git a/client/widgets/combobox.cc b/client/widgets/combobox.cc index 480cada..aa2d78b 100644 --- a/client/widgets/combobox.cc +++ b/client/widgets/combobox.cc @@ -27,8 +27,8 @@ #include "combobox.h" #include -ComboBox::ComboBox(QDomNode &node) - : QComboBox(), Widget(node) +ComboBox::ComboBox(QDomNode &node, MacroWindow *macrowindow) + : QComboBox(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/combobox.h b/client/widgets/combobox.h index ab92e64..a79b2aa 100644 --- a/client/widgets/combobox.h +++ b/client/widgets/combobox.h @@ -34,7 +34,7 @@ class ComboBox : public QComboBox, public Widget { public: - ComboBox(QDomNode &node); + ComboBox(QDomNode &node, MacroWindow *macrowindow); public slots: bool isValid(); diff --git a/client/widgets/frame.cc b/client/widgets/frame.cc index e2227cc..2560994 100644 --- a/client/widgets/frame.cc +++ b/client/widgets/frame.cc @@ -28,8 +28,8 @@ #include #include -Frame::Frame(QDomNode &node) - : QFrame(), Widget(node) +Frame::Frame(QDomNode &node, MacroWindow *macrowindow) + : QFrame(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/frame.h b/client/widgets/frame.h index 80aeded..1daf3d4 100644 --- a/client/widgets/frame.h +++ b/client/widgets/frame.h @@ -34,7 +34,7 @@ class Frame : public QFrame, public Widget { public: - Frame(QDomNode &node); + Frame(QDomNode &node, MacroWindow *macrowindow); public slots: QString getValue(); diff --git a/client/widgets/groupbox.cc b/client/widgets/groupbox.cc index dba97cd..8461a1b 100644 --- a/client/widgets/groupbox.cc +++ b/client/widgets/groupbox.cc @@ -28,8 +28,8 @@ #include #include -GroupBox::GroupBox(QDomNode &node) - : QGroupBox(), Widget(node) +GroupBox::GroupBox(QDomNode &node, MacroWindow *macrowindow) + : QGroupBox(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/groupbox.h b/client/widgets/groupbox.h index 0cc1890..567fa3f 100644 --- a/client/widgets/groupbox.h +++ b/client/widgets/groupbox.h @@ -34,7 +34,7 @@ class GroupBox : public QGroupBox, public Widget { public: - GroupBox(QDomNode &node); + GroupBox(QDomNode &node, MacroWindow *macrowindow); public slots: QString getValue(); diff --git a/client/widgets/label.cc b/client/widgets/label.cc index 95d53ac..c495c12 100644 --- a/client/widgets/label.cc +++ b/client/widgets/label.cc @@ -27,8 +27,8 @@ #include "label.h" #include -Label::Label(QDomNode &node) - : QLabel(), Widget(node) +Label::Label(QDomNode &node, MacroWindow *macrowindow) + : QLabel(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/label.h b/client/widgets/label.h index 9c539e7..c1ede43 100644 --- a/client/widgets/label.h +++ b/client/widgets/label.h @@ -36,7 +36,7 @@ class Label : public QLabel, public Widget { Q_OBJECT public: - Label(QDomNode &node); + Label(QDomNode &node, MacroWindow *macrowindow); public slots: QString getValue(); diff --git a/client/widgets/lineedit.cc b/client/widgets/lineedit.cc index a6f2e83..7f270e9 100644 --- a/client/widgets/lineedit.cc +++ b/client/widgets/lineedit.cc @@ -27,8 +27,8 @@ #include "lineedit.h" #include -LineEdit::LineEdit(QDomNode &node) - : QLineEdit(), Widget(node) +LineEdit::LineEdit(QDomNode &node, MacroWindow *macrowindow) + : QLineEdit(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); @@ -75,3 +75,8 @@ QString LineEdit::getValue() { return text(); } + +void LineEdit::setValue(QString value) +{ + setText(value); +} diff --git a/client/widgets/lineedit.h b/client/widgets/lineedit.h index faea440..41296a9 100644 --- a/client/widgets/lineedit.h +++ b/client/widgets/lineedit.h @@ -36,11 +36,12 @@ class LineEdit : public QLineEdit, public Widget { Q_OBJECT public: - LineEdit(QDomNode &node); + LineEdit(QDomNode &node, MacroWindow *macrowindow); public slots: void changed(); QString getValue(); + void setValue(QString value); private: bool valid; diff --git a/client/widgets/listbox.cc b/client/widgets/listbox.cc index c7151cc..3021bd9 100644 --- a/client/widgets/listbox.cc +++ b/client/widgets/listbox.cc @@ -27,8 +27,8 @@ #include "listbox.h" #include -ListBox::ListBox(QDomNode &node) - : QListWidget(), Widget(node) +ListBox::ListBox(QDomNode &node, MacroWindow *macrowindow) + : QListWidget(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/listbox.h b/client/widgets/listbox.h index e41838b..b283bcc 100644 --- a/client/widgets/listbox.h +++ b/client/widgets/listbox.h @@ -34,7 +34,7 @@ class ListBox : public QListWidget, public Widget { public: - ListBox(QDomNode &node); + ListBox(QDomNode &node, MacroWindow *macrowindow); public slots: bool isValid(); diff --git a/client/widgets/pushbutton.cc b/client/widgets/pushbutton.cc index d674162..a0540f3 100644 --- a/client/widgets/pushbutton.cc +++ b/client/widgets/pushbutton.cc @@ -27,8 +27,8 @@ #include "pushbutton.h" #include -PushButton::PushButton(QDomNode &node) - : QPushButton(), Widget(node) +PushButton::PushButton(QDomNode &node, MacroWindow *macrowindow) + : QPushButton(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/pushbutton.h b/client/widgets/pushbutton.h index 42e3156..fe75fbf 100644 --- a/client/widgets/pushbutton.h +++ b/client/widgets/pushbutton.h @@ -36,7 +36,7 @@ class PushButton : public QPushButton, public Widget { Q_OBJECT public: - PushButton(QDomNode &node); + PushButton(QDomNode &node, MacroWindow *macrowindow); QString field; public slots: diff --git a/client/widgets/radiobuttons.cc b/client/widgets/radiobuttons.cc index 8c87a0c..7508974 100644 --- a/client/widgets/radiobuttons.cc +++ b/client/widgets/radiobuttons.cc @@ -30,8 +30,8 @@ #include #include -RadioButtons::RadioButtons(QDomNode &node) - : QFrame(), Widget(node) +RadioButtons::RadioButtons(QDomNode &node, MacroWindow *macrowindow) + : QFrame(), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/radiobuttons.h b/client/widgets/radiobuttons.h index 454d159..67c1cd0 100644 --- a/client/widgets/radiobuttons.h +++ b/client/widgets/radiobuttons.h @@ -37,7 +37,7 @@ class RadioButtons : public QFrame, public Widget { public: - RadioButtons(QDomNode &node); + RadioButtons(QDomNode &node, MacroWindow *macrowindow); public slots: bool isValid(); diff --git a/client/widgets/textedit.cc b/client/widgets/textedit.cc index e217cc6..a284967 100644 --- a/client/widgets/textedit.cc +++ b/client/widgets/textedit.cc @@ -28,8 +28,8 @@ #include #include -TextEdit::TextEdit(QDomNode &node) - : QTextEdit(), Widget(node) +TextEdit::TextEdit(QDomNode &node, MacroWindow *macrowindow) + : QTextEdit(), Widget(node, macrowindow) { //setAutoFillBackground(true); /* Default is false, which disables background // color manipulation.*/ diff --git a/client/widgets/textedit.h b/client/widgets/textedit.h index 466af0f..946e7b9 100644 --- a/client/widgets/textedit.h +++ b/client/widgets/textedit.h @@ -36,7 +36,7 @@ class TextEdit : public QTextEdit, public Widget { Q_OBJECT public: - TextEdit(QDomNode &node); + TextEdit(QDomNode &node, MacroWindow *macrowindow); public slots: void changed(); diff --git a/client/widgets/widget.cc b/client/widgets/widget.cc index d17754e..61e2a53 100644 --- a/client/widgets/widget.cc +++ b/client/widgets/widget.cc @@ -26,10 +26,12 @@ */ #include "widget.h" -Widget::Widget(QDomNode &node) +Widget::Widget(QDomNode &node, MacroWindow *macrowindow) { QDomElement elem = node.toElement(); + this->macrowindow = macrowindow; + if(elem.hasAttribute("name")) { widget_name = elem.attribute("name"); } else { @@ -37,11 +39,11 @@ Widget::Widget(QDomNode &node) elem.tagName().toStdString().c_str()); } - if(elem.hasAttribute("lua_validator")) { - lua_validator = elem.attribute("lua_validator"); - hasluavalidator = true; + if(elem.hasAttribute("lua")) { + luaprogram = elem.attribute("lua"); + hasluaprogram = true; } else { - hasluavalidator = false; + hasluaprogram = false; } if(elem.hasAttribute("regexp")) { @@ -63,6 +65,10 @@ QString Widget::getValue() return ""; } +void Widget::setValue(QString) +{ +} + bool Widget::isValid() { return regexpValidator() && luaValidator(); @@ -75,17 +81,7 @@ bool Widget::regexpValidator() bool Widget::luaValidator() { - if(!hasluavalidator) return true; - - Variables v; - v["value"] = getValue().toStdString(); - LUA lua(v); - - std::string program = lua_validator.toStdString(); - - std::string result = lua.run(program); - - // printf("Running [%s] => [%s]\n", program.c_str(), result.c_str()); + if(!hasluaprogram) return true; - return result == "true"; + return macrowindow->lua->run(luaprogram, getValue()); } diff --git a/client/widgets/widget.h b/client/widgets/widget.h index 391f2e9..cba6be9 100644 --- a/client/widgets/widget.h +++ b/client/widgets/widget.h @@ -31,13 +31,15 @@ #include #include +#include "macrowindow.h" #include "lua.h" class Widget { public: - Widget(QDomNode &node); + Widget(QDomNode &node, MacroWindow *macrowindow); virtual ~Widget(){} virtual QString getValue(); + virtual void setValue(QString value); virtual bool isValid(); QString getName(); @@ -51,9 +53,11 @@ private: QRegExp rx; bool hasregexpvalidator; - bool hasluavalidator; + bool hasluaprogram; - QString lua_validator; + QString luaprogram; + LUA *lua; + MacroWindow *macrowindow; }; #endif/*__PRACRO_WIDGET_H__*/ diff --git a/client/widgets/window.cc b/client/widgets/window.cc index 5d15733..b2b4298 100644 --- a/client/widgets/window.cc +++ b/client/widgets/window.cc @@ -28,8 +28,8 @@ #include #include -Window::Window(QDomNode &node) - : QWidget(NULL), Widget(node) +Window::Window(QDomNode &node, MacroWindow *macrowindow) + : QWidget(NULL), Widget(node, macrowindow) { QDomElement elem = node.toElement(); diff --git a/client/widgets/window.h b/client/widgets/window.h index 93c48ab..bd4c77b 100644 --- a/client/widgets/window.h +++ b/client/widgets/window.h @@ -34,7 +34,7 @@ class Window : public QWidget, public Widget { public: - Window(QDomNode &node); + Window(QDomNode &node, MacroWindow *macrowindow); public slots: QString getValue(); diff --git a/server/xml/example2.xml b/server/xml/example2.xml index ddcc4e6..826b694 100644 --- a/server/xml/example2.xml +++ b/server/xml/example2.xml @@ -24,8 +24,10 @@ - if( tonumber(value) == 42 ) + fisk = getValue('sphere') + if( tonumber(fisk) == tonumber(value) ) then + setValue('cyl', value) return true else return false @@ -40,15 +42,15 @@