1/**************************************************************************** 2** 3** Copyright (C) 2018 The Qt Company Ltd. 4** Contact: https://www.qt.io/licensing/ 5** 6** This file is part of the examples of the Qt Toolkit. 7** 8** $QT_BEGIN_LICENSE:BSD$ 9** Commercial License Usage 10** Licensees holding valid commercial Qt licenses may use this file in 11** accordance with the commercial license agreement provided with the 12** Software or, alternatively, in accordance with the terms contained in 13** a written agreement between you and The Qt Company. For licensing terms 14** and conditions see https://www.qt.io/terms-conditions. For further 15** information use the contact form at https://www.qt.io/contact-us. 16** 17** BSD License Usage 18** Alternatively, you may use this file under the terms of the BSD license 19** as follows: 20** 21** "Redistribution and use in source and binary forms, with or without 22** modification, are permitted provided that the following conditions are 23** met: 24** * Redistributions of source code must retain the above copyright 25** notice, this list of conditions and the following disclaimer. 26** * Redistributions in binary form must reproduce the above copyright 27** notice, this list of conditions and the following disclaimer in 28** the documentation and/or other materials provided with the 29** distribution. 30** * Neither the name of The Qt Company Ltd nor the names of its 31** contributors may be used to endorse or promote products derived 32** from this software without specific prior written permission. 33** 34** 35** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 36** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 37** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 38** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 39** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 41** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 42** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 43** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 44** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 45** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 46** 47** $QT_END_LICENSE$ 48** 49****************************************************************************/ 50 51import QtQml 2.12 52import QtQuick 2.12 53import QtQuick.Window 2.3 54import QtQuick.Controls 2.2 55import QtQuick.Layouts 1.3 56import GameOfLifeModel 1.0 57 58ApplicationWindow { 59 id: root 60 visible: true 61 width: 760 62 height: 810 63 minimumWidth: 475 64 minimumHeight: 300 65 66 color: "#09102B" 67 title: qsTr("Conway’s Game of Life") 68 69 //! [tableview] 70 TableView { 71 id: tableView 72 anchors.fill: parent 73 74 rowSpacing: 1 75 columnSpacing: 1 76 77 ScrollBar.horizontal: ScrollBar {} 78 ScrollBar.vertical: ScrollBar {} 79 80 delegate: Rectangle { 81 id: cell 82 implicitWidth: 15 83 implicitHeight: 15 84 85 required property var model 86 required property bool value 87 88 color: value ? "#f3f3f4" : "#b5b7bf" 89 90 MouseArea { 91 anchors.fill: parent 92 onClicked: parent.model.value = !parent.value 93 } 94 } 95 //! [tableview] 96 97 //! [model] 98 model: GameOfLifeModel { 99 id: gameOfLifeModel 100 } 101 //! [model] 102 103 //! [scroll] 104 contentX: (contentWidth - width) / 2; 105 contentY: (contentHeight - height) / 2; 106 //! [scroll] 107 } 108 109 footer: Rectangle { 110 signal nextStep 111 112 id: footer 113 height: 50 114 color: "#F3F3F4" 115 116 RowLayout { 117 anchors.centerIn: parent 118 119 //! [next] 120 Button { 121 text: qsTr("Next") 122 onClicked: gameOfLifeModel.nextStep() 123 } 124 //! [next] 125 126 Item { 127 width: 50 128 } 129 130 Slider { 131 id: slider 132 x: 245 133 y: 17 134 from: 0 135 to: 1 136 value: 0.9 137 } 138 139 Button { 140 text: timer.running ? "❙❙" : "▶️" 141 onClicked: timer.running = !timer.running 142 } 143 } 144 145 Timer { 146 id: timer 147 interval: 1000 - (980 * slider.value) 148 running: true 149 repeat: true 150 151 onTriggered: gameOfLifeModel.nextStep() 152 } 153 } 154 155 Component.onCompleted: { 156 gameOfLifeModel.loadFile(":/gosperglidergun.cells"); 157 } 158} 159