Browse Source

Add QSvgWidget support

Neal Wilson 9 years ago
parent
commit
cc8a914edc
2 changed files with 93 additions and 0 deletions
  1. 1
    0
      src/Typica.pro
  2. 92
    0
      src/typica.w

+ 1
- 0
src/Typica.pro View File

8
 QT += xmlpatterns
8
 QT += xmlpatterns
9
 QT += scripttools
9
 QT += scripttools
10
 QT += webkit
10
 QT += webkit
11
+QT += svg
11
 
12
 
12
 CONFIG += extserialport
13
 CONFIG += extserialport
13
 
14
 

+ 92
- 0
src/typica.w View File

623
 #include <QtDebug>
623
 #include <QtDebug>
624
 #include <QtXmlPatterns>
624
 #include <QtXmlPatterns>
625
 #include <QtWebKit>
625
 #include <QtWebKit>
626
+#include <QtSvg>
626
 
627
 
627
 @ New code is being written in separate files in a long term effort to improve
628
 @ New code is being written in separate files in a long term effort to improve
628
 organization of the code. The result of this is that some additional headers
629
 organization of the code. The result of this is that some additional headers
1363
     setQFrameProperties(value, engine);
1364
     setQFrameProperties(value, engine);
1364
 }
1365
 }
1365
 
1366
 
1367
+@* Scripting QSvgWidget.
1368
+
1369
+\noindent Sometimes it is useful to provide a space for simple drawings without
1370
+the need for all of the other capabilities of a web view. This was introduced
1371
+as a way to draw box plots to help guide the creation of roast specifications.
1372
+
1373
+@<Function prototypes for scripting@>=
1374
+void setQSvgWidgetProperties(QScriptValue value, QScriptEngine *engine);
1375
+QScriptValue constructQSvgWidget(QScriptContext *context,
1376
+                                 QScriptEngine *engine);
1377
+QScriptValue QSvgWidget_loadDevice(QScriptContext *context,
1378
+                                   QScriptEngine *engine);
1379
+void addSvgWidgetToLayout(QDomElement element, QStack<QWidget *> *widgetStack,
1380
+                          QStack<QLayout *> *layoutStack);
1381
+
1382
+@ The constructor must be passed to the scripting engine.
1383
+
1384
+@<Set up the scripting engine@>=
1385
+constructor = engine->newFunction(constructQSvgWidget);
1386
+value = engine->newQMetaObject(&QSvgWidget::staticMetaObject, constructor);
1387
+engine->globalObject().setProperty("QSvgWidget", value);
1388
+
1389
+@ The constructor is trivial.
1390
+
1391
+@<Functions for scripting@>=
1392
+QScriptValue constructQSvgWidget(QScriptContext *context,
1393
+                                 QScriptEngine *engine)
1394
+{
1395
+    QScriptValue object = engine->newQObject(new QSvgWidget);
1396
+    setQSvgWidgetProperties(object, engine);
1397
+    return object;
1398
+}
1399
+
1400
+@ A property is added that allows loading data from a |QIODevice|.
1401
+
1402
+@<Functions for scripting@>=
1403
+void setQSvgWidgetProperties(QScriptValue value, QScriptEngine *engine)
1404
+{
1405
+    setQWidgetProperties(value, engine);
1406
+    value.setProperty("loadDevice",
1407
+                      engine->newFunction(QSvgWidget_loadDevice));
1408
+}
1409
+
1410
+QScriptValue QSvgWidget_loadDevice(QScriptContext *context, QScriptEngine *)
1411
+{
1412
+    if(context->argumentCount() == 1)
1413
+    {
1414
+        QSvgWidget *self = getself<@[QSvgWidget *@]>(context);
1415
+        QIODevice *device = argument<QIODevice *>(0, context);
1416
+        device->reset();
1417
+        QByteArray data = device->readAll();
1418
+        self->load(data);
1419
+    }
1420
+    else
1421
+    {
1422
+        context->throwError("Incorrect number of arguments passed to "@|
1423
+                            "QSvgWidget::loadData(). This method takes one "@|
1424
+                            "QIODevice as an argument.");
1425
+    }
1426
+    return QScriptValue();
1427
+}
1428
+
1429
+@ Additional work is needed to allow including this from the XML description of
1430
+a window.
1431
+
1432
+@<Additional box layout elements@>=
1433
+else if(currentElement.tagName() == "svgwidget")
1434
+{
1435
+    addSvgWidgetToLayout(currentElement, widgetStack, layoutStack);
1436
+}
1437
+
1438
+@ The function used to create this follows the usual pattern.
1439
+
1440
+@<Functions for scripting@>=
1441
+void addSvgWidgetToLayout(QDomElement element, QStack<QWidget *> *,
1442
+                          QStack<QLayout *> *layoutStack)
1443
+{
1444
+    QBoxLayout *layout = qobject_cast<QBoxLayout *>(layoutStack->top());
1445
+    QSvgWidget *widget = new QSvgWidget;
1446
+    layout->addWidget(widget);
1447
+    QString id = element.attribute("id");
1448
+    if(!id.isEmpty())
1449
+    {
1450
+        widget->setObjectName(id);
1451
+    }
1452
+}
1453
+
1366
 @* Scripting QLineEdit.
1454
 @* Scripting QLineEdit.
1367
 
1455
 
1368
 \noindent Similarly, we may want to allow line edits in interfaces defined
1456
 \noindent Similarly, we may want to allow line edits in interfaces defined
6116
 {
6204
 {
6117
     setQLineEditProperties(value, engine);
6205
     setQLineEditProperties(value, engine);
6118
 }
6206
 }
6207
+else if(className == "QSvgWidget")
6208
+{
6209
+    setQSvgWidgetProperties(value, engine);
6210
+}
6119
 
6211
 
6120
 @ In the list of classes, the SaltTable entry is for a class which does not
6212
 @ In the list of classes, the SaltTable entry is for a class which does not
6121
 strictly exist on its own. It is, however, useful to provide some custom
6213
 strictly exist on its own. It is, however, useful to provide some custom

Loading…
Cancel
Save