Commit 497dd323 authored by Daniel Molkentin's avatar Daniel Molkentin Committed by Eike Ziller

Introduce QML-based welcome screen using desktop components

Implements new XML-based format for examples, demos & tutorials

Done-with: Primrose Mbanefo <ext-primrose.mbanefo@nokia.com>
Change-Id: I42c0afdb419cffe5637cd4f298e828d09e0fb15a
Reviewed-on: http://codereview.qt.nokia.com/840Reviewed-by: default avatarEike Ziller <eike.ziller@nokia.com>
parent b23aa108
......@@ -90,6 +90,7 @@ share/doc/qtcreator/qtcreator.qch
src/tools/gen-cpp-ast/generate-ast
src/tools/mkvisitor/cplusplus0
src/tools/qml/qmldump/qmldump
src/tools/examplesscanner/examplesscanner
src/tools/valgrindfake/valgrind-fake
# Tests
......
......@@ -24,6 +24,7 @@ isEmpty(vcproj) {
}
DATA_DIRS = \
welcomescreen \
examplebrowser \
snippets \
templates \
......
import QtQuick 1.0
import "custom" as Components
import "plugin"
Components.Button {
id:button
// dm: this is wrong
width: Math.max(100, button.iconSource !== "" ? labelItem.contentsWidth+12 : 0 )
height: Math.max(22, sizehint.height)
property variant sizehint: backgroundItem.sizeFromContents(80, 6)
property bool defaultbutton
property string hint
background: QStyleItem {
id: styleitem
anchors.fill: parent
elementType: "button"
sunken: pressed || checked
raised: !(pressed || checked)
hover: containsMouse
text: button.iconSource === "" ? button.text : ""
focus: button.focus
hint: button.hint
// If no icon, let the style do the drawing
activeControl: focus ? "default" : ""
Connections{
target: button
onToolTipTriggered: styleitem.showTip()
}
function showTip(){
showToolTip(tooltip);
}
}
label: Item {
// Used as a fallback since I can't pass the imageURL
// directly to the style object
visible: button.iconSource !== ""
property int contentsWidth : row.width
Row {
id: row
anchors.centerIn: parent
spacing: 4
Image {
source: iconSource
anchors.verticalCenter: parent.verticalCenter
fillMode: Image.Stretch //mm Image should shrink if button is too small, depends on QTBUG-14957
}
Text {
id:text
color: textColor
anchors.verticalCenter: parent.verticalCenter
text: button.text
horizontalAlignment: Text.Center
}
}
}
Keys.onSpacePressed:clicked()
}
import QtQuick 1.0
import "custom" as Components
Components.ButtonRow {
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
// jb : Size should not depend on background, we should make it consistent
Components.CheckBox{
id:checkbox
property string text
property string hint
height:20
width: Math.max(110, backgroundItem.textWidth(text) + 40)
background: QStyleItem {
elementType:"checkbox"
sunken:pressed
on:checked || pressed
hover:containsMouse
text:checkbox.text
enabled:checkbox.enabled
focus:checkbox.focus
hint:checkbox.hint
}
Keys.onSpacePressed:checked = !checked
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
Components.ChoiceList {
id: choicelist
property int buttonHeight: backgroundItem.sizeFromContents(100, 18).height
property int buttonWidth: backgroundItem.sizeFromContents(100, 18).width
property string hint
height: buttonHeight
width: buttonWidth
topMargin: 4
bottomMargin: 4
background: QStyleItem {
anchors.fill: parent
elementType: "combobox"
sunken: pressed
raised: !pressed
hover: containsMouse
enabled: choicelist.enabled
text: currentItemText
focus: choicelist.focus
hint: choicelist.hint
}
listItem: Item {
id:item
height: 22
anchors.left: parent.left
width: choicelist.width
QStyleItem {
anchors.fill: parent
elementType: "comboboxitem"
text: itemText
selected: highlighted
}
}
popupFrame: QStyleItem {
property string popupLocation: backgroundItem.styleHint("comboboxpopup") ? "center" : "below"
property int fw: backgroundItem.pixelMetric("menupanelwidth");
anchors.leftMargin: backgroundItem.pixelMetric("menuhmargin") + fw
anchors.rightMargin: backgroundItem.pixelMetric("menuhmargin") + fw
anchors.topMargin: backgroundItem.pixelMetric("menuvmargin") + fw
anchors.bottomMargin: backgroundItem.pixelMetric("menuvmargin") + fw
elementType: "menu"
effect: DropShadow {
blurRadius: 18
color: "#90000000"
xOffset: 1
yOffset: 1
}
}
}
import QtQuick 1.0
import "custom" as Components
MenuBase {
id: choiceList
property ListModel model
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
// jens: ContainsMouse breaks drag functionality
QStyleItem {
id: dial
width:100
height:100
property alias maximumValue: range.maximumValue
property alias minimumValue: range.minimumValue
property alias containsMouse: mouseArea.containsMouse
property alias value: range.value
property bool wrapping: false
property bool tickmarks: true // not implemented
RangeModel {
id: range
minimumValue: 0.0
maximumValue: 1.0
stepSize: 0.0
value: 0
}
MouseArea {
id: mouseArea
anchors.fill:parent
property bool inDrag
hoverEnabled:true
onPositionChanged: {
if (pressed) {
value = valueFromPoint(mouseX, mouseY)
inDrag = true
}
}
onPressed: {
value = valueFromPoint(mouseX, mouseY)
dial.focus = true
}
onReleased:inDrag = false;
function bound(val) { return Math.max(minimumValue, Math.min(maximumValue, val)); }
function valueFromPoint(x, y)
{
var yy = height/2.0 - y;
var xx = x - width/2.0;
var a = (xx || yy) ? Math.atan2(yy, xx) : 0;
if (a < Math.PI/ -2)
a = a + Math.PI * 2;
var dist = 0;
var minv = minimumValue*100, maxv = maximumValue*100;
if (minimumValue < 0) {
dist = -minimumValue;
minv = 0;
maxv = maximumValue + dist;
}
var r = maxv - minv;
var v;
if (wrapping)
v = (0.5 + minv + r * (Math.PI * 3 / 2 - a) / (2 * Math.PI));
else
v = (0.5 + minv + r* (Math.PI * 4 / 3 - a) / (Math.PI * 10 / 6));
if (dist > 0)
v -= dist;
return maximumValue - bound(v/100)
}
}
WheelArea {
id: wheelarea
anchors.fill: parent
horizontalMinimumValue: dial.minimumValue
horizontalMaximumValue: dial.maximumValue
verticalMinimumValue: dial.minimumValue
verticalMaximumValue: dial.maximumValue
property double step: (dial.maximumValue - dial.minimumValue)/100
onVerticalWheelMoved: {
value += verticalDelta/4*step
}
onHorizontalWheelMoved: {
value += horizontalDelta/4*step
}
}
elementType:"dial"
sunken: mouseArea.pressed
maximum: range.maximumValue*90
minimum: range.minimumValue*90
focus:dial.focus
value: visualPos*90
enabled: dial.enabled
property double visualPos : range.value
Behavior on visualPos {
enabled: !mouseArea.inDrag
NumberAnimation {
duration: 300
easing.type: Easing.OutSine
}
}
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
QStyleBackground {
width: 100
height: 100
default property alias children: content.children
style: QStyleItem {
id: styleitem
elementType: "frame"
}
Item {
id: content
anchors.fill: parent
anchors.margins: frameWidth
property int frameWidth: styleitem.pixelMetric("defaultframewidth");
}
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
Components.GroupBox {
id: groupbox
width: Math.max(200, contentWidth + sizeHint.width)
height: contentHeight + sizeHint.height + 4
property variant sizeHint: backgroundItem.sizeFromContents(0, 24)
property bool flat: false
background : QStyleItem {
id: styleitem
elementType: "groupbox"
anchors.fill: parent
text: groupbox.title
hover: checkbox.containsMouse
on: checkbox.checked
focus: checkbox.activeFocus
activeControl: checkable ? "checkbox" : ""
sunken: !flat
}
}
import QtQuick 1.0
import "../components/plugin"
MenuBase {
}
import QtQuick 1.0
import "../components/plugin"
MenuItemBase {
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
Components.ProgressBar {
id:progressbar
property variant sizehint: backgroundItem.sizeFromContents(23, 23)
property int orientation: Qt.Horizontal
property string hint
height: orientation === Qt.Horizontal ? sizehint.height : 200
width: orientation === Qt.Horizontal ? 200 : sizehint.height
background: QStyleItem {
anchors.fill: parent
elementType: "progressbar"
// XXX: since desktop uses int instead of real, the progressbar
// range [0..1] must be stretched to a good precision
property int factor : 1000
value: indeterminate ? 0 : progressbar.value * factor // does indeterminate value need to be 1 on windows?
minimum: indeterminate ? 0 : progressbar.minimumValue * factor
maximum: indeterminate ? 0 : progressbar.maximumValue * factor
enabled: progressbar.enabled
horizontal: progressbar.orientation == Qt.Horizontal
hint: progressbar.hint
}
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
// jb : Size should not depend on background, we should make it consistent
Components.CheckBox {
id:radiobutton
property string text
property string hint
width:110
height:20
background: QStyleItem {
elementType:"radiobutton"
sunken:pressed
on:checked || pressed
hover:containsMouse
text:radiobutton.text
enabled:radiobutton.enabled
focus:radiobutton.focus
hint:radiobutton.hint
}
Keys.onSpacePressed:clicked()
}
import QtQuick 1.0
import "custom" as Components
import "plugin"
FocusScope {
id: scrollarea
width: 100
height: 100
property int frameWidth: frame ? styleitem.pixelMetric("defaultframewidth") : 0;
property int contentHeight : content.childrenRect.height
property int contentWidth: content.childrenRect.width
property alias color: colorRect.color
property bool frame: true
property bool highlightOnFocus: false
property bool frameAroundContents: styleitem.styleHint("framearoundcontents")
property alias verticalValue: vscrollbar.value
property alias horizontalValue: hscrollbar.value
default property alias data: content.data
property int contentY
property int contentX
onContentYChanged: {
vscrollbar.value = contentY
wheelarea.verticalValue = contentY
}
onContentXChanged: {
hscrollbar.value = contentX
wheelarea.horizontalValue = contentX
}
Rectangle {
id: colorRect
color: "transparent"
anchors.fill:styleitem
anchors.margins: frameWidth
}
QStyleItem {
id: styleitem
elementType: "frame"
onElementTypeChanged: scrollarea.frameWidth = styleitem.pixelMetric("defaultframewidth");
sunken: true
visible: frame
anchors.fill: parent
anchors.rightMargin: frame ? (frameAroundContents ? (vscrollbar.visible ? vscrollbar.width + 2 * frameMargins : 0) : -frameWidth) : 0
anchors.bottomMargin: frame ? (frameAroundContents ? (hscrollbar.visible ? hscrollbar.height + 2 * frameMargins : 0) : -frameWidth) : 0
anchors.topMargin: frame ? (frameAroundContents ? 0 : -frameWidth) : 0
property int scrollbarspacing: styleitem.pixelMetric("scrollbarspacing");
property int frameMargins : frame ? scrollbarspacing : 0
property int frameoffset: style === "mac" ? -1 : 0
}
Item {
id: flickable
anchors.fill: styleitem
anchors.margins: frameWidth
clip: true
Item {
id: content
x: -scrollarea.contentX
y: -scrollarea.contentY
}
}
WheelArea {
id: wheelarea
anchors.fill: parent
horizontalMinimumValue: hscrollbar.minimumValue
horizontalMaximumValue: hscrollbar.maximumValue
verticalMinimumValue: vscrollbar.minimumValue
verticalMaximumValue: vscrollbar.maximumValue
onVerticalValueChanged: {
contentY = verticalValue
}
onHorizontalValueChanged: {
contentX = horizontalValue
}
}
ScrollBar {
id: hscrollbar
orientation: Qt.Horizontal
property int availableWidth : scrollarea.width - (frame ? (vscrollbar.width) : 0)
visible: contentWidth > availableWidth
maximumValue: contentWidth > availableWidth ? scrollarea.contentWidth - availableWidth: 0
minimumValue: 0
anchors.bottom: parent.bottom
anchors.bottomMargin: styleitem.frameoffset
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: (frame ? frameWidth : 0)
anchors.rightMargin: { vscrollbar.visible ? scrollbarExtent : (frame ? 1 : 0) }
onValueChanged: contentX = value
property int scrollbarExtent : styleitem.pixelMetric("scrollbarExtent");
}
ScrollBar {
id: vscrollbar
orientation: Qt.Vertical
property int availableHeight : scrollarea.height - (frame ? (hscrollbar.height) : 0)