diff options
-rw-r--r-- | client/docgen/doc.h | 3 | ||||
-rw-r--r-- | client/docgen/docgen.cc | 87 | ||||
-rw-r--r-- | client/docgen/generate.cc | 40 | ||||
-rw-r--r-- | client/docgen/parse.cc | 18 | ||||
-rw-r--r-- | client/docgen/style.css | 5 | ||||
-rw-r--r-- | client/luadb.cc | 8 | ||||
-rw-r--r-- | client/luadb.h | 53 | ||||
-rw-r--r-- | client/widgets/altcombobox.h | 1 | ||||
-rw-r--r-- | client/widgets/button.h | 1 | ||||
-rw-r--r-- | client/widgets/checkbox.h | 1 | ||||
-rw-r--r-- | client/widgets/checkgroupbox.h | 1 | ||||
-rw-r--r-- | client/widgets/combobox.h | 1 | ||||
-rw-r--r-- | client/widgets/datetime.h | 1 | ||||
-rw-r--r-- | client/widgets/groupbox.h | 1 | ||||
-rw-r--r-- | client/widgets/label.h | 1 | ||||
-rw-r--r-- | client/widgets/lineedit.h | 1 | ||||
-rw-r--r-- | client/widgets/listbox.h | 1 | ||||
-rw-r--r-- | client/widgets/metawidget.h | 1 | ||||
-rw-r--r-- | client/widgets/multilist.h | 1 | ||||
-rw-r--r-- | client/widgets/radiobuttons.h | 1 | ||||
-rw-r--r-- | client/widgets/textedit.h | 1 | ||||
-rw-r--r-- | client/widgets/widget.h | 1 | ||||
-rw-r--r-- | client/widgets/window.h | 1 | ||||
-rw-r--r-- | server/src/luapraxisd.cc | 14 | ||||
-rw-r--r-- | server/src/luapraxisd.h | 90 |
25 files changed, 299 insertions, 35 deletions
diff --git a/client/docgen/doc.h b/client/docgen/doc.h index ae693f5..5678476 100644 --- a/client/docgen/doc.h +++ b/client/docgen/doc.h @@ -69,6 +69,9 @@ public: QString title; QString name; QString tag; + bool serverside; + bool clientside; + QString classname; QString extends; bool container; QString description; diff --git a/client/docgen/docgen.cc b/client/docgen/docgen.cc index e4af0a3..4eb2e08 100644 --- a/client/docgen/docgen.cc +++ b/client/docgen/docgen.cc @@ -32,6 +32,7 @@ #include <QDir> #include <QMap> #include <QDate> +#include <QFileInfo> #include <stdio.h> @@ -39,7 +40,9 @@ #include "parse.h" #include "generate.h" -#define INPUT "../widgets" +#define WIDGETS_DIR "../widgets" +#define SERVER_DIR "../../server/src" +#define CLIENT_DIR ".." #define OUTPUT "html" QString output; @@ -94,16 +97,46 @@ void writeIndex(QMap<QString, Doc> &docs) out += "<h1>Pracro "VERSION" Documentation</h1>\n"; out += "<h2>Overview</h2>\n"; + out += "<h3>Clientside</h3>\n"; + out += "<h4>Widgets</h4>\n"; out += "<ul>\n"; QMap<QString, Doc>::iterator i = docs.begin(); while(i != docs.end()) { Doc &doc = *i; - out += "<li><a href=\""+doc.name+".html\">["+doc.name+"]</a> - "+ - doc.title+"</li>\n"; + if(doc.tag != "") { + out += "<li><a href=\""+doc.name+".html\">["+doc.name+"]</a> - "+ + doc.title+"</li>\n"; + } + i++; + } + out += "</ul>\n"; + out += "<h4>Classes</h4>\n"; + out += "<ul>\n"; + i = docs.begin(); + while(i != docs.end()) { + Doc &doc = *i; + if(doc.classname != "" && doc.clientside) { + out += "<li><a href=\""+doc.name+".html\">["+doc.name+"]</a> - "+ + doc.title+"</li>\n"; + } i++; } out += "</ul>\n"; + out += "<h3>Serverside</h3>\n"; + out += "<ul>\n"; + i = docs.begin(); + while(i != docs.end()) { + Doc &doc = *i; + if(doc.classname != "" && doc.serverside) { + out += "<li><a href=\""+doc.name+".html\">["+doc.name+"]</a> - "+ + doc.title+"</li>\n"; + } + i++; + } + out += "</ul>\n"; + + QFile::remove(output + "/index.html"); QFile ofile(output + "/index.html"); ofile.open(QIODevice::ReadWrite | QIODevice::Text); @@ -133,15 +166,47 @@ int main(int argc, char *argv[]) QFile::remove(output + "/style.css"); QFile::copy("style.css", output + "/style.css"); - QDir dir(INPUT); - QStringList filter; filter << "*.h"; - dir.setNameFilters(filter); + QStringList files; + + // Widgets + { + QDir dir(WIDGETS_DIR); + QStringList filter; filter << "*.h"; + dir.setNameFilters(filter); + if(!dir.exists()) return 1; + QFileInfoList inflst = dir.entryInfoList(QDir::Files); + foreach(QFileInfo inf, inflst) { + files.append(inf.absoluteFilePath()); + } + } + + // Client + { + QDir dir(CLIENT_DIR); + QStringList filter; filter << "*.h"; + dir.setNameFilters(filter); + if(!dir.exists()) return 1; + QFileInfoList inflst = dir.entryInfoList(QDir::Files); + foreach(QFileInfo inf, inflst) { + files.append(inf.absoluteFilePath()); + } + } + + // Server + { + QDir dir(SERVER_DIR); + QStringList filter; filter << "*.h"; + dir.setNameFilters(filter); + if(!dir.exists()) return 1; + QFileInfoList inflst = dir.entryInfoList(QDir::Files); + foreach(QFileInfo inf, inflst) { + files.append(inf.absoluteFilePath()); + } + } - if(!dir.exists()) return 1; - QStringList l = dir.entryList(QDir::Files); - foreach(QString file, l) { - Doc doc = parse(QString(INPUT) + "/" + file); - if(doc.title != "" || doc.tag != "") + foreach(QString file, files) { + Doc doc = parse(file); + if(doc.title != "" || doc.tag != "" || doc.classname != "") docs[doc.name] = doc; } diff --git a/client/docgen/generate.cc b/client/docgen/generate.cc index b521f1f..f418b24 100644 --- a/client/docgen/generate.cc +++ b/client/docgen/generate.cc @@ -219,6 +219,18 @@ QString generate(Doc &doc, QMap<QString, QVector<Method> > &meths, highlight("<" + doc.tag + " />", xml) + "</pre></div>\n"; } + if(doc.serverside) + out += " <div class=\"availablility\">Available serverside.</div>\n"; + + if(doc.clientside) + out += " <div class=\"availablility\">Available clientside.</div>\n"; + + + if(doc.classname != "" ){ + out += " <div class=\"classname\">Class<pre class=\"code\">" + + doc.classname + "</pre></div>\n"; + } + if(doc.container) { out += " <div class=\"container\">Widget is a container.</div>\n"; } @@ -248,21 +260,23 @@ QString generate(Doc &doc, QMap<QString, QVector<Method> > &meths, out += generateExamples(doc.examples, xml); - out += " <h2>Attributes</h2>\n"; - out += " <div class=\"attributes\">\n"; - if(doc.attributes.size()) { - out += generateAttributes(doc.attributes); - } + if(doc.tag != "") { + out += " <h2>Attributes</h2>\n"; + out += " <div class=\"attributes\">\n"; + if(doc.attributes.size()) { + out += generateAttributes(doc.attributes); + } - QMap<QString, QVector<Attribute> >::iterator i = atts.begin(); - while(i != atts.end()) { - out += " <h3>Attributes inherited from <a href=\"" + i.key() + - ".html\">"+i.key()+"</a>:</h3>\n"; - out += generateAttributes(i.value()); - i++; + QMap<QString, QVector<Attribute> >::iterator i = atts.begin(); + while(i != atts.end()) { + out += " <h3>Attributes inherited from <a href=\"" + i.key() + + ".html\">"+i.key()+"</a>:</h3>\n"; + out += generateAttributes(i.value()); + i++; + } + out += " </div>\n"; } - out += " </div>\n"; - + out += generateMethodOverview(doc, meths); out += " <h2>Methods</h2>\n"; diff --git a/client/docgen/parse.cc b/client/docgen/parse.cc index 64c2aa7..0354f57 100644 --- a/client/docgen/parse.cc +++ b/client/docgen/parse.cc @@ -89,6 +89,8 @@ Doc parse(QString filename) { Doc doc; doc.container = false; + doc.serverside = false; + doc.clientside = false; QFileInfo fi(filename); QString name = fi.fileName(); @@ -134,10 +136,26 @@ Doc parse(QString filename) continue; } + if(state == none && line.left(6) == "@class") { + doc.classname = line.right(line.length() - line.indexOf(" ") - 1); + doc.name = doc.classname; + continue; + } + if(state == none && line.left(8) == "@extends") { doc.extends = line.right(line.length() - line.indexOf(" ") - 1); continue; } + + if(state == none && line.left(11) == "@serverside") { + doc.serverside = true; + continue; + } + + if(state == none && line.left(11) == "@clientside") { + doc.clientside = true; + continue; + } if(state == none && line.left(11) == "@screenshot") { Screenshot s; diff --git a/client/docgen/style.css b/client/docgen/style.css index e938648..17f087e 100644 --- a/client/docgen/style.css +++ b/client/docgen/style.css @@ -26,6 +26,11 @@ a:hover { } .doc .tagname { + font-size: 1.5em; + text-align: center; +} +.doc .classname { + font-size: 1.5em; text-align: center; } .doc .extends {} diff --git a/client/luadb.cc b/client/luadb.cc index 317831f..a848f36 100644 --- a/client/luadb.cc +++ b/client/luadb.cc @@ -77,7 +77,7 @@ typedef struct db_userdata { DB *db; } db_userdata; -static int db_value(lua_State *L) +int db_value(lua_State *L) { db_userdata *dbu; @@ -91,7 +91,7 @@ static int db_value(lua_State *L) return 1; } -static int db_exec(lua_State *L) +int db_exec(lua_State *L) { db_userdata *dbu; @@ -105,7 +105,7 @@ static int db_exec(lua_State *L) return 0; } -static int db_next(lua_State *L) +int db_next(lua_State *L) { db_userdata *dbu; @@ -119,7 +119,7 @@ static int db_next(lua_State *L) return 1; } -static int db_new(lua_State *L) +int db_new(lua_State *L) { const char *driver = luaL_checkstring(L, 1); const char *host = luaL_checkstring(L, 2); diff --git a/client/luadb.h b/client/luadb.h index a87baf5..91c8777 100644 --- a/client/luadb.h +++ b/client/luadb.h @@ -30,6 +30,59 @@ #include <lua.hpp> +/*** + * Database Class + * @class DB + * @clientside + * The DB class connects and handles communication with the an SQL server using + * the QDatabase API. + */ + +/*** + * @method object DB.new(string driver, string host, string database, string user, string password, int port) + * Create a new DB connection object. + * @param driver A string containing the QT SQL driver name. QPSQL: postgresql + * driver. + * @param host The hostname to connect to. + * @param database The database to open. + * @param user The username to use for authentication. + * @param password The password to use for authentication. + * @param port The port to connect to. + * @return The newly created communication object. + * @example Create a new database object: + * px = DB.new('QPSQL', 'localhost', 'mydb', 'user01', 'verysecret', '5432') + */ +int db_new(lua_State *L); + +/*** + * @method nil exec(string query) + * Execute an SQL query. + * @param query A string containing the SQL query to execute. + */ +int db_exec(lua_State *L); + +/*** + * @method string value(int index) + * Get current value from the result of the last query. + * @param index The column index number to use for the value retrieval. + * @return A string containing the value in the result cell. + */ +int db_value(lua_State *L); + +/*** + * @method boolean next() + * Iterate to next row in result set. + * @return true if another row is availble, false if the end of the list has + * been reached. + * @example Iterate through a result list and print the value in column 0 in each row: + * while db:next() + * do + * local item = db:value(0) + * print(item) + * end + */ +int db_next(lua_State *L); + void register_db(lua_State *L); #endif/*__PRACRO_LUADB_H__*/ diff --git a/client/widgets/altcombobox.h b/client/widgets/altcombobox.h index b0fb61c..73dee10 100644 --- a/client/widgets/altcombobox.h +++ b/client/widgets/altcombobox.h @@ -43,6 +43,7 @@ /*** * ComboBox Widget with Alternate Value * @tag altcombobox + * @clientside * @extends combobox * @screenshot Example: altitem selected. * <altcombobox name="ex" layout="vbox" value="altitem" type="select"> diff --git a/client/widgets/button.h b/client/widgets/button.h index 0bd7db9..d9053a6 100644 --- a/client/widgets/button.h +++ b/client/widgets/button.h @@ -34,6 +34,7 @@ /*** * PushButton Widget * @tag button + * @clientside * @screenshot Example button * <button caption="Click me"/> * @screenshot Example cancel button diff --git a/client/widgets/checkbox.h b/client/widgets/checkbox.h index ce31a62..5fef7cb 100644 --- a/client/widgets/checkbox.h +++ b/client/widgets/checkbox.h @@ -38,6 +38,7 @@ /*** * CheckBox Widget * @tag checkbox + * @clientside * @screenshot An example checkbox * <checkbox name="example" truevalue="true" falsevalue="false" value="true" * caption="A simple checkbox"/> diff --git a/client/widgets/checkgroupbox.h b/client/widgets/checkgroupbox.h index 5dfa7fb..96056a4 100644 --- a/client/widgets/checkgroupbox.h +++ b/client/widgets/checkgroupbox.h @@ -41,6 +41,7 @@ /*** * Checkable GroupBox Widget * @tag checkgroupbox + * @clientside * @extends checkbox * @screenshot Example 1: type="framed" * <checkgroupbox name="example" caption="Example" type="framed" layout="vbox" diff --git a/client/widgets/combobox.h b/client/widgets/combobox.h index bf61b1a..448a0ff 100644 --- a/client/widgets/combobox.h +++ b/client/widgets/combobox.h @@ -40,6 +40,7 @@ /*** * ComboBox Widget * @tag combobox + * @clientside * @screenshot Example * <combobox name="ex" layout="vbox" value="item" type="select"> * <item caption="Item" value="item"/> diff --git a/client/widgets/datetime.h b/client/widgets/datetime.h index 84df018..a36d87b 100644 --- a/client/widgets/datetime.h +++ b/client/widgets/datetime.h @@ -35,6 +35,7 @@ /*** * Date and Time Widget * @tag datetime + * @clientside * @screenshot Example with fuzziness="1" and value="1234567890" * <datetime name="x" fuzziness="1" value="1234567890"/> * @screenshot Example with fuzziness="7" and value="1234567890" diff --git a/client/widgets/groupbox.h b/client/widgets/groupbox.h index 58e52bb..9198a5a 100644 --- a/client/widgets/groupbox.h +++ b/client/widgets/groupbox.h @@ -37,6 +37,7 @@ /*** * Layout or Frame Widget * @tag frame + * @clientside * @screenshot Example with caption. * <frame caption="Caption" layout="vbox"> * <label caption="Label"/> diff --git a/client/widgets/label.h b/client/widgets/label.h index b303d0d..eae97b8 100644 --- a/client/widgets/label.h +++ b/client/widgets/label.h @@ -34,6 +34,7 @@ /*** * Label Widget * @tag label + * @clientside * @screenshot Example * <label width="300" caption="A nice label with a caption"/> * @extends widget diff --git a/client/widgets/lineedit.h b/client/widgets/lineedit.h index 08230a6..d482c15 100644 --- a/client/widgets/lineedit.h +++ b/client/widgets/lineedit.h @@ -39,6 +39,7 @@ /*** * Line Edit Widget * @tag lineedit + * @clientside * @screenshot Example * <lineedit name="myname" value="some text"/> * @extends widget diff --git a/client/widgets/listbox.h b/client/widgets/listbox.h index 82c5dfc..f9d967a 100644 --- a/client/widgets/listbox.h +++ b/client/widgets/listbox.h @@ -38,6 +38,7 @@ /*** * ListBox Widget + * @clientside * @tag listbox * @screenshot Example * <listbox name="x" value="item1"> diff --git a/client/widgets/metawidget.h b/client/widgets/metawidget.h index c6bf5d0..c6a7224 100644 --- a/client/widgets/metawidget.h +++ b/client/widgets/metawidget.h @@ -36,6 +36,7 @@ /*** * Meta Widget + * @clientside * @extends widget * @tag metawidget * @screenshot An example of a metawidget with two inner widgets. The metawidget is not in itself visible. diff --git a/client/widgets/multilist.h b/client/widgets/multilist.h index f7da8fa..a7c5332 100644 --- a/client/widgets/multilist.h +++ b/client/widgets/multilist.h @@ -37,6 +37,7 @@ /*** * Multi List Widget * @tag multilist + * @clientside * @container * @screenshot Example of multilist containing a metawidget. * <multilist name="x" layout="vbox" innerwidget="in" value="Abc: Def diff --git a/client/widgets/radiobuttons.h b/client/widgets/radiobuttons.h index 4b9ce67..e09d4e8 100644 --- a/client/widgets/radiobuttons.h +++ b/client/widgets/radiobuttons.h @@ -35,6 +35,7 @@ /*** * Radio Button Group Widget * @tag radiobuttons + * @clientside * @extends widget * @screenshot Example with four radiobuttons * <radiobuttons name="x" value="item2"> diff --git a/client/widgets/textedit.h b/client/widgets/textedit.h index 542dd6f..fbbb040 100644 --- a/client/widgets/textedit.h +++ b/client/widgets/textedit.h @@ -35,6 +35,7 @@ /*** * Multiline Text Edit Widget * @tag textedit + * @clientside * @screenshot Example of a textedit. * <textedit name="x" value="This is a multiline textfield. * It may contain all text in the universe, it will simply add a scrollbar."/> diff --git a/client/widgets/widget.h b/client/widgets/widget.h index 6199aa4..f2bf278 100644 --- a/client/widgets/widget.h +++ b/client/widgets/widget.h @@ -44,6 +44,7 @@ /*** * Virtual Base Widget * This tag is purely virtual. It is inherited by all other widgets. + * @clientside * @att name The name of the widget. This is also the name used by the scripts. * @att value The initial value of the widget. It is overwritten if there is a * map with a recent value or if the database contains a recent value. diff --git a/client/widgets/window.h b/client/widgets/window.h index ea3af0a..8fb5c59 100644 --- a/client/widgets/window.h +++ b/client/widgets/window.h @@ -34,6 +34,7 @@ * Widgets Outer Container * @tag widgets * @container + * @clientside * This is the outer tag of the macro widgets. * @att caption This is the name that will be shown in the macro. * @att layout this is the layout that is used by the macro. It can be one of diff --git a/server/src/luapraxisd.cc b/server/src/luapraxisd.cc index b50446c..bdaf372 100644 --- a/server/src/luapraxisd.cc +++ b/server/src/luapraxisd.cc @@ -44,7 +44,7 @@ typedef struct px_userdata { Praxisd *px; } px_userdata; -static int px_addcave(lua_State *L) +int px_addcave(lua_State *L) { px_userdata *pxu; pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); @@ -80,7 +80,7 @@ static int px_addcave(lua_State *L) return 0; } -static int px_addbehandling(lua_State *L) +int px_addbehandling(lua_State *L) { px_userdata *pxu; pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); @@ -112,7 +112,7 @@ static int px_addbehandling(lua_State *L) return 0; } -static int px_adddiagnose(lua_State *L) +int px_adddiagnose(lua_State *L) { px_userdata *pxu; pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); @@ -144,7 +144,7 @@ static int px_adddiagnose(lua_State *L) return 0; } -static int px_getcave(lua_State *L) +int px_getcave(lua_State *L) { px_userdata *pxu; pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); @@ -185,7 +185,7 @@ static int px_getcave(lua_State *L) return 1; } -static int px_cavelist(lua_State *L) +int px_cavelist(lua_State *L) { px_userdata *pxu; pxu = (px_userdata *)luaL_checkudata(L, 1, "Praxisd"); @@ -211,7 +211,7 @@ static int px_cavelist(lua_State *L) return 1; } -static int px_new(lua_State *L) +int px_new(lua_State *L) { const char *host = luaL_checkstring(L, 1); int port = (int)luaL_checknumber(L, 2); @@ -244,7 +244,7 @@ static int px_gc(lua_State *L) } static const struct luaL_Reg px_meths[] = { - {"__gc" ,px_gc}, + {"__gc", px_gc}, {"cavelist", px_cavelist}, {"getcave", px_getcave}, {"addcave", px_addcave}, diff --git a/server/src/luapraxisd.h b/server/src/luapraxisd.h index 2ab9ab5..71225bf 100644 --- a/server/src/luapraxisd.h +++ b/server/src/luapraxisd.h @@ -30,6 +30,96 @@ #include <lua.hpp> +/*** + * Praxisd Class + * @class Praxisd + * @serverside + * The praxisd class connects and handles communication with the praxisd + * daemon process. + */ + +/*** + * @method object Praxisd.new(string host, int port) + * Create a new Praxisd connection object. + * @param host The hostname to connect to. + * @param port The port number to connect to. + * @return The newly created communication object. + * @example Create a new praxisd object: + * px = Praxisd.new('localhost', 10000) + */ +int px_new(lua_State *L); + +/*** + * @method stringlist praxisd:cavelist() + * Get server cave list. + * To retrieve cavelist for a patient see @see praxisd:getcave(). + * @return The complete list of known (possible) cave from the server. + * @example Create a new praxisd object, get and print cavelist: + * px = Praxisd.new('localhost', 10000) + * lst = px:cavelist() + * for i=0,#lst do + * print(lst[i]) + * end + */ +int px_cavelist(lua_State *L); + +/*** + * @method stringlist praxisd:getcave(string patientid) + * Get cave list from a patient. + * To retrieve cavelist from the server see @see praxisd:cavelist(). To add cave + * to a patient see @see praxisd:addcave(). + * @param patientid A string containing the patientid. + * @return The list cave registered with the patient. + * @example Create a new praxisd object, get and print cavelist: + * px = Praxisd.new('localhost', 10000) + * lst = px:getcave('1234567890') + * for i=0,#lst do + * print(lst[i]) + * end + */ +int px_getcave(lua_State *L); + +/*** + * @method nil praxisd:adddiagnose(string patientid, string diagnose, string text) + * Add a diagnose to a patient. + * @param patientid A string containing the patientid. + * @param diagnose The diagnose code. + * @param text A text to store with the diagnose code. The string mat be up to 6 + * characters long. If longer it will be trunkated. + * @example Create a new praxisd object and add a diagnose: + * px = Praxisd.new('localhost', 10000) + * px:adddiagnose('1234567890', 'C0001', 'o.dxt') + */ +int px_adddiagnose(lua_State *L); + +/*** + * @method nil praxisd:addbehandling(string patientid, string behandling, string text) + * Add a behandling to a patient. + * @param patientid A string containing the patientid. + * @param diagnose The behandling code. + * @param text A text to store with the behandling code. The string mat be up to 6 + * characters long. If longer it will be trunkated. + * @example Create a new praxisd object and add a behandling: + * px = Praxisd.new('localhost', 10000) + * px:addbehandling('1234567890', 'B0001', 'o.sin') + */ +int px_addbehandling(lua_State *L); + +/*** + * @method nil praxisd:addcave(string patientid, string cave, string text) + * Add a cave entry to a patient. To retrieve list of cave from a patient + * see @see praxisd:getcave(). + * @param patientid A string containing the patientid. + * @param diagnose The cave string. + * @param text A text to store with the cave entry. NOTE: This is not shown in + * PCPraxis! The string mat be up to 6 characters long. If longer it will be + * trunkated. + * @example Create a new praxisd object and add a cave entry: + * px = Praxisd.new('localhost', 10000) + * px:addcave('1234567890', 'AZOPT', '') + */ +int px_addcave(lua_State *L); + void register_praxisd(lua_State *L); #endif/*__PRACRO_LUAPRAXISD_H__*/ |