diff --git a/reference/RectTracker/main.cpp b/reference/RectTracker/main.cpp index 9f1cc2c86..678bab209 100644 --- a/reference/RectTracker/main.cpp +++ b/reference/RectTracker/main.cpp @@ -5,9 +5,12 @@ using namespace Upp; struct MyApp : TopWindow { Rect rect; int hline, vline; + Point line1, line2; typedef MyApp CLASSNAME; + DropList op; + void Round(Rect& r) { int cx = r.GetWidth(); @@ -19,42 +22,49 @@ struct MyApp : TopWindow { { Size sz = GetSize(); w.DrawRect(sz, SColorPaper()); - DrawFrame(w, rect, Black()); - w.DrawRect(0, hline, sz.cx, 1, SRed); - w.DrawRect(vline, 0, 1, sz.cy, SBlue); + DrawFrame(w, rect, SBlack()); + w.DrawRect(0, hline, sz.cx, 1, SRed()); + w.DrawRect(vline, 0, 1, sz.cy, SBlue()); + if(line1 != line2) + w.DrawLine(line1, line2, DPI(2), SMagenta()); } virtual void LeftDown(Point p, dword keyflags) { RectTracker tr(*this); Size sz = GetSize(); - if((keyflags & K_CTRL) && (keyflags & K_ALT)) { + switch((int)~op) { + case 0: + rect = tr.Track(rect, ALIGN_RIGHT, ALIGN_BOTTOM); + break; + case 1: + rect = tr.Track(rect, ALIGN_LEFT, ALIGN_TOP); + break; + case 2: + tr.Dashed().Animation(); + rect = tr.Track(rect, ALIGN_CENTER, ALIGN_CENTER); + break; + case 3: + tr.Solid(); + vline = tr.TrackVertLine(0, 0, sz.cy, vline); + break; + case 4: + tr.Solid(); + hline = tr.TrackHorzLine(0, 0, sz.cx, hline); + break; + case 5: + line1 = p; + line2 = tr.TrackLine(p.x, p.y); + break; + case 6: tr.Dashed(); tr.MinSize(Size(-10000, -10000)); // allow negative size tr.Width(DPI(4)); tr.SetColor(Yellow()); + tr.round = THISBACK(Round); rect = tr.Track(rect, ALIGN_RIGHT, ALIGN_BOTTOM); rect.Normalize(); - } - else - if(keyflags & K_ALT) { - tr.Dashed().Animation(); - tr.round = THISBACK(Round); - rect = tr.Track(rect, ALIGN_CENTER, ALIGN_CENTER); - } - else - if(keyflags & K_SHIFT) { - tr.Solid(); - hline = tr.TrackHorzLine(0, 0, sz.cx, hline); - } - else - if(keyflags & K_CTRL) { - tr.Solid(); - vline = tr.TrackVertLine(0, 0, sz.cy, vline); - } - else { - tr.Normal(); - rect = tr.Track(rect, ALIGN_RIGHT, ALIGN_BOTTOM); - } + break; + }; Refresh(); } @@ -63,6 +73,19 @@ struct MyApp : TopWindow { hline = 150; vline = 150; Sizeable().Zoomable(); + + line1 = line2 = Point(10, 10); + + Add(op.LeftPosZ(10, 200).TopPosZ(10)); + op.Add(0, "Bottom right corner of rectangle"); + op.Add(1, "Top left corner of rectangle"); + op.Add(2, "Move rectangle"); + op.Add(3, "Vertical line"); + op.Add(4, "Horizontal line"); + op.Add(5, "Free line"); + op.Add(6, "Resize rectangle, special features"); + + op <<= 0; } }; diff --git a/reference/SQL_MultiDB/SQL_MultiDB.upp b/reference/SQL_MultiDB/SQL_MultiDB.upp new file mode 100644 index 000000000..5e168ba18 --- /dev/null +++ b/reference/SQL_MultiDB/SQL_MultiDB.upp @@ -0,0 +1,16 @@ +description "Demonstrates how to handle multiple database connections\377"; + +uses + Core, + MySql, + plugin/sqlite3; + +file + mysql_schema.sch, + sqlite3_schema.sch, + multidb.h, + main.cpp; + +mainconfig + "" = ""; + diff --git a/reference/SQL_MultiDB/main.cpp b/reference/SQL_MultiDB/main.cpp new file mode 100644 index 000000000..0b111aa94 --- /dev/null +++ b/reference/SQL_MultiDB/main.cpp @@ -0,0 +1,55 @@ +#include + +using namespace Upp; + +#define SCHEMADIALECT +#define MODEL +#include // creates the code for mapping schema structures to database rows +#include // creates the code to generate sql scripts that upload schema to DB +#undef SCHEMADIALECT + +namespace DB2 { +#define SCHEMADIALECT +#define MODEL +#include +#include +#undef SCHEMADIALECT +} + +CONSOLE_APP_MAIN +{ + Sqlite3Session sqlite3; + MySqlSession mysql; + // edit the connection parameters if necessary + if(mysql.Connect("root", "Passw0rd", "test")) { + Cout() << "Connected\n"; + SQL = mysql; + + SqlSchema sch(MY_SQL); + All_Tables(sch); + // create the table if necessary + SqlPerformScript(sch.Upgrade()); + SqlPerformScript(sch.Attributes()); + SQL.ClearError(); + + try { + // insert some random data + SQL & Insert(TEST_TABLE)(VALUE, Uuid::Create().ToString()); + // fetch some data + Sql sql; + sql * Select(ID, VALUE).From(TEST_TABLE) + .OrderBy(Descending(ID)) + .Limit(5); + while(sql.Fetch()) + Cout() << AsString(sql[0]) << ": " << AsString(sql[VALUE]) << "\n"; + } + catch(SqlExc &ex) { + Cerr() << "ERROR: " << ex << "\n"; + SetExitCode(1); + } + } + else { + Cerr() <<"ERROR: Unable to connect to database\n"; + SetExitCode(1); + } +} diff --git a/reference/SQL_MultiDB/multidb.h b/reference/SQL_MultiDB/multidb.h new file mode 100644 index 000000000..3419f1024 --- /dev/null +++ b/reference/SQL_MultiDB/multidb.h @@ -0,0 +1,16 @@ +#ifndef _SQL_MultiDB_multidb_h_ +#define _SQL_MultiDB_multidb_h_ + +#define SCHEMADIALECT +#define MODEL +#include +#undef SCHEMADIALECT + +namespace DB2 { +#define SCHEMADIALECT +#define MODEL +#include +#undef SCHEMADIALECT +}; + +#endif diff --git a/reference/SQL_MultiDB/mysql_schema.sch b/reference/SQL_MultiDB/mysql_schema.sch new file mode 100644 index 000000000..e6a0e9fa2 --- /dev/null +++ b/reference/SQL_MultiDB/mysql_schema.sch @@ -0,0 +1,4 @@ +TABLE_(TEST_TABLE) + INT_ (ID) PRIMARY_KEY AUTO_INCREMENT + STRING_ (VALUE, 32) +END_TABLE diff --git a/reference/SQL_MultiDB/sqlite3_schema.sch b/reference/SQL_MultiDB/sqlite3_schema.sch new file mode 100644 index 000000000..ba090da93 --- /dev/null +++ b/reference/SQL_MultiDB/sqlite3_schema.sch @@ -0,0 +1,5 @@ +TABLE(TEST_TABLE) // Note that column names definition is simply shared between schemas + INT (ID) PRIMARY_KEY AUTO_INCREMENT + STRING (VALUE, 32) + STRING_ (NAME, 200) +END_TABLE