/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick
import QtQuick.Window
Item {
id: display
property realfontSize: Math.floor(Screen.pixelDensity*5.0)
property boolenteringDigits: false
readonly property intmaxDigits: (width/fontSize) +1
property stringdisplayedOperand
property stringerrorString: qsTr("ERROR")
readonly property boolisError: displayedOperand===errorStringfunction displayOperator(operator)
{
listView.model.append({ "operator": operator, "operand": "" })
enteringDigits=truelistView.positionViewAtEnd()
}
function newLine(operator, operand)
{
displayedOperand=displayNumber(operand)
listView.model.append({ "operator": operator, "operand": displayedOperand })
enteringDigits=falselistView.positionViewAtEnd()
}
function appendDigit(digit)
{
if (!enteringDigits)
listView.model.append({ "operator": "", "operand": "" })
const i = listView.model.count-1;
listView.model.get(i).operand=listView.model.get(i).operand+digit;
enteringDigits=truelistView.positionViewAtEnd()
}
function setDigit(digit)
{
const i = listView.model.count-1;
listView.model.get(i).operand=digit;
listView.positionViewAtEnd()
}
function clear()
{
displayedOperand=""if (enteringDigits) {
const i = listView.model.count-1if (i>=0)
listView.model.remove(i)
enteringDigits=false
}
}
// Returns a string representation of a number that fits in// display.maxDigits characters, trying to keep as much precision// as possible. If the number cannot be displayed, returns an// error string.function displayNumber(num) {
if (typeof(num) !="number")
returnerrorString;
const intNum = parseInt(num);
const intLen = intNum.toString().length;
// Do not count the minus sign as a digit
const maxLen = num<0 ? maxDigits+1 : maxDigits;
if (num.toString().length<=maxLen) {
if (isFinite(num))
returnnum.toString();
returnerrorString;
}
// Integer part of the number is too long - try// an exponential notationif (intNum==num||intLen>maxLen-3) {
const expVal = num.toExponential(maxDigits-6).toString();
if (expVal.length<=maxLen)
returnexpVal;
}
// Try a float presentation with fixed number of digits
const floatStr = parseFloat(num).toFixed(maxDigits-intLen-1).toString();
if (floatStr.length<=maxLen)
returnfloatStr;
returnerrorString;
}
Item {
id: theItemwidth: parent.width+32height: parent.heightRectangle {
id: rectx: 16color: "white"height: parent.heightwidth: display.width-16
}
Image {
anchors.right: rect.leftsource: "images/paper-edge-left.png"height: parent.heightfillMode: Image.TileVertically
}
Image {
anchors.left: rect.rightsource: "images/paper-edge-right.png"height: parent.heightfillMode: Image.TileVertically
}
Image {
id: gripsource: "images/paper-grip.png"anchors.horizontalCenter: parent.horizontalCenteranchors.bottom: parent.bottomanchors.bottomMargin: 20
}
ListView {
id: listViewx: 16; y: 30width: display.widthheight: display.height-50-ydelegate: Item {
height: display.fontSize*1.1width: parent.widthText {
id: operatorx: 6font.pixelSize: display.fontSizecolor: "#6da43d"text: model.operator
}
Text {
id: operandfont.pixelSize: display.fontSizeanchors.right: parent.rightanchors.rightMargin: 22text: model.operand
}
}
model: ListModel { }
}
}
}