Browse Source

Allow QTabBar creation from XML configuration files

Neal Wilson 7 years ago
parent
commit
b3de80261a
1 changed files with 78 additions and 0 deletions
  1. 78
    0
      src/typica.w

+ 78
- 0
src/typica.w View File

@@ -4917,6 +4917,80 @@ void populateStackedLayout(QDomElement element, QStack<QWidget *> *widgetStack,
4917 4917
     }
4918 4918
 }
4919 4919
 
4920
+@ A common use of stacked layouts is in the creation of tabbed interfaces, but
4921
+there are also many uses in \pn{} where the tabs are not required. Therefore,
4922
+tab bar creation requires a separate XML element.
4923
+
4924
+@<Additional box layout elements@>=
4925
+else if(currentElement.tagName() == "tabbar")
4926
+{
4927
+	addTabBarToLayout(currentElement, widgetStack, layoutStack);
4928
+}
4929
+
4930
+@ The function used to create this follows the usual pattern.
4931
+
4932
+@<Functions for scripting@>=
4933
+void addTabBarToLayout(QDomElement element, QStack<QWidget*> *, QStack<QLayout*> *layoutStack)
4934
+{
4935
+	QBoxLayout *layout = qobject_cast<QBoxLayout *>(layoutStack->top());
4936
+	QTabBar *widget = new QTabBar;
4937
+	layout->addWidget(widget);
4938
+	if(!element.attribute("id").isEmpty())
4939
+	{
4940
+		widget->setObjectName(element.attribute("id"));
4941
+	}
4942
+}
4943
+
4944
+@ Rather than define the tab set in XML, this is left to the host environment.
4945
+This means that some additional scripting support is required.
4946
+
4947
+@<Set up the scripting engine@>=
4948
+constructor = engine->newFunction(constructQTabBar);
4949
+value = engine->newQMetaObject(&QTabBar::staticMetaObject, constructor);
4950
+engine->globalObject().setProperty("QTabBar", value);
4951
+
4952
+@ The constructor is trivial.
4953
+
4954
+@<Functions for scripting@>=
4955
+QScriptValue constructQTabBar(QScriptContext *, QScriptEngine *engine)
4956
+{
4957
+	QScriptValue object = engine->newQObject(new QTabBar);
4958
+	setQTabBarProperties(object, engine);
4959
+	return object;
4960
+}
4961
+
4962
+@ There are many functions that I might want to some day add support for, but
4963
+the immediate need is just creating the tabs in the first place.
4964
+
4965
+@<Functions for scripting@>=
4966
+void setQTabBarProperties(QScriptValue value, QScriptEngine *engine)
4967
+{
4968
+	setQWidgetProperties(value, engine);
4969
+	value.setProperty("addTab", engine->newFunction(QTabBar_addTab));
4970
+}
4971
+
4972
+QScriptValue QTabBar_addTab(QScriptContext *context, QScriptEngine *)
4973
+{
4974
+	QTabBar *self = getself<QTabBar *>(context);
4975
+	if(context->argumentCount() > 0)
4976
+	{
4977
+		self->addTab(argument<QString>(0, context));
4978
+	}
4979
+	else
4980
+	{
4981
+		context->throwError("Incorrect number of arguments passed to "@|
4982
+		                    "QTabBar::addTab().");
4983
+	}
4984
+	return QScriptValue();
4985
+}
4986
+
4987
+@ Function prototypes are needed.
4988
+
4989
+@<Function prototypes for scripting@>=
4990
+QScriptValue constructQTabBar(QScriptContext *context, QScriptEngine *engine);
4991
+void setQTabBarProperties(QScriptValue value, QScriptEngine *engine);
4992
+QScriptValue QTabBar_addTab(QScriptContext *context, QScriptEngine *engine);
4993
+
4920 4994
 @ Using a grid layout is a bit different from using a box layout. Child elements
4921 4995
 with various attributes are required to take full advantage of this layout type.
4922 4996
 All direct children of a grid layout element should be {\tt <row>} elements
@@ -6385,6 +6459,10 @@ else if(className == "QSvgWidget")
6385 6459
 {
6386 6460
     setQSvgWidgetProperties(value, engine);
6387 6461
 }
6462
+else if(className == "QTabBar")
6463
+{
6464
+	setQTabBarProperties(value, engine);
6465
+}
6388 6466
 
6389 6467
 @ In the list of classes, the SaltTable entry is for a class which does not
6390 6468
 strictly exist on its own. It is, however, useful to provide some custom

Loading…
Cancel
Save