Display.qml Example File | Qt Quick 5.9

Qt 5.9 | Qt Quick | Qt Quick Demo - Calqlatr | Display.qml Example File

Qt 5.9.4 Reference Documentation

# Display.qml Example File

demos/calqlatr/content/Display.qml

      /****************************************************************************
      **
      ** 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 2.0
      import QtQuick.Window 2.0

      Item {
          id: display
          property real fontSize: Math.floor(Screen.pixelDensity * 5.0)
          property bool enteringDigits: false
          property int maxDigits: (width / fontSize) + 1
          property string displayedOperand
          property string errorString: qsTr("ERROR")
          property bool isError: displayedOperand === errorString

          function displayOperator(operator)
          {
              listView.model.append({ "operator": operator, "operand": "" })
              enteringDigits = true
              listView.positionViewAtEnd()
          }

          function newLine(operator, operand)
          {
              displayedOperand = displayNumber(operand)
              listView.model.append({ "operator": operator, "operand": displayedOperand })
              enteringDigits = false
              listView.positionViewAtEnd()
          }

          function appendDigit(digit)
          {
              if (!enteringDigits)
                  listView.model.append({ "operator": "", "operand": "" })
              var i = listView.model.count - 1;
              listView.model.get(i).operand = listView.model.get(i).operand + digit;
              enteringDigits = true
              listView.positionViewAtEnd()
          }

          function setDigit(digit)
          {
              var i = listView.model.count - 1;
              listView.model.get(i).operand = digit;
              listView.positionViewAtEnd()
          }

          function clear()
          {
              displayedOperand = ""
              if (enteringDigits) {
                  var i = listView.model.count - 1
                  if (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")
                  return errorString;

              var intNum = parseInt(num);
              var intLen = intNum.toString().length;

              // Do not count the minus sign as a digit
              var maxLen = num < 0 ? maxDigits + 1 : maxDigits;

              if (num.toString().length <= maxLen) {
                  if (isFinite(num))
                      return num.toString();
                  return errorString;
              }

              // Integer part of the number is too long - try
              // an exponential notation
              if (intNum == num || intLen > maxLen - 3) {
                  var expVal = num.toExponential(maxDigits - 6).toString();
                  if (expVal.length <= maxLen)
                      return expVal;
              }

              // Try a float presentation with fixed number of digits
              var floatStr = parseFloat(num).toFixed(maxDigits - intLen - 1).toString();
              if (floatStr.length <= maxLen)
                  return floatStr;

              return errorString;
          }

          Item {
              id: theItem
              width: parent.width + 32
              height: parent.height

              Rectangle {
                  id: rect
                  x: 16
                  color: "white"
                  height: parent.height
                  width: display.width - 16
              }
              Image {
                  anchors.right: rect.left
                  source: "images/paper-edge-left.png"
                  height: parent.height
                  fillMode: Image.TileVertically
              }
              Image {
                  anchors.left: rect.right
                  source: "images/paper-edge-right.png"
                  height: parent.height
                  fillMode: Image.TileVertically
              }

              Image {
                  id: grip
                  source: "images/paper-grip.png"
                  anchors.horizontalCenter: parent.horizontalCenter
                  anchors.bottom: parent.bottom
                  anchors.bottomMargin: 20
              }

              ListView {
                  id: listView
                  x: 16; y: 30
                  width: display.width
                  height: display.height - 50 - y
                  delegate: Item {
                      height: display.fontSize * 1.1
                      width: parent.width
                      Text {
                          id: operator
                          x: 6
                          font.pixelSize: display.fontSize
                          color: "#6da43d"
                          text: model.operator
                      }
                      Text {
                          id: operand
                          font.pixelSize: display.fontSize
                          anchors.right: parent.right
                          anchors.rightMargin: 22
                          text: model.operand
                      }
                  }
                  model: ListModel { }
              }

          }

      }