From d5cc61fbda71321afcdee0d41bbeeb3568e96ec3 Mon Sep 17 00:00:00 2001 From: samreid Date: Thu, 27 Feb 2020 11:38:06 -0700 Subject: [PATCH] Add repo to migration list, see https://github.com/phetsims/chipper/issues/875 --- area-model-common-tests.html | 40 +- js/AreaModelCommonA11yStrings.js | 337 ++-- js/area-model-common-strings.js | 14 + js/area-model-common-test-config.js | 50 - js/area-model-common-tests.js | 14 +- js/areaModelCommon.js | 8 +- js/common/AreaModelCommonConstants.js | 242 ++- js/common/AreaModelCommonGlobals.js | 24 +- js/common/AreaModelCommonQueryParameters.js | 22 +- js/common/model/Area.js | 440 +++-- js/common/model/AreaCalculationChoice.js | 44 +- js/common/model/AreaDisplay.js | 222 ++- js/common/model/AreaModelCommonModel.js | 202 +- js/common/model/OrientationPair.js | 156 +- js/common/model/PartialProductsChoice.js | 36 +- js/common/model/Partition.js | 106 +- js/common/model/PartitionedArea.js | 80 +- js/common/model/Polynomial.js | 172 +- js/common/model/PolynomialTests.js | 90 +- js/common/model/Term.js | 272 ++- js/common/model/TermList.js | 188 +- js/common/model/TermListTests.js | 102 +- js/common/model/TermTests.js | 28 +- .../view/AreaCalculationRadioButtonGroup.js | 115 +- js/common/view/AreaDisplayNode.js | 532 +++--- js/common/view/AreaModelCommonAccordionBox.js | 91 +- js/common/view/AreaModelCommonColorProfile.js | 252 ++- .../view/AreaModelCommonRadioButtonGroup.js | 61 +- js/common/view/AreaScreenView.js | 588 +++--- js/common/view/CalculationNode.js | 372 ++-- js/common/view/PartialProductLabelNode.js | 313 ++-- .../view/PartialProductRadioButtonGroup.js | 236 ++- js/common/view/PoolableLayerNode.js | 141 +- js/common/view/RangeLabelNode.js | 217 ++- js/common/view/TotalAreaNode.js | 155 +- .../view/calculation/CalculationGroup.js | 106 +- js/common/view/calculation/CalculationLine.js | 560 +++--- .../view/calculation/CalculationLinesNode.js | 636 ++++--- .../view/calculation/DistributionLine.js | 103 +- js/common/view/calculation/ExpandedLine.js | 91 +- js/common/view/calculation/Minus.js | 94 +- js/common/view/calculation/MinusesLine.js | 43 +- js/common/view/calculation/MultipliedLine.js | 43 +- js/common/view/calculation/MultiplyX.js | 162 +- js/common/view/calculation/OrderedLine.js | 43 +- js/common/view/calculation/Parentheses.js | 194 +- js/common/view/calculation/PlaceholderBox.js | 96 +- js/common/view/calculation/Plus.js | 94 +- js/common/view/calculation/QuestionMark.js | 92 +- .../view/calculation/QuestionMarkLine.js | 41 +- js/common/view/calculation/SumLine.js | 41 +- js/common/view/calculation/TermText.js | 102 +- js/common/view/calculation/TotalsLine.js | 77 +- js/game/model/AreaChallenge.js | 882 +++++---- js/game/model/AreaChallengeDescription.js | 1622 ++++++++--------- js/game/model/AreaChallengeType.js | 32 +- js/game/model/AreaLevel.js | 256 ++- js/game/model/Entry.js | 109 +- js/game/model/EntryDisplayType.js | 36 +- js/game/model/EntryStatus.js | 36 +- js/game/model/EntryType.js | 86 +- js/game/model/GameAreaDisplay.js | 137 +- js/game/model/GameAreaModel.js | 318 ++-- js/game/model/GameState.js | 62 +- js/game/model/GenericGameAreaModel.js | 113 +- js/game/model/InputMethod.js | 74 +- js/game/model/VariablesGameAreaModel.js | 97 +- js/game/view/GameAreaDisplayNode.js | 351 ++-- js/game/view/GameAreaScreenView.js | 976 +++++----- js/game/view/GameAudio.js | 75 +- js/game/view/GameEditableLabelNode.js | 279 ++- js/game/view/PolynomialEditNode.js | 409 +++-- js/generic/model/GenericArea.js | 230 ++- js/generic/model/GenericAreaDisplay.js | 45 +- js/generic/model/GenericAreaModel.js | 122 +- js/generic/model/GenericLayout.js | 168 +- js/generic/model/GenericPartition.js | 49 +- js/generic/view/GenericAreaDisplayNode.js | 332 ++-- js/generic/view/GenericAreaScreenView.js | 168 +- js/generic/view/GenericFactorsNode.js | 234 ++- js/generic/view/GenericLayoutSelectionNode.js | 459 +++-- js/generic/view/GenericPartitionedAreaNode.js | 129 +- js/generic/view/PartitionSizeEditNode.js | 149 +- js/generic/view/TermAccumulator.js | 338 ++-- js/generic/view/TermEditNode.js | 257 ++- js/generic/view/TermKeypadPanel.js | 316 ++-- js/proportional/model/PartitionLineChoice.js | 36 +- js/proportional/model/ProportionalArea.js | 412 +++-- .../model/ProportionalAreaDisplay.js | 101 +- .../model/ProportionalAreaModel.js | 184 +- js/proportional/view/CalculationBox.js | 168 +- js/proportional/view/CountingAreaNode.js | 214 ++- .../view/PartitionRadioButtonGroup.js | 176 +- .../view/ProportionalAreaDisplayNode.js | 666 ++++--- .../view/ProportionalAreaGridLinesNode.js | 101 +- .../view/ProportionalAreaScreenView.js | 496 +++-- .../view/ProportionalDragHandle.js | 365 ++-- .../view/ProportionalFactorsNode.js | 286 ++- .../view/ProportionalPartitionLineNode.js | 440 +++-- js/proportional/view/SceneRadioButtonGroup.js | 95 +- js/proportional/view/TiledAreaNode.js | 468 +++-- js/screens/DecimalsScreen.js | 133 +- js/screens/ExploreScreen.js | 119 +- js/screens/GenericGameScreen.js | 79 +- js/screens/GenericScreen.js | 83 +- js/screens/MultiplyScreen.js | 133 +- js/screens/PartitionScreen.js | 135 +- js/screens/VariablesGameScreen.js | 79 +- js/screens/VariablesScreen.js | 83 +- mipmaps/explore-screen-icon_png.js | 38 + mipmaps/explore-screen-navbar_png.js | 38 + mipmaps/generic-game-screen-icon_png.js | 38 + mipmaps/generic-game-screen-navbar_png.js | 38 + mipmaps/generic-screen-icon_png.js | 38 + mipmaps/level-1-icon_png.js | 38 + mipmaps/level-2-icon_png.js | 38 + mipmaps/level-3-icon_png.js | 38 + mipmaps/level-4-icon_png.js | 38 + mipmaps/level-5-icon_png.js | 38 + mipmaps/level-6-icon_png.js | 38 + mipmaps/multiply-screen-icon_png.js | 38 + mipmaps/multiply-screen-navbar_png.js | 38 + mipmaps/partition-screen-icon_png.js | 38 + mipmaps/partition-screen-navbar_png.js | 38 + mipmaps/variables-game-screen-icon_png.js | 38 + mipmaps/variables-game-screen-navbar_png.js | 38 + mipmaps/variables-screen-icon_png.js | 38 + 127 files changed, 11770 insertions(+), 11492 deletions(-) create mode 100644 js/area-model-common-strings.js delete mode 100644 js/area-model-common-test-config.js create mode 100644 mipmaps/explore-screen-icon_png.js create mode 100644 mipmaps/explore-screen-navbar_png.js create mode 100644 mipmaps/generic-game-screen-icon_png.js create mode 100644 mipmaps/generic-game-screen-navbar_png.js create mode 100644 mipmaps/generic-screen-icon_png.js create mode 100644 mipmaps/level-1-icon_png.js create mode 100644 mipmaps/level-2-icon_png.js create mode 100644 mipmaps/level-3-icon_png.js create mode 100644 mipmaps/level-4-icon_png.js create mode 100644 mipmaps/level-5-icon_png.js create mode 100644 mipmaps/level-6-icon_png.js create mode 100644 mipmaps/multiply-screen-icon_png.js create mode 100644 mipmaps/multiply-screen-navbar_png.js create mode 100644 mipmaps/partition-screen-icon_png.js create mode 100644 mipmaps/partition-screen-navbar_png.js create mode 100644 mipmaps/variables-game-screen-icon_png.js create mode 100644 mipmaps/variables-game-screen-navbar_png.js create mode 100644 mipmaps/variables-screen-icon_png.js diff --git a/area-model-common-tests.html b/area-model-common-tests.html index fdfe4679..9bbfe6c6 100644 --- a/area-model-common-tests.html +++ b/area-model-common-tests.html @@ -18,6 +18,28 @@ \ No newline at end of file diff --git a/js/AreaModelCommonA11yStrings.js b/js/AreaModelCommonA11yStrings.js index 488ec91d..8be37ad8 100644 --- a/js/AreaModelCommonA11yStrings.js +++ b/js/AreaModelCommonA11yStrings.js @@ -7,180 +7,177 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from './areaModelCommon.js'; - const AreaModelCommonA11yStrings = { - areaEqualsPattern: { - value: 'Area equals {{area}}' - }, - areaGrid: { - value: 'Area Grid' - }, - areaGridRectanglePattern: { - value: '{{height}} by {{width}} rectangle.' - }, - areaGridSize: { - value: 'Area Grid Size' - }, - base10AreaTiles: { - value: 'Base 10 area tiles' - }, - betweenCalculationLines: { - value: 'is equivalent to ' - }, - calculationBoxTitle: { - value: 'Calculation' - }, - calculationBoxDescription: { - value: 'Show or hide the calculation.' - }, - countingNumbersDescription: { - value: 'Count each unit of area' - }, - countingNumbersLabel: { - value: 'Counting Numbers' - }, - countingNumbersPattern: { - value: 'Area units count to {{count}}.' - }, - dragHandle: { - value: 'Drag handle' - }, - dragHandleDescriptionPattern: { - value: 'Drag the handle to build a rectangle up to {{height}} by {{width}}.' - }, - erase: { - value: 'Erase' - }, - eraseDescription: { - value: 'Clear the rectangle and build a new one.' - }, - factorsBox: { - value: 'Factors' - }, - factorsBoxDescription: { - value: 'Show or hide the factors.' - }, - factorsTimesPattern: { - value: '{{height}} times {{width}}' - }, - gridLinesLabel: { - value: 'Grid lines' - }, - hidePartialProducts: { - value: 'Hide partial products' - }, - horizontalDimensionCapitalized: { - value: 'Width' - }, - horizontalPartition: { - value: 'Horizontal partition' - }, - horizontalPartitionHandle: { - value: 'Horizontal partition handle' - }, - horizontalPartitionHandleDescription: { - value: 'Partition rectangle into two smaller areas by splitting the height.' - }, - horizontalPicker: { - value: 'Width' - }, - horizontalPickerDescription: { - value: 'Change the dimensions of the rectangle.' - }, - multiplyDescription: { - value: 'Play with multiplication by interacting with an area model.' - }, - onePartialProductFactorPattern: { - value: 'No partition set. Product factors are {{first}}.' - }, - onePartialProductPattern: { - value: 'No partition set. Product is {{first}}.' - }, - partitionDescription: { - value: 'Partition your area model and explore the distributive property.' - }, - partitionSelectionDescription: { - value: 'Switch between vertical and horizontal partition lines.' - }, - placeholder: { - value: 'empty' - }, - productBox: { - value: 'Product' - }, - productBoxDescription: { - value: 'Show or hide the product.' - }, - productTimesPattern: { - value: '{{left}} times {{right}}' - }, - quantityPattern: { - value: 'left parenthesis {{content}} right parenthesis' - }, - questionMark: { - value: 'undefined' - }, - sceneSelectionPattern: { - value: '{{height}} by {{width}}' - }, - showPartialProductFactors: { - value: 'Show partial product factors' - }, - showPartialProducts: { - value: 'Show partial products' - }, - sumMinus: { - value: 'minus' - }, - sumPlus: { - value: 'plus' - }, - threePartitionsSplitPattern: { - value: '{{partition}} of {{size}} split into {{size1}}, {{size2}} and {{size3}}.' - }, - twoPartialProductFactorsPattern: { - value: 'There are two partitions. Partial product factors are {{first}} and {{second}}.' - }, - twoPartialProductsPattern: { - value: 'There are two partitions. Partial products are {{first}} and {{second}}.' - }, - twoPartitionsSplitPattern: { - value: '{{partition}} of {{size}} split into {{size1}} and {{size2}}.' - }, - verticalDimensionCapitalized: { - value: 'Height' - }, - verticalPartition: { - value: 'Vertical partition' - }, - verticalPartitionHandle: { - value: 'Vertical partition handle' - }, - verticalPartitionHandleDescription: { - value: 'Partition rectangle into two smaller areas by splitting the width.' - }, - verticalPicker: { - value: 'Height' - }, - verticalPickerDescription: { - value: 'Change the dimensions of the rectangle.' - } - }; +const AreaModelCommonA11yStrings = { + areaEqualsPattern: { + value: 'Area equals {{area}}' + }, + areaGrid: { + value: 'Area Grid' + }, + areaGridRectanglePattern: { + value: '{{height}} by {{width}} rectangle.' + }, + areaGridSize: { + value: 'Area Grid Size' + }, + base10AreaTiles: { + value: 'Base 10 area tiles' + }, + betweenCalculationLines: { + value: 'is equivalent to ' + }, + calculationBoxTitle: { + value: 'Calculation' + }, + calculationBoxDescription: { + value: 'Show or hide the calculation.' + }, + countingNumbersDescription: { + value: 'Count each unit of area' + }, + countingNumbersLabel: { + value: 'Counting Numbers' + }, + countingNumbersPattern: { + value: 'Area units count to {{count}}.' + }, + dragHandle: { + value: 'Drag handle' + }, + dragHandleDescriptionPattern: { + value: 'Drag the handle to build a rectangle up to {{height}} by {{width}}.' + }, + erase: { + value: 'Erase' + }, + eraseDescription: { + value: 'Clear the rectangle and build a new one.' + }, + factorsBox: { + value: 'Factors' + }, + factorsBoxDescription: { + value: 'Show or hide the factors.' + }, + factorsTimesPattern: { + value: '{{height}} times {{width}}' + }, + gridLinesLabel: { + value: 'Grid lines' + }, + hidePartialProducts: { + value: 'Hide partial products' + }, + horizontalDimensionCapitalized: { + value: 'Width' + }, + horizontalPartition: { + value: 'Horizontal partition' + }, + horizontalPartitionHandle: { + value: 'Horizontal partition handle' + }, + horizontalPartitionHandleDescription: { + value: 'Partition rectangle into two smaller areas by splitting the height.' + }, + horizontalPicker: { + value: 'Width' + }, + horizontalPickerDescription: { + value: 'Change the dimensions of the rectangle.' + }, + multiplyDescription: { + value: 'Play with multiplication by interacting with an area model.' + }, + onePartialProductFactorPattern: { + value: 'No partition set. Product factors are {{first}}.' + }, + onePartialProductPattern: { + value: 'No partition set. Product is {{first}}.' + }, + partitionDescription: { + value: 'Partition your area model and explore the distributive property.' + }, + partitionSelectionDescription: { + value: 'Switch between vertical and horizontal partition lines.' + }, + placeholder: { + value: 'empty' + }, + productBox: { + value: 'Product' + }, + productBoxDescription: { + value: 'Show or hide the product.' + }, + productTimesPattern: { + value: '{{left}} times {{right}}' + }, + quantityPattern: { + value: 'left parenthesis {{content}} right parenthesis' + }, + questionMark: { + value: 'undefined' + }, + sceneSelectionPattern: { + value: '{{height}} by {{width}}' + }, + showPartialProductFactors: { + value: 'Show partial product factors' + }, + showPartialProducts: { + value: 'Show partial products' + }, + sumMinus: { + value: 'minus' + }, + sumPlus: { + value: 'plus' + }, + threePartitionsSplitPattern: { + value: '{{partition}} of {{size}} split into {{size1}}, {{size2}} and {{size3}}.' + }, + twoPartialProductFactorsPattern: { + value: 'There are two partitions. Partial product factors are {{first}} and {{second}}.' + }, + twoPartialProductsPattern: { + value: 'There are two partitions. Partial products are {{first}} and {{second}}.' + }, + twoPartitionsSplitPattern: { + value: '{{partition}} of {{size}} split into {{size1}} and {{size2}}.' + }, + verticalDimensionCapitalized: { + value: 'Height' + }, + verticalPartition: { + value: 'Vertical partition' + }, + verticalPartitionHandle: { + value: 'Vertical partition handle' + }, + verticalPartitionHandleDescription: { + value: 'Partition rectangle into two smaller areas by splitting the width.' + }, + verticalPicker: { + value: 'Height' + }, + verticalPickerDescription: { + value: 'Change the dimensions of the rectangle.' + } +}; - if ( phet.chipper.queryParameters.stringTest === 'xss' ) { - for ( const key in AreaModelCommonA11yStrings ) { - AreaModelCommonA11yStrings[ key ].value += ''; - } +if ( phet.chipper.queryParameters.stringTest === 'xss' ) { + for ( const key in AreaModelCommonA11yStrings ) { + AreaModelCommonA11yStrings[ key ].value += ''; } +} - // verify that object is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( AreaModelCommonA11yStrings ); } +// verify that object is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( AreaModelCommonA11yStrings ); } - areaModelCommon.register( 'AreaModelCommonA11yStrings', AreaModelCommonA11yStrings ); +areaModelCommon.register( 'AreaModelCommonA11yStrings', AreaModelCommonA11yStrings ); - return AreaModelCommonA11yStrings; -} ); +export default AreaModelCommonA11yStrings; \ No newline at end of file diff --git a/js/area-model-common-strings.js b/js/area-model-common-strings.js new file mode 100644 index 00000000..cc781257 --- /dev/null +++ b/js/area-model-common-strings.js @@ -0,0 +1,14 @@ +// Copyright 2020, University of Colorado Boulder + +/** + * Auto-generated from modulify, DO NOT manually modify. + */ + +import getStringModule from '../../chipper/js/getStringModule.js'; +import areaModelCommon from './areaModelCommon.js'; + +const areaModelCommonStrings = getStringModule( 'AREA_MODEL_COMMON' ); + +areaModelCommon.register( 'areaModelCommonStrings', areaModelCommonStrings ); + +export default areaModelCommonStrings; diff --git a/js/area-model-common-test-config.js b/js/area-model-common-test-config.js deleted file mode 100644 index 75fa3f19..00000000 --- a/js/area-model-common-test-config.js +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2018-2019, University of Colorado Boulder - -/* - * IMPORTANT: This file was auto-generated by "grunt generate-config". Please do not modify this directly. Instead - * please modify area-model-common/package.json to control dependencies. - * - * RequireJS configuration file for the area-model-common sim. - * Paths are relative to the location of this file. - */ - -require.config( { - - deps: [ 'area-model-common-tests' ], - - paths: { - - // Third-party libs - text: '../../sherpa/lib/text-2.0.12', - - // PhET plugins - sound: '../../chipper/js/requirejs-plugins/sound', - image: '../../chipper/js/requirejs-plugins/image', - mipmap: '../../chipper/js/requirejs-plugins/mipmap', - string: '../../chipper/js/requirejs-plugins/string', - ifphetio: '../../chipper/js/requirejs-plugins/ifphetio', - - // PhET libs, uppercase names to identify them in require.js imports. - // IMPORTANT: DO NOT modify. This file is auto-generated. See documentation at the top. - AREA_MODEL_COMMON: '.', - AXON: '../../axon/js', - BRAND: '../../brand/' + phet.chipper.brand + '/js', - DOT: '../../dot/js', - JOIST: '../../joist/js', - KITE: '../../kite/js', - PHETCOMMON: '../../phetcommon/js', - PHET_CORE: '../../phet-core/js', - PHET_IO: '../../phet-io/js', - REPOSITORY: '..', - SCENERY: '../../scenery/js', - SCENERY_PHET: '../../scenery-phet/js', - SUN: '../../sun/js', - TAMBO: '../../tambo/js', - TANDEM: '../../tandem/js', - TWIXT: '../../twixt/js', - VEGAS: '../../vegas/js' - }, - - // optional cache bust to make browser refresh load all included scripts, can be disabled with ?cacheBust=false - urlArgs: phet.chipper.getCacheBustArgs() -} ); diff --git a/js/area-model-common-tests.js b/js/area-model-common-tests.js index 45e17548..9525ac4e 100644 --- a/js/area-model-common-tests.js +++ b/js/area-model-common-tests.js @@ -5,14 +5,10 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - require( 'AREA_MODEL_COMMON/common/model/TermTests' ); - require( 'AREA_MODEL_COMMON/common/model/TermListTests' ); - require( 'AREA_MODEL_COMMON/common/model/PolynomialTests' ); +import './common/model/PolynomialTests.js'; +import './common/model/TermListTests.js'; +import './common/model/TermTests.js'; - // Since our tests are loaded asynchronously, we must direct QUnit to begin the tests - QUnit.start(); -} ); \ No newline at end of file +// Since our tests are loaded asynchronously, we must direct QUnit to begin the tests +QUnit.start(); \ No newline at end of file diff --git a/js/areaModelCommon.js b/js/areaModelCommon.js index a65be964..2884104b 100644 --- a/js/areaModelCommon.js +++ b/js/areaModelCommon.js @@ -5,11 +5,7 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const Namespace = require( 'PHET_CORE/Namespace' ); +import Namespace from '../../phet-core/js/Namespace.js'; - return new Namespace( 'areaModelCommon' ); -} ); \ No newline at end of file +export default new Namespace( 'areaModelCommon' ); \ No newline at end of file diff --git a/js/common/AreaModelCommonConstants.js b/js/common/AreaModelCommonConstants.js index ff76c8d0..77e962fd 100644 --- a/js/common/AreaModelCommonConstants.js +++ b/js/common/AreaModelCommonConstants.js @@ -5,126 +5,122 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const MathSymbolFont = require( 'SCENERY_PHET/MathSymbolFont' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const Vector2 = require( 'DOT/Vector2' ); - - // constants - const LARGE_PARTIAL_PRODUCT_FONT_SIZE = 19; - const NORMAL_EDIT_FONT_SIZE = 18; - - return areaModelCommon.register( 'AreaModelCommonConstants', { - - // {PhetFont} All fonts - FACTORS_TERM_FONT: new PhetFont( 36 ), // Terms/numbers in the factors box - FACTORS_PAREN_FONT: new PhetFont( 40 ), // Parentheses in the factors box - CALCULATION_X_FONT: new PhetFont( 16 ), - CALCULATION_PAREN_FONT: new PhetFont( 16 ), - CALCULATION_DOT_FONT: new PhetFont( { size: 16, weight: 'bold' } ), - CALCULATION_TERM_FONT: new PhetFont( 16 ), - TITLE_FONT: new PhetFont( 18 ), - TOTAL_AREA_LABEL_FONT: new PhetFont( 30 ), - TOTAL_AREA_VALUE_FONT: new PhetFont( { size: 30, weight: 'bold' } ), - SYMBOL_FONT: new PhetFont( 20 ), - PARTIAL_PRODUCT_FONT: new PhetFont( LARGE_PARTIAL_PRODUCT_FONT_SIZE ), - PARTIAL_FACTOR_FONT: new PhetFont( 14 ), - TERM_EDIT_READOUT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), - POLYNOMIAL_EDIT_READOUT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), - PROPORTIONAL_PARTITION_READOUT_FONT: new PhetFont( { size: NORMAL_EDIT_FONT_SIZE, weight: 'bold' } ), - TOTAL_SIZE_READOUT_FONT: new PhetFont( { size: 22, weight: 'bold' } ), - KEYPAD_FONT: new PhetFont( 20 ), - KEYPAD_READOUT_FONT: new PhetFont( 20 ), - LAYOUT_FONT: new PhetFont( 16 ), - BUTTON_FONT: new PhetFont( 20 ), - SCORE_INCREASE_FONT: new PhetFont( { size: 18, weight: 'bold' } ), - COUNTING_ICON_FONT: new PhetFont( 22 ), - COUNTING_FONT: new PhetFont( 20 ), - REWARD_NODE_FONT: new PhetFont( { size: 35, weight: 'bold' } ), - GAME_MAIN_LABEL_FONT: new PhetFont( { size: NORMAL_EDIT_FONT_SIZE, weight: 'bold' } ), - GAME_MAIN_EDIT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), - GAME_PARTIAL_PRODUCT_LABEL_FONT: new PhetFont( { size: LARGE_PARTIAL_PRODUCT_FONT_SIZE, weight: 'bold' } ), - GAME_PARTIAL_PRODUCT_EDIT_FONT: new PhetFont( LARGE_PARTIAL_PRODUCT_FONT_SIZE ), - GAME_TOTAL_FONT: new PhetFont( { size: 30, weight: 'bold' } ), - GAME_POLYNOMIAL_EDIT_FONT: new PhetFont( { size: 22, weight: 'bold' } ), - GAME_STATUS_BAR_BOLD_FONT: new PhetFont( { size: 18, weight: 'bold' } ), - GAME_STATUS_BAR_NON_BOLD_FONT: new PhetFont( { size: 18 } ), - GAME_STATUS_BAR_PROMPT_FONT: new PhetFont( { size: 30, weight: 'bold' } ), - - // {string} - The string to be provided to RichText for a mathematical-looking x - X_VARIABLE_RICH_STRING: 'x', - - // {number} Two different area sizes (they are square), one needed for the intro sim - AREA_SIZE: 350, - LARGE_AREA_SIZE: 450, - - // {Vector2} We need to place the areas in different locations depending on the screen - MAIN_AREA_OFFSET: new Vector2( 180, 80 ), - LARGE_AREA_OFFSET: new Vector2( 80, 80 ), - GAME_AREA_OFFSET: new Vector2( 180, 200 ), - - // {number} - Panel options - LAYOUT_SPACING: 10, - PANEL_CORNER_RADIUS: 5, - PANEL_INTERIOR_MAX: 230, // Maximum width of the content inside the panels - - // {number} - Partition drag handle options - PARTITION_HANDLE_OFFSET: 15, - PARTITION_HANDLE_RADIUS: 10, - - // {number} - Relative positions (from 0 to 1) of where the generic partition lines should be - GENERIC_SINGLE_OFFSET: 0.62, // if there is one line - GENERIC_FIRST_OFFSET: 0.45, - GENERIC_SECOND_OFFSET: 0.78, - - // {number} - Like the generic view, but for the icon - GENERIC_ICON_SINGLE_OFFSET: 0.68, - GENERIC_ICON_FIRST_OFFSET: 0.55, - GENERIC_ICON_SECOND_OFFSET: 0.80, - - // {Vector2} - Offset vector from the upper-left of the area to the x,y location where the dimension line labels - // would intersect. - PROPORTIONAL_RANGE_OFFSET: new Vector2( -35, -28 ), - GENERIC_RANGE_OFFSET: new Vector2( -60, -40 ), - - // {number} - Space between the area and the keypad - KEYPAD_LEFT_PADDING: 25, - - // {number} - Number of challenges per level - NUM_CHALLENGES: 6, - - // {number} - The perfect score for a level - PERFECT_SCORE: 12, - - // {number} - Padding in-between content and surrounding parentheses in the calculation area - CALCULATION_PAREN_PADDING: 0, - - // {number} - Padding in-between an end parenthesis and start parenthese, e.g. between )( - CALCULATION_PAREN_PAREN_PADDING: 0, - - // {number} - Padding around an x (used for multiplication) - CALCULATION_X_PADDING: 3, - - // {number} - Padding around a dot (used for multiplication) - CALCULATION_DOT_PADDING: 3, - - // {number} - Padding around most (binary) operations in the calculation - CALCULATION_OP_PADDING: 5, - - // {number} - Padding between a term and an adjacent parenthesis, e.g. "x(" or ")x" - CALCULATION_TERM_PAREN_PADDING: 1, - - // {OrientationPair.} - The opposite-orientation offset to use for term edit nodes, e.g. - // node[ orientation.opposite.coordinate ] = PARTITION_OFFSET.get( orientation ) - PARTITION_OFFSET: new OrientationPair( -20, -30 ), - - // {string} - The character we use as a generic decimal character to get an approximate width for numeric - // representations. - MEASURING_CHARACTER: '9' - } ); -} ); + +import Vector2 from '../../../dot/js/Vector2.js'; +import MathSymbolFont from '../../../scenery-phet/js/MathSymbolFont.js'; +import PhetFont from '../../../scenery-phet/js/PhetFont.js'; +import areaModelCommon from '../areaModelCommon.js'; +import OrientationPair from './model/OrientationPair.js'; + +// constants +const LARGE_PARTIAL_PRODUCT_FONT_SIZE = 19; +const NORMAL_EDIT_FONT_SIZE = 18; + +export default areaModelCommon.register( 'AreaModelCommonConstants', { + + // {PhetFont} All fonts + FACTORS_TERM_FONT: new PhetFont( 36 ), // Terms/numbers in the factors box + FACTORS_PAREN_FONT: new PhetFont( 40 ), // Parentheses in the factors box + CALCULATION_X_FONT: new PhetFont( 16 ), + CALCULATION_PAREN_FONT: new PhetFont( 16 ), + CALCULATION_DOT_FONT: new PhetFont( { size: 16, weight: 'bold' } ), + CALCULATION_TERM_FONT: new PhetFont( 16 ), + TITLE_FONT: new PhetFont( 18 ), + TOTAL_AREA_LABEL_FONT: new PhetFont( 30 ), + TOTAL_AREA_VALUE_FONT: new PhetFont( { size: 30, weight: 'bold' } ), + SYMBOL_FONT: new PhetFont( 20 ), + PARTIAL_PRODUCT_FONT: new PhetFont( LARGE_PARTIAL_PRODUCT_FONT_SIZE ), + PARTIAL_FACTOR_FONT: new PhetFont( 14 ), + TERM_EDIT_READOUT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), + POLYNOMIAL_EDIT_READOUT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), + PROPORTIONAL_PARTITION_READOUT_FONT: new PhetFont( { size: NORMAL_EDIT_FONT_SIZE, weight: 'bold' } ), + TOTAL_SIZE_READOUT_FONT: new PhetFont( { size: 22, weight: 'bold' } ), + KEYPAD_FONT: new PhetFont( 20 ), + KEYPAD_READOUT_FONT: new PhetFont( 20 ), + LAYOUT_FONT: new PhetFont( 16 ), + BUTTON_FONT: new PhetFont( 20 ), + SCORE_INCREASE_FONT: new PhetFont( { size: 18, weight: 'bold' } ), + COUNTING_ICON_FONT: new PhetFont( 22 ), + COUNTING_FONT: new PhetFont( 20 ), + REWARD_NODE_FONT: new PhetFont( { size: 35, weight: 'bold' } ), + GAME_MAIN_LABEL_FONT: new PhetFont( { size: NORMAL_EDIT_FONT_SIZE, weight: 'bold' } ), + GAME_MAIN_EDIT_FONT: new PhetFont( NORMAL_EDIT_FONT_SIZE ), + GAME_PARTIAL_PRODUCT_LABEL_FONT: new PhetFont( { size: LARGE_PARTIAL_PRODUCT_FONT_SIZE, weight: 'bold' } ), + GAME_PARTIAL_PRODUCT_EDIT_FONT: new PhetFont( LARGE_PARTIAL_PRODUCT_FONT_SIZE ), + GAME_TOTAL_FONT: new PhetFont( { size: 30, weight: 'bold' } ), + GAME_POLYNOMIAL_EDIT_FONT: new PhetFont( { size: 22, weight: 'bold' } ), + GAME_STATUS_BAR_BOLD_FONT: new PhetFont( { size: 18, weight: 'bold' } ), + GAME_STATUS_BAR_NON_BOLD_FONT: new PhetFont( { size: 18 } ), + GAME_STATUS_BAR_PROMPT_FONT: new PhetFont( { size: 30, weight: 'bold' } ), + + // {string} - The string to be provided to RichText for a mathematical-looking x + X_VARIABLE_RICH_STRING: 'x', + + // {number} Two different area sizes (they are square), one needed for the intro sim + AREA_SIZE: 350, + LARGE_AREA_SIZE: 450, + + // {Vector2} We need to place the areas in different locations depending on the screen + MAIN_AREA_OFFSET: new Vector2( 180, 80 ), + LARGE_AREA_OFFSET: new Vector2( 80, 80 ), + GAME_AREA_OFFSET: new Vector2( 180, 200 ), + + // {number} - Panel options + LAYOUT_SPACING: 10, + PANEL_CORNER_RADIUS: 5, + PANEL_INTERIOR_MAX: 230, // Maximum width of the content inside the panels + + // {number} - Partition drag handle options + PARTITION_HANDLE_OFFSET: 15, + PARTITION_HANDLE_RADIUS: 10, + + // {number} - Relative positions (from 0 to 1) of where the generic partition lines should be + GENERIC_SINGLE_OFFSET: 0.62, // if there is one line + GENERIC_FIRST_OFFSET: 0.45, + GENERIC_SECOND_OFFSET: 0.78, + + // {number} - Like the generic view, but for the icon + GENERIC_ICON_SINGLE_OFFSET: 0.68, + GENERIC_ICON_FIRST_OFFSET: 0.55, + GENERIC_ICON_SECOND_OFFSET: 0.80, + + // {Vector2} - Offset vector from the upper-left of the area to the x,y location where the dimension line labels + // would intersect. + PROPORTIONAL_RANGE_OFFSET: new Vector2( -35, -28 ), + GENERIC_RANGE_OFFSET: new Vector2( -60, -40 ), + + // {number} - Space between the area and the keypad + KEYPAD_LEFT_PADDING: 25, + + // {number} - Number of challenges per level + NUM_CHALLENGES: 6, + + // {number} - The perfect score for a level + PERFECT_SCORE: 12, + + // {number} - Padding in-between content and surrounding parentheses in the calculation area + CALCULATION_PAREN_PADDING: 0, + + // {number} - Padding in-between an end parenthesis and start parenthese, e.g. between )( + CALCULATION_PAREN_PAREN_PADDING: 0, + + // {number} - Padding around an x (used for multiplication) + CALCULATION_X_PADDING: 3, + + // {number} - Padding around a dot (used for multiplication) + CALCULATION_DOT_PADDING: 3, + + // {number} - Padding around most (binary) operations in the calculation + CALCULATION_OP_PADDING: 5, + + // {number} - Padding between a term and an adjacent parenthesis, e.g. "x(" or ")x" + CALCULATION_TERM_PAREN_PADDING: 1, + + // {OrientationPair.} - The opposite-orientation offset to use for term edit nodes, e.g. + // node[ orientation.opposite.coordinate ] = PARTITION_OFFSET.get( orientation ) + PARTITION_OFFSET: new OrientationPair( -20, -30 ), + + // {string} - The character we use as a generic decimal character to get an approximate width for numeric + // representations. + MEASURING_CHARACTER: '9' +} ); \ No newline at end of file diff --git a/js/common/AreaModelCommonGlobals.js b/js/common/AreaModelCommonGlobals.js index 8a4c23bb..2ed76fb9 100644 --- a/js/common/AreaModelCommonGlobals.js +++ b/js/common/AreaModelCommonGlobals.js @@ -5,21 +5,17 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignGroup = require( 'SCENERY/nodes/AlignGroup' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import AlignGroup from '../../../scenery/js/nodes/AlignGroup.js'; +import areaModelCommon from '../areaModelCommon.js'; - return areaModelCommon.register( 'AreaModelCommonGlobals', { +export default areaModelCommon.register( 'AreaModelCommonGlobals', { - // @public {AlignGroup} - Used to properly horizontally align all of the panels/accordions/etc. across screens. - panelAlignGroup: new AlignGroup( { - matchVertical: false - } ), + // @public {AlignGroup} - Used to properly horizontally align all of the panels/accordions/etc. across screens. + panelAlignGroup: new AlignGroup( { + matchVertical: false + } ), - // @public {AlignGroup} - Used for the radio group selection icons (so they are consistent across screens) - selectionButtonAlignGroup: new AlignGroup() - } ); -} ); + // @public {AlignGroup} - Used for the radio group selection icons (so they are consistent across screens) + selectionButtonAlignGroup: new AlignGroup() +} ); \ No newline at end of file diff --git a/js/common/AreaModelCommonQueryParameters.js b/js/common/AreaModelCommonQueryParameters.js index 8ddce7b4..2004d99e 100644 --- a/js/common/AreaModelCommonQueryParameters.js +++ b/js/common/AreaModelCommonQueryParameters.js @@ -5,22 +5,18 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../areaModelCommon.js'; - const AreaModelCommonQueryParameters = QueryStringMachine.getAll( { +const AreaModelCommonQueryParameters = QueryStringMachine.getAll( { - // When provided, generic screens will have terms set to make the calculation area as large as possible, for debugging - maximumCalculationSize: { type: 'flag' }, + // When provided, generic screens will have terms set to make the calculation area as large as possible, for debugging + maximumCalculationSize: { type: 'flag' }, - // If set, uses constructed English strings instead of MathML for the accessible parallel DOM. - rawMath: { type: 'flag' } - } ); + // If set, uses constructed English strings instead of MathML for the accessible parallel DOM. + rawMath: { type: 'flag' } +} ); - areaModelCommon.register( 'AreaModelCommonQueryParameters', AreaModelCommonQueryParameters ); +areaModelCommon.register( 'AreaModelCommonQueryParameters', AreaModelCommonQueryParameters ); - return AreaModelCommonQueryParameters; -} ); +export default AreaModelCommonQueryParameters; \ No newline at end of file diff --git a/js/common/model/Area.js b/js/common/model/Area.js index fb9e03c1..21e57db3 100644 --- a/js/common/model/Area.js +++ b/js/common/model/Area.js @@ -5,246 +5,242 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const NumberProperty = require( 'AXON/NumberProperty' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const PartitionedArea = require( 'AREA_MODEL_COMMON/common/model/PartitionedArea' ); - const Polynomial = require( 'AREA_MODEL_COMMON/common/model/Polynomial' ); - const Property = require( 'AXON/Property' ); - const TermList = require( 'AREA_MODEL_COMMON/common/model/TermList' ); - const validate = require( 'AXON/validate' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import NumberProperty from '../../../../axon/js/NumberProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import validate from '../../../../axon/js/validate.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from './OrientationPair.js'; +import PartitionedArea from './PartitionedArea.js'; +import Polynomial from './Polynomial.js'; +import TermList from './TermList.js'; + +/** + * @constructor + * @extends {Object} + * + * @param {OrientationPair.>} partitions - The passed-in partitions become "owned" by this Area + * object (and they should not be shared by multiple areas + * ever). Usually created in subtypes anyways. + * @param {OrientationPair.>} colorProperties + * @param {number} coordinateRangeMax - The maximum value that partition coordinate ranges may take. A (proportional) + * - partition can be held at the max, but if released at the max it will jump back + * - to 0. Only one value is needed because the area is always square. + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed for this area + */ +function Area( partitions, colorProperties, coordinateRangeMax, allowExponents ) { + const self = this; + + // @public {OrientationPair.>} - Partitions for each orientation + this.partitions = partitions; + + // @public {Array.} - All partitions, regardless of orientation + this.allPartitions = partitions.horizontal.concat( partitions.vertical ); + + // @public {OrientationPair.>} - Colors for each orientation + this.colorProperties = colorProperties; + + // @public {number} - The maximum value that partition coordinate ranges may take. + this.coordinateRangeMax = coordinateRangeMax; + + // @public {boolean} - Whether exponents (powers of x) are allowed for this area + this.allowExponents = allowExponents; + + // @public {Property.} - The index of the highlighted calculation line (if using the LINE_BY_LINE choice). + this.calculationIndexProperty = new NumberProperty( 0 ); + + // @public {Array.} - An array of 2-dimensional sections of area defined by a horizontal and + // vertical pair of partitions. + this.partitionedAreas = _.flatten( partitions.horizontal.map( function( horizontalPartition ) { + return partitions.vertical.map( function( verticalPartition ) { + return self.createPartitionedArea( new OrientationPair( horizontalPartition, verticalPartition ) ); + } ); + } ) ); + + // @public {OrientationPair.>} - Null if there is no defined total. Otherwise it's the + // sum of the sizes of all (defined) partitions of the given orientation. + this.totalProperties = OrientationPair.create( this.createMappedTermsArrayProperty.bind( this, function( terms ) { + return new Polynomial( terms ); + } ) ); + + // @public {OrientationPair.>} - Null if there is no defined partition. Otherwise it's a + // list of the sizes of all (defined) partitions of the given orientation. This does NOT combine terms with the + // same exponent, unlike this.totalProperties. + this.termListProperties = OrientationPair.create( this.createMappedTermsArrayProperty.bind( this, function( terms ) { + return new TermList( terms ); + } ) ); + + // @public {Property.} - Null if there is no defined total, otherwise the total area (width of the + // "area" times its height). + this.totalAreaProperty = new DerivedProperty( + this.totalProperties.values, + function( horizontalTotal, verticalTotal ) { + return horizontalTotal && verticalTotal && horizontalTotal.times( verticalTotal ); + }, { + useDeepEquality: true + } ); + + // @public {OrientationPair.>} - Displayed term list for the product. Null if there is no + // defined total. + this.displayProperties = allowExponents ? this.termListProperties : this.totalProperties; + + // @public {OrientationPair.>>} - For each orientation, will contain a property with an + // unsorted list of unique boundary locations (the minimum or maximum coordinates of partitions). So if there are + // two partitions for an orientation, one from 1 to 5, and the other from 5 to 7, the value of the property will be + // [ 1, 5, 7 ] + this.partitionBoundariesProperties = OrientationPair.create( this.createPartitionBoundariesProperty.bind( this ) ); +} + +areaModelCommon.register( 'Area', Area ); + +export default inherit( Object, Area, { /** - * @constructor - * @extends {Object} + * Creates a partitioned area given two partitions. + * @protected * - * @param {OrientationPair.>} partitions - The passed-in partitions become "owned" by this Area - * object (and they should not be shared by multiple areas - * ever). Usually created in subtypes anyways. - * @param {OrientationPair.>} colorProperties - * @param {number} coordinateRangeMax - The maximum value that partition coordinate ranges may take. A (proportional) - * - partition can be held at the max, but if released at the max it will jump back - * - to 0. Only one value is needed because the area is always square. - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed for this area + * @param {OrientationPair.} partitions + * @returns {PartitionedArea} */ - function Area( partitions, colorProperties, coordinateRangeMax, allowExponents ) { - const self = this; + createPartitionedArea: function( partitions ) { + const partitionedArea = new PartitionedArea( partitions ); + + // By default, have the area linked to the partitions. This won't work for the game. + // NOTE: Since we "own" the partitions memory-wise, we don't need to unlink here since they should all be GC'ed + // at the same time. + Property.multilink( + [ partitions.horizontal.sizeProperty, partitions.vertical.sizeProperty ], + function( horizontalSize, verticalSize ) { + if ( horizontalSize === null || verticalSize === null ) { + partitionedArea.areaProperty.value = null; + } + else { + partitionedArea.areaProperty.value = horizontalSize.times( verticalSize ); + } + } ); - // @public {OrientationPair.>} - Partitions for each orientation - this.partitions = partitions; + return partitionedArea; + }, - // @public {Array.} - All partitions, regardless of orientation - this.allPartitions = partitions.horizontal.concat( partitions.vertical ); + /** + * Resets the area to its initial values. + * @public + */ + reset: function() { + // NOTE: Not resetting partitions here. The subtype takes care of that action (which may be indirect) + this.calculationIndexProperty.reset(); + }, - // @public {OrientationPair.>} - Colors for each orientation - this.colorProperties = colorProperties; + /** + * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 + * @public + */ + erase: function() { + // Overridden in subtypes + }, - // @public {number} - The maximum value that partition coordinate ranges may take. - this.coordinateRangeMax = coordinateRangeMax; + /** + * Returns all defined partitions for a given orientation. + * @public + * + * @param {Orientation} orientation + * @returns {Array.} + */ + getDefinedPartitions: function( orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - // @public {boolean} - Whether exponents (powers of x) are allowed for this area - this.allowExponents = allowExponents; + return this.partitions.get( orientation ).filter( function( partition ) { + return partition.isDefined(); + } ); + }, - // @public {Property.} - The index of the highlighted calculation line (if using the LINE_BY_LINE choice). - this.calculationIndexProperty = new NumberProperty( 0 ); + /** + * Returns an array of Terms containing all of the defined partition sizes for the given orientation. + * @public + * + * @param {Orientation} orientation + * @returns {Array.} + */ + getTerms: function( orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - // @public {Array.} - An array of 2-dimensional sections of area defined by a horizontal and - // vertical pair of partitions. - this.partitionedAreas = _.flatten( partitions.horizontal.map( function( horizontalPartition ) { - return partitions.vertical.map( function( verticalPartition ) { - return self.createPartitionedArea( new OrientationPair( horizontalPartition, verticalPartition ) ); - } ); - } ) ); + return this.getDefinedPartitions( orientation ).map( function( partition ) { + return partition.sizeProperty.value; + } ); + }, - // @public {OrientationPair.>} - Null if there is no defined total. Otherwise it's the - // sum of the sizes of all (defined) partitions of the given orientation. - this.totalProperties = OrientationPair.create( this.createMappedTermsArrayProperty.bind( this, function( terms ) { - return new Polynomial( terms ); - } ) ); + /** + * Returns a TermList containing all of the defined partition sizes for the given orientation. + * @public + * + * @param {Orientation} orientation + * @returns {TermList} + */ + getTermList: function( orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - // @public {OrientationPair.>} - Null if there is no defined partition. Otherwise it's a - // list of the sizes of all (defined) partitions of the given orientation. This does NOT combine terms with the - // same exponent, unlike this.totalProperties. - this.termListProperties = OrientationPair.create( this.createMappedTermsArrayProperty.bind( this, function( terms ) { - return new TermList( terms ); + return new TermList( this.getTerms( orientation ) ); + }, + + /** + * Creates a DerivedProperty with `map( totalSizeTerms )` for a particular orientation, where totalSizeTerms + * is an array of the total terms for that orientation. + * @private + * + * @param {function} map - function( {Array.} ): * + * @param {Orientation} orientation + * @returns {Property.<*|null>} + */ + createMappedTermsArrayProperty: function( map, orientation ) { + const self = this; + + const properties = _.flatten( this.partitions.get( orientation ).map( function( partition ) { + return [ partition.sizeProperty, partition.visibleProperty ]; } ) ); - // @public {Property.} - Null if there is no defined total, otherwise the total area (width of the - // "area" times its height). - this.totalAreaProperty = new DerivedProperty( - this.totalProperties.values, - function( horizontalTotal, verticalTotal ) { - return horizontalTotal && verticalTotal && horizontalTotal.times( verticalTotal ); - }, { - useDeepEquality: true - } ); + return new DerivedProperty( properties, function() { + const terms = self.getTerms( orientation ); + if ( terms.length ) { + return map( terms ); + } + else { + return null; + } + }, { + useDeepEquality: true + } ); + }, - // @public {OrientationPair.>} - Displayed term list for the product. Null if there is no - // defined total. - this.displayProperties = allowExponents ? this.termListProperties : this.totalProperties; + /** + * Returns a property that will contain an array of all unique partition boundaries (the minimum or maximum + * coordinate locations of a partition). + * @private + * + * @param {Orientation} orientation + * @returns {Property.>} + */ + createPartitionBoundariesProperty: function( orientation ) { + const partitions = this.partitions.get( orientation ); - // @public {OrientationPair.>>} - For each orientation, will contain a property with an - // unsorted list of unique boundary locations (the minimum or maximum coordinates of partitions). So if there are - // two partitions for an orientation, one from 1 to 5, and the other from 5 to 7, the value of the property will be - // [ 1, 5, 7 ] - this.partitionBoundariesProperties = OrientationPair.create( this.createPartitionBoundariesProperty.bind( this ) ); - } + // Property dependencies + const partitionProperties = _.flatten( partitions.map( function( partition ) { + return [ partition.coordinateRangeProperty, partition.visibleProperty ]; + } ) ); - areaModelCommon.register( 'Area', Area ); - - return inherit( Object, Area, { - /** - * Creates a partitioned area given two partitions. - * @protected - * - * @param {OrientationPair.} partitions - * @returns {PartitionedArea} - */ - createPartitionedArea: function( partitions ) { - const partitionedArea = new PartitionedArea( partitions ); - - // By default, have the area linked to the partitions. This won't work for the game. - // NOTE: Since we "own" the partitions memory-wise, we don't need to unlink here since they should all be GC'ed - // at the same time. - Property.multilink( - [ partitions.horizontal.sizeProperty, partitions.vertical.sizeProperty ], - function( horizontalSize, verticalSize ) { - if ( horizontalSize === null || verticalSize === null ) { - partitionedArea.areaProperty.value = null; - } - else { - partitionedArea.areaProperty.value = horizontalSize.times( verticalSize ); - } - } ); - - return partitionedArea; - }, - - /** - * Resets the area to its initial values. - * @public - */ - reset: function() { - // NOTE: Not resetting partitions here. The subtype takes care of that action (which may be indirect) - this.calculationIndexProperty.reset(); - }, - - /** - * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 - * @public - */ - erase: function() { - // Overridden in subtypes - }, - - /** - * Returns all defined partitions for a given orientation. - * @public - * - * @param {Orientation} orientation - * @returns {Array.} - */ - getDefinedPartitions: function( orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); - - return this.partitions.get( orientation ).filter( function( partition ) { - return partition.isDefined(); - } ); - }, - - /** - * Returns an array of Terms containing all of the defined partition sizes for the given orientation. - * @public - * - * @param {Orientation} orientation - * @returns {Array.} - */ - getTerms: function( orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); - - return this.getDefinedPartitions( orientation ).map( function( partition ) { - return partition.sizeProperty.value; - } ); - }, - - /** - * Returns a TermList containing all of the defined partition sizes for the given orientation. - * @public - * - * @param {Orientation} orientation - * @returns {TermList} - */ - getTermList: function( orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); - - return new TermList( this.getTerms( orientation ) ); - }, - - /** - * Creates a DerivedProperty with `map( totalSizeTerms )` for a particular orientation, where totalSizeTerms - * is an array of the total terms for that orientation. - * @private - * - * @param {function} map - function( {Array.} ): * - * @param {Orientation} orientation - * @returns {Property.<*|null>} - */ - createMappedTermsArrayProperty: function( map, orientation ) { - const self = this; - - const properties = _.flatten( this.partitions.get( orientation ).map( function( partition ) { - return [ partition.sizeProperty, partition.visibleProperty ]; - } ) ); - - return new DerivedProperty( properties, function() { - const terms = self.getTerms( orientation ); - if ( terms.length ) { - return map( terms ); + return new DerivedProperty( partitionProperties, function() { + return _.uniq( _.flatten( partitions.map( function( partition ) { + const range = partition.coordinateRangeProperty.value; + + // Ignore null range or invisible + if ( range === null || !partition.visibleProperty.value ) { + return []; } else { - return null; + return [ range.min, range.max ]; } - }, { - useDeepEquality: true - } ); - }, - - /** - * Returns a property that will contain an array of all unique partition boundaries (the minimum or maximum - * coordinate locations of a partition). - * @private - * - * @param {Orientation} orientation - * @returns {Property.>} - */ - createPartitionBoundariesProperty: function( orientation ) { - const partitions = this.partitions.get( orientation ); - - // Property dependencies - const partitionProperties = _.flatten( partitions.map( function( partition ) { - return [ partition.coordinateRangeProperty, partition.visibleProperty ]; - } ) ); - - return new DerivedProperty( partitionProperties, function() { - return _.uniq( _.flatten( partitions.map( function( partition ) { - const range = partition.coordinateRangeProperty.value; - - // Ignore null range or invisible - if ( range === null || !partition.visibleProperty.value ) { - return []; - } - else { - return [ range.min, range.max ]; - } - } ) ) ); - } ); - } - } ); -} ); + } ) ) ); + } ); + } +} ); \ No newline at end of file diff --git a/js/common/model/AreaCalculationChoice.js b/js/common/model/AreaCalculationChoice.js index 2d8df388..791fb083 100644 --- a/js/common/model/AreaCalculationChoice.js +++ b/js/common/model/AreaCalculationChoice.js @@ -5,35 +5,31 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const AreaCalculationChoice = { - // Don't show the calculation panel/box at all - HIDDEN: 'HIDDEN', +const AreaCalculationChoice = { + // Don't show the calculation panel/box at all + HIDDEN: 'HIDDEN', - // Show one line (with adjacent lines somewhat faded). Only supported by the calculation panel (using - // CalculationNode), since the CalculationBox doesn't have room or the desire for the complexity. - LINE_BY_LINE: 'LINE_BY_LINE', + // Show one line (with adjacent lines somewhat faded). Only supported by the calculation panel (using + // CalculationNode), since the CalculationBox doesn't have room or the desire for the complexity. + LINE_BY_LINE: 'LINE_BY_LINE', - // Show all lines at once (supported by calculation panel/box) - SHOW_ALL_LINES: 'SHOW_ALL_LINES' - }; + // Show all lines at once (supported by calculation panel/box) + SHOW_ALL_LINES: 'SHOW_ALL_LINES' +}; - areaModelCommon.register( 'AreaCalculationChoice', AreaCalculationChoice ); +areaModelCommon.register( 'AreaCalculationChoice', AreaCalculationChoice ); - // @public {Array.} - All values the enumeration can take. - AreaCalculationChoice.VALUES = [ - AreaCalculationChoice.HIDDEN, - AreaCalculationChoice.LINE_BY_LINE, - AreaCalculationChoice.SHOW_ALL_LINES - ]; +// @public {Array.} - All values the enumeration can take. +AreaCalculationChoice.VALUES = [ + AreaCalculationChoice.HIDDEN, + AreaCalculationChoice.LINE_BY_LINE, + AreaCalculationChoice.SHOW_ALL_LINES +]; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( AreaCalculationChoice ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( AreaCalculationChoice ); } - return AreaCalculationChoice; -} ); +export default AreaCalculationChoice; \ No newline at end of file diff --git a/js/common/model/AreaDisplay.js b/js/common/model/AreaDisplay.js index 3785142f..8a08368d 100644 --- a/js/common/model/AreaDisplay.js +++ b/js/common/model/AreaDisplay.js @@ -8,132 +8,128 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from './OrientationPair.js'; - /** - * @constructor - * @extends {Object} - * - * @param {Property.} areaProperty - This changes when the scene changes (we have one area per scene) - */ - function AreaDisplay( areaProperty ) { - // @public {Property.} - this.areaProperty = areaProperty; +/** + * @constructor + * @extends {Object} + * + * @param {Property.} areaProperty - This changes when the scene changes (we have one area per scene) + */ +function AreaDisplay( areaProperty ) { + // @public {Property.} + this.areaProperty = areaProperty; + + // @public {OrientationPair.>>} + this.partitionsProperties = this.wrapOrientationPair( _.property( 'partitions' ) ); + + // @public {Property.>} + this.allPartitionsProperty = this.wrapObject( _.property( 'allPartitions' ) ); - // @public {OrientationPair.>>} - this.partitionsProperties = this.wrapOrientationPair( _.property( 'partitions' ) ); + // @public {OrientationPair.>} + this.colorProperties = this.wrapOrientationPairProperty( _.property( 'colorProperties' ) ); - // @public {Property.>} - this.allPartitionsProperty = this.wrapObject( _.property( 'allPartitions' ) ); + // @public {Property.} + this.coordinateRangeMaxProperty = this.wrapObject( _.property( 'coordinateRangeMax' ) ); - // @public {OrientationPair.>} - this.colorProperties = this.wrapOrientationPairProperty( _.property( 'colorProperties' ) ); + // @public {Property.} + this.allowExponentsProperty = this.wrapObject( _.property( 'allowExponents' ) ); - // @public {Property.} - this.coordinateRangeMaxProperty = this.wrapObject( _.property( 'coordinateRangeMax' ) ); + // @public {Property.} + this.calculationIndexProperty = this.wrapProperty( _.property( 'calculationIndexProperty' ) ); - // @public {Property.} - this.allowExponentsProperty = this.wrapObject( _.property( 'allowExponents' ) ); + // @public {Property.>} + this.partitionedAreasProperty = this.wrapObject( _.property( 'partitionedAreas' ) ); - // @public {Property.} - this.calculationIndexProperty = this.wrapProperty( _.property( 'calculationIndexProperty' ) ); + // @public {OrientationPair.>} + this.totalProperties = this.wrapOrientationPairProperty( _.property( 'totalProperties' ) ); - // @public {Property.>} - this.partitionedAreasProperty = this.wrapObject( _.property( 'partitionedAreas' ) ); + // @public {OrientationPair.>} + this.termListProperties = this.wrapOrientationPairProperty( _.property( 'termListProperties' ) ); + + // @public {Property.} + this.totalAreaProperty = this.wrapProperty( _.property( 'totalAreaProperty' ), { + useDeepEquality: true + } ); + + // @public {OrientationPair.>} + this.displayProperties = this.wrapOrientationPairProperty( _.property( 'displayProperties' ) ); + + // @public {OrientationPair.>>} + this.partitionBoundariesProperties = this.wrapOrientationPairProperty( _.property( 'partitionBoundariesProperties' ) ); +} + +areaModelCommon.register( 'AreaDisplay', AreaDisplay ); + +export default inherit( Object, AreaDisplay, { + /** + * Wraps an orientation pair into one that contains properties. + * @protected + * + * @param {function} map - function( {Area} ): {OrientationPair.<*>} + * @param {Object} [options] + * @returns {OrientationPair.>} + */ + wrapOrientationPair: function( map, options ) { + const self = this; - // @public {OrientationPair.>} - this.totalProperties = this.wrapOrientationPairProperty( _.property( 'totalProperties' ) ); + return OrientationPair.create( function( orientation ) { + return self.wrapObject( function( area ) { + return map( area ).get( orientation ); + }, options ); + } ); + }, - // @public {OrientationPair.>} - this.termListProperties = this.wrapOrientationPairProperty( _.property( 'termListProperties' ) ); + /** + * Wraps an orientation pair of properties + * @protected + * + * NOTE: This is like wrapOrientationPair, but with the critical difference of using wrapProperty internally instead + * of wrapObject. + * + * @param {function} map - function( {Area} ): {OrientationPair.>} + * @param {Object} [options] + * @returns {OrientationPair.>} + */ + wrapOrientationPairProperty: function( map, options ) { + const self = this; - // @public {Property.} - this.totalAreaProperty = this.wrapProperty( _.property( 'totalAreaProperty' ), { - useDeepEquality: true + return OrientationPair.create( function( orientation ) { + return self.wrapProperty( function( area ) { + return map( area ).get( orientation ); + }, options ); } ); + }, - // @public {OrientationPair.>} - this.displayProperties = this.wrapOrientationPairProperty( _.property( 'displayProperties' ) ); + /** + * Wraps a property. + * @protected + * + * @param {function} map - function( {Area} ): {Property.<*>} + * @param {Object} [options] + * @returns {Property.<*>} + */ + wrapProperty: function( map, options ) { + return new DynamicProperty( this.areaProperty, merge( { + derive: map + }, options ) ); + }, - // @public {OrientationPair.>>} - this.partitionBoundariesProperties = this.wrapOrientationPairProperty( _.property( 'partitionBoundariesProperties' ) ); + /** + * Wraps an object into a property. + * @protected + * + * @param {function} map - function( {Area} ): {*} + * @param {Object} [options] + * @returns {Property.<*>} + */ + wrapObject: function( map, options ) { + return new DerivedProperty( [ this.areaProperty ], map, options ); } - - areaModelCommon.register( 'AreaDisplay', AreaDisplay ); - - return inherit( Object, AreaDisplay, { - /** - * Wraps an orientation pair into one that contains properties. - * @protected - * - * @param {function} map - function( {Area} ): {OrientationPair.<*>} - * @param {Object} [options] - * @returns {OrientationPair.>} - */ - wrapOrientationPair: function( map, options ) { - const self = this; - - return OrientationPair.create( function( orientation ) { - return self.wrapObject( function( area ) { - return map( area ).get( orientation ); - }, options ); - } ); - }, - - /** - * Wraps an orientation pair of properties - * @protected - * - * NOTE: This is like wrapOrientationPair, but with the critical difference of using wrapProperty internally instead - * of wrapObject. - * - * @param {function} map - function( {Area} ): {OrientationPair.>} - * @param {Object} [options] - * @returns {OrientationPair.>} - */ - wrapOrientationPairProperty: function( map, options ) { - const self = this; - - return OrientationPair.create( function( orientation ) { - return self.wrapProperty( function( area ) { - return map( area ).get( orientation ); - }, options ); - } ); - }, - - /** - * Wraps a property. - * @protected - * - * @param {function} map - function( {Area} ): {Property.<*>} - * @param {Object} [options] - * @returns {Property.<*>} - */ - wrapProperty: function( map, options ) { - return new DynamicProperty( this.areaProperty, merge( { - derive: map - }, options ) ); - }, - - /** - * Wraps an object into a property. - * @protected - * - * @param {function} map - function( {Area} ): {*} - * @param {Object} [options] - * @returns {Property.<*>} - */ - wrapObject: function( map, options ) { - return new DerivedProperty( [ this.areaProperty ], map, options ); - } - } ); -} ); +} ); \ No newline at end of file diff --git a/js/common/model/AreaModelCommonModel.js b/js/common/model/AreaModelCommonModel.js index d70e30b2..1e716e19 100644 --- a/js/common/model/AreaModelCommonModel.js +++ b/js/common/model/AreaModelCommonModel.js @@ -5,123 +5,119 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const Area = require( 'AREA_MODEL_COMMON/common/model/Area' ); - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PartialProductsChoice = require( 'AREA_MODEL_COMMON/common/model/PartialProductsChoice' ); - const Property = require( 'AXON/Property' ); - /** - * @constructor - * @extends {Object} - * - * @param {Array.} areas - A list of all areas that can be switched between. - * @param {Area} defaultArea - The initial area - * @param {Object} [options] - */ - function AreaModelCommonModel( areas, defaultArea, options ) { +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../view/AreaModelCommonColorProfile.js'; +import Area from './Area.js'; +import AreaCalculationChoice from './AreaCalculationChoice.js'; +import PartialProductsChoice from './PartialProductsChoice.js'; - assert && assert( options === undefined || typeof options === 'object', 'If provided, options should be an object' ); +/** + * @constructor + * @extends {Object} + * + * @param {Array.} areas - A list of all areas that can be switched between. + * @param {Area} defaultArea - The initial area + * @param {Object} [options] + */ +function AreaModelCommonModel( areas, defaultArea, options ) { - options = merge( { - allowExponents: false, - isProportional: false, - initialAreaBoxExpanded: false, - initialAreaCalculationChoice: AreaCalculationChoice.HIDDEN, - initialPartialProductsChoice: PartialProductsChoice.HIDDEN - }, options ); + assert && assert( options === undefined || typeof options === 'object', 'If provided, options should be an object' ); - const self = this; + options = merge( { + allowExponents: false, + isProportional: false, + initialAreaBoxExpanded: false, + initialAreaCalculationChoice: AreaCalculationChoice.HIDDEN, + initialPartialProductsChoice: PartialProductsChoice.HIDDEN + }, options ); - // @public {Array.} - All areas that can be switched between - this.areas = areas; + const self = this; - // @public {boolean} - Whether exponents (powers of x) are allowed - this.allowExponents = options.allowExponents; + // @public {Array.} - All areas that can be switched between + this.areas = areas; - // @public {boolean} - Whether the area is proportional (or generic) - this.isProportional = options.isProportional; + // @public {boolean} - Whether exponents (powers of x) are allowed + this.allowExponents = options.allowExponents; - // @public {OrientationPair.>} - this.colorProperties = options.isProportional - ? AreaModelCommonColorProfile.proportionalColorProperties - : AreaModelCommonColorProfile.genericColorProperties; + // @public {boolean} - Whether the area is proportional (or generic) + this.isProportional = options.isProportional; - // @public {Property.} - The current area - this.currentAreaProperty = new Property( defaultArea, { - valueType: Area - } ); + // @public {OrientationPair.>} + this.colorProperties = options.isProportional + ? AreaModelCommonColorProfile.proportionalColorProperties + : AreaModelCommonColorProfile.genericColorProperties; - // @public {AreaDisplay} - this.areaDisplay = this.createAreaDisplay( this.currentAreaProperty ); + // @public {Property.} - The current area + this.currentAreaProperty = new Property( defaultArea, { + valueType: Area + } ); - // @public {Property.} - this.factorsBoxExpandedProperty = new BooleanProperty( true ); + // @public {AreaDisplay} + this.areaDisplay = this.createAreaDisplay( this.currentAreaProperty ); - // @public {Property.} - this.areaBoxExpandedProperty = new BooleanProperty( options.initialAreaBoxExpanded ); + // @public {Property.} + this.factorsBoxExpandedProperty = new BooleanProperty( true ); - // @public {Property.} + this.areaBoxExpandedProperty = new BooleanProperty( options.initialAreaBoxExpanded ); - // @public {Property.} - We need to properly update whenever the area changes OR any one of the - // individual totalAreaProperties. Since we are guaranteed to get a callback for these cases whenever one of the - // totalAreaProeprties changes, we listen to those instead. - this.totalAreaProperty = new DerivedProperty( totalAreaProperties, function() { - return self.currentAreaProperty.value.totalAreaProperty.value; - }, { - useDeepEquality: true - } ); - } + // @public {Property.} areaProperty - * @returns {AreaDisplay} - */ - createAreaDisplay: function( areaProperty ) { - throw new Error( 'abstract method' ); - }, - - /** - * Returns the model to its initial state. - * @public - */ - reset: function() { - this.currentAreaProperty.reset(); - this.factorsBoxExpandedProperty.reset(); - this.areaBoxExpandedProperty.reset(); - this.areaCalculationChoiceProperty.reset(); - this.partialProductsChoiceProperty.reset(); - - this.areas.forEach( function( area ) { - area.reset(); - } ); - } + const totalAreaProperties = [ this.currentAreaProperty ].concat( this.areas.map( function( area ) { + return area.totalAreaProperty; + } ) ); + + // @public {Property.} - We need to properly update whenever the area changes OR any one of the + // individual totalAreaProperties. Since we are guaranteed to get a callback for these cases whenever one of the + // totalAreaProeprties changes, we listen to those instead. + this.totalAreaProperty = new DerivedProperty( totalAreaProperties, function() { + return self.currentAreaProperty.value.totalAreaProperty.value; + }, { + useDeepEquality: true } ); -} ); +} + +areaModelCommon.register( 'AreaModelCommonModel', AreaModelCommonModel ); + +export default inherit( Object, AreaModelCommonModel, { + /** + * Abstract, returns an AreaDisplay concrete type. + * @protected + * + * @param {Property.} areaProperty + * @returns {AreaDisplay} + */ + createAreaDisplay: function( areaProperty ) { + throw new Error( 'abstract method' ); + }, + + /** + * Returns the model to its initial state. + * @public + */ + reset: function() { + this.currentAreaProperty.reset(); + this.factorsBoxExpandedProperty.reset(); + this.areaBoxExpandedProperty.reset(); + this.areaCalculationChoiceProperty.reset(); + this.partialProductsChoiceProperty.reset(); + + this.areas.forEach( function( area ) { + area.reset(); + } ); + } +} ); \ No newline at end of file diff --git a/js/common/model/OrientationPair.js b/js/common/model/OrientationPair.js index b8fb24ce..828103bb 100644 --- a/js/common/model/OrientationPair.js +++ b/js/common/model/OrientationPair.js @@ -5,93 +5,89 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const validate = require( 'AXON/validate' ); +import validate from '../../../../axon/js/validate.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; - /** - * @constructor - * @extends {Object} - * - * @param {*} horizontal - Value for the horizontal orientation - * @param {*} vertical - Value for the vertical orientation - */ - function OrientationPair( horizontal, vertical ) { - // @public {*} - this.horizontal = horizontal; +/** + * @constructor + * @extends {Object} + * + * @param {*} horizontal - Value for the horizontal orientation + * @param {*} vertical - Value for the vertical orientation + */ +function OrientationPair( horizontal, vertical ) { + // @public {*} + this.horizontal = horizontal; - // @public {*} - this.vertical = vertical; + // @public {*} + this.vertical = vertical; - // @public {Array.<*>} - this.values = [ horizontal, vertical ]; - } + // @public {Array.<*>} + this.values = [ horizontal, vertical ]; +} - areaModelCommon.register( 'OrientationPair', OrientationPair ); +areaModelCommon.register( 'OrientationPair', OrientationPair ); - return inherit( Object, OrientationPair, { - /** - * Returns the value associated with the particular orientation. - * @public - * - * @param {Orientation} orientation - * @returns {*} - */ - get: function( orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); +export default inherit( Object, OrientationPair, { + /** + * Returns the value associated with the particular orientation. + * @public + * + * @param {Orientation} orientation + * @returns {*} + */ + get: function( orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - return orientation === Orientation.HORIZONTAL ? this.horizontal : this.vertical; - }, + return orientation === Orientation.HORIZONTAL ? this.horizontal : this.vertical; + }, - /** - * Returns a new OrientationPair with mapped values. - * @public - * - * @param {Function} mapFunction - function( {*}, {Orientation} ): {*} - * @returns {OrientationPair.<*>} - With the mapped values - */ - map: function( mapFunction ) { - return new OrientationPair( - mapFunction( this.horizontal, Orientation.HORIZONTAL ), - mapFunction( this.vertical, Orientation.VERTICAL ) - ); - }, + /** + * Returns a new OrientationPair with mapped values. + * @public + * + * @param {Function} mapFunction - function( {*}, {Orientation} ): {*} + * @returns {OrientationPair.<*>} - With the mapped values + */ + map: function( mapFunction ) { + return new OrientationPair( + mapFunction( this.horizontal, Orientation.HORIZONTAL ), + mapFunction( this.vertical, Orientation.VERTICAL ) + ); + }, - /** - * Calls the callback on each item of the orientation pair. - * @public - * - * @param {Function} callback - function( {*}, {Orientation} ) - */ - forEach: function( callback ) { - callback( this.horizontal, Orientation.HORIZONTAL ); - callback( this.vertical, Orientation.VERTICAL ); - }, + /** + * Calls the callback on each item of the orientation pair. + * @public + * + * @param {Function} callback - function( {*}, {Orientation} ) + */ + forEach: function( callback ) { + callback( this.horizontal, Orientation.HORIZONTAL ); + callback( this.vertical, Orientation.VERTICAL ); + }, - /** - * Calls reset() on each item in the orientation pair. - * @public - */ - reset: function() { - this.forEach( function( value ) { - value.reset(); - } ); - } - }, { - /** - * Creates an orientation pair based on a factory method. - * @public - * - * @param {function} factory - Called factory( {Orientation} ) : {*}, called once for each orientation to determine - * the value. - */ - create: function( factory ) { - return new OrientationPair( factory( Orientation.HORIZONTAL ), factory( Orientation.VERTICAL ) ); - } - } ); -} ); + /** + * Calls reset() on each item in the orientation pair. + * @public + */ + reset: function() { + this.forEach( function( value ) { + value.reset(); + } ); + } +}, { + /** + * Creates an orientation pair based on a factory method. + * @public + * + * @param {function} factory - Called factory( {Orientation} ) : {*}, called once for each orientation to determine + * the value. + */ + create: function( factory ) { + return new OrientationPair( factory( Orientation.HORIZONTAL ), factory( Orientation.VERTICAL ) ); + } +} ); \ No newline at end of file diff --git a/js/common/model/PartialProductsChoice.js b/js/common/model/PartialProductsChoice.js index e2ef7151..54cf5ca7 100644 --- a/js/common/model/PartialProductsChoice.js +++ b/js/common/model/PartialProductsChoice.js @@ -5,29 +5,25 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const PartialProductsChoice = { - HIDDEN: 'HIDDEN', // e.g. nothing shown - PRODUCTS: 'PRODUCTS', // e.g. '52' - FACTORS: 'FACTORS' // e.g. '26 x 2' - }; +const PartialProductsChoice = { + HIDDEN: 'HIDDEN', // e.g. nothing shown + PRODUCTS: 'PRODUCTS', // e.g. '52' + FACTORS: 'FACTORS' // e.g. '26 x 2' +}; - areaModelCommon.register( 'PartialProductsChoice', PartialProductsChoice ); +areaModelCommon.register( 'PartialProductsChoice', PartialProductsChoice ); - // @public {Array.} - All values the enumeration can take. - PartialProductsChoice.VALUES = [ - PartialProductsChoice.HIDDEN, - PartialProductsChoice.PRODUCTS, - PartialProductsChoice.FACTORS - ]; +// @public {Array.} - All values the enumeration can take. +PartialProductsChoice.VALUES = [ + PartialProductsChoice.HIDDEN, + PartialProductsChoice.PRODUCTS, + PartialProductsChoice.FACTORS +]; - // verify that enum is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( PartialProductsChoice ); } +// verify that enum is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( PartialProductsChoice ); } - return PartialProductsChoice; -} ); +export default PartialProductsChoice; \ No newline at end of file diff --git a/js/common/model/Partition.js b/js/common/model/Partition.js index 22167c98..fe9931b9 100644 --- a/js/common/model/Partition.js +++ b/js/common/model/Partition.js @@ -5,67 +5,63 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const validate = require( 'AXON/validate' ); +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import validate from '../../../../axon/js/validate.js'; +import Range from '../../../../dot/js/Range.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Term from './Term.js'; - /** - * @constructor - * @extends {Object} - * - * @param {Orientation} orientation - * @param {Property.} colorProperty - */ - function Partition( orientation, colorProperty ) { - validate( orientation, { validValues: Orientation.VALUES } ); - assert && assert( colorProperty instanceof Property ); - - // @public {Property.} - Null indicates the size is not defined. - this.sizeProperty = new Property( null, { - useDeepEquality: true, - isValidValue: Term.isTermOrNull - } ); - - // @public {Orientation} - an intrinsic property of the Partition - this.orientation = orientation; +/** + * @constructor + * @extends {Object} + * + * @param {Orientation} orientation + * @param {Property.} colorProperty + */ +function Partition( orientation, colorProperty ) { + validate( orientation, { validValues: Orientation.VALUES } ); + assert && assert( colorProperty instanceof Property ); - // @public {Property.} - this.colorProperty = colorProperty; + // @public {Property.} - Null indicates the size is not defined. + this.sizeProperty = new Property( null, { + useDeepEquality: true, + isValidValue: Term.isTermOrNull + } ); - // @public {Property.} - Owned property, does not need to be disposed. - this.visibleProperty = new BooleanProperty( true ); + // @public {Orientation} - an intrinsic property of the Partition + this.orientation = orientation; - // @public {Property.} - The contained 'section' of the full available model area. Should be null when - // coordinates can't be computed. For generic partitions, it will be from 0 to 1. For proportional partitions, it - // will be from 0 to its maximum size. Owned property, does not need to be disposed. - this.coordinateRangeProperty = new Property( null, { - useDeepEquality: true, - isValidValue: function( value ) { - return value === null || value instanceof Range; - } - } ); - } + // @public {Property.} + this.colorProperty = colorProperty; - areaModelCommon.register( 'Partition', Partition ); + // @public {Property.} - Owned property, does not need to be disposed. + this.visibleProperty = new BooleanProperty( true ); - return inherit( Object, Partition, { - /** - * Returns whether this partition is defined, i.e. "is shown in the area, and has a size" - * @public - * - * @returns {boolean} - */ - isDefined: function() { - return this.visibleProperty.value && this.sizeProperty.value !== null; + // @public {Property.} - The contained 'section' of the full available model area. Should be null when + // coordinates can't be computed. For generic partitions, it will be from 0 to 1. For proportional partitions, it + // will be from 0 to its maximum size. Owned property, does not need to be disposed. + this.coordinateRangeProperty = new Property( null, { + useDeepEquality: true, + isValidValue: function( value ) { + return value === null || value instanceof Range; } } ); -} ); +} + +areaModelCommon.register( 'Partition', Partition ); + +export default inherit( Object, Partition, { + /** + * Returns whether this partition is defined, i.e. "is shown in the area, and has a size" + * @public + * + * @returns {boolean} + */ + isDefined: function() { + return this.visibleProperty.value && this.sizeProperty.value !== null; + } +} ); \ No newline at end of file diff --git a/js/common/model/PartitionedArea.js b/js/common/model/PartitionedArea.js index b1401682..a07344ad 100644 --- a/js/common/model/PartitionedArea.js +++ b/js/common/model/PartitionedArea.js @@ -5,50 +5,46 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Term from './Term.js'; +/** + * @constructor + * @extends {Object} + * + * @param {OrientationPair.} partitions + */ +function PartitionedArea( partitions ) { + + // @public {OrientationPair.} + this.partitions = partitions; + + // @public {Property.} - Area may not be defined if the size of a partition is not defined. + this.areaProperty = new Property( null, { + useDeepEquality: true, + isValidValue: Term.isTermOrNull + } ); + + // @public {Property.} + this.visibleProperty = DerivedProperty.and( [ + partitions.horizontal.visibleProperty, + partitions.vertical.visibleProperty + ] ); +} + +areaModelCommon.register( 'PartitionedArea', PartitionedArea ); + +export default inherit( Object, PartitionedArea, { /** - * @constructor - * @extends {Object} - * - * @param {OrientationPair.} partitions + * Cleans up references. + * @public */ - function PartitionedArea( partitions ) { - - // @public {OrientationPair.} - this.partitions = partitions; - - // @public {Property.} - Area may not be defined if the size of a partition is not defined. - this.areaProperty = new Property( null, { - useDeepEquality: true, - isValidValue: Term.isTermOrNull - } ); - - // @public {Property.} - this.visibleProperty = DerivedProperty.and( [ - partitions.horizontal.visibleProperty, - partitions.vertical.visibleProperty - ] ); + dispose: function() { + this.visibleProperty.dispose(); + this.areaProperty.dispose(); } - - areaModelCommon.register( 'PartitionedArea', PartitionedArea ); - - return inherit( Object, PartitionedArea, { - /** - * Cleans up references. - * @public - */ - dispose: function() { - this.visibleProperty.dispose(); - this.areaProperty.dispose(); - } - } ); -} ); +} ); \ No newline at end of file diff --git a/js/common/model/Polynomial.js b/js/common/model/Polynomial.js index 53dec58e..1790fd0e 100644 --- a/js/common/model/Polynomial.js +++ b/js/common/model/Polynomial.js @@ -5,106 +5,102 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const TermList = require( 'AREA_MODEL_COMMON/common/model/TermList' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Term from './Term.js'; +import TermList from './TermList.js'; - /** - * @constructor - * @extends {TermList} - * - * @param {Array.} terms - */ - function Polynomial( terms ) { - - const combinedTerms = []; - const sortedTerms = _.sortBy( terms, function( term ) { - return -term.power; - } ); +/** + * @constructor + * @extends {TermList} + * + * @param {Array.} terms + */ +function Polynomial( terms ) { - while ( sortedTerms.length ) { - let coefficient = 0; - const power = sortedTerms[ 0 ].power; + const combinedTerms = []; + const sortedTerms = _.sortBy( terms, function( term ) { + return -term.power; + } ); - while ( sortedTerms.length && sortedTerms[ 0 ].power === power ) { - coefficient += sortedTerms[ 0 ].coefficient; - sortedTerms.shift(); - } + while ( sortedTerms.length ) { + let coefficient = 0; + const power = sortedTerms[ 0 ].power; - if ( coefficient !== 0 ) { - combinedTerms.push( new Term( coefficient, power ) ); - } + while ( sortedTerms.length && sortedTerms[ 0 ].power === power ) { + coefficient += sortedTerms[ 0 ].coefficient; + sortedTerms.shift(); } - // If empty, add a zero term - if ( combinedTerms.length === 0 ) { - combinedTerms.push( new Term( 0 ) ); + if ( coefficient !== 0 ) { + combinedTerms.push( new Term( coefficient, power ) ); } + } - TermList.call( this, combinedTerms ); + // If empty, add a zero term + if ( combinedTerms.length === 0 ) { + combinedTerms.push( new Term( 0 ) ); } - areaModelCommon.register( 'Polynomial', Polynomial ); + TermList.call( this, combinedTerms ); +} - return inherit( TermList, Polynomial, { - /** - * Returns the coefficient in front of the term with the specific power. If it doesn't exist, 0 is used (since it's - * like an implicit term with a 0-coefficient) - * @public - * - * @param {number} power - * @returns {number} - */ - getCoefficient: function( power ) { - const term = _.find( this.terms, function( term ) { - return term.power === power; - } ); - if ( term ) { - return term.coefficient; - } - else { - return 0; - } - }, +areaModelCommon.register( 'Polynomial', Polynomial ); - /** - * Returns a new Term with the coefficient and power for the specified coefficient in our polynomial. - * @public - * - * @param {number} power - * @returns {Term} - */ - getTerm: function( power ) { - return new Term( this.getCoefficient( power ), power ); - }, +export default inherit( TermList, Polynomial, { + /** + * Returns the coefficient in front of the term with the specific power. If it doesn't exist, 0 is used (since it's + * like an implicit term with a 0-coefficient) + * @public + * + * @param {number} power + * @returns {number} + */ + getCoefficient: function( power ) { + const term = _.find( this.terms, function( term ) { + return term.power === power; + } ); + if ( term ) { + return term.coefficient; + } + else { + return 0; + } + }, - /** - * Addition of polynomials. - * @public - * @override - * - * @param {TermList} termList - * @returns {Polynomial} - */ - plus: function( termList ) { - return new Polynomial( this.terms.concat( termList.terms ) ); - }, + /** + * Returns a new Term with the coefficient and power for the specified coefficient in our polynomial. + * @public + * + * @param {number} power + * @returns {Term} + */ + getTerm: function( power ) { + return new Term( this.getCoefficient( power ), power ); + }, - /** - * Multiplication of polynomials. - * @public - * @override - * - * @param {TermList} termList - * @returns {Polynomial} - */ - times: function( termList ) { - return new Polynomial( TermList.prototype.times.call( this, termList ).terms ); - } - } ); -} ); + /** + * Addition of polynomials. + * @public + * @override + * + * @param {TermList} termList + * @returns {Polynomial} + */ + plus: function( termList ) { + return new Polynomial( this.terms.concat( termList.terms ) ); + }, + + /** + * Multiplication of polynomials. + * @public + * @override + * + * @param {TermList} termList + * @returns {Polynomial} + */ + times: function( termList ) { + return new Polynomial( TermList.prototype.times.call( this, termList ).terms ); + } +} ); \ No newline at end of file diff --git a/js/common/model/PolynomialTests.js b/js/common/model/PolynomialTests.js index 06fbcb0b..99e6ba85 100644 --- a/js/common/model/PolynomialTests.js +++ b/js/common/model/PolynomialTests.js @@ -5,56 +5,52 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const Polynomial = require( 'AREA_MODEL_COMMON/common/model/Polynomial' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); +import Polynomial from './Polynomial.js'; +import Term from './Term.js'; - QUnit.module( 'Polynomial' ); +QUnit.module( 'Polynomial' ); - QUnit.test( 'Combining factors', function( assert ) { - assert.ok( new Polynomial( [ - new Term( 2, 1 ), - new Term( -3, 1 ) - ] ).getTerm( 1 ).equals( new Term( -1, 1 ) ), 'Should be combined into one' ); - } ); +QUnit.test( 'Combining factors', function( assert ) { + assert.ok( new Polynomial( [ + new Term( 2, 1 ), + new Term( -3, 1 ) + ] ).getTerm( 1 ).equals( new Term( -1, 1 ) ), 'Should be combined into one' ); +} ); - QUnit.test( 'Times', function( assert ) { - assert.ok( new Polynomial( [ - new Term( 4, 1 ), - new Term( -5, 0 ) - ] ).times( new Polynomial( [ - new Term( 2, 2 ), - new Term( 3, 1 ), - new Term( -6, 0 ) - ] ) ).equals( new Polynomial( [ - new Term( 8, 3 ), - new Term( 2, 2 ), - new Term( -39, 1 ), - new Term( 30, 0 ) - ] ) ), 'Example multiplication' ); +QUnit.test( 'Times', function( assert ) { + assert.ok( new Polynomial( [ + new Term( 4, 1 ), + new Term( -5, 0 ) + ] ).times( new Polynomial( [ + new Term( 2, 2 ), + new Term( 3, 1 ), + new Term( -6, 0 ) + ] ) ).equals( new Polynomial( [ + new Term( 8, 3 ), + new Term( 2, 2 ), + new Term( -39, 1 ), + new Term( 30, 0 ) + ] ) ), 'Example multiplication' ); - assert.ok( new Polynomial( [ - new Term( 3, 1 ), // 3x - new Term( -2, 0 ) // -2 - ] ).times( new Polynomial( [ - new Term( 2, 1 ), // 2x - new Term( 1, 0 ) // 1 - ] ) ).equals( new Polynomial( [ - new Term( 6, 2 ), // 6x^2 - new Term( -1, 1 ), // -x - new Term( -2, 0 ) // -2 - ] ) ), 'Example multiplication' ); + assert.ok( new Polynomial( [ + new Term( 3, 1 ), // 3x + new Term( -2, 0 ) // -2 + ] ).times( new Polynomial( [ + new Term( 2, 1 ), // 2x + new Term( 1, 0 ) // 1 + ] ) ).equals( new Polynomial( [ + new Term( 6, 2 ), // 6x^2 + new Term( -1, 1 ), // -x + new Term( -2, 0 ) // -2 + ] ) ), 'Example multiplication' ); - assert.ok( new Polynomial( [ - new Term( 1, 2 ) // x^2 - ] ).times( new Polynomial( [ - new Term( 1, 0 ), // 1 - new Term( 1, 0 ) // 1 - ] ) ).equals( new Polynomial( [ - new Term( 2, 2 ) // 2x^2 - ] ) ), 'Combination and multiplication' ); - } ); -} ); + assert.ok( new Polynomial( [ + new Term( 1, 2 ) // x^2 + ] ).times( new Polynomial( [ + new Term( 1, 0 ), // 1 + new Term( 1, 0 ) // 1 + ] ) ).equals( new Polynomial( [ + new Term( 2, 2 ) // 2x^2 + ] ) ), 'Combination and multiplication' ); +} ); \ No newline at end of file diff --git a/js/common/model/Term.js b/js/common/model/Term.js index e1c8ef14..ad8fcce3 100644 --- a/js/common/model/Term.js +++ b/js/common/model/Term.js @@ -5,160 +5,156 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Utils = require( 'DOT/Utils' ); +import Utils from '../../../../dot/js/Utils.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +/** + * @constructor + * @extends {Object} + * + * @param {number} coefficient + * @param {number} [power] + */ +function Term( coefficient, power ) { + // Properly handle 0x. This generally removes a lot of special-cases (e.g. 0x^2 equals 0), and allows things like + // Polynomial to easily have one term of each power (where if the constant is 0, its power is 0). Also applies to + // things like sorting by power or how we want things displayed (0, not 0x). + // See https://github.com/phetsims/area-model-common/issues/6 + if ( coefficient === 0 ) { + power = 0; + } + + // The power argument is optional--if not supplied, the power defaults to 0. + power = ( power === undefined ? 0 : power ); + + assert && assert( typeof coefficient === 'number' && isFinite( coefficient ), + 'Coefficient only needs to be a finite number' ); + + assert && assert( typeof power === 'number' && isFinite( power ) ); + + // @public {number} + this.coefficient = coefficient; + + // @public {number} + this.power = power; +} + +areaModelCommon.register( 'Term', Term ); + +export default inherit( Object, Term, { /** - * @constructor - * @extends {Object} + * Term multiplication. + * @public * - * @param {number} coefficient - * @param {number} [power] + * @param {Term} term + * @returns {Term} */ - function Term( coefficient, power ) { - // Properly handle 0x. This generally removes a lot of special-cases (e.g. 0x^2 equals 0), and allows things like - // Polynomial to easily have one term of each power (where if the constant is 0, its power is 0). Also applies to - // things like sorting by power or how we want things displayed (0, not 0x). - // See https://github.com/phetsims/area-model-common/issues/6 - if ( coefficient === 0 ) { - power = 0; - } + times: function( term ) { + return new Term( this.coefficient * term.coefficient, this.power + term.power ); + }, - // The power argument is optional--if not supplied, the power defaults to 0. - power = ( power === undefined ? 0 : power ); + /** + * Equality + * @public + * + * @param {Term} term + * @returns {boolean} + */ + equals: function( term ) { + // Handle floating-point error for common cases. Epsilon guessed at what may be most relevant if this is moved + // to common code. + return Utils.equalsEpsilon( this.coefficient, term.coefficient, 1e-7 ) && this.power === term.power; + }, - assert && assert( typeof coefficient === 'number' && isFinite( coefficient ), - 'Coefficient only needs to be a finite number' ); + /** + * Returns a string representation of the term suitable for RichText, but without any signs. + * @public + * + * @returns {string} + */ + toNoSignRichString: function() { + let string = ''; - assert && assert( typeof power === 'number' && isFinite( power ) ); + if ( Math.abs( this.coefficient ) !== 1 || this.power === 0 ) { + string += Utils.toFixedNumber( Math.abs( this.coefficient ), 2 ); + } + if ( this.power > 0 ) { + string += AreaModelCommonConstants.X_VARIABLE_RICH_STRING; + } + if ( this.power > 1 ) { + string += '' + this.power + ''; + } - // @public {number} - this.coefficient = coefficient; + return string; + }, - // @public {number} - this.power = power; - } + /** + * Returns a string representation of the term suitable for RichText. + * @public + * + * @param {boolean} includeBinaryOperation - If true, assumes we are in a sum and not the first term so includes + * an initial plus or minus. If false, only a unary minus would be included. + * @returns {string} + */ + toRichString: function( includeBinaryOperation ) { + assert && assert( typeof includeBinaryOperation === 'boolean' ); - areaModelCommon.register( 'Term', Term ); - - return inherit( Object, Term, { - /** - * Term multiplication. - * @public - * - * @param {Term} term - * @returns {Term} - */ - times: function( term ) { - return new Term( this.coefficient * term.coefficient, this.power + term.power ); - }, - - /** - * Equality - * @public - * - * @param {Term} term - * @returns {boolean} - */ - equals: function( term ) { - // Handle floating-point error for common cases. Epsilon guessed at what may be most relevant if this is moved - // to common code. - return Utils.equalsEpsilon( this.coefficient, term.coefficient, 1e-7 ) && this.power === term.power; - }, - - /** - * Returns a string representation of the term suitable for RichText, but without any signs. - * @public - * - * @returns {string} - */ - toNoSignRichString: function() { - let string = ''; - - if ( Math.abs( this.coefficient ) !== 1 || this.power === 0 ) { - string += Utils.toFixedNumber( Math.abs( this.coefficient ), 2 ); - } - if ( this.power > 0 ) { - string += AreaModelCommonConstants.X_VARIABLE_RICH_STRING; - } - if ( this.power > 1 ) { - string += '' + this.power + ''; - } + let string = ''; - return string; - }, - - /** - * Returns a string representation of the term suitable for RichText. - * @public - * - * @param {boolean} includeBinaryOperation - If true, assumes we are in a sum and not the first term so includes - * an initial plus or minus. If false, only a unary minus would be included. - * @returns {string} - */ - toRichString: function( includeBinaryOperation ) { - assert && assert( typeof includeBinaryOperation === 'boolean' ); - - let string = ''; - - if ( includeBinaryOperation ) { - if ( this.coefficient < 0 ) { - string += ' ' + MathSymbols.MINUS + ' '; - } - else { - string += ' ' + MathSymbols.PLUS + ' '; - } + if ( includeBinaryOperation ) { + if ( this.coefficient < 0 ) { + string += ' ' + MathSymbols.MINUS + ' '; } else { - if ( this.coefficient < 0 ) { - string += MathSymbols.UNARY_MINUS; - } + string += ' ' + MathSymbols.PLUS + ' '; } + } + else { + if ( this.coefficient < 0 ) { + string += MathSymbols.UNARY_MINUS; + } + } - string += this.toNoSignRichString(); + string += this.toNoSignRichString(); - return string; + return string; + } +}, { + /** + * Returns the longest generic term's toRichString (for proper sizing). + * @public + * + * @param {boolean} allowExponents - Whether powers of x can be included + * @param {number} digitCount - If no powers of x allowed, how many numeric digits can be allowed. + * @returns {string} + */ + getLargestGenericString: function( allowExponents, digitCount ) { + const digits = _.range( 0, digitCount ).map( function() { + return AreaModelCommonConstants.MEASURING_CHARACTER; + } ).join( '' ); + + if ( allowExponents ) { + // The square is an example of an exponent that will increase the height of the displayed string, so we want to + // include it if exponents are allowed. + return MathSymbols.MINUS + digits + 'x2'; } - }, { - /** - * Returns the longest generic term's toRichString (for proper sizing). - * @public - * - * @param {boolean} allowExponents - Whether powers of x can be included - * @param {number} digitCount - If no powers of x allowed, how many numeric digits can be allowed. - * @returns {string} - */ - getLargestGenericString: function( allowExponents, digitCount ) { - const digits = _.range( 0, digitCount ).map( function() { - return AreaModelCommonConstants.MEASURING_CHARACTER; - } ).join( '' ); - - if ( allowExponents ) { - // The square is an example of an exponent that will increase the height of the displayed string, so we want to - // include it if exponents are allowed. - return MathSymbols.MINUS + digits + 'x2'; - } - else { - return MathSymbols.MINUS + digits; - } - }, - - /** - * Returns whether the parameter is a Term (or is null) - * @public - * - * @param {*} thing - * @returns {boolean} - */ - isTermOrNull: function( thing ) { - return thing === null || thing instanceof Term; + else { + return MathSymbols.MINUS + digits; } - } ); -} ); + }, + + /** + * Returns whether the parameter is a Term (or is null) + * @public + * + * @param {*} thing + * @returns {boolean} + */ + isTermOrNull: function( thing ) { + return thing === null || thing instanceof Term; + } +} ); \ No newline at end of file diff --git a/js/common/model/TermList.js b/js/common/model/TermList.js index 5b31ebb5..a10fe0e7 100644 --- a/js/common/model/TermList.js +++ b/js/common/model/TermList.js @@ -6,113 +6,109 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; - /** - * @constructor - * @extends {Object} - * - * @param {Array.} terms - */ - function TermList( terms ) { +/** + * @constructor + * @extends {Object} + * + * @param {Array.} terms + */ +function TermList( terms ) { - // @public {Array.} - this.terms = terms; - } + // @public {Array.} + this.terms = terms; +} - areaModelCommon.register( 'TermList', TermList ); +areaModelCommon.register( 'TermList', TermList ); - return inherit( Object, TermList, { +export default inherit( Object, TermList, { - /** - * Addition of term lists. - * @public - * - * @param {TermList} termList - * @returns {TermList} - */ - plus: function( termList ) { - return new TermList( this.terms.concat( termList.terms ) ); - }, + /** + * Addition of term lists. + * @public + * + * @param {TermList} termList + * @returns {TermList} + */ + plus: function( termList ) { + return new TermList( this.terms.concat( termList.terms ) ); + }, + + /** + * Multiplication of term lists. + * @public + * + * @param {TermList} termList + * @returns {TermList} + */ + times: function( termList ) { + return new TermList( _.flatten( this.terms.map( function( term ) { + return termList.terms.map( function( otherTerm ) { + return term.times( otherTerm ); + } ); + } ) ) ); + }, - /** - * Multiplication of term lists. - * @public - * - * @param {TermList} termList - * @returns {TermList} - */ - times: function( termList ) { - return new TermList( _.flatten( this.terms.map( function( term ) { - return termList.terms.map( function( otherTerm ) { - return term.times( otherTerm ); - } ); - } ) ) ); - }, + /** + * Returns a new TermList, (stable) sorted by the exponent. + * @public + * + * @returns {TermList} + */ + orderedByExponent: function() { + return new TermList( _.sortBy( this.terms, function( term ) { + return -term.power; + } ) ); + }, - /** - * Returns a new TermList, (stable) sorted by the exponent. - * @public - * - * @returns {TermList} - */ - orderedByExponent: function() { - return new TermList( _.sortBy( this.terms, function( term ) { - return -term.power; - } ) ); - }, + /** + * Returns whether any of the terms have a negative coefficient. + * @public + * + * @returns {boolean} + */ + hasNegativeTerm: function() { + return _.some( this.terms, function( term ) { + return term.coefficient < 0; + } ); + }, - /** - * Returns whether any of the terms have a negative coefficient. - * @public - * - * @returns {boolean} - */ - hasNegativeTerm: function() { - return _.some( this.terms, function( term ) { - return term.coefficient < 0; - } ); - }, + /** + * Returns a string suitable for RichText + * @public + * + * @returns {string} + */ + toRichString: function() { + return this.terms.map( function( term, index ) { + return term.toRichString( index > 0 ); + } ).join( '' ); + }, - /** - * Returns a string suitable for RichText - * @public - * - * @returns {string} - */ - toRichString: function() { - return this.terms.map( function( term, index ) { - return term.toRichString( index > 0 ); - } ).join( '' ); - }, + /** + * Equality for just whether the terms are the same (so a TermList can be compared to a Polynomial and be equal + * despite being different types.) Note that Polynomial orders the terms so this order-dependent check will still + * work. + * @public + * + * @param {TermList} termList + */ + equals: function( termList ) { + if ( this.terms.length !== termList.terms.length ) { + return false; + } - /** - * Equality for just whether the terms are the same (so a TermList can be compared to a Polynomial and be equal - * despite being different types.) Note that Polynomial orders the terms so this order-dependent check will still - * work. - * @public - * - * @param {TermList} termList - */ - equals: function( termList ) { - if ( this.terms.length !== termList.terms.length ) { + // This uses a reverse search instead of a forward search for optimization--probably not important for Area Model, + // but optimized in case it is moved to common code. + for ( let i = this.terms.length - 1; i >= 0; i-- ) { + if ( !this.terms[ i ].equals( termList.terms[ i ] ) ) { return false; } - - // This uses a reverse search instead of a forward search for optimization--probably not important for Area Model, - // but optimized in case it is moved to common code. - for ( let i = this.terms.length - 1; i >= 0; i-- ) { - if ( !this.terms[ i ].equals( termList.terms[ i ] ) ) { - return false; - } - } - - return true; } - } ); -} ); + + return true; + } +} ); \ No newline at end of file diff --git a/js/common/model/TermListTests.js b/js/common/model/TermListTests.js index 865227a8..6522da73 100644 --- a/js/common/model/TermListTests.js +++ b/js/common/model/TermListTests.js @@ -5,61 +5,57 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const TermList = require( 'AREA_MODEL_COMMON/common/model/TermList' ); +import Term from './Term.js'; +import TermList from './TermList.js'; - QUnit.module( 'TermList' ); +QUnit.module( 'TermList' ); - QUnit.test( 'Times', function( assert ) { - assert.ok( new TermList( [ - new Term( 3, 1 ), // 3x - new Term( -2, 0 ) // -2 - ] ).times( new TermList( [ - new Term( 2, 1 ), // 2x - new Term( 1, 0 ) // 1 - ] ) ).equals( new TermList( [ - new Term( 6, 2 ), // 6x^2 - new Term( 3, 1 ), // 3x - new Term( -4, 1 ), // -4x - new Term( -2, 0 ) // -2 - ] ) ), 'Example multiplication' ); - } ); - - QUnit.test( 'Ordering', function( assert ) { - assert.ok( new TermList( [ - new Term( 3, 2 ), - new Term( 1, 1 ), - new Term( 2, 0 ) - ] ).orderedByExponent().equals( new TermList( [ - new Term( 3, 2 ), - new Term( 1, 1 ), - new Term( 2, 0 ) - ] ) ), 'Ordering (no change)' ); - assert.ok( new TermList( [ - new Term( 2, 0 ), - new Term( 1, 1 ), - new Term( 3, 2 ) - ] ).orderedByExponent().equals( new TermList( [ - new Term( 3, 2 ), - new Term( 1, 1 ), - new Term( 2, 0 ) - ] ) ), 'Ordering (reversed)' ); - } ); +QUnit.test( 'Times', function( assert ) { + assert.ok( new TermList( [ + new Term( 3, 1 ), // 3x + new Term( -2, 0 ) // -2 + ] ).times( new TermList( [ + new Term( 2, 1 ), // 2x + new Term( 1, 0 ) // 1 + ] ) ).equals( new TermList( [ + new Term( 6, 2 ), // 6x^2 + new Term( 3, 1 ), // 3x + new Term( -4, 1 ), // -4x + new Term( -2, 0 ) // -2 + ] ) ), 'Example multiplication' ); +} ); - QUnit.test( 'Negative test', function( assert ) { - assert.ok( !new TermList( [ - new Term( 3, 2 ), - new Term( 1, 1 ), - new Term( 2, 0 ) - ] ).hasNegativeTerm(), 'No negative' ); - assert.ok( new TermList( [ - new Term( 3, 2 ), - new Term( 1, 1 ), - new Term( -2, 0 ) - ] ).hasNegativeTerm(), 'Has negative' ); - } ); +QUnit.test( 'Ordering', function( assert ) { + assert.ok( new TermList( [ + new Term( 3, 2 ), + new Term( 1, 1 ), + new Term( 2, 0 ) + ] ).orderedByExponent().equals( new TermList( [ + new Term( 3, 2 ), + new Term( 1, 1 ), + new Term( 2, 0 ) + ] ) ), 'Ordering (no change)' ); + assert.ok( new TermList( [ + new Term( 2, 0 ), + new Term( 1, 1 ), + new Term( 3, 2 ) + ] ).orderedByExponent().equals( new TermList( [ + new Term( 3, 2 ), + new Term( 1, 1 ), + new Term( 2, 0 ) + ] ) ), 'Ordering (reversed)' ); } ); + +QUnit.test( 'Negative test', function( assert ) { + assert.ok( !new TermList( [ + new Term( 3, 2 ), + new Term( 1, 1 ), + new Term( 2, 0 ) + ] ).hasNegativeTerm(), 'No negative' ); + assert.ok( new TermList( [ + new Term( 3, 2 ), + new Term( 1, 1 ), + new Term( -2, 0 ) + ] ).hasNegativeTerm(), 'Has negative' ); +} ); \ No newline at end of file diff --git a/js/common/model/TermTests.js b/js/common/model/TermTests.js index a524af4d..6f8426a5 100644 --- a/js/common/model/TermTests.js +++ b/js/common/model/TermTests.js @@ -5,23 +5,19 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); +import Term from './Term.js'; - QUnit.module( 'Term' ); +QUnit.module( 'Term' ); - QUnit.test( 'Equality', function( assert ) { - assert.ok( new Term( 1, 2 ).equals( new Term( 1, 2 ) ), 'Basic equality' ); - assert.ok( !new Term( 2, 2 ).equals( new Term( 1, 2 ) ), 'Basic inequality' ); - assert.ok( !new Term( 1, 2 ).equals( new Term( 1, 1 ) ), 'Basic inequality' ); - } ); - - QUnit.test( 'Multiplication', function( assert ) { - assert.ok( new Term( 3, 0 ).times( new Term( 5, 0 ) ).equals( new Term( 15, 0 ) ), 'Basic multiplication' ); - assert.ok( new Term( 3, 1 ).times( new Term( 5, 0 ) ).equals( new Term( 15, 1 ) ), 'Basic multiplication (one exponent)' ); - assert.ok( new Term( 3, 2 ).times( new Term( 5, 1 ) ).equals( new Term( 15, 3 ) ), 'Basic multiplication (two exponents)' ); - } ); +QUnit.test( 'Equality', function( assert ) { + assert.ok( new Term( 1, 2 ).equals( new Term( 1, 2 ) ), 'Basic equality' ); + assert.ok( !new Term( 2, 2 ).equals( new Term( 1, 2 ) ), 'Basic inequality' ); + assert.ok( !new Term( 1, 2 ).equals( new Term( 1, 1 ) ), 'Basic inequality' ); } ); + +QUnit.test( 'Multiplication', function( assert ) { + assert.ok( new Term( 3, 0 ).times( new Term( 5, 0 ) ).equals( new Term( 15, 0 ) ), 'Basic multiplication' ); + assert.ok( new Term( 3, 1 ).times( new Term( 5, 0 ) ).equals( new Term( 15, 1 ) ), 'Basic multiplication (one exponent)' ); + assert.ok( new Term( 3, 2 ).times( new Term( 5, 1 ) ).equals( new Term( 15, 3 ) ), 'Basic multiplication (two exponents)' ); +} ); \ No newline at end of file diff --git a/js/common/view/AreaCalculationRadioButtonGroup.js b/js/common/view/AreaCalculationRadioButtonGroup.js index 72c13375..dca696c2 100644 --- a/js/common/view/AreaCalculationRadioButtonGroup.js +++ b/js/common/view/AreaCalculationRadioButtonGroup.js @@ -7,69 +7,66 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonRadioButtonGroup' ); - const FontAwesomeNode = require( 'SUN/FontAwesomeNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const VBox = require( 'SCENERY/nodes/VBox' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import FontAwesomeNode from '../../../../sun/js/FontAwesomeNode.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaCalculationChoice from '../model/AreaCalculationChoice.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; +import AreaModelCommonRadioButtonGroup from './AreaModelCommonRadioButtonGroup.js'; - /** - * @constructor - * @extends {AreaModelCommonRadioButtonGroup} - * - * @param {Property.} areaCalculationChoiceProperty - * @param {AlignGroup} selectionButtonAlignGroup - */ - function AreaCalculationRadioButtonGroup( areaCalculationChoiceProperty, selectionButtonAlignGroup ) { +/** + * @constructor + * @extends {AreaModelCommonRadioButtonGroup} + * + * @param {Property.} areaCalculationChoiceProperty + * @param {AlignGroup} selectionButtonAlignGroup + */ +function AreaCalculationRadioButtonGroup( areaCalculationChoiceProperty, selectionButtonAlignGroup ) { - const darkColorProperty = AreaModelCommonColorProfile.calculationIconDarkProperty; - const lightColorProperty = AreaModelCommonColorProfile.calculationIconLightProperty; + const darkColorProperty = AreaModelCommonColorProfile.calculationIconDarkProperty; + const lightColorProperty = AreaModelCommonColorProfile.calculationIconLightProperty; - AreaModelCommonRadioButtonGroup.call( this, areaCalculationChoiceProperty, [ { - value: AreaCalculationChoice.HIDDEN, - node: new AlignBox( new FontAwesomeNode( 'eye_close', { scale: 0.8 } ), { group: selectionButtonAlignGroup } ) - }, { - value: AreaCalculationChoice.LINE_BY_LINE, - node: new AlignBox( createCalculationIcon( darkColorProperty, lightColorProperty ), { group: selectionButtonAlignGroup } ) - }, { - value: AreaCalculationChoice.SHOW_ALL_LINES, - node: new AlignBox( createCalculationIcon( darkColorProperty, darkColorProperty ), { group: selectionButtonAlignGroup } ) - } ] ); - } + AreaModelCommonRadioButtonGroup.call( this, areaCalculationChoiceProperty, [ { + value: AreaCalculationChoice.HIDDEN, + node: new AlignBox( new FontAwesomeNode( 'eye_close', { scale: 0.8 } ), { group: selectionButtonAlignGroup } ) + }, { + value: AreaCalculationChoice.LINE_BY_LINE, + node: new AlignBox( createCalculationIcon( darkColorProperty, lightColorProperty ), { group: selectionButtonAlignGroup } ) + }, { + value: AreaCalculationChoice.SHOW_ALL_LINES, + node: new AlignBox( createCalculationIcon( darkColorProperty, darkColorProperty ), { group: selectionButtonAlignGroup } ) + } ] ); +} - areaModelCommon.register( 'AreaCalculationRadioButtonGroup', AreaCalculationRadioButtonGroup ); +areaModelCommon.register( 'AreaCalculationRadioButtonGroup', AreaCalculationRadioButtonGroup ); - /** - * Creates a calculation icon with two fills. - * @private - * - * @param {Property.} topColorProperty - Fill for the top line - * @param {Property.} bottomColorProperty - Fill for the bottom-most three lines - * @returns {Node} - */ - function createCalculationIcon( topColorProperty, bottomColorProperty ) { - const height = 5; - const fullWidth = 30; - const partialWidth = 20; - return new VBox( { - children: [ - new Rectangle( 0, 0, partialWidth, height, { fill: topColorProperty } ), - new Rectangle( 0, 0, fullWidth, height, { fill: bottomColorProperty } ), - new Rectangle( 0, 0, partialWidth, height, { fill: bottomColorProperty } ), - new Rectangle( 0, 0, fullWidth, height, { fill: bottomColorProperty } ) - ], - align: 'left', - spacing: 2 - } ); - } +/** + * Creates a calculation icon with two fills. + * @private + * + * @param {Property.} topColorProperty - Fill for the top line + * @param {Property.} bottomColorProperty - Fill for the bottom-most three lines + * @returns {Node} + */ +function createCalculationIcon( topColorProperty, bottomColorProperty ) { + const height = 5; + const fullWidth = 30; + const partialWidth = 20; + return new VBox( { + children: [ + new Rectangle( 0, 0, partialWidth, height, { fill: topColorProperty } ), + new Rectangle( 0, 0, fullWidth, height, { fill: bottomColorProperty } ), + new Rectangle( 0, 0, partialWidth, height, { fill: bottomColorProperty } ), + new Rectangle( 0, 0, fullWidth, height, { fill: bottomColorProperty } ) + ], + align: 'left', + spacing: 2 + } ); +} - return inherit( AreaModelCommonRadioButtonGroup, AreaCalculationRadioButtonGroup ); -} ); +inherit( AreaModelCommonRadioButtonGroup, AreaCalculationRadioButtonGroup ); +export default AreaCalculationRadioButtonGroup; \ No newline at end of file diff --git a/js/common/view/AreaDisplayNode.js b/js/common/view/AreaDisplayNode.js index 96a4ef52..1716591e 100644 --- a/js/common/view/AreaDisplayNode.js +++ b/js/common/view/AreaDisplayNode.js @@ -7,309 +7,305 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const EraserButton = require( 'SCENERY_PHET/buttons/EraserButton' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const ModelViewTransform2 = require( 'PHETCOMMON/view/ModelViewTransform2' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const PartialProductLabelNode = require( 'AREA_MODEL_COMMON/common/view/PartialProductLabelNode' ); - const PartialProductsChoice = require( 'AREA_MODEL_COMMON/common/model/PartialProductsChoice' ); - const PoolableLayerNode = require( 'AREA_MODEL_COMMON/common/view/PoolableLayerNode' ); - const Property = require( 'AXON/Property' ); - const RangeLabelNode = require( 'AREA_MODEL_COMMON/common/view/RangeLabelNode' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - - // a11y strings - const eraseString = AreaModelCommonA11yStrings.erase.value; - const eraseDescriptionString = AreaModelCommonA11yStrings.eraseDescription.value; - const horizontalDimensionCapitalizedString = AreaModelCommonA11yStrings.horizontalDimensionCapitalized.value; - const onePartialProductFactorPatternString = AreaModelCommonA11yStrings.onePartialProductFactorPattern.value; - const onePartialProductPatternString = AreaModelCommonA11yStrings.onePartialProductPattern.value; - const productTimesPatternString = AreaModelCommonA11yStrings.productTimesPattern.value; - const threePartitionsSplitPatternString = AreaModelCommonA11yStrings.threePartitionsSplitPattern.value; - const twoPartialProductFactorsPatternString = AreaModelCommonA11yStrings.twoPartialProductFactorsPattern.value; - const twoPartialProductsPatternString = AreaModelCommonA11yStrings.twoPartialProductsPattern.value; - const twoPartitionsSplitPatternString = AreaModelCommonA11yStrings.twoPartitionsSplitPattern.value; - const verticalDimensionCapitalizedString = AreaModelCommonA11yStrings.verticalDimensionCapitalized.value; - /** - * @constructor - * @extends {Node} - * - * @param {AreaDisplay} areaDisplay - * @param {Property.} partialProductsChoiceProperty - * @param {Object} [options] - */ - function AreaDisplayNode( areaDisplay, partialProductsChoiceProperty, options ) { - options = merge( { +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import ModelViewTransform2 from '../../../../phetcommon/js/view/ModelViewTransform2.js'; +import EraserButton from '../../../../scenery-phet/js/buttons/EraserButton.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import OrientationPair from '../model/OrientationPair.js'; +import PartialProductsChoice from '../model/PartialProductsChoice.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; +import PartialProductLabelNode from './PartialProductLabelNode.js'; +import PoolableLayerNode from './PoolableLayerNode.js'; +import RangeLabelNode from './RangeLabelNode.js'; + +// a11y strings +const eraseString = AreaModelCommonA11yStrings.erase.value; +const eraseDescriptionString = AreaModelCommonA11yStrings.eraseDescription.value; +const horizontalDimensionCapitalizedString = AreaModelCommonA11yStrings.horizontalDimensionCapitalized.value; +const onePartialProductFactorPatternString = AreaModelCommonA11yStrings.onePartialProductFactorPattern.value; +const onePartialProductPatternString = AreaModelCommonA11yStrings.onePartialProductPattern.value; +const productTimesPatternString = AreaModelCommonA11yStrings.productTimesPattern.value; +const threePartitionsSplitPatternString = AreaModelCommonA11yStrings.threePartitionsSplitPattern.value; +const twoPartialProductFactorsPatternString = AreaModelCommonA11yStrings.twoPartialProductFactorsPattern.value; +const twoPartialProductsPatternString = AreaModelCommonA11yStrings.twoPartialProductsPattern.value; +const twoPartitionsSplitPatternString = AreaModelCommonA11yStrings.twoPartitionsSplitPattern.value; +const verticalDimensionCapitalizedString = AreaModelCommonA11yStrings.verticalDimensionCapitalized.value; - // These do not change for a given AreaDisplayNode - allowExponents: false, - isProportional: false, - useLargeArea: false - }, options ); +/** + * @constructor + * @extends {Node} + * + * @param {AreaDisplay} areaDisplay + * @param {Property.} partialProductsChoiceProperty + * @param {Object} [options] + */ +function AreaDisplayNode( areaDisplay, partialProductsChoiceProperty, options ) { + options = merge( { - const self = this; + // These do not change for a given AreaDisplayNode + allowExponents: false, + isProportional: false, + useLargeArea: false + }, options ); - Node.call( this ); + const self = this; - // @public {AreaDisplay} - this.areaDisplay = areaDisplay; + Node.call( this ); - // @public {Node} - Layers (a11y) - this.accessibleParagraphNode = new Node( { - tagName: 'p' - } ); - this.areaLayer = new Node(); - this.labelLayer = new Node(); + // @public {AreaDisplay} + this.areaDisplay = areaDisplay; - this.addChild( this.accessibleParagraphNode ); - this.addChild( this.areaLayer ); - this.addChild( this.labelLayer ); + // @public {Node} - Layers (a11y) + this.accessibleParagraphNode = new Node( { + tagName: 'p' + } ); + this.areaLayer = new Node(); + this.labelLayer = new Node(); - // @public {number} - this.viewSize = options.useLargeArea ? AreaModelCommonConstants.LARGE_AREA_SIZE : AreaModelCommonConstants.AREA_SIZE; + this.addChild( this.accessibleParagraphNode ); + this.addChild( this.areaLayer ); + this.addChild( this.labelLayer ); - // A11y description for the partitions for each orientation - const accessiblePartitionNodes = OrientationPair.create( function( orientation ) { - const partitionLabel = new Node( { - tagName: 'span' - } ); - Property.multilink( [ - areaDisplay.partitionsProperties.get( orientation ), - areaDisplay.totalProperties.get( orientation ) - ], function( partitions, total ) { - partitions = partitions.filter( function( partition ) { - return partition.sizeProperty.value !== null && partition.visibleProperty.value === true; - } ); - if ( partitions.length < 2 || total === null ) { - partitionLabel.innerContent = ''; - } - else if ( partitions.length === 2 ) { - partitionLabel.innerContent = StringUtils.fillIn( twoPartitionsSplitPatternString, { - partition: orientation === Orientation.HORIZONTAL ? horizontalDimensionCapitalizedString : verticalDimensionCapitalizedString, - size: total.toRichString(), - size1: partitions[ 0 ].sizeProperty.value.toRichString( false ), - size2: partitions[ 1 ].sizeProperty.value.toRichString( false ) - } ); - } - else if ( partitions.length === 3 ) { - partitionLabel.innerContent = StringUtils.fillIn( threePartitionsSplitPatternString, { - partition: orientation === Orientation.HORIZONTAL ? horizontalDimensionCapitalizedString : verticalDimensionCapitalizedString, - size: total.toRichString(), - size1: partitions[ 0 ].sizeProperty.value.toRichString( false ), - size2: partitions[ 1 ].sizeProperty.value.toRichString( false ), - size3: partitions[ 2 ].sizeProperty.value.toRichString( false ) - } ); - } - else { - throw new Error( 'unexpected number of partitions for a11y' ); - } - } ); - return partitionLabel; - } ); - this.accessibleParagraphNode.addChild( accessiblePartitionNodes.vertical ); - this.accessibleParagraphNode.addChild( accessiblePartitionNodes.horizontal ); + // @public {number} + this.viewSize = options.useLargeArea ? AreaModelCommonConstants.LARGE_AREA_SIZE : AreaModelCommonConstants.AREA_SIZE; - // A11y description for the partial products - const accessiblePartialProductNode = new Node( { + // A11y description for the partitions for each orientation + const accessiblePartitionNodes = OrientationPair.create( function( orientation ) { + const partitionLabel = new Node( { tagName: 'span' } ); - let accessiblePartialMultilink = null; - areaDisplay.partitionedAreasProperty.link( function( partitionedAreas ) { - if ( accessiblePartialMultilink ) { - accessiblePartialMultilink.dispose(); + Property.multilink( [ + areaDisplay.partitionsProperties.get( orientation ), + areaDisplay.totalProperties.get( orientation ) + ], function( partitions, total ) { + partitions = partitions.filter( function( partition ) { + return partition.sizeProperty.value !== null && partition.visibleProperty.value === true; + } ); + if ( partitions.length < 2 || total === null ) { + partitionLabel.innerContent = ''; } - const properties = [ - partialProductsChoiceProperty - ].concat( partitionedAreas.map( function( partitionedArea ) { return partitionedArea.areaProperty; } ) ) - .concat( partitionedAreas.map( function( partitionedArea ) { return partitionedArea.visibleProperty; } ) ); - accessiblePartialMultilink = Property.multilink( properties, function() { - const activePartitionedAreas = areaDisplay.partitionedAreasProperty.value.filter( function( partitionedArea ) { - return partitionedArea.visibleProperty.value && - partitionedArea.areaProperty.value !== null && - partitionedArea.partitions.vertical.sizeProperty.value !== null && - partitionedArea.partitions.horizontal.sizeProperty.value !== null; + else if ( partitions.length === 2 ) { + partitionLabel.innerContent = StringUtils.fillIn( twoPartitionsSplitPatternString, { + partition: orientation === Orientation.HORIZONTAL ? horizontalDimensionCapitalizedString : verticalDimensionCapitalizedString, + size: total.toRichString(), + size1: partitions[ 0 ].sizeProperty.value.toRichString( false ), + size2: partitions[ 1 ].sizeProperty.value.toRichString( false ) } ); - const fillObject = {}; - let fillString; - if ( activePartitionedAreas.length > 2 || - activePartitionedAreas.length === 0 || - partialProductsChoiceProperty.value === PartialProductsChoice.HIDDEN ) { - accessiblePartialProductNode.innerContent = ''; - } - else if ( partialProductsChoiceProperty.value === PartialProductsChoice.PRODUCTS ) { - fillString = onePartialProductPatternString; - fillObject.first = activePartitionedAreas[ 0 ].areaProperty.value.toRichString( false ); + } + else if ( partitions.length === 3 ) { + partitionLabel.innerContent = StringUtils.fillIn( threePartitionsSplitPatternString, { + partition: orientation === Orientation.HORIZONTAL ? horizontalDimensionCapitalizedString : verticalDimensionCapitalizedString, + size: total.toRichString(), + size1: partitions[ 0 ].sizeProperty.value.toRichString( false ), + size2: partitions[ 1 ].sizeProperty.value.toRichString( false ), + size3: partitions[ 2 ].sizeProperty.value.toRichString( false ) + } ); + } + else { + throw new Error( 'unexpected number of partitions for a11y' ); + } + } ); + return partitionLabel; + } ); + this.accessibleParagraphNode.addChild( accessiblePartitionNodes.vertical ); + this.accessibleParagraphNode.addChild( accessiblePartitionNodes.horizontal ); - if ( activePartitionedAreas.length === 2 ) { - fillString = twoPartialProductsPatternString; - fillObject.second = activePartitionedAreas[ 1 ].areaProperty.value.toRichString( false ); - } + // A11y description for the partial products + const accessiblePartialProductNode = new Node( { + tagName: 'span' + } ); + let accessiblePartialMultilink = null; + areaDisplay.partitionedAreasProperty.link( function( partitionedAreas ) { + if ( accessiblePartialMultilink ) { + accessiblePartialMultilink.dispose(); + } + const properties = [ + partialProductsChoiceProperty + ].concat( partitionedAreas.map( function( partitionedArea ) { return partitionedArea.areaProperty; } ) ) + .concat( partitionedAreas.map( function( partitionedArea ) { return partitionedArea.visibleProperty; } ) ); + accessiblePartialMultilink = Property.multilink( properties, function() { + const activePartitionedAreas = areaDisplay.partitionedAreasProperty.value.filter( function( partitionedArea ) { + return partitionedArea.visibleProperty.value && + partitionedArea.areaProperty.value !== null && + partitionedArea.partitions.vertical.sizeProperty.value !== null && + partitionedArea.partitions.horizontal.sizeProperty.value !== null; + } ); + const fillObject = {}; + let fillString; + if ( activePartitionedAreas.length > 2 || + activePartitionedAreas.length === 0 || + partialProductsChoiceProperty.value === PartialProductsChoice.HIDDEN ) { + accessiblePartialProductNode.innerContent = ''; + } + else if ( partialProductsChoiceProperty.value === PartialProductsChoice.PRODUCTS ) { + fillString = onePartialProductPatternString; + fillObject.first = activePartitionedAreas[ 0 ].areaProperty.value.toRichString( false ); - accessiblePartialProductNode.innerContent = StringUtils.fillIn( fillString, fillObject ); + if ( activePartitionedAreas.length === 2 ) { + fillString = twoPartialProductsPatternString; + fillObject.second = activePartitionedAreas[ 1 ].areaProperty.value.toRichString( false ); } - else if ( partialProductsChoiceProperty.value === PartialProductsChoice.FACTORS ) { - fillString = onePartialProductFactorPatternString; - fillObject.first = StringUtils.fillIn( productTimesPatternString, { - left: activePartitionedAreas[ 0 ].partitions.vertical.sizeProperty.value.toRichString( false ), - right: activePartitionedAreas[ 0 ].partitions.horizontal.sizeProperty.value.toRichString( false ) - } ); - if ( activePartitionedAreas.length === 2 ) { - fillString = twoPartialProductFactorsPatternString; - fillObject.second = StringUtils.fillIn( productTimesPatternString, { - left: activePartitionedAreas[ 1 ].partitions.vertical.sizeProperty.value.toRichString( false ), - right: activePartitionedAreas[ 1 ].partitions.horizontal.sizeProperty.value.toRichString( false ) - } ); - } + accessiblePartialProductNode.innerContent = StringUtils.fillIn( fillString, fillObject ); + } + else if ( partialProductsChoiceProperty.value === PartialProductsChoice.FACTORS ) { + fillString = onePartialProductFactorPatternString; + fillObject.first = StringUtils.fillIn( productTimesPatternString, { + left: activePartitionedAreas[ 0 ].partitions.vertical.sizeProperty.value.toRichString( false ), + right: activePartitionedAreas[ 0 ].partitions.horizontal.sizeProperty.value.toRichString( false ) + } ); - accessiblePartialProductNode.innerContent = StringUtils.fillIn( fillString, fillObject ); - } - else { - throw new Error( 'unknown situation for a11y partial products' ); + if ( activePartitionedAreas.length === 2 ) { + fillString = twoPartialProductFactorsPatternString; + fillObject.second = StringUtils.fillIn( productTimesPatternString, { + left: activePartitionedAreas[ 1 ].partitions.vertical.sizeProperty.value.toRichString( false ), + right: activePartitionedAreas[ 1 ].partitions.horizontal.sizeProperty.value.toRichString( false ) + } ); } - } ); - } ); - this.accessibleParagraphNode.addChild( accessiblePartialProductNode ); - - const modelBoundsProperty = new DerivedProperty( [ areaDisplay.coordinateRangeMaxProperty ], function( coordinateRangeMax ) { - return new Bounds2( 0, 0, coordinateRangeMax, coordinateRangeMax ); - } ); - const viewBounds = new Bounds2( 0, 0, this.viewSize, this.viewSize ); - // @protected {Property.} - Maps from coordinate range values to view values. - this.modelViewTransformProperty = new DerivedProperty( [ modelBoundsProperty ], function( modelBounds ) { - return ModelViewTransform2.createRectangleMapping( modelBounds, viewBounds ); + accessiblePartialProductNode.innerContent = StringUtils.fillIn( fillString, fillObject ); + } + else { + throw new Error( 'unknown situation for a11y partial products' ); + } } ); + } ); + this.accessibleParagraphNode.addChild( accessiblePartialProductNode ); - // Dimension line views - Orientation.VALUES.forEach( function( orientation ) { - const colorProperty = self.areaDisplay.colorProperties.get( orientation ); - const termListProperty = self.areaDisplay.displayProperties.get( orientation ); - const tickLocationsProperty = new DerivedProperty( - [ areaDisplay.partitionBoundariesProperties.get( orientation ) ], - function( partitionBoundaries ) { - return partitionBoundaries.map( function( boundary ) { - return orientation.modelToView( self.modelViewTransformProperty.value, boundary ); - } ); - } ); - self.labelLayer.addChild( new RangeLabelNode( - termListProperty, - orientation, - tickLocationsProperty, - colorProperty, - options.isProportional - ) ); - } ); + const modelBoundsProperty = new DerivedProperty( [ areaDisplay.coordinateRangeMaxProperty ], function( coordinateRangeMax ) { + return new Bounds2( 0, 0, coordinateRangeMax, coordinateRangeMax ); + } ); + const viewBounds = new Bounds2( 0, 0, this.viewSize, this.viewSize ); - // @private {boolean} - Whether we need to update the labels. It's expensive, so we only do it at most once a frame. - this.productPositionLabelsDirty = true; - const invalidateProductLabels = function() { - self.productPositionLabelsDirty = true; - }; - - // @protected {Array.} - this.productLabels = []; - - // Create pooled partial product labels - this.labelLayer.addChild( new PoolableLayerNode( { - usedArray: this.productLabels, - updatedCallback: invalidateProductLabels, - arrayProperty: areaDisplay.partitionedAreasProperty, - createNode: function( partitionedArea ) { - return new PartialProductLabelNode( - partialProductsChoiceProperty, - new Property( partitionedArea ), - options.allowExponents - ); - }, - getItemProperty: function( productLabel ) { - return productLabel.partitionedAreaProperty; - } - } ) ); + // @protected {Property.} - Maps from coordinate range values to view values. + this.modelViewTransformProperty = new DerivedProperty( [ modelBoundsProperty ], function( modelBounds ) { + return ModelViewTransform2.createRectangleMapping( modelBounds, viewBounds ); + } ); - // Note this needs to be linked after the product labels are created, so the order dependency works - areaDisplay.allPartitionsProperty.link( function( newAllPartitions, oldAllPartitions ) { - oldAllPartitions && oldAllPartitions.forEach( function( partition ) { - partition.coordinateRangeProperty.unlink( invalidateProductLabels ); - } ); - newAllPartitions.forEach( function( partition ) { - partition.coordinateRangeProperty.lazyLink( invalidateProductLabels ); + // Dimension line views + Orientation.VALUES.forEach( function( orientation ) { + const colorProperty = self.areaDisplay.colorProperties.get( orientation ); + const termListProperty = self.areaDisplay.displayProperties.get( orientation ); + const tickLocationsProperty = new DerivedProperty( + [ areaDisplay.partitionBoundariesProperties.get( orientation ) ], + function( partitionBoundaries ) { + return partitionBoundaries.map( function( boundary ) { + return orientation.modelToView( self.modelViewTransformProperty.value, boundary ); + } ); } ); + self.labelLayer.addChild( new RangeLabelNode( + termListProperty, + orientation, + tickLocationsProperty, + colorProperty, + options.isProportional + ) ); + } ); - invalidateProductLabels(); + // @private {boolean} - Whether we need to update the labels. It's expensive, so we only do it at most once a frame. + this.productPositionLabelsDirty = true; + const invalidateProductLabels = function() { + self.productPositionLabelsDirty = true; + }; + + // @protected {Array.} + this.productLabels = []; + + // Create pooled partial product labels + this.labelLayer.addChild( new PoolableLayerNode( { + usedArray: this.productLabels, + updatedCallback: invalidateProductLabels, + arrayProperty: areaDisplay.partitionedAreasProperty, + createNode: function( partitionedArea ) { + return new PartialProductLabelNode( + partialProductsChoiceProperty, + new Property( partitionedArea ), + options.allowExponents + ); + }, + getItemProperty: function( productLabel ) { + return productLabel.partitionedAreaProperty; + } + } ) ); + + // Note this needs to be linked after the product labels are created, so the order dependency works + areaDisplay.allPartitionsProperty.link( function( newAllPartitions, oldAllPartitions ) { + oldAllPartitions && oldAllPartitions.forEach( function( partition ) { + partition.coordinateRangeProperty.unlink( invalidateProductLabels ); + } ); + newAllPartitions.forEach( function( partition ) { + partition.coordinateRangeProperty.lazyLink( invalidateProductLabels ); } ); - // Also invalidate our label positions when the label type changes. - // See https://github.com/phetsims/area-model-common/issues/109 - partialProductsChoiceProperty.lazyLink( invalidateProductLabels ); + invalidateProductLabels(); + } ); - // Do it once initially for proper layout at the start - this.positionProductLabels(); + // Also invalidate our label positions when the label type changes. + // See https://github.com/phetsims/area-model-common/issues/109 + partialProductsChoiceProperty.lazyLink( invalidateProductLabels ); - // @public {Node} - Exposed publicly for a11y, and used in subclasses - this.eraseButton = new EraserButton( { - listener: function() { - areaDisplay.areaProperty.value.erase(); - }, - center: options.isProportional - ? AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET - : AreaModelCommonConstants.GENERIC_RANGE_OFFSET, - touchAreaXDilation: 8, - touchAreaYDilation: 8, - - // a11y - innerContent: eraseString, - descriptionContent: eraseDescriptionString - } ); + // Do it once initially for proper layout at the start + this.positionProductLabels(); - // @protected {Node} - this.backgroundNode = new Rectangle( 0, 0, this.viewSize, this.viewSize, { - fill: AreaModelCommonColorProfile.areaBackgroundProperty - } ); + // @public {Node} - Exposed publicly for a11y, and used in subclasses + this.eraseButton = new EraserButton( { + listener: function() { + areaDisplay.areaProperty.value.erase(); + }, + center: options.isProportional + ? AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET + : AreaModelCommonConstants.GENERIC_RANGE_OFFSET, + touchAreaXDilation: 8, + touchAreaYDilation: 8, + + // a11y + innerContent: eraseString, + descriptionContent: eraseDescriptionString + } ); - // @protected {Node} - this.borderNode = new Rectangle( 0, 0, this.viewSize, this.viewSize, { - stroke: AreaModelCommonColorProfile.areaBorderProperty - } ); + // @protected {Node} + this.backgroundNode = new Rectangle( 0, 0, this.viewSize, this.viewSize, { + fill: AreaModelCommonColorProfile.areaBackgroundProperty + } ); - this.labelLayer.addChild( this.eraseButton ); - } + // @protected {Node} + this.borderNode = new Rectangle( 0, 0, this.viewSize, this.viewSize, { + stroke: AreaModelCommonColorProfile.areaBorderProperty + } ); - areaModelCommon.register( 'AreaDisplayNode', AreaDisplayNode ); + this.labelLayer.addChild( this.eraseButton ); +} - return inherit( Node, AreaDisplayNode, { - /** - * Updates expensive-to-update things only once a frame (for performance). - * @public - */ - update: function() { - if ( !this.productPositionLabelsDirty ) { return; } - this.productPositionLabelsDirty = false; +areaModelCommon.register( 'AreaDisplayNode', AreaDisplayNode ); - this.positionProductLabels(); - }, +export default inherit( Node, AreaDisplayNode, { + /** + * Updates expensive-to-update things only once a frame (for performance). + * @public + */ + update: function() { + if ( !this.productPositionLabelsDirty ) { return; } + this.productPositionLabelsDirty = false; - /** - * Positions all of the partial products labels. - * @protected - */ - positionProductLabels: function() { - throw new Error( 'abstract method' ); - } - } ); -} ); + this.positionProductLabels(); + }, + + /** + * Positions all of the partial products labels. + * @protected + */ + positionProductLabels: function() { + throw new Error( 'abstract method' ); + } +} ); \ No newline at end of file diff --git a/js/common/view/AreaModelCommonAccordionBox.js b/js/common/view/AreaModelCommonAccordionBox.js index 649397ea..32fc7405 100644 --- a/js/common/view/AreaModelCommonAccordionBox.js +++ b/js/common/view/AreaModelCommonAccordionBox.js @@ -7,55 +7,52 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AccordionBox = require( 'SUN/AccordionBox' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Text = require( 'SCENERY/nodes/Text' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import AccordionBox from '../../../../sun/js/AccordionBox.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; - /** - * @constructor - * @extends {AccordionBox} - * - * @param {string} titleString - * @param {Property.} expandedProperty - * @param {Node} content - * @param {Object} [options] - */ - function AreaModelCommonAccordionBox( titleString, expandedProperty, content, options ) { - options = merge( { - titleNode: new Text( titleString, { - font: AreaModelCommonConstants.TITLE_FONT, - maxWidth: options.maxTitleWidth || 200 - } ), - expandedProperty: expandedProperty, - contentXMargin: 15, - contentYMargin: 12, - resize: true, - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, - fill: AreaModelCommonColorProfile.panelBackgroundProperty, - stroke: AreaModelCommonColorProfile.panelBorderProperty, - titleAlignX: 'left', - titleXSpacing: 8, - buttonXMargin: 10, - buttonYMargin: 8, - expandCollapseButtonOptions: { - sideLength: 20, - touchAreaXDilation: 5, - touchAreaYDilation: 5 - } - }, options ); +/** + * @constructor + * @extends {AccordionBox} + * + * @param {string} titleString + * @param {Property.} expandedProperty + * @param {Node} content + * @param {Object} [options] + */ +function AreaModelCommonAccordionBox( titleString, expandedProperty, content, options ) { + options = merge( { + titleNode: new Text( titleString, { + font: AreaModelCommonConstants.TITLE_FONT, + maxWidth: options.maxTitleWidth || 200 + } ), + expandedProperty: expandedProperty, + contentXMargin: 15, + contentYMargin: 12, + resize: true, + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, + fill: AreaModelCommonColorProfile.panelBackgroundProperty, + stroke: AreaModelCommonColorProfile.panelBorderProperty, + titleAlignX: 'left', + titleXSpacing: 8, + buttonXMargin: 10, + buttonYMargin: 8, + expandCollapseButtonOptions: { + sideLength: 20, + touchAreaXDilation: 5, + touchAreaYDilation: 5 + } + }, options ); - AccordionBox.call( this, content, options ); - } + AccordionBox.call( this, content, options ); +} - areaModelCommon.register( 'AreaModelCommonAccordionBox', AreaModelCommonAccordionBox ); +areaModelCommon.register( 'AreaModelCommonAccordionBox', AreaModelCommonAccordionBox ); - return inherit( AccordionBox, AreaModelCommonAccordionBox ); -} ); +inherit( AccordionBox, AreaModelCommonAccordionBox ); +export default AreaModelCommonAccordionBox; \ No newline at end of file diff --git a/js/common/view/AreaModelCommonColorProfile.js b/js/common/view/AreaModelCommonColorProfile.js index 30b032cb..0c4ad54d 100644 --- a/js/common/view/AreaModelCommonColorProfile.js +++ b/js/common/view/AreaModelCommonColorProfile.js @@ -5,162 +5,158 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const Color = require( 'SCENERY/util/Color' ); - const ColorProfile = require( 'SCENERY_PHET/ColorProfile' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const PhetColorScheme = require( 'SCENERY_PHET/PhetColorScheme' ); - - // Initial colors for each profile, by string key. Only profile currently is default (still helpful for making color - // tweaks with the top-level files) - const AreaModelCommonColorProfile = new ColorProfile( [ 'default' ], { - /*---------------------------------------------------------------------------* - * Common colors - *----------------------------------------------------------------------------*/ - - // Main background color for the sim - background: { default: new Color( 244, 252, 254 ) }, - - // Radio buttons for scene selection / area-model calculation / partial products - radioBorder: { default: new Color( 97, 200, 216 ) }, - radioBackground: { default: Color.WHITE }, - - // Things that look like panels (except for the keypad panel) - panelBorder: { default: new Color( 0x3, 0x3, 0x3 ) }, - panelBackground: { default: Color.WHITE }, - - // Main appearance - areaBackground: { default: Color.WHITE }, - areaBorder: { default: Color.BLACK }, - - // Partition line (stroke includes handle) - partitionLineBorder: { default: Color.BLACK }, - partitionLineStroke: { default: Color.BLACK }, - - // Calculation "base" colors - calculationActive: { default: Color.BLACK }, - calculationInactive: { default: new Color( 0xaaaaaa ) }, - - // Calculation next/previous arrows - calculationArrowUp: { default: Color.BLACK }, - calculationArrowDisabled: { default: new Color( 0xaaaaaa ) }, - // Calculation icon (in area-model-calculation panel) - calculationIconDark: { default: Color.BLACK }, - calculationIconLight: { default: new Color( 0xaaaaaa ) }, +import ColorProfile from '../../../../scenery-phet/js/ColorProfile.js'; +import PhetColorScheme from '../../../../scenery-phet/js/PhetColorScheme.js'; +import Color from '../../../../scenery/js/util/Color.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from '../model/OrientationPair.js'; - // Shown behind partial product labels - partialProductBackground: { default: new Color( 255, 255, 255, 0.75 ) }, - partialProductBorder: { default: new Color( 0, 0, 0, 0.2 ) }, +// Initial colors for each profile, by string key. Only profile currently is default (still helpful for making color +// tweaks with the top-level files) +const AreaModelCommonColorProfile = new ColorProfile( [ 'default' ], { + /*---------------------------------------------------------------------------* + * Common colors + *----------------------------------------------------------------------------*/ - selectionSeparator: { default: new Color( 0xaaaaaa ) }, + // Main background color for the sim + background: { default: new Color( 244, 252, 254 ) }, - /*---------------------------------------------------------------------------* - * Proportional colors - *----------------------------------------------------------------------------*/ + // Radio buttons for scene selection / area-model calculation / partial products + radioBorder: { default: new Color( 97, 200, 216 ) }, + radioBackground: { default: Color.WHITE }, - // Main "color" identity for proportional width/height - proportionalWidth: { default: new Color( 181, 45, 0 ) }, // red - proportionalHeight: { default: new Color( 0, 71, 253 ) }, // blue + // Things that look like panels (except for the keypad panel) + panelBorder: { default: new Color( 0x3, 0x3, 0x3 ) }, + panelBackground: { default: Color.WHITE }, - // Grid lines for within the area - gridLine: { default: new Color( 0xdd, 0xdd, 0xdd ) }, + // Main appearance + areaBackground: { default: Color.WHITE }, + areaBorder: { default: Color.BLACK }, - // The "active" part of the area (within the width/height selected) - proportionalActiveAreaBorder: { default: new Color( 0x66, 0x66, 0x66 ) }, - proportionalActiveAreaBackground: { default: new Color( 0, 0, 0, 0.1 ) }, + // Partition line (stroke includes handle) + partitionLineBorder: { default: Color.BLACK }, + partitionLineStroke: { default: Color.BLACK }, - // Drag handle to the lower-right of the proportional areas - proportionalDragHandleBorder: { default: new Color( 0x66, 0x66, 0x66 ) }, - proportionalDragHandleBackground: { default: new Color( 172, 201, 184 ) }, + // Calculation "base" colors + calculationActive: { default: Color.BLACK }, + calculationInactive: { default: new Color( 0xaaaaaa ) }, - // Tiles (proportional screens) - bigTile: { default: new Color( 255, 220, 120 ) }, - mediumTile: { default: new Color( 249, 244, 136 ) }, - smallTile: { default: new Color( 252, 250, 202 ) }, - semiTransparentSmallTile: { default: new Color( 243, 235, 43, 0.25 ) }, // blends onto white to look the same as smallTile - tileBorder: { default: new Color( 0xaaaaaa ) }, + // Calculation next/previous arrows + calculationArrowUp: { default: Color.BLACK }, + calculationArrowDisabled: { default: new Color( 0xaaaaaa ) }, - // Proportional icon colors - gridIcon: { default: new Color( 0x55, 0x55, 0x55 ) }, - tileIconStroke: { default: Color.BLACK }, - partitionLineIconBorder: { default: new Color( 0xaa, 0xaa, 0xaa ) }, - partitionLineIconBackground: { default: Color.WHITE }, - partitionLineIconLine: { default: Color.BLACK }, - partitionLineIconHandle: { default: new Color( 0x33, 0x33, 0x33 ) }, + // Calculation icon (in area-model-calculation panel) + calculationIconDark: { default: Color.BLACK }, + calculationIconLight: { default: new Color( 0xaaaaaa ) }, - // Color for the counting/numbering labels for each grid square - countingLabel: { default: Color.BLACK }, + // Shown behind partial product labels + partialProductBackground: { default: new Color( 255, 255, 255, 0.75 ) }, + partialProductBorder: { default: new Color( 0, 0, 0, 0.2 ) }, - /*---------------------------------------------------------------------------* - * Generic colors - *----------------------------------------------------------------------------*/ + selectionSeparator: { default: new Color( 0xaaaaaa ) }, - // Main "color" identity for generic width/height - genericWidth: { default: new Color( 0, 165, 83 ) }, // green - genericHeight: { default: new Color( 91, 42, 194 ) }, // purple + /*---------------------------------------------------------------------------* + * Proportional colors + *----------------------------------------------------------------------------*/ - // Edit button - editButtonBackground: { default: new Color( 241, 232, 0 ) }, + // Main "color" identity for proportional width/height + proportionalWidth: { default: new Color( 181, 45, 0 ) }, // red + proportionalHeight: { default: new Color( 0, 71, 253 ) }, // blue - // Edit readout - editActiveBackground: { default: new Color( 255, 255, 130 ) }, - editInactiveBackground: { default: Color.WHITE }, + // Grid lines for within the area + gridLine: { default: new Color( 0xdd, 0xdd, 0xdd ) }, - // Keypad panel - keypadPanelBorder: { default: new Color( 0x99, 0x99, 0x99 ) }, - keypadPanelBackground: { default: new Color( 230, 230, 230 ) }, + // The "active" part of the area (within the width/height selected) + proportionalActiveAreaBorder: { default: new Color( 0x66, 0x66, 0x66 ) }, + proportionalActiveAreaBackground: { default: new Color( 0, 0, 0, 0.1 ) }, - keypadReadoutBorder: { default: Color.BLACK }, - keypadReadoutBackground: { default: Color.WHITE }, + // Drag handle to the lower-right of the proportional areas + proportionalDragHandleBorder: { default: new Color( 0x66, 0x66, 0x66 ) }, + proportionalDragHandleBackground: { default: new Color( 172, 201, 184 ) }, - keypadEnterBackground: { default: new Color( 241, 232, 0 ) }, + // Tiles (proportional screens) + bigTile: { default: new Color( 255, 220, 120 ) }, + mediumTile: { default: new Color( 249, 244, 136 ) }, + smallTile: { default: new Color( 252, 250, 202 ) }, + semiTransparentSmallTile: { default: new Color( 243, 235, 43, 0.25 ) }, // blends onto white to look the same as smallTile + tileBorder: { default: new Color( 0xaaaaaa ) }, - // Area sign highlights - genericPositiveBackground: { default: new Color( 0xd4f3fe ) }, - genericNegativeBackground: { default: new Color( 0xe5a5ab ) }, + // Proportional icon colors + gridIcon: { default: new Color( 0x55, 0x55, 0x55 ) }, + tileIconStroke: { default: Color.BLACK }, + partitionLineIconBorder: { default: new Color( 0xaa, 0xaa, 0xaa ) }, + partitionLineIconBackground: { default: Color.WHITE }, + partitionLineIconLine: { default: Color.BLACK }, + partitionLineIconHandle: { default: new Color( 0x33, 0x33, 0x33 ) }, - // Layout grid icon color - layoutGrid: { default: Color.BLACK }, - layoutIconFill: { default: Color.WHITE }, - layoutHover: { default: new Color( 240, 240, 240 ) }, + // Color for the counting/numbering labels for each grid square + countingLabel: { default: Color.BLACK }, - /*---------------------------------------------------------------------------* - * Game colors - *----------------------------------------------------------------------------*/ + /*---------------------------------------------------------------------------* + * Generic colors + *----------------------------------------------------------------------------*/ - numbersIconBackground: { default: new Color( '#b26fac' ) }, - variablesIconBackground: { default: new Color( '#6f9fb2' ) }, + // Main "color" identity for generic width/height + genericWidth: { default: new Color( 0, 165, 83 ) }, // green + genericHeight: { default: new Color( 91, 42, 194 ) }, // purple - gameButtonBackground: { default: new Color( 241, 232, 0 ) }, + // Edit button + editButtonBackground: { default: new Color( 241, 232, 0 ) }, - // border/text highlights for editable values - errorStatus: { default: Color.RED }, - dirtyStatus: { default: new Color( '#3B97BA' ) }, + // Edit readout + editActiveBackground: { default: new Color( 255, 255, 130 ) }, + editInactiveBackground: { default: Color.WHITE }, - dynamicPartialProduct: { default: new Color( 128, 130, 133 ) }, - fixedPartialProduct: { default: Color.BLACK }, - totalEditable: { default: Color.BLACK }, + // Keypad panel + keypadPanelBorder: { default: new Color( 0x99, 0x99, 0x99 ) }, + keypadPanelBackground: { default: new Color( 230, 230, 230 ) }, - startOverButtonBaseColor: { default: PhetColorScheme.BUTTON_YELLOW } + keypadReadoutBorder: { default: Color.BLACK }, + keypadReadoutBackground: { default: Color.WHITE }, - } ); + keypadEnterBackground: { default: new Color( 241, 232, 0 ) }, - areaModelCommon.register( 'AreaModelCommonColorProfile', AreaModelCommonColorProfile ); + // Area sign highlights + genericPositiveBackground: { default: new Color( 0xd4f3fe ) }, + genericNegativeBackground: { default: new Color( 0xe5a5ab ) }, - // @public {OrientationPair.>} - AreaModelCommonColorProfile.proportionalColorProperties = new OrientationPair( - AreaModelCommonColorProfile.proportionalWidthProperty, - AreaModelCommonColorProfile.proportionalHeightProperty - ); - AreaModelCommonColorProfile.genericColorProperties = new OrientationPair( - AreaModelCommonColorProfile.genericWidthProperty, - AreaModelCommonColorProfile.genericHeightProperty - ); + // Layout grid icon color + layoutGrid: { default: Color.BLACK }, + layoutIconFill: { default: Color.WHITE }, + layoutHover: { default: new Color( 240, 240, 240 ) }, + + /*---------------------------------------------------------------------------* + * Game colors + *----------------------------------------------------------------------------*/ + + numbersIconBackground: { default: new Color( '#b26fac' ) }, + variablesIconBackground: { default: new Color( '#6f9fb2' ) }, + + gameButtonBackground: { default: new Color( 241, 232, 0 ) }, + + // border/text highlights for editable values + errorStatus: { default: Color.RED }, + dirtyStatus: { default: new Color( '#3B97BA' ) }, + + dynamicPartialProduct: { default: new Color( 128, 130, 133 ) }, + fixedPartialProduct: { default: Color.BLACK }, + totalEditable: { default: Color.BLACK }, + + startOverButtonBaseColor: { default: PhetColorScheme.BUTTON_YELLOW } - return AreaModelCommonColorProfile; } ); + +areaModelCommon.register( 'AreaModelCommonColorProfile', AreaModelCommonColorProfile ); + +// @public {OrientationPair.>} +AreaModelCommonColorProfile.proportionalColorProperties = new OrientationPair( + AreaModelCommonColorProfile.proportionalWidthProperty, + AreaModelCommonColorProfile.proportionalHeightProperty +); +AreaModelCommonColorProfile.genericColorProperties = new OrientationPair( + AreaModelCommonColorProfile.genericWidthProperty, + AreaModelCommonColorProfile.genericHeightProperty +); + +export default AreaModelCommonColorProfile; \ No newline at end of file diff --git a/js/common/view/AreaModelCommonRadioButtonGroup.js b/js/common/view/AreaModelCommonRadioButtonGroup.js index d1744451..46a18c1e 100644 --- a/js/common/view/AreaModelCommonRadioButtonGroup.js +++ b/js/common/view/AreaModelCommonRadioButtonGroup.js @@ -5,39 +5,36 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const RadioButtonGroup = require( 'SUN/buttons/RadioButtonGroup' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import RadioButtonGroup from '../../../../sun/js/buttons/RadioButtonGroup.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; - /** - * @constructor - * @extends {RadioButtonGroup} - * - * @param {Property.<*>} property - * @param {Array.} items - See RadioButtonGroup for more info - * @param {Object} [options] - */ - function AreaModelCommonRadioButtonGroup( property, items, options ) { - RadioButtonGroup.call( this, property, items, merge( { - orientation: 'horizontal', - buttonContentXMargin: 10, - buttonContentYMargin: 10, - selectedLineWidth: 2, - deselectedLineWidth: 1.5, - touchAreaXDilation: 6, - touchAreaYDilation: 6, - selectedStroke: AreaModelCommonColorProfile.radioBorderProperty, - baseColor: AreaModelCommonColorProfile.radioBackgroundProperty - }, options ) ); - } +/** + * @constructor + * @extends {RadioButtonGroup} + * + * @param {Property.<*>} property + * @param {Array.} items - See RadioButtonGroup for more info + * @param {Object} [options] + */ +function AreaModelCommonRadioButtonGroup( property, items, options ) { + RadioButtonGroup.call( this, property, items, merge( { + orientation: 'horizontal', + buttonContentXMargin: 10, + buttonContentYMargin: 10, + selectedLineWidth: 2, + deselectedLineWidth: 1.5, + touchAreaXDilation: 6, + touchAreaYDilation: 6, + selectedStroke: AreaModelCommonColorProfile.radioBorderProperty, + baseColor: AreaModelCommonColorProfile.radioBackgroundProperty + }, options ) ); +} - areaModelCommon.register( 'AreaModelCommonRadioButtonGroup', AreaModelCommonRadioButtonGroup ); +areaModelCommon.register( 'AreaModelCommonRadioButtonGroup', AreaModelCommonRadioButtonGroup ); - return inherit( RadioButtonGroup, AreaModelCommonRadioButtonGroup ); -} ); +inherit( RadioButtonGroup, AreaModelCommonRadioButtonGroup ); +export default AreaModelCommonRadioButtonGroup; \ No newline at end of file diff --git a/js/common/view/AreaScreenView.js b/js/common/view/AreaScreenView.js index 7db7405a..bbfc54eb 100644 --- a/js/common/view/AreaScreenView.js +++ b/js/common/view/AreaScreenView.js @@ -7,335 +7,331 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const AreaCalculationRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/AreaCalculationRadioButtonGroup' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonAccordionBox = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonAccordionBox' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonGlobals = require( 'AREA_MODEL_COMMON/common/AreaModelCommonGlobals' ); - const AreaModelCommonModel = require( 'AREA_MODEL_COMMON/common/model/AreaModelCommonModel' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const CalculationBox = require( 'AREA_MODEL_COMMON/proportional/view/CalculationBox' ); - const CalculationNode = require( 'AREA_MODEL_COMMON/common/view/CalculationNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const interleave = require( 'PHET_CORE/interleave' ); - const Line = require( 'SCENERY/nodes/Line' ); - const merge = require( 'PHET_CORE/merge' ); - const Panel = require( 'SUN/Panel' ); - const PartialProductRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/PartialProductRadioButtonGroup' ); - const Property = require( 'AXON/Property' ); - const required = require( 'PHET_CORE/required' ); - const ResetAllButton = require( 'SCENERY_PHET/buttons/ResetAllButton' ); - const ScreenView = require( 'JOIST/ScreenView' ); - const Text = require( 'SCENERY/nodes/Text' ); - const TotalAreaNode = require( 'AREA_MODEL_COMMON/common/view/TotalAreaNode' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - // strings - const areaModelCalculationString = require( 'string!AREA_MODEL_COMMON/areaModelCalculation' ); - const dimensionsString = require( 'string!AREA_MODEL_COMMON/dimensions' ); - const factorsString = require( 'string!AREA_MODEL_COMMON/factors' ); - const partialProductsString = require( 'string!AREA_MODEL_COMMON/partialProducts' ); - const productString = require( 'string!AREA_MODEL_COMMON/product' ); - const totalAreaOfModelString = require( 'string!AREA_MODEL_COMMON/totalAreaOfModel' ); - - // a11y strings - const factorsBoxString = AreaModelCommonA11yStrings.factorsBox.value; - const factorsBoxDescriptionString = AreaModelCommonA11yStrings.factorsBoxDescription.value; - const productBoxString = AreaModelCommonA11yStrings.productBox.value; - const productBoxDescriptionString = AreaModelCommonA11yStrings.productBoxDescription.value; - /** - * @constructor - * @extends {ScreenView} - * - * @param {AreaModelCommonModel} model - * @param {Object} config - */ - function AreaScreenView( model, config ) { - config = merge( { +import Property from '../../../../axon/js/Property.js'; +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import ScreenView from '../../../../joist/js/ScreenView.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import interleave from '../../../../phet-core/js/interleave.js'; +import merge from '../../../../phet-core/js/merge.js'; +import required from '../../../../phet-core/js/required.js'; +import ResetAllButton from '../../../../scenery-phet/js/buttons/ResetAllButton.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import Panel from '../../../../sun/js/Panel.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import CalculationBox from '../../proportional/view/CalculationBox.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import AreaModelCommonGlobals from '../AreaModelCommonGlobals.js'; +import AreaModelCommonModel from '../model/AreaModelCommonModel.js'; +import AreaCalculationRadioButtonGroup from './AreaCalculationRadioButtonGroup.js'; +import AreaModelCommonAccordionBox from './AreaModelCommonAccordionBox.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; +import CalculationNode from './CalculationNode.js'; +import PartialProductRadioButtonGroup from './PartialProductRadioButtonGroup.js'; +import TotalAreaNode from './TotalAreaNode.js'; + +const areaModelCalculationString = areaModelCommonStrings.areaModelCalculation; +const dimensionsString = areaModelCommonStrings.dimensions; +const factorsString = areaModelCommonStrings.factors; +const partialProductsString = areaModelCommonStrings.partialProducts; +const productString = areaModelCommonStrings.product; +const totalAreaOfModelString = areaModelCommonStrings.totalAreaOfModel; + +// a11y strings +const factorsBoxString = AreaModelCommonA11yStrings.factorsBox.value; +const factorsBoxDescriptionString = AreaModelCommonA11yStrings.factorsBoxDescription.value; +const productBoxString = AreaModelCommonA11yStrings.productBox.value; +const productBoxDescriptionString = AreaModelCommonA11yStrings.productBoxDescription.value; - // {number} How many decimal places should be shown - decimalPlaces: required( config.decimalPlaces ), +/** + * @constructor + * @extends {ScreenView} + * + * @param {AreaModelCommonModel} model + * @param {Object} config + */ +function AreaScreenView( model, config ) { + config = merge( { - // {boolean} Whether we show options that let the user select the partial product style - showProductsSelection: true, + // {number} How many decimal places should be shown + decimalPlaces: required( config.decimalPlaces ), - // {boolean} (optional) - Whether we show options that let the user select the calculation style - showCalculationSelection: true, + // {boolean} Whether we show options that let the user select the partial product style + showProductsSelection: true, - // {boolean} (optional) - Selected area background and products box use a light-tile-colored background - useTileLikeBackground: false, + // {boolean} (optional) - Whether we show options that let the user select the calculation style + showCalculationSelection: true, - // {boolean} (optional) - Uses "product" and "factors" to be simpler and more multiplication-like - useSimplifiedNames: false, + // {boolean} (optional) - Selected area background and products box use a light-tile-colored background + useTileLikeBackground: false, - // {boolean} (optional) - If true, changes the location/size of the area to take up more space - useLargeArea: false, + // {boolean} (optional) - Uses "product" and "factors" to be simpler and more multiplication-like + useSimplifiedNames: false, - // {boolean} (optional) - If true, a simplified accordion box will be used for the calculation lines (instead of a panel). - // Notably, the accordion box does NOT support line-by-line appearance, and can be collapsed. - useCalculationBox: false - }, config ); + // {boolean} (optional) - If true, changes the location/size of the area to take up more space + useLargeArea: false, - assert && assert( model instanceof AreaModelCommonModel ); + // {boolean} (optional) - If true, a simplified accordion box will be used for the calculation lines (instead of a panel). + // Notably, the accordion box does NOT support line-by-line appearance, and can be collapsed. + useCalculationBox: false + }, config ); - ScreenView.call( this ); + assert && assert( model instanceof AreaModelCommonModel ); - // @protected {AreaModelCommonModel} - this.model = model; + ScreenView.call( this ); - // @protected {boolean} - this.useTileLikeBackground = config.useTileLikeBackground; - this.useLargeArea = config.useLargeArea; - this.showProductsSelection = config.showProductsSelection; - this.showCalculationSelection = config.showCalculationSelection; + // @protected {AreaModelCommonModel} + this.model = model; - // @protected {Node} - Exposed for a11y selection - this.productsSelectionPanel = this.createPanelContent( - partialProductsString, - AreaModelCommonGlobals.panelAlignGroup, - new PartialProductRadioButtonGroup( model, AreaModelCommonGlobals.selectionButtonAlignGroup ) - ); + // @protected {boolean} + this.useTileLikeBackground = config.useTileLikeBackground; + this.useLargeArea = config.useLargeArea; + this.showProductsSelection = config.showProductsSelection; + this.showCalculationSelection = config.showCalculationSelection; - // @public {Node} (a11y) - this.calculationSelectionPanel = this.createPanelContent( - areaModelCalculationString, - AreaModelCommonGlobals.panelAlignGroup, - new AreaCalculationRadioButtonGroup( model.areaCalculationChoiceProperty, AreaModelCommonGlobals.selectionButtonAlignGroup ) - ); - const selectionContent = new VBox( { - spacing: 15 - } ); - this.getSelectionNodesProperty().link( function( selectionNodes ) { - selectionContent.children = interleave( selectionNodes, function() { - return new Line( { - x2: AreaModelCommonConstants.PANEL_INTERIOR_MAX, - stroke: AreaModelCommonColorProfile.selectionSeparatorProperty - } ); - } ); - } ); + // @protected {Node} - Exposed for a11y selection + this.productsSelectionPanel = this.createPanelContent( + partialProductsString, + AreaModelCommonGlobals.panelAlignGroup, + new PartialProductRadioButtonGroup( model, AreaModelCommonGlobals.selectionButtonAlignGroup ) + ); - // @protected {Node} (a11y) - Shows radio button groups to select partial product / calculation / partition line options. - this.selectionPanel = new Panel( selectionContent, { - xMargin: 15, - yMargin: 10, - fill: AreaModelCommonColorProfile.panelBackgroundProperty, - stroke: AreaModelCommonColorProfile.panelBorderProperty, - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS + // @public {Node} (a11y) + this.calculationSelectionPanel = this.createPanelContent( + areaModelCalculationString, + AreaModelCommonGlobals.panelAlignGroup, + new AreaCalculationRadioButtonGroup( model.areaCalculationChoiceProperty, AreaModelCommonGlobals.selectionButtonAlignGroup ) + ); + const selectionContent = new VBox( { + spacing: 15 + } ); + this.getSelectionNodesProperty().link( function( selectionNodes ) { + selectionContent.children = interleave( selectionNodes, function() { + return new Line( { + x2: AreaModelCommonConstants.PANEL_INTERIOR_MAX, + stroke: AreaModelCommonColorProfile.selectionSeparatorProperty + } ); } ); + } ); - const factorsBoxContent = new AlignBox( this.createFactorsNode( model, config.decimalPlaces ), { - group: AreaModelCommonGlobals.panelAlignGroup, - xAlign: 'center' - } ); + // @protected {Node} (a11y) - Shows radio button groups to select partial product / calculation / partition line options. + this.selectionPanel = new Panel( selectionContent, { + xMargin: 15, + yMargin: 10, + fill: AreaModelCommonColorProfile.panelBackgroundProperty, + stroke: AreaModelCommonColorProfile.panelBorderProperty, + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS + } ); - // @protected {Node} (a11y) - Exposed for a11y order - this.factorsBox = new AreaModelCommonAccordionBox( - config.useSimplifiedNames ? factorsString : dimensionsString, - model.factorsBoxExpandedProperty, - factorsBoxContent, - { - // Cut some spacing from the exponent-enabled one, as it looks like way too much padding otherwise - contentYSpacing: model.allowExponents ? 5 : 8, - - // a11y - labelTagName: 'h3', - labelContent: factorsBoxString, - titleBarOptions: { - descriptionContent: factorsBoxDescriptionString - } - } ); + const factorsBoxContent = new AlignBox( this.createFactorsNode( model, config.decimalPlaces ), { + group: AreaModelCommonGlobals.panelAlignGroup, + xAlign: 'center' + } ); - const areaBoxContent = new AlignBox( new TotalAreaNode( - model.totalAreaProperty, - model.isProportional, - model.isProportional ? model.getMaximumAreaString() : '', - this.useTileLikeBackground - ), { - group: AreaModelCommonGlobals.panelAlignGroup, - xAlign: 'center' + // @protected {Node} (a11y) - Exposed for a11y order + this.factorsBox = new AreaModelCommonAccordionBox( + config.useSimplifiedNames ? factorsString : dimensionsString, + model.factorsBoxExpandedProperty, + factorsBoxContent, + { + // Cut some spacing from the exponent-enabled one, as it looks like way too much padding otherwise + contentYSpacing: model.allowExponents ? 5 : 8, + + // a11y + labelTagName: 'h3', + labelContent: factorsBoxString, + titleBarOptions: { + descriptionContent: factorsBoxDescriptionString + } } ); - // @protected {Node} (a11y) - this.areaBox = new AreaModelCommonAccordionBox( - config.useSimplifiedNames ? productString : totalAreaOfModelString, - model.areaBoxExpandedProperty, - areaBoxContent, { - // a11y - labelTagName: 'h3', - labelContent: productBoxString, - titleBarOptions: { - descriptionContent: productBoxDescriptionString - } + const areaBoxContent = new AlignBox( new TotalAreaNode( + model.totalAreaProperty, + model.isProportional, + model.isProportional ? model.getMaximumAreaString() : '', + this.useTileLikeBackground + ), { + group: AreaModelCommonGlobals.panelAlignGroup, + xAlign: 'center' + } ); + + // @protected {Node} (a11y) + this.areaBox = new AreaModelCommonAccordionBox( + config.useSimplifiedNames ? productString : totalAreaOfModelString, + model.areaBoxExpandedProperty, + areaBoxContent, { + // a11y + labelTagName: 'h3', + labelContent: productBoxString, + titleBarOptions: { + descriptionContent: productBoxDescriptionString } - ); + } + ); - // @protected {VBox} - Available for subtype positioning relative to this. - this.rightPanelContainer = new VBox( { - children: this.getRightAlignNodes(), - spacing: AreaModelCommonConstants.LAYOUT_SPACING - } ); - this.addChild( new AlignBox( this.rightPanelContainer, { - alignBounds: this.layoutBounds, - xAlign: 'right', - yAlign: 'top', - margin: AreaModelCommonConstants.LAYOUT_SPACING - } ) ); - - // @protected {Node|null} (a11y) - The calculation panel/box near the bottom of the screen - this.calculationNode = null; - if ( config.useCalculationBox ) { - const calculationTop = AreaModelCommonConstants.MAIN_AREA_OFFSET.y + + // @protected {VBox} - Available for subtype positioning relative to this. + this.rightPanelContainer = new VBox( { + children: this.getRightAlignNodes(), + spacing: AreaModelCommonConstants.LAYOUT_SPACING + } ); + this.addChild( new AlignBox( this.rightPanelContainer, { + alignBounds: this.layoutBounds, + xAlign: 'right', + yAlign: 'top', + margin: AreaModelCommonConstants.LAYOUT_SPACING + } ) ); + + // @protected {Node|null} (a11y) - The calculation panel/box near the bottom of the screen + this.calculationNode = null; + if ( config.useCalculationBox ) { + const calculationTop = AreaModelCommonConstants.MAIN_AREA_OFFSET.y + AreaModelCommonConstants.AREA_SIZE + AreaModelCommonConstants.LAYOUT_SPACING + 30; - const calculationBottom = this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING; - const calculationBounds = new Bounds2( 0, 0, AreaModelCommonConstants.AREA_SIZE, calculationBottom - calculationTop ); - this.calculationNode = new CalculationBox( model, calculationBounds, { - x: AreaModelCommonConstants.MAIN_AREA_OFFSET.x, - y: calculationTop - } ); - } - else { - this.calculationNode = new CalculationNode( model ); - } - this.addChild( this.calculationNode ); - - // @protected {Node} (a11y) - Reset all button - this.resetAllButton = new ResetAllButton( { - listener: function() { - model.reset(); - }, - right: this.layoutBounds.right - AreaModelCommonConstants.LAYOUT_SPACING, - bottom: this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING + const calculationBottom = this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING; + const calculationBounds = new Bounds2( 0, 0, AreaModelCommonConstants.AREA_SIZE, calculationBottom - calculationTop ); + this.calculationNode = new CalculationBox( model, calculationBounds, { + x: AreaModelCommonConstants.MAIN_AREA_OFFSET.x, + y: calculationTop } ); - this.addChild( this.resetAllButton ); - - // @protected {AreaDisplayNode} - this.areaDisplayNode = this.createAreaDisplayNode( model ); - this.addChild( this.areaDisplayNode ); } + else { + this.calculationNode = new CalculationNode( model ); + } + this.addChild( this.calculationNode ); - areaModelCommon.register( 'AreaScreenView', AreaScreenView ); - - return inherit( ScreenView, AreaScreenView, { - /** - * Steps the view forward, updating things that only update once a frame. - * @public - * - * @param {number} dt - */ - step: function( dt ) { - - // No animation is happening in the view. This is for batching updates to happen only once a frame. - this.calculationNode.update(); - this.areaDisplayNode.update(); + // @protected {Node} (a11y) - Reset all button + this.resetAllButton = new ResetAllButton( { + listener: function() { + model.reset(); }, + right: this.layoutBounds.right - AreaModelCommonConstants.LAYOUT_SPACING, + bottom: this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING + } ); + this.addChild( this.resetAllButton ); - /** - * The content on the right side varies depending on the subtype, so we provide overriding here. - * @protected - * - * @returns {Array.} - */ - getRightAlignNodes: function() { - const children = [ - this.factorsBox, - this.areaBox - ]; - if ( this.showCalculationSelection || this.showProductsSelection ) { - children.push( this.selectionPanel ); - } - return children; - }, + // @protected {AreaDisplayNode} + this.areaDisplayNode = this.createAreaDisplayNode( model ); + this.addChild( this.areaDisplayNode ); +} - /** - * The content embedded in the selection panel varies depending on the subtype, so we provide overriding here. - * @protected - * - * NOTE: We need to support the fact that this can change, so it's a Property - * - * @returns {Property.>} - */ - getSelectionNodesProperty: function() { - const selectionNodes = []; - if ( this.showProductsSelection ) { - selectionNodes.push( this.productsSelectionPanel ); - } - if ( this.showCalculationSelection ) { - selectionNodes.push( this.calculationSelectionPanel ); - } - return new Property( selectionNodes ); - }, +areaModelCommon.register( 'AreaScreenView', AreaScreenView ); - /** - * Creates a panel interior with the title left-aligned, and the content somewhat offset from the left with a - * guaranteed margin. - * @protected - * - * @param {string} titleString - * @param {AlignGroup} panelAlignGroup - * @param {Node} content - */ - createPanelContent: function( titleString, panelAlignGroup, content ) { - return new VBox( { - children: [ - new AlignBox( new Text( titleString, { - font: AreaModelCommonConstants.TITLE_FONT, - maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX - } ), { - group: panelAlignGroup, - xAlign: 'left' - } ), - new AlignBox( content, { - group: panelAlignGroup, - xAlign: 'center', - xMargin: 15 - } ) - ], - spacing: 10 - } ); - }, +export default inherit( ScreenView, AreaScreenView, { + /** + * Steps the view forward, updating things that only update once a frame. + * @public + * + * @param {number} dt + */ + step: function( dt ) { - /** - * Returns the ideal translation for instances of AreaDisplayNode on the main view. - * @protected - * - * @returns {Vector2} - */ - getDisplayTranslation: function() { - return this.layoutBounds.leftTop.plus( - this.useLargeArea ? AreaModelCommonConstants.LARGE_AREA_OFFSET : AreaModelCommonConstants.MAIN_AREA_OFFSET - ); - }, + // No animation is happening in the view. This is for batching updates to happen only once a frame. + this.calculationNode.update(); + this.areaDisplayNode.update(); + }, - /** - * Creates the "factors" (dimensions) content for the accordion box. - * @public - * - * @param {AreaModelCommonModel} model - * @param {number} decimalPlaces - * @returns {Node} - */ - createFactorsNode: function( model, decimalPlaces ) { - throw new Error( 'abstract method, should be implemented by subtype' ); - }, + /** + * The content on the right side varies depending on the subtype, so we provide overriding here. + * @protected + * + * @returns {Array.} + */ + getRightAlignNodes: function() { + const children = [ + this.factorsBox, + this.areaBox + ]; + if ( this.showCalculationSelection || this.showProductsSelection ) { + children.push( this.selectionPanel ); + } + return children; + }, - /** - * Creates the main area display view for the screen. - * @public - * - * @param {AreaModelCommonModel} model - * @returns {AreaDisplayNode} - */ - createAreaDisplayNode: function( model ) { - throw new Error( 'abstract method, should be implemented by subtype' ); + /** + * The content embedded in the selection panel varies depending on the subtype, so we provide overriding here. + * @protected + * + * NOTE: We need to support the fact that this can change, so it's a Property + * + * @returns {Property.>} + */ + getSelectionNodesProperty: function() { + const selectionNodes = []; + if ( this.showProductsSelection ) { + selectionNodes.push( this.productsSelectionPanel ); } - } ); -} ); + if ( this.showCalculationSelection ) { + selectionNodes.push( this.calculationSelectionPanel ); + } + return new Property( selectionNodes ); + }, + + /** + * Creates a panel interior with the title left-aligned, and the content somewhat offset from the left with a + * guaranteed margin. + * @protected + * + * @param {string} titleString + * @param {AlignGroup} panelAlignGroup + * @param {Node} content + */ + createPanelContent: function( titleString, panelAlignGroup, content ) { + return new VBox( { + children: [ + new AlignBox( new Text( titleString, { + font: AreaModelCommonConstants.TITLE_FONT, + maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX + } ), { + group: panelAlignGroup, + xAlign: 'left' + } ), + new AlignBox( content, { + group: panelAlignGroup, + xAlign: 'center', + xMargin: 15 + } ) + ], + spacing: 10 + } ); + }, + + /** + * Returns the ideal translation for instances of AreaDisplayNode on the main view. + * @protected + * + * @returns {Vector2} + */ + getDisplayTranslation: function() { + return this.layoutBounds.leftTop.plus( + this.useLargeArea ? AreaModelCommonConstants.LARGE_AREA_OFFSET : AreaModelCommonConstants.MAIN_AREA_OFFSET + ); + }, + + /** + * Creates the "factors" (dimensions) content for the accordion box. + * @public + * + * @param {AreaModelCommonModel} model + * @param {number} decimalPlaces + * @returns {Node} + */ + createFactorsNode: function( model, decimalPlaces ) { + throw new Error( 'abstract method, should be implemented by subtype' ); + }, + + /** + * Creates the main area display view for the screen. + * @public + * + * @param {AreaModelCommonModel} model + * @returns {AreaDisplayNode} + */ + createAreaDisplayNode: function( model ) { + throw new Error( 'abstract method, should be implemented by subtype' ); + } +} ); \ No newline at end of file diff --git a/js/common/view/CalculationNode.js b/js/common/view/CalculationNode.js index d4d7d7ee..0d430bdc 100644 --- a/js/common/view/CalculationNode.js +++ b/js/common/view/CalculationNode.js @@ -8,197 +8,193 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const CalculationLinesNode = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLinesNode' ); - const FireListener = require( 'SCENERY/listeners/FireListener' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Path = require( 'SCENERY/nodes/Path' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Shape = require( 'KITE/Shape' ); - - // constants - const MAX_LINE_WIDTH = 680; // may need to be updated if the panel size is changed. - const LINE_BY_LINE_EXPANSION = 25; - const ARROW_SIZE = 18; - const ARROW_TOUCH_DILATION = 8; - /** - * @constructor - * @extends {Node} - * - * @param {AreaModelCommonModel} model - * @param {Object} [nodeOptions] - */ - function CalculationNode( model, nodeOptions ) { - - const self = this; - - Node.call( this ); - - // @private {CalculationLinesNode} - this.calculationLinesNode = new CalculationLinesNode( model ); - - const background = new Rectangle( { - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, - fill: AreaModelCommonColorProfile.panelBackgroundProperty, - stroke: AreaModelCommonColorProfile.panelBorderProperty - } ); - this.addChild( background ); - - const previousShape = new Shape().moveTo( 0, 0 ) - .lineTo( ARROW_SIZE, 0 ) - .lineTo( ARROW_SIZE / 2, -ARROW_SIZE * 0.8 ) - .close(); - const previousArrow = new Path( previousShape, { - fill: AreaModelCommonColorProfile.calculationArrowUpProperty, - cursor: 'pointer' - } ); - previousArrow.mouseArea = previousArrow.localBounds; - previousArrow.touchArea = previousArrow.localBounds.dilated( ARROW_TOUCH_DILATION ); - const previousListener = new FireListener( { - fire: function() { - self.calculationLinesNode.moveToPreviousLine(); - } - } ); - previousArrow.addInputListener( previousListener ); - this.calculationLinesNode.previousEnabledProperty.link( function( enabled ) { - previousListener.interrupt(); - previousArrow.pickable = enabled; - previousArrow.fill = enabled - ? AreaModelCommonColorProfile.calculationArrowUpProperty - : AreaModelCommonColorProfile.calculationArrowDisabledProperty; - } ); - - this.addChild( previousArrow ); - const nextShape = new Shape().moveTo( 0, 0 ) - .lineTo( ARROW_SIZE, 0 ) - .lineTo( ARROW_SIZE / 2, ARROW_SIZE * 0.8 ) - .close(); - const nextArrow = new Path( nextShape, { - fill: AreaModelCommonColorProfile.calculationArrowUpProperty, - cursor: 'pointer' - } ); - nextArrow.mouseArea = nextArrow.localBounds; - nextArrow.touchArea = nextArrow.localBounds.dilated( ARROW_TOUCH_DILATION ); - this.addChild( nextArrow ); - const nextListener = new FireListener( { - fire: function() { - self.calculationLinesNode.moveToNextLine(); - } - } ); - nextArrow.addInputListener( nextListener ); - this.calculationLinesNode.nextEnabledProperty.link( function( enabled ) { - nextListener.interrupt(); - nextArrow.pickable = enabled; - nextArrow.fill = enabled - ? AreaModelCommonColorProfile.calculationArrowUpProperty - : AreaModelCommonColorProfile.calculationArrowDisabledProperty; - } ); - - model.areaCalculationChoiceProperty.link( function( choice ) { - previousArrow.visible = nextArrow.visible = choice === AreaCalculationChoice.LINE_BY_LINE; - } ); - - this.mutate( nodeOptions ); - - this.addChild( this.calculationLinesNode ); - - model.areaCalculationChoiceProperty.link( function( choice ) { - self.visible = choice !== AreaCalculationChoice.HIDDEN; - } ); - - function update() { - if ( !self.calculationLinesNode.calculationLinesProperty.value.length ) { - return; - } - - const isLineByLine = model.areaCalculationChoiceProperty.value === AreaCalculationChoice.LINE_BY_LINE; - let maxLineWidth = _.reduce( self.calculationLinesNode.calculationLinesProperty.value, function( max, line ) { - return Math.max( max, line.node.width ); - }, 0 ); - - // If we are LINE_BY_LINE, we won't have as much room because of the buttons - const availableLineWidth = MAX_LINE_WIDTH + ( isLineByLine ? 0 : LINE_BY_LINE_EXPANSION ); - - // Scale the calculation down if necessary, so we can fit within our MAX_LINE_WIDTH - self.calculationLinesNode.setScaleMagnitude( maxLineWidth > availableLineWidth ? ( availableLineWidth / maxLineWidth ) : 1 ); - - // If we scaled things down, our maxLineWidth will be the available width (we don't want our 'panel' larger) - maxLineWidth = Math.min( maxLineWidth, availableLineWidth ); - - let backgroundBounds = self.calculationLinesNode.bounds; - - // If we removed lines for the "line-by-line", make sure we take up enough room to not change size. - if ( backgroundBounds.width < maxLineWidth ) { - backgroundBounds = backgroundBounds.dilatedX( ( maxLineWidth - backgroundBounds.width ) / 2 ); - } - - // Add some space around the lines - backgroundBounds = backgroundBounds.dilated( 5 ); - - // Add some space for the next/previous buttons - if ( isLineByLine ) { - backgroundBounds.maxX += LINE_BY_LINE_EXPANSION; - } - - // Minimum width of the area size - if ( backgroundBounds.width < AreaModelCommonConstants.AREA_SIZE ) { - backgroundBounds = backgroundBounds.dilatedX( ( AreaModelCommonConstants.AREA_SIZE - backgroundBounds.width ) / 2 ); - } - - // Minimum height - if ( backgroundBounds.height < 120 ) { - backgroundBounds = backgroundBounds.dilatedY( ( 120 - backgroundBounds.height ) / 2 ); - } - - // If we support decimals, use a slightly larger minimum. - // See https://github.com/phetsims/area-model-decimals/issues/6 - const decimalsLineByLineWidth = AreaModelCommonConstants.AREA_SIZE + 40; - if ( isLineByLine && - model.currentAreaProperty.value.partitionSnapSize && - model.currentAreaProperty.value.partitionSnapSize < 1 && - backgroundBounds.width < decimalsLineByLineWidth ) { - backgroundBounds = backgroundBounds.dilatedX( ( decimalsLineByLineWidth - backgroundBounds.width ) / 2 ); - } - - background.rectBounds = backgroundBounds; - previousArrow.rightTop = backgroundBounds.eroded( 5 ).rightTop; - nextArrow.rightBottom = backgroundBounds.eroded( 5 ).rightBottom; - - // Empirically determined to be the best Y location given all of the combinations. Hard to determine with - // computation, so left here. - self.centerY = 543 - AreaModelCommonConstants.LAYOUT_SPACING; - - // First try to center - self.centerX = AreaModelCommonConstants.MAIN_AREA_OFFSET.x + AreaModelCommonConstants.AREA_SIZE / 2; - if ( self.left < AreaModelCommonConstants.LAYOUT_SPACING ) { - - // If that doesn't work, don't let it go out of bounds left-side. - self.left = AreaModelCommonConstants.LAYOUT_SPACING; - } - } +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import FireListener from '../../../../scenery/js/listeners/FireListener.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import AreaCalculationChoice from '../model/AreaCalculationChoice.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; +import CalculationLinesNode from './calculation/CalculationLinesNode.js'; + +// constants +const MAX_LINE_WIDTH = 680; // may need to be updated if the panel size is changed. +const LINE_BY_LINE_EXPANSION = 25; +const ARROW_SIZE = 18; +const ARROW_TOUCH_DILATION = 8; - this.calculationLinesNode.displayUpdatedEmitter.addListener( update ); - update(); - } +/** + * @constructor + * @extends {Node} + * + * @param {AreaModelCommonModel} model + * @param {Object} [nodeOptions] + */ +function CalculationNode( model, nodeOptions ) { - areaModelCommon.register( 'CalculationNode', CalculationNode ); + const self = this; - return inherit( Node, CalculationNode, { - /** - * Updates the calculation lines. - * @public - */ - update: function() { - this.calculationLinesNode.update(); + Node.call( this ); + + // @private {CalculationLinesNode} + this.calculationLinesNode = new CalculationLinesNode( model ); + + const background = new Rectangle( { + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, + fill: AreaModelCommonColorProfile.panelBackgroundProperty, + stroke: AreaModelCommonColorProfile.panelBorderProperty + } ); + this.addChild( background ); + + const previousShape = new Shape().moveTo( 0, 0 ) + .lineTo( ARROW_SIZE, 0 ) + .lineTo( ARROW_SIZE / 2, -ARROW_SIZE * 0.8 ) + .close(); + const previousArrow = new Path( previousShape, { + fill: AreaModelCommonColorProfile.calculationArrowUpProperty, + cursor: 'pointer' + } ); + previousArrow.mouseArea = previousArrow.localBounds; + previousArrow.touchArea = previousArrow.localBounds.dilated( ARROW_TOUCH_DILATION ); + const previousListener = new FireListener( { + fire: function() { + self.calculationLinesNode.moveToPreviousLine(); } } ); -} ); + previousArrow.addInputListener( previousListener ); + this.calculationLinesNode.previousEnabledProperty.link( function( enabled ) { + previousListener.interrupt(); + previousArrow.pickable = enabled; + previousArrow.fill = enabled + ? AreaModelCommonColorProfile.calculationArrowUpProperty + : AreaModelCommonColorProfile.calculationArrowDisabledProperty; + } ); + + this.addChild( previousArrow ); + const nextShape = new Shape().moveTo( 0, 0 ) + .lineTo( ARROW_SIZE, 0 ) + .lineTo( ARROW_SIZE / 2, ARROW_SIZE * 0.8 ) + .close(); + const nextArrow = new Path( nextShape, { + fill: AreaModelCommonColorProfile.calculationArrowUpProperty, + cursor: 'pointer' + } ); + nextArrow.mouseArea = nextArrow.localBounds; + nextArrow.touchArea = nextArrow.localBounds.dilated( ARROW_TOUCH_DILATION ); + this.addChild( nextArrow ); + const nextListener = new FireListener( { + fire: function() { + self.calculationLinesNode.moveToNextLine(); + } + } ); + nextArrow.addInputListener( nextListener ); + this.calculationLinesNode.nextEnabledProperty.link( function( enabled ) { + nextListener.interrupt(); + nextArrow.pickable = enabled; + nextArrow.fill = enabled + ? AreaModelCommonColorProfile.calculationArrowUpProperty + : AreaModelCommonColorProfile.calculationArrowDisabledProperty; + } ); + + model.areaCalculationChoiceProperty.link( function( choice ) { + previousArrow.visible = nextArrow.visible = choice === AreaCalculationChoice.LINE_BY_LINE; + } ); + + this.mutate( nodeOptions ); + + this.addChild( this.calculationLinesNode ); + + model.areaCalculationChoiceProperty.link( function( choice ) { + self.visible = choice !== AreaCalculationChoice.HIDDEN; + } ); + + function update() { + if ( !self.calculationLinesNode.calculationLinesProperty.value.length ) { + return; + } + + const isLineByLine = model.areaCalculationChoiceProperty.value === AreaCalculationChoice.LINE_BY_LINE; + let maxLineWidth = _.reduce( self.calculationLinesNode.calculationLinesProperty.value, function( max, line ) { + return Math.max( max, line.node.width ); + }, 0 ); + + // If we are LINE_BY_LINE, we won't have as much room because of the buttons + const availableLineWidth = MAX_LINE_WIDTH + ( isLineByLine ? 0 : LINE_BY_LINE_EXPANSION ); + + // Scale the calculation down if necessary, so we can fit within our MAX_LINE_WIDTH + self.calculationLinesNode.setScaleMagnitude( maxLineWidth > availableLineWidth ? ( availableLineWidth / maxLineWidth ) : 1 ); + + // If we scaled things down, our maxLineWidth will be the available width (we don't want our 'panel' larger) + maxLineWidth = Math.min( maxLineWidth, availableLineWidth ); + + let backgroundBounds = self.calculationLinesNode.bounds; + + // If we removed lines for the "line-by-line", make sure we take up enough room to not change size. + if ( backgroundBounds.width < maxLineWidth ) { + backgroundBounds = backgroundBounds.dilatedX( ( maxLineWidth - backgroundBounds.width ) / 2 ); + } + + // Add some space around the lines + backgroundBounds = backgroundBounds.dilated( 5 ); + + // Add some space for the next/previous buttons + if ( isLineByLine ) { + backgroundBounds.maxX += LINE_BY_LINE_EXPANSION; + } + + // Minimum width of the area size + if ( backgroundBounds.width < AreaModelCommonConstants.AREA_SIZE ) { + backgroundBounds = backgroundBounds.dilatedX( ( AreaModelCommonConstants.AREA_SIZE - backgroundBounds.width ) / 2 ); + } + + // Minimum height + if ( backgroundBounds.height < 120 ) { + backgroundBounds = backgroundBounds.dilatedY( ( 120 - backgroundBounds.height ) / 2 ); + } + + // If we support decimals, use a slightly larger minimum. + // See https://github.com/phetsims/area-model-decimals/issues/6 + const decimalsLineByLineWidth = AreaModelCommonConstants.AREA_SIZE + 40; + if ( isLineByLine && + model.currentAreaProperty.value.partitionSnapSize && + model.currentAreaProperty.value.partitionSnapSize < 1 && + backgroundBounds.width < decimalsLineByLineWidth ) { + backgroundBounds = backgroundBounds.dilatedX( ( decimalsLineByLineWidth - backgroundBounds.width ) / 2 ); + } + + background.rectBounds = backgroundBounds; + previousArrow.rightTop = backgroundBounds.eroded( 5 ).rightTop; + nextArrow.rightBottom = backgroundBounds.eroded( 5 ).rightBottom; + + // Empirically determined to be the best Y location given all of the combinations. Hard to determine with + // computation, so left here. + self.centerY = 543 - AreaModelCommonConstants.LAYOUT_SPACING; + + // First try to center + self.centerX = AreaModelCommonConstants.MAIN_AREA_OFFSET.x + AreaModelCommonConstants.AREA_SIZE / 2; + if ( self.left < AreaModelCommonConstants.LAYOUT_SPACING ) { + + // If that doesn't work, don't let it go out of bounds left-side. + self.left = AreaModelCommonConstants.LAYOUT_SPACING; + } + } + + this.calculationLinesNode.displayUpdatedEmitter.addListener( update ); + update(); +} + +areaModelCommon.register( 'CalculationNode', CalculationNode ); + +export default inherit( Node, CalculationNode, { + /** + * Updates the calculation lines. + * @public + */ + update: function() { + this.calculationLinesNode.update(); + } +} ); \ No newline at end of file diff --git a/js/common/view/PartialProductLabelNode.js b/js/common/view/PartialProductLabelNode.js index b33e7b3e..bc9ff39a 100644 --- a/js/common/view/PartialProductLabelNode.js +++ b/js/common/view/PartialProductLabelNode.js @@ -7,174 +7,171 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const PartialProductsChoice = require( 'AREA_MODEL_COMMON/common/model/PartialProductsChoice' ); - const Property = require( 'AXON/Property' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Text = require( 'SCENERY/nodes/Text' ); - const Vector2 = require( 'DOT/Vector2' ); - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} partialProductsChoiceProperty - * @param {Property.} partitionedAreaProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - */ - function PartialProductLabelNode( partialProductsChoiceProperty, partitionedAreaProperty, allowExponents ) { - assert && assert( partialProductsChoiceProperty instanceof Property ); - assert && assert( typeof allowExponents === 'boolean' ); - - const self = this; - - Node.call( this ); - - // @public {Property.} - Exposed for improved positioning capability AND setting with pool - this.partitionedAreaProperty = partitionedAreaProperty; - - const areaProperty = new DynamicProperty( partitionedAreaProperty, { - derive: 'areaProperty' - } ); - const visibleProperty = new DynamicProperty( partitionedAreaProperty, { - derive: 'visibleProperty', - defaultValue: false - } ); - const horizontalSizeProperty = new DynamicProperty( partitionedAreaProperty, { - derive: 'partitions.horizontal.sizeProperty' - } ); - const verticalSizeProperty = new DynamicProperty( partitionedAreaProperty, { - derive: 'partitions.vertical.sizeProperty' - } ); - - const background = new Rectangle( { - cornerRadius: 3, - stroke: new DerivedProperty( - [ areaProperty, AreaModelCommonColorProfile.partialProductBorderProperty ], - function( area, color ) { - return ( area === null || area.coefficient === 0 ) ? 'transparent' : color; - } ), - fill: AreaModelCommonColorProfile.partialProductBackgroundProperty - } ); - this.addChild( background ); - - const box = new HBox( { - align: 'origin' - } ); - this.addChild( box ); - - // Visibility - Property.multilink( [ partialProductsChoiceProperty, visibleProperty ], function( choice, areaVisible ) { - self.visible = areaVisible && ( choice !== PartialProductsChoice.HIDDEN ); - } ); - - // RichTexts (we reuse the same instances to prevent GC and cpu cost) - const productRichText = new RichText( '', { - font: AreaModelCommonConstants.PARTIAL_PRODUCT_FONT - } ); - const factorsTextOptions = { - font: AreaModelCommonConstants.PARTIAL_FACTOR_FONT - }; - const horizontalRichText = new RichText( '', factorsTextOptions ); - const verticalRichText = new RichText( '', factorsTextOptions ); - - const rectangleSize = allowExponents ? 12 : 14; - - // Shifting the rectangles down, so we don't incur a large performance penalty for size-testing things - const rectangleExponentPadding = allowExponents ? 1.3 : 0; - const rectangleCenterY = new Text( ' ', factorsTextOptions ).centerY - rectangleSize / 2 + rectangleExponentPadding; - const horizontalRectangle = new Rectangle( 0, rectangleCenterY, rectangleSize, rectangleSize, { - stroke: 'black', - lineWidth: 0.7 - } ); - const verticalRectangle = new Rectangle( 0, rectangleCenterY, rectangleSize, rectangleSize, { - stroke: 'black', - lineWidth: 0.7 - } ); - if ( allowExponents ) { - const exponentPadding = 2; - horizontalRectangle.localBounds = horizontalRectangle.localBounds.dilatedX( exponentPadding ); - verticalRectangle.localBounds = verticalRectangle.localBounds.dilatedX( exponentPadding ); - } - - // Persistent text nodes (for performance) - const leftParenNode = new Text( '(', factorsTextOptions ); - const middleParensNode = new Text( ')(', factorsTextOptions ); - const rightParenNode = new Text( ')', factorsTextOptions ); - const timesNode = new Text( MathSymbols.TIMES, factorsTextOptions ); - - // Text/alignment - Property.multilink( - [ horizontalSizeProperty, verticalSizeProperty, partialProductsChoiceProperty ], - function( horizontalSize, verticalSize, choice ) { - let children; - - // Hidden - if ( choice === PartialProductsChoice.HIDDEN ) { - children = []; - } - // Product - else if ( choice === PartialProductsChoice.PRODUCTS ) { - productRichText.text = ( horizontalSize === null || verticalSize === null ) - ? '?' - : horizontalSize.times( verticalSize ).toRichString( false ); - children = [ productRichText ]; - } +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import PartialProductsChoice from '../model/PartialProductsChoice.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; - // Factors - else { +/** + * @constructor + * @extends {Node} + * + * @param {Property.} partialProductsChoiceProperty + * @param {Property.} partitionedAreaProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + */ +function PartialProductLabelNode( partialProductsChoiceProperty, partitionedAreaProperty, allowExponents ) { + assert && assert( partialProductsChoiceProperty instanceof Property ); + assert && assert( typeof allowExponents === 'boolean' ); + + const self = this; + + Node.call( this ); + + // @public {Property.} - Exposed for improved positioning capability AND setting with pool + this.partitionedAreaProperty = partitionedAreaProperty; + + const areaProperty = new DynamicProperty( partitionedAreaProperty, { + derive: 'areaProperty' + } ); + const visibleProperty = new DynamicProperty( partitionedAreaProperty, { + derive: 'visibleProperty', + defaultValue: false + } ); + const horizontalSizeProperty = new DynamicProperty( partitionedAreaProperty, { + derive: 'partitions.horizontal.sizeProperty' + } ); + const verticalSizeProperty = new DynamicProperty( partitionedAreaProperty, { + derive: 'partitions.vertical.sizeProperty' + } ); + + const background = new Rectangle( { + cornerRadius: 3, + stroke: new DerivedProperty( + [ areaProperty, AreaModelCommonColorProfile.partialProductBorderProperty ], + function( area, color ) { + return ( area === null || area.coefficient === 0 ) ? 'transparent' : color; + } ), + fill: AreaModelCommonColorProfile.partialProductBackgroundProperty + } ); + this.addChild( background ); + + const box = new HBox( { + align: 'origin' + } ); + this.addChild( box ); + + // Visibility + Property.multilink( [ partialProductsChoiceProperty, visibleProperty ], function( choice, areaVisible ) { + self.visible = areaVisible && ( choice !== PartialProductsChoice.HIDDEN ); + } ); + + // RichTexts (we reuse the same instances to prevent GC and cpu cost) + const productRichText = new RichText( '', { + font: AreaModelCommonConstants.PARTIAL_PRODUCT_FONT + } ); + const factorsTextOptions = { + font: AreaModelCommonConstants.PARTIAL_FACTOR_FONT + }; + const horizontalRichText = new RichText( '', factorsTextOptions ); + const verticalRichText = new RichText( '', factorsTextOptions ); + + const rectangleSize = allowExponents ? 12 : 14; + + // Shifting the rectangles down, so we don't incur a large performance penalty for size-testing things + const rectangleExponentPadding = allowExponents ? 1.3 : 0; + const rectangleCenterY = new Text( ' ', factorsTextOptions ).centerY - rectangleSize / 2 + rectangleExponentPadding; + const horizontalRectangle = new Rectangle( 0, rectangleCenterY, rectangleSize, rectangleSize, { + stroke: 'black', + lineWidth: 0.7 + } ); + const verticalRectangle = new Rectangle( 0, rectangleCenterY, rectangleSize, rectangleSize, { + stroke: 'black', + lineWidth: 0.7 + } ); + if ( allowExponents ) { + const exponentPadding = 2; + horizontalRectangle.localBounds = horizontalRectangle.localBounds.dilatedX( exponentPadding ); + verticalRectangle.localBounds = verticalRectangle.localBounds.dilatedX( exponentPadding ); + } - const horizontalNode = horizontalSize + // Persistent text nodes (for performance) + const leftParenNode = new Text( '(', factorsTextOptions ); + const middleParensNode = new Text( ')(', factorsTextOptions ); + const rightParenNode = new Text( ')', factorsTextOptions ); + const timesNode = new Text( MathSymbols.TIMES, factorsTextOptions ); + + // Text/alignment + Property.multilink( + [ horizontalSizeProperty, verticalSizeProperty, partialProductsChoiceProperty ], + function( horizontalSize, verticalSize, choice ) { + let children; + + // Hidden + if ( choice === PartialProductsChoice.HIDDEN ) { + children = []; + } + + // Product + else if ( choice === PartialProductsChoice.PRODUCTS ) { + productRichText.text = ( horizontalSize === null || verticalSize === null ) + ? '?' + : horizontalSize.times( verticalSize ).toRichString( false ); + children = [ productRichText ]; + } + + // Factors + else { + + const horizontalNode = horizontalSize ? horizontalRichText.setText( horizontalSize.toRichString( false ) ) : horizontalRectangle; - const verticalNode = verticalSize + const verticalNode = verticalSize ? verticalRichText.setText( verticalSize.toRichString( false ) ) : verticalRectangle; - if ( allowExponents ) { - box.spacing = 0; - children = [ - leftParenNode, - verticalNode, - middleParensNode, - horizontalNode, - rightParenNode - ]; - } - else { - box.spacing = 2; - children = [ - verticalNode, - timesNode, - horizontalNode - ]; - } + if ( allowExponents ) { + box.spacing = 0; + children = [ + leftParenNode, + verticalNode, + middleParensNode, + horizontalNode, + rightParenNode + ]; + } + else { + box.spacing = 2; + children = [ + verticalNode, + timesNode, + horizontalNode + ]; } + } - box.children = children; + box.children = children; - if ( isFinite( box.width ) ) { - box.center = Vector2.ZERO; - background.rectBounds = box.bounds.dilatedXY( 4, 2 ); - } - } ); - } + if ( isFinite( box.width ) ) { + box.center = Vector2.ZERO; + background.rectBounds = box.bounds.dilatedXY( 4, 2 ); + } + } ); +} - areaModelCommon.register( 'PartialProductLabelNode', PartialProductLabelNode ); +areaModelCommon.register( 'PartialProductLabelNode', PartialProductLabelNode ); - return inherit( Node, PartialProductLabelNode ); -} ); +inherit( Node, PartialProductLabelNode ); +export default PartialProductLabelNode; \ No newline at end of file diff --git a/js/common/view/PartialProductRadioButtonGroup.js b/js/common/view/PartialProductRadioButtonGroup.js index 6563af18..b5680f50 100644 --- a/js/common/view/PartialProductRadioButtonGroup.js +++ b/js/common/view/PartialProductRadioButtonGroup.js @@ -7,137 +7,133 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const AlignGroup = require( 'SCENERY/nodes/AlignGroup' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonRadioButtonGroup' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const FontAwesomeNode = require( 'SUN/FontAwesomeNode' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const PartialProductsChoice = require( 'AREA_MODEL_COMMON/common/model/PartialProductsChoice' ); - const Text = require( 'SCENERY/nodes/Text' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import AlignGroup from '../../../../scenery/js/nodes/AlignGroup.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import FontAwesomeNode from '../../../../sun/js/FontAwesomeNode.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import OrientationPair from '../model/OrientationPair.js'; +import PartialProductsChoice from '../model/PartialProductsChoice.js'; +import AreaModelCommonRadioButtonGroup from './AreaModelCommonRadioButtonGroup.js'; - // a11y strings - const hidePartialProductsString = AreaModelCommonA11yStrings.hidePartialProducts.value; - const showPartialProductsString = AreaModelCommonA11yStrings.showPartialProducts.value; - const showPartialProductFactorsString = AreaModelCommonA11yStrings.showPartialProductFactors.value; +// a11y strings +const hidePartialProductsString = AreaModelCommonA11yStrings.hidePartialProducts.value; +const showPartialProductsString = AreaModelCommonA11yStrings.showPartialProducts.value; +const showPartialProductFactorsString = AreaModelCommonA11yStrings.showPartialProductFactors.value; - /** - * @constructor - * @extends {AreaModelCommonRadioButtonGroup} - * - * @param {AreaModelCommonModel} model - * @param {AlignGroup} selectionButtonAlignGroup - */ - function PartialProductRadioButtonGroup( model, selectionButtonAlignGroup ) { +/** + * @constructor + * @extends {AreaModelCommonRadioButtonGroup} + * + * @param {AreaModelCommonModel} model + * @param {AlignGroup} selectionButtonAlignGroup + */ +function PartialProductRadioButtonGroup( model, selectionButtonAlignGroup ) { - // hardcoded strings since they shouldn't be translatable - const templateLabels = OrientationPair.create( function( orientation ) { - return new Text( orientation === Orientation.HORIZONTAL ? 'b' : 'a', { - font: AreaModelCommonConstants.SYMBOL_FONT, - fill: new DerivedProperty( - [ model.partialProductsChoiceProperty, model.colorProperties.get( orientation ) ], - function( value, color ) { - return value === PartialProductsChoice.FACTORS ? color : 'black'; - } ) - } ); + // hardcoded strings since they shouldn't be translatable + const templateLabels = OrientationPair.create( function( orientation ) { + return new Text( orientation === Orientation.HORIZONTAL ? 'b' : 'a', { + font: AreaModelCommonConstants.SYMBOL_FONT, + fill: new DerivedProperty( + [ model.partialProductsChoiceProperty, model.colorProperties.get( orientation ) ], + function( value, color ) { + return value === PartialProductsChoice.FACTORS ? color : 'black'; + } ) } ); + } ); - // Both are built here so it is a consistent size across screens. - const iconGroup = new AlignGroup(); - const exponentsIcon = new AlignBox( PartialProductRadioButtonGroup.createExponentIcon( templateLabels ), { - group: iconGroup - } ); - const noExponentsIcon = new AlignBox( PartialProductRadioButtonGroup.createNonExponentIcon( templateLabels ), { - group: iconGroup - } ); + // Both are built here so it is a consistent size across screens. + const iconGroup = new AlignGroup(); + const exponentsIcon = new AlignBox( PartialProductRadioButtonGroup.createExponentIcon( templateLabels ), { + group: iconGroup + } ); + const noExponentsIcon = new AlignBox( PartialProductRadioButtonGroup.createNonExponentIcon( templateLabels ), { + group: iconGroup + } ); - AreaModelCommonRadioButtonGroup.call( this, model.partialProductsChoiceProperty, [ - { - value: PartialProductsChoice.HIDDEN, - node: new AlignBox( new FontAwesomeNode( 'eye_close', { scale: 0.8 } ), { group: selectionButtonAlignGroup } ), + AreaModelCommonRadioButtonGroup.call( this, model.partialProductsChoiceProperty, [ + { + value: PartialProductsChoice.HIDDEN, + node: new AlignBox( new FontAwesomeNode( 'eye_close', { scale: 0.8 } ), { group: selectionButtonAlignGroup } ), - // a11y - labelContent: hidePartialProductsString - }, - { - value: PartialProductsChoice.PRODUCTS, + // a11y + labelContent: hidePartialProductsString + }, + { + value: PartialProductsChoice.PRODUCTS, - // Hardcoded 'A' string since we don't want it to be translatable - node: new AlignBox( new Text( 'A', { font: AreaModelCommonConstants.SYMBOL_FONT } ), { group: selectionButtonAlignGroup } ), + // Hardcoded 'A' string since we don't want it to be translatable + node: new AlignBox( new Text( 'A', { font: AreaModelCommonConstants.SYMBOL_FONT } ), { group: selectionButtonAlignGroup } ), - // a11y - labelContent: showPartialProductsString - }, - { - value: PartialProductsChoice.FACTORS, - node: new AlignBox( model.allowExponents ? exponentsIcon : noExponentsIcon, { group: selectionButtonAlignGroup } ), + // a11y + labelContent: showPartialProductsString + }, + { + value: PartialProductsChoice.FACTORS, + node: new AlignBox( model.allowExponents ? exponentsIcon : noExponentsIcon, { group: selectionButtonAlignGroup } ), - // a11y - labelContent: showPartialProductFactorsString - } - ] ); - } + // a11y + labelContent: showPartialProductFactorsString + } + ] ); +} - areaModelCommon.register( 'PartialProductRadioButtonGroup', PartialProductRadioButtonGroup ); +areaModelCommon.register( 'PartialProductRadioButtonGroup', PartialProductRadioButtonGroup ); - return inherit( AreaModelCommonRadioButtonGroup, PartialProductRadioButtonGroup, {}, { - /** - * Creates an 'exponents-allowed' icon based on a pair of nodes. - * @private - * - * @param {OrientationPair.} nodes - * @returns {Node} - */ - createExponentIcon: function( nodes ) { - return new HBox( { - children: [ - new Text( '(', { - font: AreaModelCommonConstants.SYMBOL_FONT - } ), - new Node( { children: [ nodes.vertical ] } ), - new Text( ')(', { - font: AreaModelCommonConstants.SYMBOL_FONT - } ), - new Node( { children: [ nodes.horizontal ] } ), - new Text( ')', { - font: AreaModelCommonConstants.SYMBOL_FONT - } ) - ], - spacing: 0, - scale: 0.9 - } ); - }, +export default inherit( AreaModelCommonRadioButtonGroup, PartialProductRadioButtonGroup, {}, { + /** + * Creates an 'exponents-allowed' icon based on a pair of nodes. + * @private + * + * @param {OrientationPair.} nodes + * @returns {Node} + */ + createExponentIcon: function( nodes ) { + return new HBox( { + children: [ + new Text( '(', { + font: AreaModelCommonConstants.SYMBOL_FONT + } ), + new Node( { children: [ nodes.vertical ] } ), + new Text( ')(', { + font: AreaModelCommonConstants.SYMBOL_FONT + } ), + new Node( { children: [ nodes.horizontal ] } ), + new Text( ')', { + font: AreaModelCommonConstants.SYMBOL_FONT + } ) + ], + spacing: 0, + scale: 0.9 + } ); + }, - /** - * Creates an 'no-exponents' icon based on a pair of nodes. - * @private - * - * @param {OrientationPair.} nodes - * @returns {Node} - */ - createNonExponentIcon: function( nodes ) { - return new HBox( { - children: [ - new Node( { children: [ nodes.vertical ] } ), - new Text( MathSymbols.TIMES, { - font: AreaModelCommonConstants.SYMBOL_FONT - } ), - new Node( { children: [ nodes.horizontal ] } ) - ], - spacing: 5 - } ); - } - } ); -} ); + /** + * Creates an 'no-exponents' icon based on a pair of nodes. + * @private + * + * @param {OrientationPair.} nodes + * @returns {Node} + */ + createNonExponentIcon: function( nodes ) { + return new HBox( { + children: [ + new Node( { children: [ nodes.vertical ] } ), + new Text( MathSymbols.TIMES, { + font: AreaModelCommonConstants.SYMBOL_FONT + } ), + new Node( { children: [ nodes.horizontal ] } ) + ], + spacing: 5 + } ); + } +} ); \ No newline at end of file diff --git a/js/common/view/PoolableLayerNode.js b/js/common/view/PoolableLayerNode.js index 6ed653b9..32e966d7 100644 --- a/js/common/view/PoolableLayerNode.js +++ b/js/common/view/PoolableLayerNode.js @@ -12,83 +12,80 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - - /** - * @constructor - * @extends {Node} - * - * So you have a Property.>, and you want to lazily create ItemNodes for each? And say each ItemNode - * has something like itemNode.itemProperty which controls which item it displays? And if the property is null, it - * doesn't display? Do I have the incredibly-specific helper type for you! For the LOW LOW price of moving it to a - * common repo, YOU COULD HAVE IT TOO! - * - * Hopefully this doesn't become a common pattern. We have 3+ usages of it, and it cleans things up overall to have - * the not-super-simple logic in one place. Enjoy. - * - * @param {Object} config - */ - function PoolableLayerNode( config ) { - const self = this; - - config = merge( { - // required - arrayProperty: null, // {Property.>} - Property that has an array of items - createNode: null, // {function} - function( {*} item ): {Node} - Create a node from an item - getItemProperty: null, // {function} - function( {*} itemNode ): {Property.<*>} - ItemNode => Item Property - - // Allow providing references - usedArray: [], - unusedArray: [], - - // Called after we run an update. - updatedCallback: null - }, config ); - - Node.call( this ); - - const usedArray = config.usedArray; - const unusedArray = config.unusedArray; - - config.arrayProperty.link( function( items ) { - - // Unuse all of the item nodes (set their property to null, hiding them, and put them in the unused array) - while ( usedArray.length ) { - const oldItemNode = usedArray.pop(); - config.getItemProperty( oldItemNode ).value = null; - unusedArray.push( oldItemNode ); - } - items.forEach( function( item ) { - let itemNode; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import areaModelCommon from '../../areaModelCommon.js'; + +/** + * @constructor + * @extends {Node} + * + * So you have a Property.>, and you want to lazily create ItemNodes for each? And say each ItemNode + * has something like itemNode.itemProperty which controls which item it displays? And if the property is null, it + * doesn't display? Do I have the incredibly-specific helper type for you! For the LOW LOW price of moving it to a + * common repo, YOU COULD HAVE IT TOO! + * + * Hopefully this doesn't become a common pattern. We have 3+ usages of it, and it cleans things up overall to have + * the not-super-simple logic in one place. Enjoy. + * + * @param {Object} config + */ +function PoolableLayerNode( config ) { + const self = this; + + config = merge( { + // required + arrayProperty: null, // {Property.>} - Property that has an array of items + createNode: null, // {function} - function( {*} item ): {Node} - Create a node from an item + getItemProperty: null, // {function} - function( {*} itemNode ): {Property.<*>} - ItemNode => Item Property + + // Allow providing references + usedArray: [], + unusedArray: [], - // Grab one from the pool - if ( unusedArray.length ) { - itemNode = unusedArray.pop(); - config.getItemProperty( itemNode ).value = item; - } + // Called after we run an update. + updatedCallback: null + }, config ); - // Or create a new one - else { - itemNode = config.createNode( item ); - self.addChild( itemNode ); - } + Node.call( this ); - usedArray.push( itemNode ); - } ); + const usedArray = config.usedArray; + const unusedArray = config.unusedArray; - config.updatedCallback && config.updatedCallback(); + config.arrayProperty.link( function( items ) { + + // Unuse all of the item nodes (set their property to null, hiding them, and put them in the unused array) + while ( usedArray.length ) { + const oldItemNode = usedArray.pop(); + config.getItemProperty( oldItemNode ).value = null; + unusedArray.push( oldItemNode ); + } + + items.forEach( function( item ) { + let itemNode; + + // Grab one from the pool + if ( unusedArray.length ) { + itemNode = unusedArray.pop(); + config.getItemProperty( itemNode ).value = item; + } + + // Or create a new one + else { + itemNode = config.createNode( item ); + self.addChild( itemNode ); + } + + usedArray.push( itemNode ); } ); - } - areaModelCommon.register( 'PoolableLayerNode', PoolableLayerNode ); + config.updatedCallback && config.updatedCallback(); + } ); +} + +areaModelCommon.register( 'PoolableLayerNode', PoolableLayerNode ); - return inherit( Node, PoolableLayerNode ); -} ); +inherit( Node, PoolableLayerNode ); +export default PoolableLayerNode; \ No newline at end of file diff --git a/js/common/view/RangeLabelNode.js b/js/common/view/RangeLabelNode.js index 84d6e1f9..e6451c09 100644 --- a/js/common/view/RangeLabelNode.js +++ b/js/common/view/RangeLabelNode.js @@ -8,138 +8,135 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Vector2 = require( 'DOT/Vector2' ); - - // constants - const TICK_LENGTH = 10; // How long the tick marks are for the range labels - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} termListProperty - * @param {Orientation} orientation - * @param {Property.>} tickLocationsProperty - In view coordinates - * @param {Property.} colorProperty - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function RangeLabelNode( termListProperty, orientation, tickLocationsProperty, colorProperty, isProportional ) { - - const self = this; - - Node.call( this ); - - const rangeOffset = ( isProportional + +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; + +// constants +const TICK_LENGTH = 10; // How long the tick marks are for the range labels + +/** + * @constructor + * @extends {Node} + * + * @param {Property.} termListProperty + * @param {Orientation} orientation + * @param {Property.>} tickLocationsProperty - In view coordinates + * @param {Property.} colorProperty + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function RangeLabelNode( termListProperty, orientation, tickLocationsProperty, colorProperty, isProportional ) { + + const self = this; + + Node.call( this ); + + const rangeOffset = ( isProportional ? AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET : AreaModelCommonConstants.GENERIC_RANGE_OFFSET )[ orientation.opposite.coordinate ]; - const richText = new RichText( '', { - font: AreaModelCommonConstants.TOTAL_SIZE_READOUT_FONT, - fill: colorProperty - } ); + const richText = new RichText( '', { + font: AreaModelCommonConstants.TOTAL_SIZE_READOUT_FONT, + fill: colorProperty + } ); - // Constrain width on the left side (don't let it go out of the layout bounds) - if ( orientation === Orientation.VERTICAL ) { - const verticalRangeOffset = isProportional + // Constrain width on the left side (don't let it go out of the layout bounds) + if ( orientation === Orientation.VERTICAL ) { + const verticalRangeOffset = isProportional ? AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET : AreaModelCommonConstants.GENERIC_RANGE_OFFSET; - richText.maxWidth = AreaModelCommonConstants.MAIN_AREA_OFFSET.x + verticalRangeOffset.x - AreaModelCommonConstants.LAYOUT_SPACING; - } + richText.maxWidth = AreaModelCommonConstants.MAIN_AREA_OFFSET.x + verticalRangeOffset.x - AreaModelCommonConstants.LAYOUT_SPACING; + } - // Update the label richText - termListProperty.link( function( termList ) { + // Update the label richText + termListProperty.link( function( termList ) { - const hasTerms = termList !== null && termList.terms.length > 0; + const hasTerms = termList !== null && termList.terms.length > 0; - richText.visible = hasTerms; - if ( hasTerms ) { - richText.text = termList.toRichString(); + richText.visible = hasTerms; + if ( hasTerms ) { + richText.text = termList.toRichString(); - // Relative positioning - if ( orientation === Orientation.HORIZONTAL ) { - richText.centerBottom = Vector2.ZERO; - } - else { - richText.rightCenter = Vector2.ZERO; - } + // Relative positioning + if ( orientation === Orientation.HORIZONTAL ) { + richText.centerBottom = Vector2.ZERO; } - } ); + else { + richText.rightCenter = Vector2.ZERO; + } + } + } ); - // Wrap our text in a label, so that we can handle positioning independent of bounds checks - const textContainer = new Node( { - children: [ richText ] - } ); - this.addChild( textContainer ); + // Wrap our text in a label, so that we can handle positioning independent of bounds checks + const textContainer = new Node( { + children: [ richText ] + } ); + this.addChild( textContainer ); - // Coordinate that doesn't change. Customized offsets added - textContainer[ orientation.opposite.coordinate ] = rangeOffset + ( orientation === Orientation.HORIZONTAL ? -3 : -5 ); + // Coordinate that doesn't change. Customized offsets added + textContainer[ orientation.opposite.coordinate ] = rangeOffset + ( orientation === Orientation.HORIZONTAL ? -3 : -5 ); - // Our main line, that the tick marks will be off of - const line = new Line( { - stroke: colorProperty - } ); - this.addChild( line ); + // Our main line, that the tick marks will be off of + const line = new Line( { + stroke: colorProperty + } ); + this.addChild( line ); - const ticks = []; + const ticks = []; - // Update the layout - tickLocationsProperty.link( function( tickLocations ) { - assert && assert( tickLocations.length === 0 || tickLocations.length >= 2 ); + // Update the layout + tickLocationsProperty.link( function( tickLocations ) { + assert && assert( tickLocations.length === 0 || tickLocations.length >= 2 ); - if ( tickLocations.length === 0 ) { - ticks.forEach( function( tick ) { - tick.visible = false; + if ( tickLocations.length === 0 ) { + ticks.forEach( function( tick ) { + tick.visible = false; + } ); + } + else { + + // Add any ticks that we need + while ( ticks.length < tickLocations.length ) { + const tick = new Line( { + y1: 0, + y2: TICK_LENGTH / 2, + stroke: colorProperty, + rotation: orientation === Orientation.HORIZONTAL ? 0 : -Math.PI / 2 } ); + ticks.push( tick ); + self.addChild( tick ); } - else { - // Add any ticks that we need - while ( ticks.length < tickLocations.length ) { - const tick = new Line( { - y1: 0, - y2: TICK_LENGTH / 2, - stroke: colorProperty, - rotation: orientation === Orientation.HORIZONTAL ? 0 : -Math.PI / 2 - } ); - ticks.push( tick ); - self.addChild( tick ); - } + ticks.forEach( function( tick, index ) { + if ( index < tickLocations.length ) { + tick.visible = true; + tick.translation = orientation.toVector( tickLocations[ index ], rangeOffset ); - ticks.forEach( function( tick, index ) { - if ( index < tickLocations.length ) { - tick.visible = true; - tick.translation = orientation.toVector( tickLocations[ index ], rangeOffset ); - - // The first/last ticks should have a different length - tick.y1 = ( index === 0 || index === tickLocations.length - 1 ) ? -TICK_LENGTH / 2 : 0; - } - else { - tick.visible = false; - } - } ); + // The first/last ticks should have a different length + tick.y1 = ( index === 0 || index === tickLocations.length - 1 ) ? -TICK_LENGTH / 2 : 0; + } + else { + tick.visible = false; + } + } ); - const minLocation = tickLocations[ 0 ]; - const maxLocation = tickLocations[ tickLocations.length - 1 ]; + const minLocation = tickLocations[ 0 ]; + const maxLocation = tickLocations[ tickLocations.length - 1 ]; - line.p1 = orientation.toVector( minLocation, rangeOffset ); - line.p2 = orientation.toVector( maxLocation, rangeOffset ); - textContainer[ orientation.coordinate ] = ( maxLocation + minLocation ) / 2; // centered - } - } ); - } + line.p1 = orientation.toVector( minLocation, rangeOffset ); + line.p2 = orientation.toVector( maxLocation, rangeOffset ); + textContainer[ orientation.coordinate ] = ( maxLocation + minLocation ) / 2; // centered + } + } ); +} - areaModelCommon.register( 'RangeLabelNode', RangeLabelNode ); +areaModelCommon.register( 'RangeLabelNode', RangeLabelNode ); - return inherit( Node, RangeLabelNode ); -} ); +inherit( Node, RangeLabelNode ); +export default RangeLabelNode; \ No newline at end of file diff --git a/js/common/view/TotalAreaNode.js b/js/common/view/TotalAreaNode.js index 854d6a13..454e9202 100644 --- a/js/common/view/TotalAreaNode.js +++ b/js/common/view/TotalAreaNode.js @@ -7,96 +7,93 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Panel = require( 'SUN/Panel' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const Text = require( 'SCENERY/nodes/Text' ); +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import Panel from '../../../../sun/js/Panel.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../AreaModelCommonConstants.js'; +import Term from '../model/Term.js'; +import AreaModelCommonColorProfile from './AreaModelCommonColorProfile.js'; - // strings - const areaString = require( 'string!AREA_MODEL_COMMON/area' ); +const areaString = areaModelCommonStrings.area; - // a11y strings - const areaEqualsPatternString = AreaModelCommonA11yStrings.areaEqualsPattern.value; +// a11y strings +const areaEqualsPatternString = AreaModelCommonA11yStrings.areaEqualsPattern.value; - /** - * @constructor - * @extends {Node} - * - * @param {Property.} totalAreaProperty - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - * @param {string} maximumWidthString - If proportional - * @param {boolean} useTileLikeBackground - Whether the "tile" color should be used with an area background (if any) - */ - function TotalAreaNode( totalAreaProperty, isProportional, maximumWidthString, useTileLikeBackground ) { - const self = this; +/** + * @constructor + * @extends {Node} + * + * @param {Property.} totalAreaProperty + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + * @param {string} maximumWidthString - If proportional + * @param {boolean} useTileLikeBackground - Whether the "tile" color should be used with an area background (if any) + */ +function TotalAreaNode( totalAreaProperty, isProportional, maximumWidthString, useTileLikeBackground ) { + const self = this; - // If powers of x are supported, we need to have a slightly different initial height so we can align-bottom. - const areaText = new RichText( Term.getLargestGenericString( true, 3 ), { - font: AreaModelCommonConstants.TOTAL_AREA_VALUE_FONT - } ); + // If powers of x are supported, we need to have a slightly different initial height so we can align-bottom. + const areaText = new RichText( Term.getLargestGenericString( true, 3 ), { + font: AreaModelCommonConstants.TOTAL_AREA_VALUE_FONT + } ); - let areaNode; - if ( isProportional ) { + let areaNode; + if ( isProportional ) { - // Has numeric display, so it doesn't need maxWidth - areaText.text = maximumWidthString; - areaNode = new HBox( { - spacing: 8, - children: [ - new Text( areaString, { font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT } ), - new Text( MathSymbols.EQUAL_TO, { font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT } ), - // AlignBox it so that it is always centered and keeps the same bounds - new Panel( new AlignBox( areaText, { alignBounds: areaText.bounds.copy(), yAlign: 'bottom' } ), { - fill: useTileLikeBackground - ? AreaModelCommonColorProfile.smallTileProperty - : AreaModelCommonColorProfile.proportionalActiveAreaBackgroundProperty - } ) - ] - } ); - } - else { - areaText.maxWidth = AreaModelCommonConstants.PANEL_INTERIOR_MAX; + // Has numeric display, so it doesn't need maxWidth + areaText.text = maximumWidthString; + areaNode = new HBox( { + spacing: 8, + children: [ + new Text( areaString, { font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT } ), + new Text( MathSymbols.EQUAL_TO, { font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT } ), + // AlignBox it so that it is always centered and keeps the same bounds + new Panel( new AlignBox( areaText, { alignBounds: areaText.bounds.copy(), yAlign: 'bottom' } ), { + fill: useTileLikeBackground + ? AreaModelCommonColorProfile.smallTileProperty + : AreaModelCommonColorProfile.proportionalActiveAreaBackgroundProperty + } ) + ] + } ); + } + else { + areaText.maxWidth = AreaModelCommonConstants.PANEL_INTERIOR_MAX; - // AlignBox it so that it is always centered and keeps the same bounds - areaNode = new AlignBox( areaText, { alignBounds: new Bounds2( 0, 0, AreaModelCommonConstants.PANEL_INTERIOR_MAX, areaText.height ) } ); - } + // AlignBox it so that it is always centered and keeps the same bounds + areaNode = new AlignBox( areaText, { alignBounds: new Bounds2( 0, 0, AreaModelCommonConstants.PANEL_INTERIOR_MAX, areaText.height ) } ); + } - Node.call( this, { - children: [ - areaNode - ], - maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX, + Node.call( this, { + children: [ + areaNode + ], + maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX, - // a11y - tagName: 'p' - } ); + // a11y + tagName: 'p' + } ); - // Update the text. - totalAreaProperty.link( function( polynomial ) { - const labelString = polynomial === null ? '?' : polynomial.toRichString(); - areaText.text = labelString; - self.innerContent = StringUtils.fillIn( areaEqualsPatternString, { - area: labelString - } ); + // Update the text. + totalAreaProperty.link( function( polynomial ) { + const labelString = polynomial === null ? '?' : polynomial.toRichString(); + areaText.text = labelString; + self.innerContent = StringUtils.fillIn( areaEqualsPatternString, { + area: labelString } ); - } + } ); +} - areaModelCommon.register( 'TotalAreaNode', TotalAreaNode ); +areaModelCommon.register( 'TotalAreaNode', TotalAreaNode ); - return inherit( Node, TotalAreaNode ); -} ); +inherit( Node, TotalAreaNode ); +export default TotalAreaNode; \ No newline at end of file diff --git a/js/common/view/calculation/CalculationGroup.js b/js/common/view/calculation/CalculationGroup.js index c3c1d1d8..686f0c99 100644 --- a/js/common/view/calculation/CalculationGroup.js +++ b/js/common/view/calculation/CalculationGroup.js @@ -7,72 +7,68 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Poolable = require( 'PHET_CORE/Poolable' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import HBox from '../../../../../scenery/js/nodes/HBox.js'; +import areaModelCommon from '../../../areaModelCommon.js'; - /** - * @constructor - * @extends {HBox} - * - * @param {Array.} nodes - Each should have a clean() method to support pooling - * @param {number} spacing - */ - function CalculationGroup( nodes, spacing ) { - assert && assert( Array.isArray( nodes ) ); - assert && assert( typeof spacing === 'number' ); - - // @public {string} - this.accessibleText = nodes.map( function( node ) { - return node.accessibleText; - } ).join( ' ' ); +/** + * @constructor + * @extends {HBox} + * + * @param {Array.} nodes - Each should have a clean() method to support pooling + * @param {number} spacing + */ +function CalculationGroup( nodes, spacing ) { + assert && assert( Array.isArray( nodes ) ); + assert && assert( typeof spacing === 'number' ); - // @private {Array.|null} - this.nodes = nodes; + // @public {string} + this.accessibleText = nodes.map( function( node ) { + return node.accessibleText; + } ).join( ' ' ); - if ( !this.initialized ) { - this.initialized = true; + // @private {Array.|null} + this.nodes = nodes; - HBox.call( this, { - align: 'bottom', + if ( !this.initialized ) { + this.initialized = true; - // a11y - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' - } ); - } + HBox.call( this, { + align: 'bottom', - this.mutate( { - tagName: nodes.length > 1 ? 'mrow' : null, - spacing: spacing, - children: nodes + // a11y + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' } ); } - areaModelCommon.register( 'CalculationGroup', CalculationGroup ); - - inherit( HBox, CalculationGroup, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - // Remove our content - this.removeAllChildren(); - this.nodes.forEach( function( node ) { - node.clean(); - } ); - this.nodes = null; - - this.freeToPool(); - } + this.mutate( { + tagName: nodes.length > 1 ? 'mrow' : null, + spacing: spacing, + children: nodes } ); +} - Poolable.mixInto( CalculationGroup ); +areaModelCommon.register( 'CalculationGroup', CalculationGroup ); - return CalculationGroup; +inherit( HBox, CalculationGroup, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + // Remove our content + this.removeAllChildren(); + this.nodes.forEach( function( node ) { + node.clean(); + } ); + this.nodes = null; + + this.freeToPool(); + } } ); + +Poolable.mixInto( CalculationGroup ); + +export default CalculationGroup; \ No newline at end of file diff --git a/js/common/view/calculation/CalculationLine.js b/js/common/view/calculation/CalculationLine.js index 9789e20f..979f08d5 100644 --- a/js/common/view/calculation/CalculationLine.js +++ b/js/common/view/calculation/CalculationLine.js @@ -5,305 +5,301 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const CalculationGroup = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationGroup' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Minus = require( 'AREA_MODEL_COMMON/common/view/calculation/Minus' ); - const MultiplyX = require( 'AREA_MODEL_COMMON/common/view/calculation/MultiplyX' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Parentheses = require( 'AREA_MODEL_COMMON/common/view/calculation/Parentheses' ); - const PlaceholderBox = require( 'AREA_MODEL_COMMON/common/view/calculation/PlaceholderBox' ); - const Plus = require( 'AREA_MODEL_COMMON/common/view/calculation/Plus' ); - const QuestionMark = require( 'AREA_MODEL_COMMON/common/view/calculation/QuestionMark' ); - const TermText = require( 'AREA_MODEL_COMMON/common/view/calculation/TermText' ); - /** - * @constructor - * @extends {Object} - * - * @param {number} index - * @param {OrientationPair.>} colorProperties - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function CalculationLine( index, colorProperties, activeIndexProperty, allowExponents, isProportional ) { - assert && assert( typeof index === 'number' ); +import DerivedProperty from '../../../../../axon/js/DerivedProperty.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; +import OrientationPair from '../../model/OrientationPair.js'; +import AreaModelCommonColorProfile from '../AreaModelCommonColorProfile.js'; +import CalculationGroup from './CalculationGroup.js'; +import Minus from './Minus.js'; +import MultiplyX from './MultiplyX.js'; +import Parentheses from './Parentheses.js'; +import PlaceholderBox from './PlaceholderBox.js'; +import Plus from './Plus.js'; +import QuestionMark from './QuestionMark.js'; +import TermText from './TermText.js'; - const self = this; +/** + * @constructor + * @extends {Object} + * + * @param {number} index + * @param {OrientationPair.>} colorProperties + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function CalculationLine( index, colorProperties, activeIndexProperty, allowExponents, isProportional ) { + assert && assert( typeof index === 'number' ); - // @public {Node|null} - The {Node}, if provided, should have a `node.clean()` method to release references - // (usually freeing it to a pool) and a `node.accessibleText` {string} representing the description of the line. - // Filled in later, should be non-null outside CalculationLine usage. - this.node = null; + const self = this; - // @public {number} - this.index = index; + // @public {Node|null} - The {Node}, if provided, should have a `node.clean()` method to release references + // (usually freeing it to a pool) and a `node.accessibleText` {string} representing the description of the line. + // Filled in later, should be non-null outside CalculationLine usage. + this.node = null; - // @public {CalculationLine|null} - Linked-list support for easy traversal through lines - this.previousLine = null; - this.nextLine = null; + // @public {number} + this.index = index; - // @private {boolean} - this.allowExponents = allowExponents; - this.isProportional = isProportional; + // @public {CalculationLine|null} - Linked-list support for easy traversal through lines + this.previousLine = null; + this.nextLine = null; - // @private {Property.} - this.isActiveProperty = new DerivedProperty( [ activeIndexProperty ], function( activeIndex ) { - return activeIndex === null || activeIndex === index; - } ); + // @private {boolean} + this.allowExponents = allowExponents; + this.isProportional = isProportional; + + // @private {Property.} + this.isActiveProperty = new DerivedProperty( [ activeIndexProperty ], function( activeIndex ) { + return activeIndex === null || activeIndex === index; + } ); + + // @private {Property.} + this.baseColorProperty = new DerivedProperty( [ + this.isActiveProperty, + AreaModelCommonColorProfile.calculationActiveProperty, + AreaModelCommonColorProfile.calculationInactiveProperty + ], function( isActive, activeColor, inactiveColor ) { + return isActive ? activeColor : inactiveColor; + }, { + useDeepEquality: true + } ); - // @private {Property.} - this.baseColorProperty = new DerivedProperty( [ - this.isActiveProperty, - AreaModelCommonColorProfile.calculationActiveProperty, + // @private {OrientationPair.>} + this.orientedColorProperties = OrientationPair.create( function( orientation ) { + return new DerivedProperty( [ + self.isActiveProperty, + colorProperties.get( orientation ), AreaModelCommonColorProfile.calculationInactiveProperty ], function( isActive, activeColor, inactiveColor ) { return isActive ? activeColor : inactiveColor; }, { useDeepEquality: true } ); + } ); +} - // @private {OrientationPair.>} - this.orientedColorProperties = OrientationPair.create( function( orientation ) { - return new DerivedProperty( [ - self.isActiveProperty, - colorProperties.get( orientation ), - AreaModelCommonColorProfile.calculationInactiveProperty - ], function( isActive, activeColor, inactiveColor ) { - return isActive ? activeColor : inactiveColor; - }, { - useDeepEquality: true - } ); - } ); - } +areaModelCommon.register( 'CalculationLine', CalculationLine ); + +export default inherit( Object, CalculationLine, { + /** + * Creates a TermText with the baseColor. + * @public + * + * @param {TermList|Term} term + * @param {boolean} excludeSign + * @returns {TermText} + */ + baseTermText: function( term, excludeSign ) { + assert && assert( typeof excludeSign === 'boolean' ); + + return TermText.createFromPool( term, this.baseColorProperty, excludeSign ); + }, - areaModelCommon.register( 'CalculationLine', CalculationLine ); - - return inherit( Object, CalculationLine, { - /** - * Creates a TermText with the baseColor. - * @public - * - * @param {TermList|Term} term - * @param {boolean} excludeSign - * @returns {TermText} - */ - baseTermText: function( term, excludeSign ) { - assert && assert( typeof excludeSign === 'boolean' ); - - return TermText.createFromPool( term, this.baseColorProperty, excludeSign ); - }, - - /** - * Creates a TermText with the color of a specific orientation. - * @public - * - * @param {Orientation} orientation - * @param {TermList|Term} term - * @returns {TermText} - */ - orientedTermText: function( orientation, term ) { - return TermText.createFromPool( term, this.orientedColorProperties.get( orientation ), false ); - }, - - /** - * Creates a PlaceholderBox with the color of a specific orientation. - * @public - * - * @param {Orientation} orientation - * @returns {PlaceholderBox} - */ - orientedPlaceholderBox: function( orientation ) { - return PlaceholderBox.createFromPool( this.orientedColorProperties.get( orientation ), this.allowExponents ); - }, - - /** - * Creates a MultiplyX with the specified content. - * @public - * - * @param {Node} leftContent - * @param {Node} rightContent - * @returns {MultiplyX} - */ - multiplyX: function( leftContent, rightContent ) { - return MultiplyX.createFromPool( leftContent, rightContent, this.baseColorProperty ); - }, - - /** - * Creates a Parentheses with the specified content. - * @public - * - * @param {Node} content - * @returns {Parentheses} - */ - parentheses: function( content ) { - return Parentheses.createFromPool( content, this.baseColorProperty ); - }, - - /** - * Creates a QuestionMark - * @public - * - * @returns {QuestionMark} - */ - questionMark: function() { - return QuestionMark.createFromPool( this.baseColorProperty ); - }, - - /** - * Creates a Plus - * @public - * - * @returns {Plus} - */ - plus: function() { - return Plus.createFromPool( this.baseColorProperty ); - }, - - /** - * Creates a Minus - * @public - * - * @returns {Minus} - */ - minus: function() { - return Minus.createFromPool( this.baseColorProperty ); - }, - - /** - * Creates a calculation group. - * @public - * - * @param {Array.} nodes - * @param {number} spacing - * @returns {Parentheses} - */ - group: function( nodes, spacing ) { - return CalculationGroup.createFromPool( nodes, spacing ); - }, - - /** - * Returns the grouping of all nodes provided, with plusses in-between each node. - * @public - * - * @param {Array.} nodes - * @returns {Node} - */ - sumGroup: function( nodes ) { - const self = this; - - return this.group( _.flatten( nodes.map( function( node, index ) { - return index > 0 ? [ self.plus(), node ] : [ node ]; - } ) ), AreaModelCommonConstants.CALCULATION_OP_PADDING ); - }, - - /** - * Returns a grouping of all (oriented) terms provided, with plusses in-between each term. - * @public - * - * @param {Array.} terms - * @param {Orientation} orientation - * @returns {Node} - */ - sumOrientedTerms: function( terms, orientation ) { - const self = this; - - return this.sumGroup( terms.map( function( term ) { - return self.orientedTermText( orientation, term ); - } ) ); - }, - - /** - * Returns a grouping of all (non-oriented) terms, with plusses/minuses in-between each term (depending on the sign) - * @public - * - * @param {Array.} terms - * @returns {Node} - */ - sumOrDifferenceOfTerms: function( terms ) { - const self = this; - - return this.group( _.flatten( terms.map( function( term, index ) { - const result = []; - - if ( index > 0 ) { - result.push( term.coefficient >= 0 ? self.plus() : self.minus() ); - } - - result.push( self.baseTermText( term, index > 0 ) ); - - return result; - } ) ), AreaModelCommonConstants.CALCULATION_OP_PADDING ); - }, - - /** - * Returns a grouping of all (oriented) terms provided, with plusses in-between each term (negative grouped in - * parentheses). - * @public - * - * @param {Array.} terms - * @returns {Node} - */ - sumWithNegativeParens: function( terms ) { - const self = this; - - return this.sumGroup( terms.map( function( term ) { - let text = self.baseTermText( term, false ); - if ( term.coefficient < 0 ) { - text = self.parentheses( text ); - } - return text; - } ) ); - }, - - /** - * Returns an array with this lines (and any previous/next lines) in the correct order (up to 3 lines). - * @public - * - * @returns {Array.} - */ - getAdjacentLines: function() { + /** + * Creates a TermText with the color of a specific orientation. + * @public + * + * @param {Orientation} orientation + * @param {TermList|Term} term + * @returns {TermText} + */ + orientedTermText: function( orientation, term ) { + return TermText.createFromPool( term, this.orientedColorProperties.get( orientation ), false ); + }, + + /** + * Creates a PlaceholderBox with the color of a specific orientation. + * @public + * + * @param {Orientation} orientation + * @returns {PlaceholderBox} + */ + orientedPlaceholderBox: function( orientation ) { + return PlaceholderBox.createFromPool( this.orientedColorProperties.get( orientation ), this.allowExponents ); + }, + + /** + * Creates a MultiplyX with the specified content. + * @public + * + * @param {Node} leftContent + * @param {Node} rightContent + * @returns {MultiplyX} + */ + multiplyX: function( leftContent, rightContent ) { + return MultiplyX.createFromPool( leftContent, rightContent, this.baseColorProperty ); + }, + + /** + * Creates a Parentheses with the specified content. + * @public + * + * @param {Node} content + * @returns {Parentheses} + */ + parentheses: function( content ) { + return Parentheses.createFromPool( content, this.baseColorProperty ); + }, + + /** + * Creates a QuestionMark + * @public + * + * @returns {QuestionMark} + */ + questionMark: function() { + return QuestionMark.createFromPool( this.baseColorProperty ); + }, + + /** + * Creates a Plus + * @public + * + * @returns {Plus} + */ + plus: function() { + return Plus.createFromPool( this.baseColorProperty ); + }, + + /** + * Creates a Minus + * @public + * + * @returns {Minus} + */ + minus: function() { + return Minus.createFromPool( this.baseColorProperty ); + }, + + /** + * Creates a calculation group. + * @public + * + * @param {Array.} nodes + * @param {number} spacing + * @returns {Parentheses} + */ + group: function( nodes, spacing ) { + return CalculationGroup.createFromPool( nodes, spacing ); + }, + + /** + * Returns the grouping of all nodes provided, with plusses in-between each node. + * @public + * + * @param {Array.} nodes + * @returns {Node} + */ + sumGroup: function( nodes ) { + const self = this; + + return this.group( _.flatten( nodes.map( function( node, index ) { + return index > 0 ? [ self.plus(), node ] : [ node ]; + } ) ), AreaModelCommonConstants.CALCULATION_OP_PADDING ); + }, + + /** + * Returns a grouping of all (oriented) terms provided, with plusses in-between each term. + * @public + * + * @param {Array.} terms + * @param {Orientation} orientation + * @returns {Node} + */ + sumOrientedTerms: function( terms, orientation ) { + const self = this; + + return this.sumGroup( terms.map( function( term ) { + return self.orientedTermText( orientation, term ); + } ) ); + }, + + /** + * Returns a grouping of all (non-oriented) terms, with plusses/minuses in-between each term (depending on the sign) + * @public + * + * @param {Array.} terms + * @returns {Node} + */ + sumOrDifferenceOfTerms: function( terms ) { + const self = this; + + return this.group( _.flatten( terms.map( function( term, index ) { const result = []; - if ( this.previousLine ) { - result.push( this.previousLine ); - } - result.push( this ); - if ( this.nextLine ) { - result.push( this.nextLine ); + + if ( index > 0 ) { + result.push( term.coefficient >= 0 ? self.plus() : self.minus() ); } + + result.push( self.baseTermText( term, index > 0 ) ); + return result; - }, - - /** - * Removes external references. - * @public - */ - dispose: function() { - this.node.clean(); - - this.orientedColorProperties.horizontal.dispose(); - this.orientedColorProperties.vertical.dispose(); - this.baseColorProperty.dispose(); - this.isActiveProperty.dispose(); + } ) ), AreaModelCommonConstants.CALCULATION_OP_PADDING ); + }, + + /** + * Returns a grouping of all (oriented) terms provided, with plusses in-between each term (negative grouped in + * parentheses). + * @public + * + * @param {Array.} terms + * @returns {Node} + */ + sumWithNegativeParens: function( terms ) { + const self = this; + + return this.sumGroup( terms.map( function( term ) { + let text = self.baseTermText( term, false ); + if ( term.coefficient < 0 ) { + text = self.parentheses( text ); + } + return text; + } ) ); + }, + + /** + * Returns an array with this lines (and any previous/next lines) in the correct order (up to 3 lines). + * @public + * + * @returns {Array.} + */ + getAdjacentLines: function() { + const result = []; + if ( this.previousLine ) { + result.push( this.previousLine ); } - }, { - // @public {number} - Calculation line indices. Each individual type of line will have an index value in the order - // it would show up in the calculation panel. This index is used to determine what the "active" line is (for the - // line-by-line view), so that when updating the calculation it can attempt to stay on the same active line. - TOTALS_LINE_INDEX: 0, - EXPANDED_LINE_INDEX: 1, - DISTRIBUTION_LINE_INDEX: 2, - MULTIPLIED_LINE_INDEX: 3, - ORDERED_LINE_INDEX: 4, - MINUSES_LINE_INDEX: 5, - SUM_LINE_INDEX: 6 - } ); -} ); + result.push( this ); + if ( this.nextLine ) { + result.push( this.nextLine ); + } + return result; + }, + + /** + * Removes external references. + * @public + */ + dispose: function() { + this.node.clean(); + + this.orientedColorProperties.horizontal.dispose(); + this.orientedColorProperties.vertical.dispose(); + this.baseColorProperty.dispose(); + this.isActiveProperty.dispose(); + } +}, { + // @public {number} - Calculation line indices. Each individual type of line will have an index value in the order + // it would show up in the calculation panel. This index is used to determine what the "active" line is (for the + // line-by-line view), so that when updating the calculation it can attempt to stay on the same active line. + TOTALS_LINE_INDEX: 0, + EXPANDED_LINE_INDEX: 1, + DISTRIBUTION_LINE_INDEX: 2, + MULTIPLIED_LINE_INDEX: 3, + ORDERED_LINE_INDEX: 4, + MINUSES_LINE_INDEX: 5, + SUM_LINE_INDEX: 6 +} ); \ No newline at end of file diff --git a/js/common/view/calculation/CalculationLinesNode.js b/js/common/view/calculation/CalculationLinesNode.js index 83cada4f..d4a55ad4 100644 --- a/js/common/view/calculation/CalculationLinesNode.js +++ b/js/common/view/calculation/CalculationLinesNode.js @@ -5,380 +5,376 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonQueryParameters = require( 'AREA_MODEL_COMMON/common/AreaModelCommonQueryParameters' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DistributionLine = require( 'AREA_MODEL_COMMON/common/view/calculation/DistributionLine' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const Emitter = require( 'AXON/Emitter' ); - const ExpandedLine = require( 'AREA_MODEL_COMMON/common/view/calculation/ExpandedLine' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MinusesLine = require( 'AREA_MODEL_COMMON/common/view/calculation/MinusesLine' ); - const MultipliedLine = require( 'AREA_MODEL_COMMON/common/view/calculation/MultipliedLine' ); - const Node = require( 'SCENERY/nodes/Node' ); - const OrderedLine = require( 'AREA_MODEL_COMMON/common/view/calculation/OrderedLine' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const QuestionMarkLine = require( 'AREA_MODEL_COMMON/common/view/calculation/QuestionMarkLine' ); - const SumLine = require( 'AREA_MODEL_COMMON/common/view/calculation/SumLine' ); - const TermList = require( 'AREA_MODEL_COMMON/common/model/TermList' ); - const TotalsLine = require( 'AREA_MODEL_COMMON/common/view/calculation/TotalsLine' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - // a11y strings - const betweenCalculationLinesString = AreaModelCommonA11yStrings.betweenCalculationLines.value; - /** - * @constructor - * @extends {VBox} - * - * @param {AreaModelCommonModel} model - */ - function CalculationLinesNode( model ) { - const self = this; +import BooleanProperty from '../../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../../axon/js/DynamicProperty.js'; +import Emitter from '../../../../../axon/js/Emitter.js'; +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../../phet-core/js/Orientation.js'; +import Node from '../../../../../scenery/js/nodes/Node.js'; +import VBox from '../../../../../scenery/js/nodes/VBox.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonQueryParameters from '../../AreaModelCommonQueryParameters.js'; +import AreaCalculationChoice from '../../model/AreaCalculationChoice.js'; +import TermList from '../../model/TermList.js'; +import DistributionLine from './DistributionLine.js'; +import ExpandedLine from './ExpandedLine.js'; +import MinusesLine from './MinusesLine.js'; +import MultipliedLine from './MultipliedLine.js'; +import OrderedLine from './OrderedLine.js'; +import QuestionMarkLine from './QuestionMarkLine.js'; +import SumLine from './SumLine.js'; +import TotalsLine from './TotalsLine.js'; + +// a11y strings +const betweenCalculationLinesString = AreaModelCommonA11yStrings.betweenCalculationLines.value; + +/** + * @constructor + * @extends {VBox} + * + * @param {AreaModelCommonModel} model + */ +function CalculationLinesNode( model ) { + const self = this; - Node.call( this ); + Node.call( this ); - // @private {Node} - this.box = new VBox( { - spacing: 1 - } ); - this.addChild( this.box ); + // @private {Node} + this.box = new VBox( { + spacing: 1 + } ); + this.addChild( this.box ); - if ( !AreaModelCommonQueryParameters.rawMath ) { - this.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; - this.tagName = 'math'; + if ( !AreaModelCommonQueryParameters.rawMath ) { + this.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; + this.tagName = 'math'; - this.box.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; - this.box.tagName = 'mtable'; - } + this.box.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; + this.box.tagName = 'mtable'; + } - // @public {Property.} - Whether there are previous/next lines (when in line-by-line mode) - this.previousEnabledProperty = new BooleanProperty( false ); - this.nextEnabledProperty = new BooleanProperty( false ); + // @public {Property.} - Whether there are previous/next lines (when in line-by-line mode) + this.previousEnabledProperty = new BooleanProperty( false ); + this.nextEnabledProperty = new BooleanProperty( false ); - // @public {Property.>} - All of our "current" lines - this.calculationLinesProperty = new Property( [] ); + // @public {Property.>} - All of our "current" lines + this.calculationLinesProperty = new Property( [] ); - // @public {Emitter} - Fired whenever the displayed appearance has updated. - this.displayUpdatedEmitter = new Emitter(); + // @public {Emitter} - Fired whenever the displayed appearance has updated. + this.displayUpdatedEmitter = new Emitter(); - // @private {AreaModelCommonModel} - this.model = model; + // @private {AreaModelCommonModel} + this.model = model; - // @private {boolean} - Whether the actual CalculationLinesNode need updating. - this.linesDirty = true; + // @private {boolean} - Whether the actual CalculationLinesNode need updating. + this.linesDirty = true; - // @private {boolean} - Whether the display of the lines (index/visibility change) needs updating. - this.displayDirty = true; + // @private {boolean} - Whether the display of the lines (index/visibility change) needs updating. + this.displayDirty = true; - // @private {Property.} - The current index (for whatever area) - this.areaIndexProperty = new DynamicProperty( model.currentAreaProperty, { - derive: 'calculationIndexProperty', - bidirectional: true + // @private {Property.} - The current index (for whatever area) + this.areaIndexProperty = new DynamicProperty( model.currentAreaProperty, { + derive: 'calculationIndexProperty', + bidirectional: true + } ); + + // @private {Property.} - The effective current index (for whatever area) that we will use for display + this.effectiveIndexProperty = new DerivedProperty( + [ this.areaIndexProperty, model.areaCalculationChoiceProperty ], + function( index, choice ) { + return choice === AreaCalculationChoice.LINE_BY_LINE ? index : null; } ); - // @private {Property.} - The effective current index (for whatever area) that we will use for display - this.effectiveIndexProperty = new DerivedProperty( - [ this.areaIndexProperty, model.areaCalculationChoiceProperty ], - function( index, choice ) { - return choice === AreaCalculationChoice.LINE_BY_LINE ? index : null; + const setLinesDirty = function() { self.linesDirty = true; }; + const setDisplayDirty = function() { self.displayDirty = true; }; + + // Listen for changes that would make the display need an update + model.areaCalculationChoiceProperty.lazyLink( setDisplayDirty ); + this.areaIndexProperty.lazyLink( setDisplayDirty ); + + // Listen for changes that would make everything need an update + model.currentAreaProperty.link( function( newArea, oldArea ) { + if ( oldArea ) { + oldArea.allPartitions.forEach( function( partition ) { + partition.sizeProperty.unlink( setLinesDirty ); + partition.visibleProperty.unlink( setLinesDirty ); } ); + } - const setLinesDirty = function() { self.linesDirty = true; }; - const setDisplayDirty = function() { self.displayDirty = true; }; + newArea.allPartitions.forEach( function( partition ) { + partition.sizeProperty.lazyLink( setLinesDirty ); + partition.visibleProperty.lazyLink( setLinesDirty ); + } ); - // Listen for changes that would make the display need an update - model.areaCalculationChoiceProperty.lazyLink( setDisplayDirty ); - this.areaIndexProperty.lazyLink( setDisplayDirty ); + setLinesDirty(); - // Listen for changes that would make everything need an update - model.currentAreaProperty.link( function( newArea, oldArea ) { - if ( oldArea ) { - oldArea.allPartitions.forEach( function( partition ) { - partition.sizeProperty.unlink( setLinesDirty ); - partition.visibleProperty.unlink( setLinesDirty ); - } ); - } + self.update(); + } ); +} - newArea.allPartitions.forEach( function( partition ) { - partition.sizeProperty.lazyLink( setLinesDirty ); - partition.visibleProperty.lazyLink( setLinesDirty ); - } ); +areaModelCommon.register( 'CalculationLinesNode', CalculationLinesNode ); - setLinesDirty(); +export default inherit( Node, CalculationLinesNode, { + /** + * Called whenever the calculation may need an update. + * @public + */ + update: function() { + // Don't update anything if things are hidden + if ( this.model.areaCalculationChoiceProperty.value === AreaCalculationChoice.HIDDEN ) { + return; + } - self.update(); - } ); - } + this.updateLines(); + this.updateDisplay(); + }, - areaModelCommon.register( 'CalculationLinesNode', CalculationLinesNode ); - - return inherit( Node, CalculationLinesNode, { - /** - * Called whenever the calculation may need an update. - * @public - */ - update: function() { - // Don't update anything if things are hidden - if ( this.model.areaCalculationChoiceProperty.value === AreaCalculationChoice.HIDDEN ) { - return; - } + /** + * Moves the display to the previous line. + * @public + */ + moveToPreviousLine: function() { + const activeLine = this.getActiveLine(); + if ( activeLine.previousLine ) { + this.areaIndexProperty.value = activeLine.previousLine.index; + } + }, - this.updateLines(); - this.updateDisplay(); - }, + /** + * Moves the display to the next line. + * @public + */ + moveToNextLine: function() { + const activeLine = this.getActiveLine(); + if ( activeLine.nextLine ) { + this.areaIndexProperty.value = activeLine.nextLine.index; + } + }, - /** - * Moves the display to the previous line. - * @public - */ - moveToPreviousLine: function() { - const activeLine = this.getActiveLine(); - if ( activeLine.previousLine ) { - this.areaIndexProperty.value = activeLine.previousLine.index; - } - }, + /** + * Removes and disposes children. + * @private + */ + wipe: function() { + while ( this.box.children.length ) { + this.box.children[ 0 ].dispose(); + } + }, - /** - * Moves the display to the next line. - * @public - */ - moveToNextLine: function() { - const activeLine = this.getActiveLine(); - if ( activeLine.nextLine ) { - this.areaIndexProperty.value = activeLine.nextLine.index; - } - }, - - /** - * Removes and disposes children. - * @private - */ - wipe: function() { - while ( this.box.children.length ) { - this.box.children[ 0 ].dispose(); - } - }, - - /** - * Update the internally-stored calculation lines. - * @private - */ - updateLines: function() { - if ( !this.linesDirty ) { - return; - } + /** + * Update the internally-stored calculation lines. + * @private + */ + updateLines: function() { + if ( !this.linesDirty ) { + return; + } - // As a sanity check, just remove all children here (so we don't leak things) - this.wipe(); + // As a sanity check, just remove all children here (so we don't leak things) + this.wipe(); - // Release line references that we had before - this.calculationLinesProperty.value.forEach( function( calculationLine ) { - calculationLine.dispose(); - } ); + // Release line references that we had before + this.calculationLinesProperty.value.forEach( function( calculationLine ) { + calculationLine.dispose(); + } ); - // Create new lines - this.calculationLinesProperty.value = CalculationLinesNode.createLines( - this.model.currentAreaProperty.value, - this.effectiveIndexProperty, - this.model.allowExponents, - this.model.isProportional - ); - - this.linesDirty = false; - this.displayDirty = true; - }, - - /** - * Update the display of the calculation lines. - * @private - */ - updateDisplay: function() { - if ( !this.displayDirty ) { - return; - } + // Create new lines + this.calculationLinesProperty.value = CalculationLinesNode.createLines( + this.model.currentAreaProperty.value, + this.effectiveIndexProperty, + this.model.allowExponents, + this.model.isProportional + ); + + this.linesDirty = false; + this.displayDirty = true; + }, + + /** + * Update the display of the calculation lines. + * @private + */ + updateDisplay: function() { + if ( !this.displayDirty ) { + return; + } + + // As a sanity check, just remove all children here (so we don't leak things) + this.wipe(); - // As a sanity check, just remove all children here (so we don't leak things) - this.wipe(); + let displayedLines = this.calculationLinesProperty.value; - let displayedLines = this.calculationLinesProperty.value; + // If we are in line-by-line mode, display adjacent lines + if ( this.model.areaCalculationChoiceProperty.value === AreaCalculationChoice.LINE_BY_LINE ) { - // If we are in line-by-line mode, display adjacent lines - if ( this.model.areaCalculationChoiceProperty.value === AreaCalculationChoice.LINE_BY_LINE ) { + const activeLine = this.getActiveLine(); + displayedLines = activeLine.getAdjacentLines(); - const activeLine = this.getActiveLine(); - displayedLines = activeLine.getAdjacentLines(); + this.previousEnabledProperty.value = !!activeLine.previousLine; + this.nextEnabledProperty.value = !!activeLine.nextLine; + } + else { + this.previousEnabledProperty.value = false; + this.nextEnabledProperty.value = false; + } - this.previousEnabledProperty.value = !!activeLine.previousLine; - this.nextEnabledProperty.value = !!activeLine.nextLine; + this.box.children = displayedLines.map( function( line, index ) { + const lineNode = new Node( { + children: [ + line.node + ] + } ); + if ( AreaModelCommonQueryParameters.rawMath ) { + lineNode.tagName = 'span'; + lineNode.innerContent = line.node.accessibleText; + lineNode.containerTagName = 'span'; + line.node.accessibleVisible = false; } else { - this.previousEnabledProperty.value = false; - this.nextEnabledProperty.value = false; + lineNode.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; + lineNode.tagName = 'mtr'; } - - this.box.children = displayedLines.map( function( line, index ) { - const lineNode = new Node( { - children: [ - line.node - ] - } ); + if ( index > 0 ) { if ( AreaModelCommonQueryParameters.rawMath ) { - lineNode.tagName = 'span'; - lineNode.innerContent = line.node.accessibleText; - lineNode.containerTagName = 'span'; - line.node.accessibleVisible = false; + lineNode.labelTagName = 'span'; + lineNode.labelContent = betweenCalculationLinesString; } else { - lineNode.accessibleNamespace = 'http://www.w3.org/1998/Math/MathML'; - lineNode.tagName = 'mtr'; + lineNode.insertChild( 0, new Node( { + // a11y + tagName: 'mtext', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: betweenCalculationLinesString + } ) ); } - if ( index > 0 ) { - if ( AreaModelCommonQueryParameters.rawMath ) { - lineNode.labelTagName = 'span'; - lineNode.labelContent = betweenCalculationLinesString; - } - else { - lineNode.insertChild( 0, new Node( { - // a11y - tagName: 'mtext', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: betweenCalculationLinesString - } ) ); - } + } + return lineNode; + } ); + + this.displayDirty = false; + this.displayUpdatedEmitter.emit(); + }, + + /** + * Returns the first active line, or null otherwise. + * @private + * + * @returns {CalculationLine|null} + */ + getActiveLine: function() { + let activeLine = _.find( this.calculationLinesProperty.value, function( line ) { + return line.isActiveProperty.value; + } ) || null; + + // If no line is currently active (maybe it was removed?), switch to the next-best line + if ( !activeLine ) { + let nextBestLine = null; + const lastIndex = this.areaIndexProperty.value; + this.calculationLinesProperty.value.forEach( function( calculationLine ) { + if ( calculationLine.index <= lastIndex ) { + nextBestLine = calculationLine; } - return lineNode; } ); - this.displayDirty = false; - this.displayUpdatedEmitter.emit(); - }, - - /** - * Returns the first active line, or null otherwise. - * @private - * - * @returns {CalculationLine|null} - */ - getActiveLine: function() { - let activeLine = _.find( this.calculationLinesProperty.value, function( line ) { - return line.isActiveProperty.value; - } ) || null; - - // If no line is currently active (maybe it was removed?), switch to the next-best line - if ( !activeLine ) { - let nextBestLine = null; - const lastIndex = this.areaIndexProperty.value; - this.calculationLinesProperty.value.forEach( function( calculationLine ) { - if ( calculationLine.index <= lastIndex ) { - nextBestLine = calculationLine; - } - } ); - - // Update the index property to point to the correct line - this.areaIndexProperty.value = nextBestLine.index; - activeLine = nextBestLine; - } + // Update the index property to point to the correct line + this.areaIndexProperty.value = nextBestLine.index; + activeLine = nextBestLine; + } - return activeLine; + return activeLine; + } +}, { + /** + * Creates an array of calculation lines. + * @private + * + * @param {Area} area + * @param {Property.} activeIndexProperty - null when all lines should be active + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + * @returns {Array.} + */ + createLines: function( area, activeIndexProperty, allowExponents, isProportional ) { + // Whether there are ANY shown partitions for a given orientation + const horizontalEmpty = area.getDefinedPartitions( Orientation.HORIZONTAL ).length === 0; + const verticalEmpty = area.getDefinedPartitions( Orientation.VERTICAL ).length === 0; + + // If both are empty, show a question mark + if ( horizontalEmpty && verticalEmpty ) { + return [ new QuestionMarkLine( area, activeIndexProperty, allowExponents, isProportional ) ]; + } + // If only one is empty, show boxes + else if ( horizontalEmpty || verticalEmpty ) { + return [ new TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) ]; } - }, { - /** - * Creates an array of calculation lines. - * @private - * - * @param {Area} area - * @param {Property.} activeIndexProperty - null when all lines should be active - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - * @returns {Array.} - */ - createLines: function( area, activeIndexProperty, allowExponents, isProportional ) { - // Whether there are ANY shown partitions for a given orientation - const horizontalEmpty = area.getDefinedPartitions( Orientation.HORIZONTAL ).length === 0; - const verticalEmpty = area.getDefinedPartitions( Orientation.VERTICAL ).length === 0; - - // If both are empty, show a question mark - if ( horizontalEmpty && verticalEmpty ) { - return [ new QuestionMarkLine( area, activeIndexProperty, allowExponents, isProportional ) ]; - } - // If only one is empty, show boxes - else if ( horizontalEmpty || verticalEmpty ) { - return [ new TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) ]; - } - const horizontalTermList = area.getTermList( Orientation.HORIZONTAL ); - const verticalTermList = area.getTermList( Orientation.VERTICAL ); + const horizontalTermList = area.getTermList( Orientation.HORIZONTAL ); + const verticalTermList = area.getTermList( Orientation.VERTICAL ); - const horizontalTerms = horizontalTermList.terms; - const verticalTerms = verticalTermList.terms; + const horizontalTerms = horizontalTermList.terms; + const verticalTerms = verticalTermList.terms; - // The total/sum for each orientation - const horizontalPolynomial = area.totalProperties.horizontal.value; - const verticalPolynomial = area.totalProperties.vertical.value; + // The total/sum for each orientation + const horizontalPolynomial = area.totalProperties.horizontal.value; + const verticalPolynomial = area.totalProperties.vertical.value; - // E.g. for ( 2 ) * ( 3 + x ), the result will be the terms 6 and 2x. - const multipliedTermList = new TermList( _.flatten( verticalTerms.map( function( verticalTerm ) { - return horizontalTerms.map( function( horizontalTerm ) { - return horizontalTerm.times( verticalTerm ); - } ); - } ) ) ); - const orderedTermList = multipliedTermList.orderedByExponent(); - const totalPolynomial = area.totalAreaProperty.value; + // E.g. for ( 2 ) * ( 3 + x ), the result will be the terms 6 and 2x. + const multipliedTermList = new TermList( _.flatten( verticalTerms.map( function( verticalTerm ) { + return horizontalTerms.map( function( horizontalTerm ) { + return horizontalTerm.times( verticalTerm ); + } ); + } ) ) ); + const orderedTermList = multipliedTermList.orderedByExponent(); + const totalPolynomial = area.totalAreaProperty.value; - // Logic for what calculation lines are needed - const needsExpansion = !allowExponents && ( !horizontalTermList.equals( horizontalPolynomial ) || + // Logic for what calculation lines are needed + const needsExpansion = !allowExponents && ( !horizontalTermList.equals( horizontalPolynomial ) || !verticalTermList.equals( verticalPolynomial ) ); - const needsDistribution = horizontalTermList.terms.length !== 1 || verticalTermList.terms.length !== 1; - const needsMultiplied = needsDistribution && !multipliedTermList.equals( totalPolynomial ); - const needsOrdered = needsMultiplied && !orderedTermList.equals( multipliedTermList ) && + const needsDistribution = horizontalTermList.terms.length !== 1 || verticalTermList.terms.length !== 1; + const needsMultiplied = needsDistribution && !multipliedTermList.equals( totalPolynomial ); + const needsOrdered = needsMultiplied && !orderedTermList.equals( multipliedTermList ) && !( orderedTermList.equals( totalPolynomial ) && ( !allowExponents || !orderedTermList.hasNegativeTerm() ) ); - const needsMinuses = needsMultiplied && allowExponents && + const needsMinuses = needsMultiplied && allowExponents && orderedTermList.hasNegativeTerm() && !orderedTermList.equals( totalPolynomial ); - // Add the actual lines - const lines = []; - // e.g. ( -x + x^2 )( x^2 - x ) <--- example used for everything except the ExpansionLine - lines.push( new TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) ); - if ( needsExpansion ) { - // e.g. ( -5 + 2 )( 7 + 3 ) <---- if we have a proportional one where Totals Line is e.g. -3 * 10 - lines.push( new ExpandedLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) ); - } - if ( needsDistribution ) { - // e.g. (-x)(x^2) + (-x)(-x) + (x^2)(x^2) + (x^2)(-x) - lines.push( new DistributionLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) ); - } - if ( needsMultiplied ) { - // e.g. (-x^3) + x^2 + x^4 + (-x^3) - lines.push( new MultipliedLine( multipliedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); - } - if ( needsOrdered ) { - // e.g. x^4 + (-x^3) + (-x^3) + x^2 - lines.push( new OrderedLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); - } - if ( needsMinuses ) { - // e.g. x^4 - x^3 - x^3 + x^2 - lines.push( new MinusesLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); - } - // e.g. x^4 - 2x^3 + x^2 - lines.push( new SumLine( area, activeIndexProperty, allowExponents, isProportional ) ); - - // Link the lines together, so it is easy to traverse - for ( let i = 1; i < lines.length; i++ ) { - lines[ i - 1 ].nextLine = lines[ i ]; - lines[ i ].previousLine = lines[ i - 1 ]; - } + // Add the actual lines + const lines = []; + // e.g. ( -x + x^2 )( x^2 - x ) <--- example used for everything except the ExpansionLine + lines.push( new TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) ); + if ( needsExpansion ) { + // e.g. ( -5 + 2 )( 7 + 3 ) <---- if we have a proportional one where Totals Line is e.g. -3 * 10 + lines.push( new ExpandedLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) ); + } + if ( needsDistribution ) { + // e.g. (-x)(x^2) + (-x)(-x) + (x^2)(x^2) + (x^2)(-x) + lines.push( new DistributionLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) ); + } + if ( needsMultiplied ) { + // e.g. (-x^3) + x^2 + x^4 + (-x^3) + lines.push( new MultipliedLine( multipliedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); + } + if ( needsOrdered ) { + // e.g. x^4 + (-x^3) + (-x^3) + x^2 + lines.push( new OrderedLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); + } + if ( needsMinuses ) { + // e.g. x^4 - x^3 - x^3 + x^2 + lines.push( new MinusesLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) ); + } + // e.g. x^4 - 2x^3 + x^2 + lines.push( new SumLine( area, activeIndexProperty, allowExponents, isProportional ) ); - return lines; + // Link the lines together, so it is easy to traverse + for ( let i = 1; i < lines.length; i++ ) { + lines[ i - 1 ].nextLine = lines[ i ]; + lines[ i ].previousLine = lines[ i - 1 ]; } - } ); -} ); + + return lines; + } +} ); \ No newline at end of file diff --git a/js/common/view/calculation/DistributionLine.js b/js/common/view/calculation/DistributionLine.js index b8742bf6..5d9a506f 100644 --- a/js/common/view/calculation/DistributionLine.js +++ b/js/common/view/calculation/DistributionLine.js @@ -5,56 +5,53 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - - /** - * @constructor - * @extends {CalculationLine} - * - * @param {Array.} horizontalTerms - * @param {Array.} verticalTerms - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function DistributionLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) { - const self = this; - - CalculationLine.call( this, CalculationLine.DISTRIBUTION_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - - this.node = this.sumGroup( _.flatten( verticalTerms.map( function( verticalTerm ) { - return horizontalTerms.map( function( horizontalTerm ) { - const horizontalText = self.orientedTermText( Orientation.HORIZONTAL, horizontalTerm ); - const verticalText = self.orientedTermText( Orientation.VERTICAL, verticalTerm ); - - // Proportional uses X-multiplication, see https://github.com/phetsims/area-model-common/issues/71 - if ( isProportional ) { - return self.parentheses( self.multiplyX( verticalText, horizontalText ) ); - } - else if ( allowExponents ) { - return self.group( [ - self.parentheses( verticalText ), - self.parentheses( horizontalText ) - ], AreaModelCommonConstants.CALCULATION_PAREN_PAREN_PADDING ); - } - // Generic Screen (non-proportional, no exponents) uses dot, see https://github.com/phetsims/area-model-common/issues/72 - else { - return self.parentheses( self.multiplyX( verticalText, horizontalText ) ); - } - } ); - } ) ) ); - } - - areaModelCommon.register( 'DistributionLine', DistributionLine ); - - return inherit( CalculationLine, DistributionLine ); -} ); + +import inherit from '../../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; +import CalculationLine from './CalculationLine.js'; + +/** + * @constructor + * @extends {CalculationLine} + * + * @param {Array.} horizontalTerms + * @param {Array.} verticalTerms + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function DistributionLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) { + const self = this; + + CalculationLine.call( this, CalculationLine.DISTRIBUTION_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); + + this.node = this.sumGroup( _.flatten( verticalTerms.map( function( verticalTerm ) { + return horizontalTerms.map( function( horizontalTerm ) { + const horizontalText = self.orientedTermText( Orientation.HORIZONTAL, horizontalTerm ); + const verticalText = self.orientedTermText( Orientation.VERTICAL, verticalTerm ); + + // Proportional uses X-multiplication, see https://github.com/phetsims/area-model-common/issues/71 + if ( isProportional ) { + return self.parentheses( self.multiplyX( verticalText, horizontalText ) ); + } + else if ( allowExponents ) { + return self.group( [ + self.parentheses( verticalText ), + self.parentheses( horizontalText ) + ], AreaModelCommonConstants.CALCULATION_PAREN_PAREN_PADDING ); + } + // Generic Screen (non-proportional, no exponents) uses dot, see https://github.com/phetsims/area-model-common/issues/72 + else { + return self.parentheses( self.multiplyX( verticalText, horizontalText ) ); + } + } ); + } ) ) ); +} + +areaModelCommon.register( 'DistributionLine', DistributionLine ); + +inherit( CalculationLine, DistributionLine ); +export default DistributionLine; \ No newline at end of file diff --git a/js/common/view/calculation/ExpandedLine.js b/js/common/view/calculation/ExpandedLine.js index 7a0fd2a5..2c305ba5 100644 --- a/js/common/view/calculation/ExpandedLine.js +++ b/js/common/view/calculation/ExpandedLine.js @@ -6,55 +6,52 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - - /** - * @constructor - * @extends {CalculationLine} - * - * @param {Array.} horizontalTerms - * @param {Array.} verticalTerms - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function ExpandedLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.EXPANDED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - - const isHorizontalSingle = horizontalTerms.length === 1; - const isVerticalSingle = verticalTerms.length === 1; - - let horizontalNode = this.sumOrientedTerms( horizontalTerms, Orientation.HORIZONTAL ); - let verticalNode = this.sumOrientedTerms( verticalTerms, Orientation.VERTICAL ); - - if ( !isHorizontalSingle || allowExponents ) { - horizontalNode = this.parentheses( horizontalNode ); - } - if ( !isVerticalSingle || allowExponents ) { - verticalNode = this.parentheses( verticalNode ); - } - - if ( isProportional ) { - this.node = this.multiplyX( verticalNode, horizontalNode ); - } - else { - const spacing = ( isHorizontalSingle || isVerticalSingle ) + +import inherit from '../../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; +import CalculationLine from './CalculationLine.js'; + +/** + * @constructor + * @extends {CalculationLine} + * + * @param {Array.} horizontalTerms + * @param {Array.} verticalTerms + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function ExpandedLine( horizontalTerms, verticalTerms, area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.EXPANDED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); + + const isHorizontalSingle = horizontalTerms.length === 1; + const isVerticalSingle = verticalTerms.length === 1; + + let horizontalNode = this.sumOrientedTerms( horizontalTerms, Orientation.HORIZONTAL ); + let verticalNode = this.sumOrientedTerms( verticalTerms, Orientation.VERTICAL ); + + if ( !isHorizontalSingle || allowExponents ) { + horizontalNode = this.parentheses( horizontalNode ); + } + if ( !isVerticalSingle || allowExponents ) { + verticalNode = this.parentheses( verticalNode ); + } + + if ( isProportional ) { + this.node = this.multiplyX( verticalNode, horizontalNode ); + } + else { + const spacing = ( isHorizontalSingle || isVerticalSingle ) ? AreaModelCommonConstants.CALCULATION_TERM_PAREN_PADDING : AreaModelCommonConstants.CALCULATION_PAREN_PAREN_PADDING; - this.node = this.group( [ verticalNode, horizontalNode ], spacing ); - } + this.node = this.group( [ verticalNode, horizontalNode ], spacing ); } +} - areaModelCommon.register( 'ExpandedLine', ExpandedLine ); +areaModelCommon.register( 'ExpandedLine', ExpandedLine ); - return inherit( CalculationLine, ExpandedLine ); -} ); +inherit( CalculationLine, ExpandedLine ); +export default ExpandedLine; \ No newline at end of file diff --git a/js/common/view/calculation/Minus.js b/js/common/view/calculation/Minus.js index c3f1be2c..7723e1cc 100644 --- a/js/common/view/calculation/Minus.js +++ b/js/common/view/calculation/Minus.js @@ -7,65 +7,61 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const Text = require( 'SCENERY/nodes/Text' ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import MathSymbols from '../../../../../scenery-phet/js/MathSymbols.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; - // a11y strings - const sumMinusString = AreaModelCommonA11yStrings.sumMinus.value; +// a11y strings +const sumMinusString = AreaModelCommonA11yStrings.sumMinus.value; - /** - * @constructor - * @extends {Text} - * - * @param {Property.} baseColorProperty - */ - function Minus( baseColorProperty ) { - assert && assert( baseColorProperty instanceof Property ); - - // @public {string} - this.accessibleText = sumMinusString; +/** + * @constructor + * @extends {Text} + * + * @param {Property.} baseColorProperty + */ +function Minus( baseColorProperty ) { + assert && assert( baseColorProperty instanceof Property ); - if ( !this.initialized ) { - this.initialized = true; + // @public {string} + this.accessibleText = sumMinusString; - Text.call( this, MathSymbols.MINUS, { - font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, + if ( !this.initialized ) { + this.initialized = true; - // a11y - tagName: 'mo', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: '−' - } ); - } + Text.call( this, MathSymbols.MINUS, { + font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, - this.fill = baseColorProperty; + // a11y + tagName: 'mo', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: '−' + } ); } - areaModelCommon.register( 'Minus', Minus ); + this.fill = baseColorProperty; +} - inherit( Text, Minus, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - this.fill = null; +areaModelCommon.register( 'Minus', Minus ); - this.freeToPool(); - } - } ); - - Poolable.mixInto( Minus ); +inherit( Text, Minus, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + this.fill = null; - return Minus; + this.freeToPool(); + } } ); + +Poolable.mixInto( Minus ); + +export default Minus; \ No newline at end of file diff --git a/js/common/view/calculation/MinusesLine.js b/js/common/view/calculation/MinusesLine.js index 7106beff..5f323901 100644 --- a/js/common/view/calculation/MinusesLine.js +++ b/js/common/view/calculation/MinusesLine.js @@ -6,31 +6,28 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import CalculationLine from './CalculationLine.js'; - /** - * @constructor - * @extends {CalculationLine} - * - * @param {TermList} orderedTermList - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function MinusesLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.MINUSES_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); +/** + * @constructor + * @extends {CalculationLine} + * + * @param {TermList} orderedTermList + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function MinusesLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.MINUSES_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - this.node = this.sumOrDifferenceOfTerms( orderedTermList.terms ); - } + this.node = this.sumOrDifferenceOfTerms( orderedTermList.terms ); +} - areaModelCommon.register( 'MinusesLine', MinusesLine ); +areaModelCommon.register( 'MinusesLine', MinusesLine ); - return inherit( CalculationLine, MinusesLine ); -} ); +inherit( CalculationLine, MinusesLine ); +export default MinusesLine; \ No newline at end of file diff --git a/js/common/view/calculation/MultipliedLine.js b/js/common/view/calculation/MultipliedLine.js index 92700e23..07e89f15 100644 --- a/js/common/view/calculation/MultipliedLine.js +++ b/js/common/view/calculation/MultipliedLine.js @@ -6,31 +6,28 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import CalculationLine from './CalculationLine.js'; - /** - * @constructor - * @extends {CalculationLine} - * - * @param {TermList} multipliedTermList - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function MultipliedLine( multipliedTermList, area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.MULTIPLIED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); +/** + * @constructor + * @extends {CalculationLine} + * + * @param {TermList} multipliedTermList + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function MultipliedLine( multipliedTermList, area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.MULTIPLIED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - this.node = this.sumWithNegativeParens( multipliedTermList.terms ); - } + this.node = this.sumWithNegativeParens( multipliedTermList.terms ); +} - areaModelCommon.register( 'MultipliedLine', MultipliedLine ); +areaModelCommon.register( 'MultipliedLine', MultipliedLine ); - return inherit( CalculationLine, MultipliedLine ); -} ); +inherit( CalculationLine, MultipliedLine ); +export default MultipliedLine; \ No newline at end of file diff --git a/js/common/view/calculation/MultiplyX.js b/js/common/view/calculation/MultiplyX.js index 198ea79a..7d5f52a1 100644 --- a/js/common/view/calculation/MultiplyX.js +++ b/js/common/view/calculation/MultiplyX.js @@ -7,102 +7,98 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); - - // a11y strings - const productTimesPatternString = AreaModelCommonA11yStrings.productTimesPattern.value; - /** - * @constructor - * @extends {HBox} - * - * @param {Node} leftContent - Should have a clean() method to support pooling - * @param {Node} rightContent - Should have a clean() method to support pooling - * @param {Property.} baseColorProperty - */ - function MultiplyX( leftContent, rightContent, baseColorProperty ) { - assert && assert( leftContent instanceof Node ); - assert && assert( rightContent instanceof Node ); - assert && assert( baseColorProperty instanceof Property ); - - // @public {string} - this.accessibleText = StringUtils.fillIn( productTimesPatternString, { - left: leftContent.accessibleText, - right: rightContent.accessibleText - } ); - - // @private {Node|null} - this.leftContent = leftContent; - this.rightContent = rightContent; - - if ( !this.initialized ) { - this.initialized = true; +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import StringUtils from '../../../../../phetcommon/js/util/StringUtils.js'; +import MathSymbols from '../../../../../scenery-phet/js/MathSymbols.js'; +import HBox from '../../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; + +// a11y strings +const productTimesPatternString = AreaModelCommonA11yStrings.productTimesPattern.value; - // @private {Text} - Persistent (since it's declared in the constructor instead of the initialize function, this - // will persist for the life of this node). - this.timesNode = new Text( MathSymbols.TIMES, { - font: AreaModelCommonConstants.CALCULATION_X_FONT, +/** + * @constructor + * @extends {HBox} + * + * @param {Node} leftContent - Should have a clean() method to support pooling + * @param {Node} rightContent - Should have a clean() method to support pooling + * @param {Property.} baseColorProperty + */ +function MultiplyX( leftContent, rightContent, baseColorProperty ) { + assert && assert( leftContent instanceof Node ); + assert && assert( rightContent instanceof Node ); + assert && assert( baseColorProperty instanceof Property ); + + // @public {string} + this.accessibleText = StringUtils.fillIn( productTimesPatternString, { + left: leftContent.accessibleText, + right: rightContent.accessibleText + } ); - // a11y - tagName: 'mo', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: '×' - } ); + // @private {Node|null} + this.leftContent = leftContent; + this.rightContent = rightContent; - HBox.call( this, { - children: [ this.timesNode ], - spacing: AreaModelCommonConstants.CALCULATION_X_PADDING, - align: 'bottom' - } ); - } + if ( !this.initialized ) { + this.initialized = true; - assert && assert( this.children.length === 1, 'Should only have the timesNode' ); + // @private {Text} - Persistent (since it's declared in the constructor instead of the initialize function, this + // will persist for the life of this node). + this.timesNode = new Text( MathSymbols.TIMES, { + font: AreaModelCommonConstants.CALCULATION_X_FONT, - this.insertChild( 0, leftContent ); - this.addChild( rightContent ); + // a11y + tagName: 'mo', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: '×' + } ); - this.timesNode.fill = baseColorProperty; + HBox.call( this, { + children: [ this.timesNode ], + spacing: AreaModelCommonConstants.CALCULATION_X_PADDING, + align: 'bottom' + } ); } - areaModelCommon.register( 'MultiplyX', MultiplyX ); + assert && assert( this.children.length === 1, 'Should only have the timesNode' ); - inherit( HBox, MultiplyX, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - assert && assert( this.children.length === 3, 'Should have two content nodes and our timesNode' ); + this.insertChild( 0, leftContent ); + this.addChild( rightContent ); - // Remove our content - this.removeChild( this.leftContent ); - this.removeChild( this.rightContent ); - this.leftContent.clean(); - this.rightContent.clean(); - this.leftContent = null; - this.rightContent = null; + this.timesNode.fill = baseColorProperty; +} - this.timesNode.fill = null; +areaModelCommon.register( 'MultiplyX', MultiplyX ); - this.freeToPool(); - } - } ); +inherit( HBox, MultiplyX, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + assert && assert( this.children.length === 3, 'Should have two content nodes and our timesNode' ); - Poolable.mixInto( MultiplyX ); + // Remove our content + this.removeChild( this.leftContent ); + this.removeChild( this.rightContent ); + this.leftContent.clean(); + this.rightContent.clean(); + this.leftContent = null; + this.rightContent = null; - return MultiplyX; + this.timesNode.fill = null; + + this.freeToPool(); + } } ); + +Poolable.mixInto( MultiplyX ); + +export default MultiplyX; \ No newline at end of file diff --git a/js/common/view/calculation/OrderedLine.js b/js/common/view/calculation/OrderedLine.js index 0bfb5cd6..720988af 100644 --- a/js/common/view/calculation/OrderedLine.js +++ b/js/common/view/calculation/OrderedLine.js @@ -5,31 +5,28 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import CalculationLine from './CalculationLine.js'; - /** - * @constructor - * @extends {CalculationLine} - * - * @param {TermList} orderedTermList - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function OrderedLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.ORDERED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); +/** + * @constructor + * @extends {CalculationLine} + * + * @param {TermList} orderedTermList + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function OrderedLine( orderedTermList, area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.ORDERED_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - this.node = this.sumWithNegativeParens( orderedTermList.terms ); - } + this.node = this.sumWithNegativeParens( orderedTermList.terms ); +} - areaModelCommon.register( 'OrderedLine', OrderedLine ); +areaModelCommon.register( 'OrderedLine', OrderedLine ); - return inherit( CalculationLine, OrderedLine ); -} ); +inherit( CalculationLine, OrderedLine ); +export default OrderedLine; \ No newline at end of file diff --git a/js/common/view/calculation/Parentheses.js b/js/common/view/calculation/Parentheses.js index 55470b48..5e11bb33 100644 --- a/js/common/view/calculation/Parentheses.js +++ b/js/common/view/calculation/Parentheses.js @@ -7,115 +7,111 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); - - // a11y strings - const quantityPatternString = AreaModelCommonA11yStrings.quantityPattern.value; - /** - * @constructor - * @extends {HBox} - * - * @param {Node} content - Should have a clean() method to support pooling - * @param {Property.} baseColorProperty - */ - function Parentheses( content, baseColorProperty ) { - assert && assert( content instanceof Node ); - assert && assert( baseColorProperty instanceof Property ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import StringUtils from '../../../../../phetcommon/js/util/StringUtils.js'; +import HBox from '../../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; + +// a11y strings +const quantityPatternString = AreaModelCommonA11yStrings.quantityPattern.value; + +/** + * @constructor + * @extends {HBox} + * + * @param {Node} content - Should have a clean() method to support pooling + * @param {Property.} baseColorProperty + */ +function Parentheses( content, baseColorProperty ) { + assert && assert( content instanceof Node ); + assert && assert( baseColorProperty instanceof Property ); + + // @public {string} + this.accessibleText = StringUtils.fillIn( quantityPatternString, { + content: content.accessibleText + } ); + + // @private {Node|null} + this.content = content; + + if ( !this.initialized ) { + this.initialized = true; + + // @private {Text} - Persistent (since these are declared in the constructor instead of the initialize function, + // they will persist for the life of this node). + this.leftParen = new Text( '(', { + font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, + + // a11y + tagName: 'mo', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: '(' + } ); + this.leftParen.setAccessibleAttribute( 'form', 'prefix', { + namespace: 'http://www.w3.org/1998/Math/MathML' + } ); - // @public {string} - this.accessibleText = StringUtils.fillIn( quantityPatternString, { - content: content.accessibleText + // @private {Text} - See notes above + this.rightParen = new Text( ')', { + font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, + + // a11y + tagName: 'mo', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: ')' + } ); + this.rightParen.setAccessibleAttribute( 'form', 'postfix', { + namespace: 'http://www.w3.org/1998/Math/MathML' } ); - // @private {Node|null} - this.content = content; - - if ( !this.initialized ) { - this.initialized = true; - - // @private {Text} - Persistent (since these are declared in the constructor instead of the initialize function, - // they will persist for the life of this node). - this.leftParen = new Text( '(', { - font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, - - // a11y - tagName: 'mo', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: '(' - } ); - this.leftParen.setAccessibleAttribute( 'form', 'prefix', { - namespace: 'http://www.w3.org/1998/Math/MathML' - } ); - - // @private {Text} - See notes above - this.rightParen = new Text( ')', { - font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, - - // a11y - tagName: 'mo', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: ')' - } ); - this.rightParen.setAccessibleAttribute( 'form', 'postfix', { - namespace: 'http://www.w3.org/1998/Math/MathML' - } ); - - HBox.call( this, { - children: [ this.leftParen, this.rightParen ], - spacing: AreaModelCommonConstants.CALCULATION_PAREN_PADDING, - - // a11y - align: 'bottom', - tagName: 'mrow', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' - } ); - } - - assert && assert( this.children.length === 2, 'Should only have a left and right paren at this moment' ); - - this.insertChild( 1, content ); - - this.leftParen.fill = baseColorProperty; - this.rightParen.fill = baseColorProperty; + HBox.call( this, { + children: [ this.leftParen, this.rightParen ], + spacing: AreaModelCommonConstants.CALCULATION_PAREN_PADDING, + + // a11y + align: 'bottom', + tagName: 'mrow', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' + } ); } - areaModelCommon.register( 'Parentheses', Parentheses ); + assert && assert( this.children.length === 2, 'Should only have a left and right paren at this moment' ); - inherit( HBox, Parentheses, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - assert && assert( this.children.length === 3, 'Should only have a left and right paren AND content' ); + this.insertChild( 1, content ); - // Remove our content - this.removeChild( this.content ); - this.content.clean(); - this.content = null; + this.leftParen.fill = baseColorProperty; + this.rightParen.fill = baseColorProperty; +} - this.leftParen.fill = null; - this.rightParen.fill = null; +areaModelCommon.register( 'Parentheses', Parentheses ); - this.freeToPool(); - } - } ); +inherit( HBox, Parentheses, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + assert && assert( this.children.length === 3, 'Should only have a left and right paren AND content' ); + + // Remove our content + this.removeChild( this.content ); + this.content.clean(); + this.content = null; - Poolable.mixInto( Parentheses ); + this.leftParen.fill = null; + this.rightParen.fill = null; - return Parentheses; + this.freeToPool(); + } } ); + +Poolable.mixInto( Parentheses ); + +export default Parentheses; \ No newline at end of file diff --git a/js/common/view/calculation/PlaceholderBox.js b/js/common/view/calculation/PlaceholderBox.js index 11478659..30cbc57e 100644 --- a/js/common/view/calculation/PlaceholderBox.js +++ b/js/common/view/calculation/PlaceholderBox.js @@ -7,65 +7,61 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import Rectangle from '../../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; - // a11y strings - const placeholderString = AreaModelCommonA11yStrings.placeholder.value; +// a11y strings +const placeholderString = AreaModelCommonA11yStrings.placeholder.value; - /** - * @constructor - * @extends {Rectangle} - * - * @param {Property.} colorProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - */ - function PlaceholderBox( colorProperty, allowExponents ) { - assert && assert( colorProperty instanceof Property ); - assert && assert( typeof allowExponents === 'boolean' ); - - if ( !this.initialized ) { - this.initialized = true; +/** + * @constructor + * @extends {Rectangle} + * + * @param {Property.} colorProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + */ +function PlaceholderBox( colorProperty, allowExponents ) { + assert && assert( colorProperty instanceof Property ); + assert && assert( typeof allowExponents === 'boolean' ); - // @public {string} - this.accessibleText = placeholderString; + if ( !this.initialized ) { + this.initialized = true; - Rectangle.call( this, 0, 0, 16, 16, { - lineWidth: 0.7, + // @public {string} + this.accessibleText = placeholderString; - // a11y - tagName: 'mi', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: placeholderString - } ); - } + Rectangle.call( this, 0, 0, 16, 16, { + lineWidth: 0.7, - this.stroke = colorProperty; - this.localBounds = this.selfBounds.dilatedX( allowExponents ? 2 : 0 ); + // a11y + tagName: 'mi', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: placeholderString + } ); } - areaModelCommon.register( 'PlaceholderBox', PlaceholderBox ); + this.stroke = colorProperty; + this.localBounds = this.selfBounds.dilatedX( allowExponents ? 2 : 0 ); +} - inherit( Rectangle, PlaceholderBox, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - this.stroke = null; - this.freeToPool(); - } - } ); +areaModelCommon.register( 'PlaceholderBox', PlaceholderBox ); - Poolable.mixInto( PlaceholderBox ); - - return PlaceholderBox; +inherit( Rectangle, PlaceholderBox, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + this.stroke = null; + this.freeToPool(); + } } ); + +Poolable.mixInto( PlaceholderBox ); + +export default PlaceholderBox; \ No newline at end of file diff --git a/js/common/view/calculation/Plus.js b/js/common/view/calculation/Plus.js index 4dc10832..78d53f5d 100644 --- a/js/common/view/calculation/Plus.js +++ b/js/common/view/calculation/Plus.js @@ -7,65 +7,61 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const Text = require( 'SCENERY/nodes/Text' ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import MathSymbols from '../../../../../scenery-phet/js/MathSymbols.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; - // a11y strings - const sumPlusString = AreaModelCommonA11yStrings.sumPlus.value; +// a11y strings +const sumPlusString = AreaModelCommonA11yStrings.sumPlus.value; - /** - * @constructor - * @extends {Text} - * - * @param {Property.} baseColorProperty - */ - function Plus( baseColorProperty ) { - assert && assert( baseColorProperty instanceof Property ); - - if ( !this.initialized ) { - this.initialized = true; +/** + * @constructor + * @extends {Text} + * + * @param {Property.} baseColorProperty + */ +function Plus( baseColorProperty ) { + assert && assert( baseColorProperty instanceof Property ); - // @public {string} - this.accessibleText = sumPlusString; + if ( !this.initialized ) { + this.initialized = true; - Text.call( this, MathSymbols.PLUS, { - font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, + // @public {string} + this.accessibleText = sumPlusString; - // a11y - tagName: 'mo', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: '+' - } ); - } + Text.call( this, MathSymbols.PLUS, { + font: AreaModelCommonConstants.CALCULATION_PAREN_FONT, - this.fill = baseColorProperty; + // a11y + tagName: 'mo', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: '+' + } ); } - areaModelCommon.register( 'Plus', Plus ); + this.fill = baseColorProperty; +} - inherit( Text, Plus, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - this.fill = null; +areaModelCommon.register( 'Plus', Plus ); - this.freeToPool(); - } - } ); - - Poolable.mixInto( Plus ); +inherit( Text, Plus, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + this.fill = null; - return Plus; + this.freeToPool(); + } } ); + +Poolable.mixInto( Plus ); + +export default Plus; \ No newline at end of file diff --git a/js/common/view/calculation/QuestionMark.js b/js/common/view/calculation/QuestionMark.js index 0cc64afa..9f93bfa4 100644 --- a/js/common/view/calculation/QuestionMark.js +++ b/js/common/view/calculation/QuestionMark.js @@ -7,64 +7,60 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const Text = require( 'SCENERY/nodes/Text' ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import Text from '../../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; - // a11y strings - const questionMarkString = AreaModelCommonA11yStrings.questionMark.value; +// a11y strings +const questionMarkString = AreaModelCommonA11yStrings.questionMark.value; - /** - * @constructor - * @extends {Text} - * - * @param {Property.} baseColorProperty - */ - function QuestionMark( baseColorProperty ) { - assert && assert( baseColorProperty instanceof Property ); - - if ( !this.initialized ) { - this.initialized = true; +/** + * @constructor + * @extends {Text} + * + * @param {Property.} baseColorProperty + */ +function QuestionMark( baseColorProperty ) { + assert && assert( baseColorProperty instanceof Property ); - // @public {string} - this.accessibleText = questionMarkString; + if ( !this.initialized ) { + this.initialized = true; - Text.call( this, '?', { - font: AreaModelCommonConstants.CALCULATION_TERM_FONT, + // @public {string} + this.accessibleText = questionMarkString; - // a11y - tagName: 'mi', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', - innerContent: questionMarkString - } ); - } + Text.call( this, '?', { + font: AreaModelCommonConstants.CALCULATION_TERM_FONT, - this.fill = baseColorProperty; + // a11y + tagName: 'mi', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML', + innerContent: questionMarkString + } ); } - areaModelCommon.register( 'QuestionMark', QuestionMark ); + this.fill = baseColorProperty; +} - inherit( Text, QuestionMark, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - this.fill = null; +areaModelCommon.register( 'QuestionMark', QuestionMark ); - this.freeToPool(); - } - } ); - - Poolable.mixInto( QuestionMark ); +inherit( Text, QuestionMark, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + this.fill = null; - return QuestionMark; + this.freeToPool(); + } } ); + +Poolable.mixInto( QuestionMark ); + +export default QuestionMark; \ No newline at end of file diff --git a/js/common/view/calculation/QuestionMarkLine.js b/js/common/view/calculation/QuestionMarkLine.js index 9c134687..0a582d55 100644 --- a/js/common/view/calculation/QuestionMarkLine.js +++ b/js/common/view/calculation/QuestionMarkLine.js @@ -5,30 +5,27 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import CalculationLine from './CalculationLine.js'; - /** - * @constructor - * @extends {CalculationLine} - * - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function QuestionMarkLine( area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.TOTALS_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); +/** + * @constructor + * @extends {CalculationLine} + * + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function QuestionMarkLine( area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.TOTALS_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - this.node = this.questionMark(); - } + this.node = this.questionMark(); +} - areaModelCommon.register( 'QuestionMarkLine', QuestionMarkLine ); +areaModelCommon.register( 'QuestionMarkLine', QuestionMarkLine ); - return inherit( CalculationLine, QuestionMarkLine ); -} ); +inherit( CalculationLine, QuestionMarkLine ); +export default QuestionMarkLine; \ No newline at end of file diff --git a/js/common/view/calculation/SumLine.js b/js/common/view/calculation/SumLine.js index 12f657f1..776fdbba 100644 --- a/js/common/view/calculation/SumLine.js +++ b/js/common/view/calculation/SumLine.js @@ -5,30 +5,27 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import CalculationLine from './CalculationLine.js'; - /** - * @constructor - * @extends {CalculationLine} - * - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function SumLine( area, activeIndexProperty, allowExponents, isProportional ) { - CalculationLine.call( this, CalculationLine.SUM_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); +/** + * @constructor + * @extends {CalculationLine} + * + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function SumLine( area, activeIndexProperty, allowExponents, isProportional ) { + CalculationLine.call( this, CalculationLine.SUM_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - this.node = this.baseTermText( area.totalAreaProperty.value, false ); - } + this.node = this.baseTermText( area.totalAreaProperty.value, false ); +} - areaModelCommon.register( 'SumLine', SumLine ); +areaModelCommon.register( 'SumLine', SumLine ); - return inherit( CalculationLine, SumLine ); -} ); +inherit( CalculationLine, SumLine ); +export default SumLine; \ No newline at end of file diff --git a/js/common/view/calculation/TermText.js b/js/common/view/calculation/TermText.js index f0245c83..743a0647 100644 --- a/js/common/view/calculation/TermText.js +++ b/js/common/view/calculation/TermText.js @@ -7,70 +7,66 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Poolable = require( 'PHET_CORE/Poolable' ); - const Property = require( 'AXON/Property' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const TermList = require( 'AREA_MODEL_COMMON/common/model/TermList' ); +import Property from '../../../../../axon/js/Property.js'; +import inherit from '../../../../../phet-core/js/inherit.js'; +import Poolable from '../../../../../phet-core/js/Poolable.js'; +import RichText from '../../../../../scenery/js/nodes/RichText.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; +import Term from '../../model/Term.js'; +import TermList from '../../model/TermList.js'; - /** - * @constructor - * @extends {RichText} - * - * @param {TermList|Term} term - * @param {Property.} colorProperty - * @param {boolean} excludeSign - */ - function TermText( term, colorProperty, excludeSign ) { - assert && assert( term instanceof Term || term instanceof TermList ); - assert && assert( colorProperty instanceof Property ); - assert && assert( typeof excludeSign === 'boolean' || excludeSign === undefined ); - - const text = excludeSign ? term.toNoSignRichString() : term.toRichString( false ); +/** + * @constructor + * @extends {RichText} + * + * @param {TermList|Term} term + * @param {Property.} colorProperty + * @param {boolean} excludeSign + */ +function TermText( term, colorProperty, excludeSign ) { + assert && assert( term instanceof Term || term instanceof TermList ); + assert && assert( colorProperty instanceof Property ); + assert && assert( typeof excludeSign === 'boolean' || excludeSign === undefined ); - // @public {string} - this.accessibleText = text; + const text = excludeSign ? term.toNoSignRichString() : term.toRichString( false ); - if ( !this.initialized ) { - this.initialized = true; + // @public {string} + this.accessibleText = text; - RichText.call( this, ' ', { - font: AreaModelCommonConstants.CALCULATION_TERM_FONT, + if ( !this.initialized ) { + this.initialized = true; - // a11y - tagName: 'mn', - accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' - } ); - } + RichText.call( this, ' ', { + font: AreaModelCommonConstants.CALCULATION_TERM_FONT, - this.mutate( { - text: text, - fill: colorProperty, - innerContent: text + // a11y + tagName: 'mn', + accessibleNamespace: 'http://www.w3.org/1998/Math/MathML' } ); } - areaModelCommon.register( 'TermText', TermText ); - - inherit( RichText, TermText, { - /** - * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). - * @public - */ - clean: function() { - this.fill = null; - this.freeToPool(); - } + this.mutate( { + text: text, + fill: colorProperty, + innerContent: text } ); +} - Poolable.mixInto( TermText ); +areaModelCommon.register( 'TermText', TermText ); - return TermText; +inherit( RichText, TermText, { + /** + * Clears the state of this node (releasing references) so it can be freed to the pool (and potentially GC'ed). + * @public + */ + clean: function() { + this.fill = null; + this.freeToPool(); + } } ); + +Poolable.mixInto( TermText ); + +export default TermText; \ No newline at end of file diff --git a/js/common/view/calculation/TotalsLine.js b/js/common/view/calculation/TotalsLine.js index 37e567c9..24a09b4f 100644 --- a/js/common/view/calculation/TotalsLine.js +++ b/js/common/view/calculation/TotalsLine.js @@ -5,46 +5,43 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const CalculationLine = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLine' ); - const inherit = require( 'PHET_CORE/inherit' ); - - /** - * @constructor - * @extends {CalculationLine} - * - * @param {Area} area - * @param {Property.} activeIndexProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) - */ - function TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) { - const self = this; - - CalculationLine.call( this, CalculationLine.TOTALS_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); - - const totalTexts = area.displayProperties.map( function( orientationTotal, orientation ) { - return orientationTotal.value ? self.orientedTermText( orientation, orientationTotal.value ) - : self.orientedPlaceholderBox( orientation ); - } ); - - if ( allowExponents ) { - this.node = this.group( [ - this.parentheses( totalTexts.vertical ), - this.parentheses( totalTexts.horizontal ) - ], AreaModelCommonConstants.CALCULATION_PAREN_PAREN_PADDING ); - } - else { - this.node = this.multiplyX( totalTexts.vertical, totalTexts.horizontal ); - } + +import inherit from '../../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../AreaModelCommonConstants.js'; +import CalculationLine from './CalculationLine.js'; + +/** + * @constructor + * @extends {CalculationLine} + * + * @param {Area} area + * @param {Property.} activeIndexProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} isProportional - Whether the area is shown as proportional (instead of generic) + */ +function TotalsLine( area, activeIndexProperty, allowExponents, isProportional ) { + const self = this; + + CalculationLine.call( this, CalculationLine.TOTALS_LINE_INDEX, area.colorProperties, activeIndexProperty, allowExponents, isProportional ); + + const totalTexts = area.displayProperties.map( function( orientationTotal, orientation ) { + return orientationTotal.value ? self.orientedTermText( orientation, orientationTotal.value ) + : self.orientedPlaceholderBox( orientation ); + } ); + + if ( allowExponents ) { + this.node = this.group( [ + this.parentheses( totalTexts.vertical ), + this.parentheses( totalTexts.horizontal ) + ], AreaModelCommonConstants.CALCULATION_PAREN_PAREN_PADDING ); + } + else { + this.node = this.multiplyX( totalTexts.vertical, totalTexts.horizontal ); } +} - areaModelCommon.register( 'TotalsLine', TotalsLine ); +areaModelCommon.register( 'TotalsLine', TotalsLine ); - return inherit( CalculationLine, TotalsLine ); -} ); +inherit( CalculationLine, TotalsLine ); +export default TotalsLine; \ No newline at end of file diff --git a/js/game/model/AreaChallenge.js b/js/game/model/AreaChallenge.js index 9d065fe2..8d6732de 100644 --- a/js/game/model/AreaChallenge.js +++ b/js/game/model/AreaChallenge.js @@ -5,515 +5,511 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const dimensionForEach = require( 'PHET_CORE/dimensionForEach' ); - const dimensionMap = require( 'PHET_CORE/dimensionMap' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryDisplayType = require( 'AREA_MODEL_COMMON/game/model/EntryDisplayType' ); - const EntryStatus = require( 'AREA_MODEL_COMMON/game/model/EntryStatus' ); - const EntryType = require( 'AREA_MODEL_COMMON/game/model/EntryType' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const GenericArea = require( 'AREA_MODEL_COMMON/generic/model/GenericArea' ); - const inherit = require( 'PHET_CORE/inherit' ); - const InputMethod = require( 'AREA_MODEL_COMMON/game/model/InputMethod' ); - const merge = require( 'PHET_CORE/merge' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Polynomial = require( 'AREA_MODEL_COMMON/common/model/Polynomial' ); - const Property = require( 'AXON/Property' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - /** - * @constructor - * @extends {Object} - * - * @param {AreaChallengeDescription} description - */ - function AreaChallenge( description ) { - const self = this; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import dimensionForEach from '../../../../phet-core/js/dimensionForEach.js'; +import dimensionMap from '../../../../phet-core/js/dimensionMap.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import Polynomial from '../../common/model/Polynomial.js'; +import Term from '../../common/model/Term.js'; +import GenericArea from '../../generic/model/GenericArea.js'; +import Entry from './Entry.js'; +import EntryDisplayType from './EntryDisplayType.js'; +import EntryStatus from './EntryStatus.js'; +import EntryType from './EntryType.js'; +import GameState from './GameState.js'; +import InputMethod from './InputMethod.js'; - // Reassign a permuted version so we don't have a chance to screw up referencing the wrong thing - description = description.getPermutedDescription(); +/** + * @constructor + * @extends {Object} + * + * @param {AreaChallengeDescription} description + */ +function AreaChallenge( description ) { + const self = this; - // @public {AreaChallengeDescription} - this.description = description; + // Reassign a permuted version so we don't have a chance to screw up referencing the wrong thing + description = description.getPermutedDescription(); - // @public {Property.} - this.stateProperty = new Property( GameState.FIRST_ATTEMPT ); + // @public {AreaChallengeDescription} + this.description = description; - // @public {GenericArea} - used in _.property( 'area' ) - this.area = new GenericArea( description.layout, description.allowExponents ); + // @public {Property.} + this.stateProperty = new Property( GameState.FIRST_ATTEMPT ); - // @public {OrientationPair.>} - The actual partition sizes - this.partitionSizes = OrientationPair.create( function( orientation ) { - return AreaChallenge.generatePartitionTerms( - description.partitionTypes.get( orientation ).length, - description.allowExponents - ); - } ); + // @public {GenericArea} - used in _.property( 'area' ) + this.area = new GenericArea( description.layout, description.allowExponents ); - // @public {OrientationPair.>} Entries for the size of each partition. - this.partitionSizeEntries = OrientationPair.create( function( orientation ) { - return self.partitionSizes.get( orientation ).map( function( size, index ) { - return new Entry( size, { - type: description.partitionTypes.get( orientation )[ index ], - displayType: EntryType.toDisplayType( description.partitionTypes.get( orientation )[ index ] ), - inputMethod: description.numberOrVariable( InputMethod.CONSTANT, InputMethod.TERM ), - numberOfDigits: description.numberOrVariable( description.partitionTypes.get( orientation ).length - index, 1 ) - } ); + // @public {OrientationPair.>} - The actual partition sizes + this.partitionSizes = OrientationPair.create( function( orientation ) { + return AreaChallenge.generatePartitionTerms( + description.partitionTypes.get( orientation ).length, + description.allowExponents + ); + } ); + + // @public {OrientationPair.>} Entries for the size of each partition. + this.partitionSizeEntries = OrientationPair.create( function( orientation ) { + return self.partitionSizes.get( orientation ).map( function( size, index ) { + return new Entry( size, { + type: description.partitionTypes.get( orientation )[ index ], + displayType: EntryType.toDisplayType( description.partitionTypes.get( orientation )[ index ] ), + inputMethod: description.numberOrVariable( InputMethod.CONSTANT, InputMethod.TERM ), + numberOfDigits: description.numberOrVariable( description.partitionTypes.get( orientation ).length - index, 1 ) } ); } ); + } ); - // @public {OrientationPair.|null} - If we're non-unique, it will hold the 0th-place coefficients (e.g. for - // x+3 times x-7, it would hold the terms 3 and -7). It will always be two 1st-order polynomials times each other. - this.swappableSizes = this.description.unique ? null : this.partitionSizes.map( _.property( 1 ) ); + // @public {OrientationPair.|null} - If we're non-unique, it will hold the 0th-place coefficients (e.g. for + // x+3 times x-7, it would hold the terms 3 and -7). It will always be two 1st-order polynomials times each other. + this.swappableSizes = this.description.unique ? null : this.partitionSizes.map( _.property( 1 ) ); - // @public {OrientationPair.|null} - If we're non-unique, it will hold the 0th-place entries (e.g. for - // x+3 times x-7, it would hold the entries for 3 and -7). It will always be two 1st-order polynomials times each - // other. - this.swappableEntries = this.description.unique ? null : this.partitionSizeEntries.map( _.property( 1 ) ); + // @public {OrientationPair.|null} - If we're non-unique, it will hold the 0th-place entries (e.g. for + // x+3 times x-7, it would hold the entries for 3 and -7). It will always be two 1st-order polynomials times each + // other. + this.swappableEntries = this.description.unique ? null : this.partitionSizeEntries.map( _.property( 1 ) ); + + // @public {OrientationPair.>>} - Basically the values of the partitionSizeEntries, but + // null if the entry's status is 'error'. + this.nonErrorPartitionSizeProperties = OrientationPair.create( function( orientation ) { + return self.partitionSizeEntries.get( orientation ).map( _.property( 'nonErrorValueProperty' ) ); + } ); - // @public {OrientationPair.>>} - Basically the values of the partitionSizeEntries, but - // null if the entry's status is 'error'. - this.nonErrorPartitionSizeProperties = OrientationPair.create( function( orientation ) { - return self.partitionSizeEntries.get( orientation ).map( _.property( 'nonErrorValueProperty' ) ); + // @public {Array.>} + this.partialProductSizes = this.partitionSizes.vertical.map( function( verticalSize ) { + return self.partitionSizes.horizontal.map( function( horizontalSize ) { + return horizontalSize.times( verticalSize ); } ); + } ); - // @public {Array.>} - this.partialProductSizes = this.partitionSizes.vertical.map( function( verticalSize ) { - return self.partitionSizes.horizontal.map( function( horizontalSize ) { - return horizontalSize.times( verticalSize ); - } ); + // @public {Array.>} + this.partialProductSizeEntries = dimensionMap( 2, this.partialProductSizes, function( size, verticalIndex, horizontalIndex ) { + + // The number of allowed digits in entry. Basically it's the sum of vertical and horizontal (multiplication sums + // the number of digits). The far-right/bototm partition gets 1 digit, and successively higher numbers of digits + // are used for consecutive partitions. + const numbersDigits = description.partitionTypes.vertical.length + description.partitionTypes.horizontal.length - verticalIndex - horizontalIndex; + const type = description.productTypes[ verticalIndex ][ horizontalIndex ]; + const entry = new Entry( size, { + type: type, + displayType: EntryType.toDisplayType( type ), + inputMethod: description.numberOrVariable( InputMethod.CONSTANT, InputMethod.TERM ), + + // Always let them put in 1 more digit than the actual answer, see https://github.com/phetsims/area-model-common/issues/63 + numberOfDigits: description.numberOrVariable( numbersDigits, 2 ) + 1 } ); + // Link up if dynamic + if ( type === EntryType.DYNAMIC ) { + + // No unlink needed, since this is just for setup. We have a fixed number of these. + Property.multilink( [ + self.nonErrorPartitionSizeProperties.horizontal[ horizontalIndex ], + self.nonErrorPartitionSizeProperties.vertical[ verticalIndex ] + ], function( horizontal, vertical ) { + // horizontal or vertical could be null (resulting in null) + entry.valueProperty.value = horizontal && vertical && horizontal.times( vertical ); + } ); + } + return entry; + } ); - // @public {Array.>} - this.partialProductSizeEntries = dimensionMap( 2, this.partialProductSizes, function( size, verticalIndex, horizontalIndex ) { - - // The number of allowed digits in entry. Basically it's the sum of vertical and horizontal (multiplication sums - // the number of digits). The far-right/bototm partition gets 1 digit, and successively higher numbers of digits - // are used for consecutive partitions. - const numbersDigits = description.partitionTypes.vertical.length + description.partitionTypes.horizontal.length - verticalIndex - horizontalIndex; - const type = description.productTypes[ verticalIndex ][ horizontalIndex ]; - const entry = new Entry( size, { - type: type, - displayType: EntryType.toDisplayType( type ), - inputMethod: description.numberOrVariable( InputMethod.CONSTANT, InputMethod.TERM ), + // We need at least a certain number of partitions to reach x^2 in the total (either at least an x^2 on one side, + // or two x-powers on each side). + const hasXSquaredTotal = ( this.partitionSizes.horizontal.length + this.partitionSizes.vertical.length ) >= 4; - // Always let them put in 1 more digit than the actual answer, see https://github.com/phetsims/area-model-common/issues/63 - numberOfDigits: description.numberOrVariable( numbersDigits, 2 ) + 1 - } ); - // Link up if dynamic - if ( type === EntryType.DYNAMIC ) { - - // No unlink needed, since this is just for setup. We have a fixed number of these. - Property.multilink( [ - self.nonErrorPartitionSizeProperties.horizontal[ horizontalIndex ], - self.nonErrorPartitionSizeProperties.vertical[ verticalIndex ] - ], function( horizontal, vertical ) { - // horizontal or vertical could be null (resulting in null) - entry.valueProperty.value = horizontal && vertical && horizontal.times( vertical ); - } ); - } - return entry; - } ); + // @public {OrientationPair.} + this.totals = OrientationPair.create( function( orientation ) { + return new Polynomial( self.partitionSizes.get( orientation ) ); + } ); - // We need at least a certain number of partitions to reach x^2 in the total (either at least an x^2 on one side, - // or two x-powers on each side). - const hasXSquaredTotal = ( this.partitionSizes.horizontal.length + this.partitionSizes.vertical.length ) >= 4; + // @public {OrientationPair.>} + this.totalProperties = OrientationPair.create( function( orientation ) { + return new Property( self.totals.get( orientation ) ); + } ); - // @public {OrientationPair.} - this.totals = OrientationPair.create( function( orientation ) { - return new Polynomial( self.partitionSizes.get( orientation ) ); + // @public {Polynomial} + this.total = this.totals.horizontal.times( this.totals.vertical ); + + const totalOptions = { + inputMethod: description.numberOrVariable( InputMethod.CONSTANT, hasXSquaredTotal ? InputMethod.POLYNOMIAL_2 : InputMethod.POLYNOMIAL_1 ), + numberOfDigits: ( description.allowExponents ? 2 : ( this.partitionSizes.horizontal.length + this.partitionSizes.vertical.length ) ) + }; + + // @private {InputMethod} + this.totalInputMethod = totalOptions.inputMethod; + + // @public {Entry} + this.totalConstantEntry = new Entry( this.total.getTerm( 0 ), merge( { + correctValue: this.total.getTerm( 0 ), + type: description.totalType, + displayType: EntryType.toDisplayType( description.totalType ) + }, totalOptions ) ); + this.totalXEntry = new Entry( this.total.getTerm( 1 ), merge( { + correctValue: this.total.getTerm( 1 ), + type: description.numberOrVariable( EntryType.GIVEN, description.totalType ), + displayType: description.numberOrVariable( EntryDisplayType.READOUT, EntryType.toDisplayType( description.totalType ) ) + }, totalOptions ) ); + this.totalXSquaredEntry = new Entry( this.total.getTerm( 2 ), merge( { + correctValue: this.total.getTerm( 2 ), + type: description.numberOrVariable( EntryType.GIVEN, description.totalType ), + displayType: description.numberOrVariable( EntryDisplayType.READOUT, EntryType.toDisplayType( description.totalType ) ) + }, totalOptions ) ); + + // @public {Array.} - All of the coefficient entries that are used by this challenge. + this.totalCoefficientEntries = [ this.totalConstantEntry ]; + if ( totalOptions.inputMethod !== InputMethod.CONSTANT ) { + this.totalCoefficientEntries.push( this.totalXEntry ); + } + if ( totalOptions.inputMethod === InputMethod.POLYNOMIAL_2 ) { + this.totalCoefficientEntries.push( this.totalXSquaredEntry ); + } + + // @public {Property.} + this.totalProperty = new DerivedProperty( + [ this.totalConstantEntry.valueProperty, this.totalXEntry.valueProperty, this.totalXSquaredEntry.valueProperty ], + function( constant, x, xSquared ) { + const terms = [ constant, x, xSquared ].filter( function( term ) { + return term !== null; + } ); + return terms.length ? new Polynomial( terms ) : null; } ); - // @public {OrientationPair.>} - this.totalProperties = OrientationPair.create( function( orientation ) { - return new Property( self.totals.get( orientation ) ); + // All of the entries for the challenge - Not including the polynomial "total" coefficient entries + const mainEntries = this.partitionSizeEntries.horizontal + .concat( this.partitionSizeEntries.vertical ) + .concat( _.flatten( this.partialProductSizeEntries ) ); + const checkingNotificationProperties = mainEntries.map( _.property( 'valueProperty' ) ) + .concat( this.totalCoefficientEntries.map( _.property( 'statusProperty' ) ) ); + + // @public {Property.} - Whether the check button should be enabled + this.allowCheckingProperty = new DerivedProperty( checkingNotificationProperties, function() { + const allDirtyCoefficients = _.every( self.totalCoefficientEntries, function( entry ) { + return entry.type === EntryType.EDITABLE && entry.statusProperty.value === EntryStatus.DIRTY; + } ); + const hasNullMain = _.some( mainEntries, function( entry ) { + return entry.valueProperty.value === null && entry.type === EntryType.EDITABLE; } ); + return !hasNullMain && !allDirtyCoefficients; + } ); - // @public {Polynomial} - this.total = this.totals.horizontal.times( this.totals.vertical ); - - const totalOptions = { - inputMethod: description.numberOrVariable( InputMethod.CONSTANT, hasXSquaredTotal ? InputMethod.POLYNOMIAL_2 : InputMethod.POLYNOMIAL_1 ), - numberOfDigits: ( description.allowExponents ? 2 : ( this.partitionSizes.horizontal.length + this.partitionSizes.vertical.length ) ) - }; - - // @private {InputMethod} - this.totalInputMethod = totalOptions.inputMethod; - - // @public {Entry} - this.totalConstantEntry = new Entry( this.total.getTerm( 0 ), merge( { - correctValue: this.total.getTerm( 0 ), - type: description.totalType, - displayType: EntryType.toDisplayType( description.totalType ) - }, totalOptions ) ); - this.totalXEntry = new Entry( this.total.getTerm( 1 ), merge( { - correctValue: this.total.getTerm( 1 ), - type: description.numberOrVariable( EntryType.GIVEN, description.totalType ), - displayType: description.numberOrVariable( EntryDisplayType.READOUT, EntryType.toDisplayType( description.totalType ) ) - }, totalOptions ) ); - this.totalXSquaredEntry = new Entry( this.total.getTerm( 2 ), merge( { - correctValue: this.total.getTerm( 2 ), - type: description.numberOrVariable( EntryType.GIVEN, description.totalType ), - displayType: description.numberOrVariable( EntryDisplayType.READOUT, EntryType.toDisplayType( description.totalType ) ) - }, totalOptions ) ); - - // @public {Array.} - All of the coefficient entries that are used by this challenge. - this.totalCoefficientEntries = [ this.totalConstantEntry ]; - if ( totalOptions.inputMethod !== InputMethod.CONSTANT ) { - this.totalCoefficientEntries.push( this.totalXEntry ); - } - if ( totalOptions.inputMethod === InputMethod.POLYNOMIAL_2 ) { - this.totalCoefficientEntries.push( this.totalXSquaredEntry ); - } + /*---------------------------------------------------------------------------* + * Dynamic hooks + *----------------------------------------------------------------------------*/ - // @public {Property.} - this.totalProperty = new DerivedProperty( - [ this.totalConstantEntry.valueProperty, this.totalXEntry.valueProperty, this.totalXSquaredEntry.valueProperty ], - function( constant, x, xSquared ) { - const terms = [ constant, x, xSquared ].filter( function( term ) { + // Now hook up dynamic parts, setting their values to null + Orientation.VALUES.forEach( function( orientation ) { + if ( description.dimensionTypes.get( orientation ) === EntryType.DYNAMIC ) { + const nonErrorProperties = self.nonErrorPartitionSizeProperties.get( orientation ); + Property.multilink( nonErrorProperties, function() { + const terms = _.map( nonErrorProperties, 'value' ).filter( function( term ) { return term !== null; } ); - return terms.length ? new Polynomial( terms ) : null; - } ); - - // All of the entries for the challenge - Not including the polynomial "total" coefficient entries - const mainEntries = this.partitionSizeEntries.horizontal - .concat( this.partitionSizeEntries.vertical ) - .concat( _.flatten( this.partialProductSizeEntries ) ); - const checkingNotificationProperties = mainEntries.map( _.property( 'valueProperty' ) ) - .concat( this.totalCoefficientEntries.map( _.property( 'statusProperty' ) ) ); - - // @public {Property.} - Whether the check button should be enabled - this.allowCheckingProperty = new DerivedProperty( checkingNotificationProperties, function() { - const allDirtyCoefficients = _.every( self.totalCoefficientEntries, function( entry ) { - return entry.type === EntryType.EDITABLE && entry.statusProperty.value === EntryStatus.DIRTY; - } ); - const hasNullMain = _.some( mainEntries, function( entry ) { - return entry.valueProperty.value === null && entry.type === EntryType.EDITABLE; + const lostATerm = terms.length !== nonErrorProperties.length; + self.totalProperties.get( orientation ).value = ( terms.length && !lostATerm ) ? new Polynomial( terms ) : null; } ); - return !hasNullMain && !allDirtyCoefficients; - } ); - - /*---------------------------------------------------------------------------* - * Dynamic hooks - *----------------------------------------------------------------------------*/ - - // Now hook up dynamic parts, setting their values to null - Orientation.VALUES.forEach( function( orientation ) { - if ( description.dimensionTypes.get( orientation ) === EntryType.DYNAMIC ) { - const nonErrorProperties = self.nonErrorPartitionSizeProperties.get( orientation ); - Property.multilink( nonErrorProperties, function() { - const terms = _.map( nonErrorProperties, 'value' ).filter( function( term ) { - return term !== null; - } ); - const lostATerm = terms.length !== nonErrorProperties.length; - self.totalProperties.get( orientation ).value = ( terms.length && !lostATerm ) ? new Polynomial( terms ) : null; - } ); - } - } ); + } + } ); - // @private {boolean} - Pick an arbitrary side to be wrong in particular variables 6-1 cases, see - // https://github.com/phetsims/area-model-common/issues/42 - this.arbitraryNonUniqueWrongOrientation = phet.joist.random.nextBoolean() ? Orientation.HORIZONTAL : Orientation.VERTICAL; - } + // @private {boolean} - Pick an arbitrary side to be wrong in particular variables 6-1 cases, see + // https://github.com/phetsims/area-model-common/issues/42 + this.arbitraryNonUniqueWrongOrientation = phet.joist.random.nextBoolean() ? Orientation.HORIZONTAL : Orientation.VERTICAL; +} - areaModelCommon.register( 'AreaChallenge', AreaChallenge ); +areaModelCommon.register( 'AreaChallenge', AreaChallenge ); - return inherit( Object, AreaChallenge, { - /** - * Returns a list of all of the editable properties that are incorrect. - * @public - * - * @returns {Array.} - */ - getIncorrectEntries: function() { - const self = this; +export default inherit( Object, AreaChallenge, { + /** + * Returns a list of all of the editable properties that are incorrect. + * @public + * + * @returns {Array.} + */ + getIncorrectEntries: function() { + const self = this; - const incorrectEntries = []; + const incorrectEntries = []; - function compareEntry( entry, expectedValue ) { - if ( entry.valueProperty.value === null || !entry.valueProperty.value.equals( expectedValue ) ) { - incorrectEntries.push( entry ); - } + function compareEntry( entry, expectedValue ) { + if ( entry.valueProperty.value === null || !entry.valueProperty.value.equals( expectedValue ) ) { + incorrectEntries.push( entry ); } + } - // NOTE: Since the only non-unique case is variables 6-1, we just check our secondary properties. - if ( !this.description.unique ) { - // Logic described by https://github.com/phetsims/area-model-common/issues/39 - // Addendum to logic in https://github.com/phetsims/area-model-common/issues/42 - if ( this.hasNonUniqueBadMatch() ) { - incorrectEntries.push( this.swappableEntries.get( this.arbitraryNonUniqueWrongOrientation ) ); - } - else { - if ( !this.nonUniqueHorizontalMatches() ) { - incorrectEntries.push( this.swappableEntries.horizontal ); - } - if ( !this.nonUniqueVerticalMatches() ) { - incorrectEntries.push( this.swappableEntries.vertical ); - } - } + // NOTE: Since the only non-unique case is variables 6-1, we just check our secondary properties. + if ( !this.description.unique ) { + // Logic described by https://github.com/phetsims/area-model-common/issues/39 + // Addendum to logic in https://github.com/phetsims/area-model-common/issues/42 + if ( this.hasNonUniqueBadMatch() ) { + incorrectEntries.push( this.swappableEntries.get( this.arbitraryNonUniqueWrongOrientation ) ); } else { - this.partitionSizeEntries.horizontal.forEach( function( entry, index ) { - compareEntry( entry, self.partitionSizes.horizontal[ index ] ); - } ); - this.partitionSizeEntries.vertical.forEach( function( entry, index ) { - compareEntry( entry, self.partitionSizes.vertical[ index ] ); - } ); - dimensionForEach( 2, this.partialProductSizeEntries, function( entry, verticalIndex, horizontalIndex ) { - compareEntry( entry, self.partialProductSizes[ verticalIndex ][ horizontalIndex ] ); - } ); - - compareEntry( this.totalConstantEntry, this.total.getTerm( 0 ) ); - if ( this.totalInputMethod !== InputMethod.CONSTANT ) { - compareEntry( this.totalXEntry, this.total.getTerm( 1 ) ); + if ( !this.nonUniqueHorizontalMatches() ) { + incorrectEntries.push( this.swappableEntries.horizontal ); } - if ( this.totalInputMethod === InputMethod.POLYNOMIAL_2 ) { - compareEntry( this.totalXSquaredEntry, this.total.getTerm( 2 ) ); + if ( !this.nonUniqueVerticalMatches() ) { + incorrectEntries.push( this.swappableEntries.vertical ); } } - - return _.uniq( incorrectEntries ).filter( function( entry ) { - return entry.displayType === EntryDisplayType.EDITABLE; + } + else { + this.partitionSizeEntries.horizontal.forEach( function( entry, index ) { + compareEntry( entry, self.partitionSizes.horizontal[ index ] ); + } ); + this.partitionSizeEntries.vertical.forEach( function( entry, index ) { + compareEntry( entry, self.partitionSizes.vertical[ index ] ); + } ); + dimensionForEach( 2, this.partialProductSizeEntries, function( entry, verticalIndex, horizontalIndex ) { + compareEntry( entry, self.partialProductSizes[ verticalIndex ][ horizontalIndex ] ); } ); - }, - - /** - * Returns whether our horizontal (secondary) partition size equals one of the expected (secondary) partition sizes. - * @private - * - * @returns {boolean} - */ - nonUniqueHorizontalMatches: function() { - const actual = this.swappableEntries.horizontal.valueProperty.value; - return actual !== null && ( actual.equals( this.swappableSizes.horizontal ) || actual.equals( this.swappableSizes.vertical ) ); - }, - - /** - * Returns whether our vertical (secondary) partition size equals one of the expected (secondary) partition sizes. - * @private - * - * @returns {boolean} - */ - nonUniqueVerticalMatches: function() { - const actual = this.swappableEntries.vertical.valueProperty.value; - - return actual !== null && ( actual.equals( this.swappableSizes.horizontal ) || actual.equals( this.swappableSizes.vertical ) ); - }, - - /** - * Returns whether a permutation of our secondary partition sizes matches the expected sizes. Helpful for the case - * where values can be swapped between locations. - * @private - * - * @returns {boolean} - */ - hasNonUniqueMatch: function() { - const expected1 = this.swappableSizes.horizontal; - const expected2 = this.swappableSizes.vertical; - const actual1 = this.swappableEntries.horizontal.valueProperty.value; - const actual2 = this.swappableEntries.vertical.valueProperty.value; - - return actual1 !== null && actual2 !== null && - ( ( actual1.equals( expected1 ) && actual2.equals( expected2 ) ) || - ( actual1.equals( expected2 ) && actual2.equals( expected1 ) ) ); - }, - - /** - * Returns whether both properties match one answer but not the other. - * @private - * - * @returns {boolean} - */ - hasNonUniqueBadMatch: function() { - // Check for a case where both properties match one answer but not the other - return this.nonUniqueHorizontalMatches() && this.nonUniqueVerticalMatches() && !this.hasNonUniqueMatch(); - }, - - /** - * Remove highlights for non-unique changes, see https://github.com/phetsims/area-model-common/issues/42 - * @private - */ - checkNonUniqueChanges: function() { - if ( !this.description.unique ) { - if ( this.hasNonUniqueBadMatch() ) { - this.swappableEntries.horizontal.statusProperty.value = EntryStatus.NORMAL; - this.swappableEntries.vertical.statusProperty.value = EntryStatus.NORMAL; - } + compareEntry( this.totalConstantEntry, this.total.getTerm( 0 ) ); + if ( this.totalInputMethod !== InputMethod.CONSTANT ) { + compareEntry( this.totalXEntry, this.total.getTerm( 1 ) ); + } + if ( this.totalInputMethod === InputMethod.POLYNOMIAL_2 ) { + compareEntry( this.totalXSquaredEntry, this.total.getTerm( 2 ) ); } - }, + } - /** - * Shows the answers to the challenge. - * @public - */ - showAnswers: function() { - const self = this; + return _.uniq( incorrectEntries ).filter( function( entry ) { + return entry.displayType === EntryDisplayType.EDITABLE; + } ); + }, - // Match solutions for 6-1 variables, see https://github.com/phetsims/area-model-common/issues/42 - if ( !this.description.unique ) { - let reversed = false; + /** + * Returns whether our horizontal (secondary) partition size equals one of the expected (secondary) partition sizes. + * @private + * + * @returns {boolean} + */ + nonUniqueHorizontalMatches: function() { + const actual = this.swappableEntries.horizontal.valueProperty.value; + return actual !== null && ( actual.equals( this.swappableSizes.horizontal ) || actual.equals( this.swappableSizes.vertical ) ); + }, - const expected1 = this.swappableSizes.horizontal; - const expected2 = this.swappableSizes.vertical; + /** + * Returns whether our vertical (secondary) partition size equals one of the expected (secondary) partition sizes. + * @private + * + * @returns {boolean} + */ + nonUniqueVerticalMatches: function() { + const actual = this.swappableEntries.vertical.valueProperty.value; - const actual1Entry = this.swappableEntries.horizontal; - const actual2Entry = this.swappableEntries.vertical; + return actual !== null && ( actual.equals( this.swappableSizes.horizontal ) || actual.equals( this.swappableSizes.vertical ) ); + }, - const actual1 = actual1Entry.valueProperty.value; - const actual2 = actual2Entry.valueProperty.value; + /** + * Returns whether a permutation of our secondary partition sizes matches the expected sizes. Helpful for the case + * where values can be swapped between locations. + * @private + * + * @returns {boolean} + */ + hasNonUniqueMatch: function() { + const expected1 = this.swappableSizes.horizontal; + const expected2 = this.swappableSizes.vertical; - if ( actual1 && actual2 ) { - const matches1 = actual1.equals( expected1 ) || actual1.equals( expected2 ); - const matches2 = actual2.equals( expected1 ) || actual2.equals( expected2 ); + const actual1 = this.swappableEntries.horizontal.valueProperty.value; + const actual2 = this.swappableEntries.vertical.valueProperty.value; - if ( matches1 !== matches2 && ( actual1.equals( expected2 ) || actual2.equals( expected1 ) ) ) { - reversed = true; - } - } + return actual1 !== null && actual2 !== null && + ( ( actual1.equals( expected1 ) && actual2.equals( expected2 ) ) || + ( actual1.equals( expected2 ) && actual2.equals( expected1 ) ) ); + }, - if ( reversed ) { - actual1Entry.valueProperty.value = expected2; - actual2Entry.valueProperty.value = expected1; - this.totalProperties.horizontal.value = this.totals.vertical; - this.totalProperties.vertical.value = this.totals.horizontal; - } - else { - actual1Entry.valueProperty.value = expected1; - actual2Entry.valueProperty.value = expected2; - this.totalProperties.horizontal.value = this.totals.horizontal; - this.totalProperties.vertical.value = this.totals.vertical; - } - actual1Entry.statusProperty.value = EntryStatus.NORMAL; - actual2Entry.statusProperty.value = EntryStatus.NORMAL; - } - else { - this.partitionSizeEntries.horizontal.forEach( function( entry, index ) { - entry.valueProperty.value = self.partitionSizes.horizontal[ index ]; - } ); - this.partitionSizeEntries.vertical.forEach( function( entry, index ) { - entry.valueProperty.value = self.partitionSizes.vertical[ index ]; - } ); + /** + * Returns whether both properties match one answer but not the other. + * @private + * + * @returns {boolean} + */ + hasNonUniqueBadMatch: function() { + // Check for a case where both properties match one answer but not the other + return this.nonUniqueHorizontalMatches() && this.nonUniqueVerticalMatches() && !this.hasNonUniqueMatch(); + }, - this.totalProperties.horizontal.value = this.totals.horizontal; - this.totalProperties.vertical.value = this.totals.vertical; + /** + * Remove highlights for non-unique changes, see https://github.com/phetsims/area-model-common/issues/42 + * @private + */ + checkNonUniqueChanges: function() { + if ( !this.description.unique ) { + if ( this.hasNonUniqueBadMatch() ) { + this.swappableEntries.horizontal.statusProperty.value = EntryStatus.NORMAL; + this.swappableEntries.vertical.statusProperty.value = EntryStatus.NORMAL; } + } + }, - dimensionForEach( 2, this.partialProductSizeEntries, function( entry, verticalIndex, horizontalIndex ) { - entry.valueProperty.value = self.partialProductSizes[ verticalIndex ][ horizontalIndex ]; - entry.statusProperty.value = EntryStatus.NORMAL; - } ); + /** + * Shows the answers to the challenge. + * @public + */ + showAnswers: function() { + const self = this; - this.totalConstantEntry.valueProperty.value = this.total.getTerm( 0 ); - this.totalXEntry.valueProperty.value = this.total.getTerm( 1 ); - this.totalXSquaredEntry.valueProperty.value = this.total.getTerm( 2 ); - this.totalConstantEntry.statusProperty.value = EntryStatus.NORMAL; - this.totalXEntry.statusProperty.value = EntryStatus.NORMAL; - this.totalXSquaredEntry.statusProperty.value = EntryStatus.NORMAL; - }, - - /** - * Checks the user's input against the known answer. - * @public - * - * @returns {number} - The amount of score gained - */ - check: function() { - let scoreIncrease = 0; - - const badEntries = this.getIncorrectEntries(); - const isCorrect = badEntries.length === 0; - - const currentState = this.stateProperty.value; - - if ( !isCorrect ) { - badEntries.forEach( function( badEntry ) { - badEntry.statusProperty.value = EntryStatus.INCORRECT; - } ); - } + // Match solutions for 6-1 variables, see https://github.com/phetsims/area-model-common/issues/42 + if ( !this.description.unique ) { + let reversed = false; + + const expected1 = this.swappableSizes.horizontal; + const expected2 = this.swappableSizes.vertical; + + const actual1Entry = this.swappableEntries.horizontal; + const actual2Entry = this.swappableEntries.vertical; + + const actual1 = actual1Entry.valueProperty.value; + const actual2 = actual2Entry.valueProperty.value; - if ( currentState === GameState.FIRST_ATTEMPT ) { - if ( isCorrect ) { - scoreIncrease = 2; + if ( actual1 && actual2 ) { + const matches1 = actual1.equals( expected1 ) || actual1.equals( expected2 ); + const matches2 = actual2.equals( expected1 ) || actual2.equals( expected2 ); + + if ( matches1 !== matches2 && ( actual1.equals( expected2 ) || actual2.equals( expected1 ) ) ) { + reversed = true; } - this.stateProperty.value = isCorrect ? GameState.CORRECT_ANSWER : GameState.WRONG_FIRST_ANSWER; } - else if ( currentState === GameState.SECOND_ATTEMPT ) { - if ( isCorrect ) { - scoreIncrease = 1; - } - this.stateProperty.value = isCorrect ? GameState.CORRECT_ANSWER : GameState.WRONG_SECOND_ANSWER; + + if ( reversed ) { + actual1Entry.valueProperty.value = expected2; + actual2Entry.valueProperty.value = expected1; + this.totalProperties.horizontal.value = this.totals.vertical; + this.totalProperties.vertical.value = this.totals.horizontal; } else { - throw new Error( 'How is check possible here?' ); + actual1Entry.valueProperty.value = expected1; + actual2Entry.valueProperty.value = expected2; + this.totalProperties.horizontal.value = this.totals.horizontal; + this.totalProperties.vertical.value = this.totals.vertical; } + actual1Entry.statusProperty.value = EntryStatus.NORMAL; + actual2Entry.statusProperty.value = EntryStatus.NORMAL; + } + else { + this.partitionSizeEntries.horizontal.forEach( function( entry, index ) { + entry.valueProperty.value = self.partitionSizes.horizontal[ index ]; + } ); + this.partitionSizeEntries.vertical.forEach( function( entry, index ) { + entry.valueProperty.value = self.partitionSizes.vertical[ index ]; + } ); - return scoreIncrease; - }, - - /** - * Move to try another time. - * @public - */ - tryAgain: function() { - this.stateProperty.value = GameState.SECOND_ATTEMPT; + this.totalProperties.horizontal.value = this.totals.horizontal; + this.totalProperties.vertical.value = this.totals.vertical; } - }, { - - /** - * Generates a series of (semi) random terms for partition sizes for a particular orientation. - * @private - * - * @param {number} quantity - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed for this area - * @returns {Array.} - */ - generatePartitionTerms: function( quantity, allowExponents ) { - const maxPower = quantity - 1; - return _.range( maxPower, -1 ).map( function( power ) { - return AreaChallenge.generateTerm( power, maxPower, quantity, allowExponents ); + + dimensionForEach( 2, this.partialProductSizeEntries, function( entry, verticalIndex, horizontalIndex ) { + entry.valueProperty.value = self.partialProductSizes[ verticalIndex ][ horizontalIndex ]; + entry.statusProperty.value = EntryStatus.NORMAL; + } ); + + this.totalConstantEntry.valueProperty.value = this.total.getTerm( 0 ); + this.totalXEntry.valueProperty.value = this.total.getTerm( 1 ); + this.totalXSquaredEntry.valueProperty.value = this.total.getTerm( 2 ); + this.totalConstantEntry.statusProperty.value = EntryStatus.NORMAL; + this.totalXEntry.statusProperty.value = EntryStatus.NORMAL; + this.totalXSquaredEntry.statusProperty.value = EntryStatus.NORMAL; + }, + + /** + * Checks the user's input against the known answer. + * @public + * + * @returns {number} - The amount of score gained + */ + check: function() { + let scoreIncrease = 0; + + const badEntries = this.getIncorrectEntries(); + const isCorrect = badEntries.length === 0; + + const currentState = this.stateProperty.value; + + if ( !isCorrect ) { + badEntries.forEach( function( badEntry ) { + badEntry.statusProperty.value = EntryStatus.INCORRECT; } ); - }, - - /** - * Generates a (semi) random term for a partition size. - * @private - * - * @param {number} power - Power of 'x' or '10' that the single digit is multiplied times - * @param {number} maxPower - Maximum power for all terms of this orientation. - * @param {number} quantity - Quantity of terms generated total - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @returns {Term} - */ - generateTerm: function( power, maxPower, quantity, allowExponents ) { - if ( allowExponents ) { - - // Don't let leading x or x^2 have a coefficient. - if ( power === maxPower && power > 0 ) { - return new Term( 1, power ); - } - else { - const sign = phet.joist.random.nextBoolean() ? 1 : -1; + } - // Exclude a 1 if our length is 1 (so that we don't just have a single 1 as a dimensinon, so there is the - // ability to have a partition line) - const digit = phet.joist.random.nextIntBetween( ( sign > 0 && quantity === 1 ) ? 2 : 1, 9 ); - return new Term( sign * digit, power ); - } + if ( currentState === GameState.FIRST_ATTEMPT ) { + if ( isCorrect ) { + scoreIncrease = 2; + } + this.stateProperty.value = isCorrect ? GameState.CORRECT_ANSWER : GameState.WRONG_FIRST_ANSWER; + } + else if ( currentState === GameState.SECOND_ATTEMPT ) { + if ( isCorrect ) { + scoreIncrease = 1; + } + this.stateProperty.value = isCorrect ? GameState.CORRECT_ANSWER : GameState.WRONG_SECOND_ANSWER; + } + else { + throw new Error( 'How is check possible here?' ); + } + + return scoreIncrease; + }, + + /** + * Move to try another time. + * @public + */ + tryAgain: function() { + this.stateProperty.value = GameState.SECOND_ATTEMPT; + } +}, { + + /** + * Generates a series of (semi) random terms for partition sizes for a particular orientation. + * @private + * + * @param {number} quantity + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed for this area + * @returns {Array.} + */ + generatePartitionTerms: function( quantity, allowExponents ) { + const maxPower = quantity - 1; + return _.range( maxPower, -1 ).map( function( power ) { + return AreaChallenge.generateTerm( power, maxPower, quantity, allowExponents ); + } ); + }, + + /** + * Generates a (semi) random term for a partition size. + * @private + * + * @param {number} power - Power of 'x' or '10' that the single digit is multiplied times + * @param {number} maxPower - Maximum power for all terms of this orientation. + * @param {number} quantity - Quantity of terms generated total + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @returns {Term} + */ + generateTerm: function( power, maxPower, quantity, allowExponents ) { + if ( allowExponents ) { + + // Don't let leading x or x^2 have a coefficient. + if ( power === maxPower && power > 0 ) { + return new Term( 1, power ); } else { + const sign = phet.joist.random.nextBoolean() ? 1 : -1; - // Exclude a 1 if our length is 1 - return new Term( phet.joist.random.nextIntBetween( quantity === 1 ? 2 : 1, 9 ) * Math.pow( 10, power ) ); + // Exclude a 1 if our length is 1 (so that we don't just have a single 1 as a dimensinon, so there is the + // ability to have a partition line) + const digit = phet.joist.random.nextIntBetween( ( sign > 0 && quantity === 1 ) ? 2 : 1, 9 ); + return new Term( sign * digit, power ); } } - } ); -} ); + else { + + // Exclude a 1 if our length is 1 + return new Term( phet.joist.random.nextIntBetween( quantity === 1 ? 2 : 1, 9 ) * Math.pow( 10, power ) ); + } + } +} ); \ No newline at end of file diff --git a/js/game/model/AreaChallengeDescription.js b/js/game/model/AreaChallengeDescription.js index 5f7197f9..9dc28a76 100644 --- a/js/game/model/AreaChallengeDescription.js +++ b/js/game/model/AreaChallengeDescription.js @@ -5,831 +5,827 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaChallengeType = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeType' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const EntryType = require( 'AREA_MODEL_COMMON/game/model/EntryType' ); - const GenericLayout = require( 'AREA_MODEL_COMMON/generic/model/GenericLayout' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Permutation = require( 'DOT/Permutation' ); - - // strings - const levelPromptOneProductOneLengthString = require( 'string!AREA_MODEL_COMMON/levelPrompt.oneProduct.oneLength' ); - const levelPromptOneProductTextString = require( 'string!AREA_MODEL_COMMON/levelPrompt.oneProduct.text' ); - const levelPromptOneProductTotalAreaString = require( 'string!AREA_MODEL_COMMON/levelPrompt.oneProduct.totalArea' ); - const levelPromptThreeLengthsString = require( 'string!AREA_MODEL_COMMON/levelPrompt.threeLengths' ); - const levelPromptTotalAreaString = require( 'string!AREA_MODEL_COMMON/levelPrompt.totalArea' ); - const levelPromptTwoLengthsString = require( 'string!AREA_MODEL_COMMON/levelPrompt.twoLengths' ); - const levelPromptTwoProductsString = require( 'string!AREA_MODEL_COMMON/levelPrompt.twoProducts' ); - - // shortcuts - const EDITABLE = EntryType.EDITABLE; - const DYNAMIC = EntryType.DYNAMIC; - const GIVEN = EntryType.GIVEN; - - // We need the ability to generate random permutations for different numbers of elements. It's simplest if we - // enumerate the possibilities here. - const permutations = { - 1: Permutation.permutations( 1 ), - 2: Permutation.permutations( 2 ), - 3: Permutation.permutations( 3 ) - }; +import Permutation from '../../../../dot/js/Permutation.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import GenericLayout from '../../generic/model/GenericLayout.js'; +import AreaChallengeType from './AreaChallengeType.js'; +import EntryType from './EntryType.js'; + +const levelPromptOneProductOneLengthString = areaModelCommonStrings.levelPrompt.oneProduct.oneLength; +const levelPromptOneProductTextString = areaModelCommonStrings.levelPrompt.oneProduct.text; +const levelPromptOneProductTotalAreaString = areaModelCommonStrings.levelPrompt.oneProduct.totalArea; +const levelPromptThreeLengthsString = areaModelCommonStrings.levelPrompt.threeLengths; +const levelPromptTotalAreaString = areaModelCommonStrings.levelPrompt.totalArea; +const levelPromptTwoLengthsString = areaModelCommonStrings.levelPrompt.twoLengths; +const levelPromptTwoProductsString = areaModelCommonStrings.levelPrompt.twoProducts; + +// shortcuts +const EDITABLE = EntryType.EDITABLE; +const DYNAMIC = EntryType.DYNAMIC; +const GIVEN = EntryType.GIVEN; + +// We need the ability to generate random permutations for different numbers of elements. It's simplest if we +// enumerate the possibilities here. +const permutations = { + 1: Permutation.permutations( 1 ), + 2: Permutation.permutations( 2 ), + 3: Permutation.permutations( 3 ) +}; + +/** + * @constructor + * @extends {Object} + * + * @param {Object} config + */ +function AreaChallengeDescription( config ) { + config = merge( { + // required + horizontal: null, // {Array.} + vertical: null, // {Array.} + products: null, // {Array.>} + total: null, // {EntryType} + horizontalTotal: null, // {EntryType} + verticalTotal: null, // {EntryType} + type: null, // {AreaChallengeType} + + // optional + shufflable: true, + unique: true + }, config ); + + assert && assert( Array.isArray( config.horizontal ) ); + assert && assert( Array.isArray( config.vertical ) ); + assert && assert( Array.isArray( config.products ) ); + assert && assert( _.includes( EntryType.VALUES, config.total ) ); + assert && assert( _.includes( EntryType.VALUES, config.horizontalTotal ) ); + assert && assert( _.includes( EntryType.VALUES, config.verticalTotal ) ); + assert && assert( _.includes( AreaChallengeType.VALUES, config.type ) ); + + // @public {OrientationPair.>} - Entry types for partition sizes + this.partitionTypes = new OrientationPair( config.horizontal, config.vertical ); + + // @public {Array.>} - Entry types for partitioned areas + this.productTypes = config.products; + + // @public {OrientationPair.} - Entry types for horizontal and vertical dimension totals + this.dimensionTypes = new OrientationPair( config.horizontalTotal, config.verticalTotal ); + + // @public {EntryType} - Entry type for the total area + this.totalType = config.total; + + // @public {AreaChallengeType} - The type of challenge + this.type = config.type; + + // @public {boolean} + this.allowExponents = this.type === AreaChallengeType.VARIABLES; + + // @public {boolean} - Whether transposing is supported + this.transposable = this.type === AreaChallengeType.NUMBERS; + + // @public {boolean} + this.shufflable = config.shufflable; + + // @public {boolean} + this.unique = config.unique; + + // @public {GenericLayout} + this.layout = GenericLayout.fromValues( config.horizontal.length, config.vertical.length ); +} + +areaModelCommon.register( 'AreaChallengeDescription', AreaChallengeDescription ); + +/** + * Returns a string key used for looking up the proper prompt in promptMap below. + * @private + * + * @param {boolean} hasAreaEntry + * @param {number} numProductEntries + * @param {number} numPartitionEntries + * @returns {string} + */ +function getPromptKey( hasAreaEntry, numProductEntries, numPartitionEntries ) { + return hasAreaEntry + ',' + numProductEntries + ',' + numPartitionEntries; +} + +const promptMap = {}; +promptMap[ getPromptKey( true, 0, 0 ) ] = levelPromptTotalAreaString; +promptMap[ getPromptKey( false, 1, 0 ) ] = levelPromptOneProductTextString; +promptMap[ getPromptKey( false, 2, 0 ) ] = levelPromptTwoProductsString; +promptMap[ getPromptKey( true, 1, 0 ) ] = levelPromptOneProductTotalAreaString; +promptMap[ getPromptKey( false, 1, 1 ) ] = levelPromptOneProductOneLengthString; +promptMap[ getPromptKey( false, 0, 2 ) ] = levelPromptTwoLengthsString; +promptMap[ getPromptKey( false, 0, 3 ) ] = levelPromptThreeLengthsString; + +function isEditable( type ) { + return type === EntryType.EDITABLE; +} + +inherit( Object, AreaChallengeDescription, { /** - * @constructor - * @extends {Object} + * Returns the string representing the prompt for this challenge (what should be done to solve it). + * @public * - * @param {Object} config + * @returns {string} */ - function AreaChallengeDescription( config ) { - config = merge( { - // required - horizontal: null, // {Array.} - vertical: null, // {Array.} - products: null, // {Array.>} - total: null, // {EntryType} - horizontalTotal: null, // {EntryType} - verticalTotal: null, // {EntryType} - type: null, // {AreaChallengeType} - - // optional - shufflable: true, - unique: true - }, config ); - - assert && assert( Array.isArray( config.horizontal ) ); - assert && assert( Array.isArray( config.vertical ) ); - assert && assert( Array.isArray( config.products ) ); - assert && assert( _.includes( EntryType.VALUES, config.total ) ); - assert && assert( _.includes( EntryType.VALUES, config.horizontalTotal ) ); - assert && assert( _.includes( EntryType.VALUES, config.verticalTotal ) ); - assert && assert( _.includes( AreaChallengeType.VALUES, config.type ) ); - - // @public {OrientationPair.>} - Entry types for partition sizes - this.partitionTypes = new OrientationPair( config.horizontal, config.vertical ); - - // @public {Array.>} - Entry types for partitioned areas - this.productTypes = config.products; - - // @public {OrientationPair.} - Entry types for horizontal and vertical dimension totals - this.dimensionTypes = new OrientationPair( config.horizontalTotal, config.verticalTotal ); - - // @public {EntryType} - Entry type for the total area - this.totalType = config.total; - - // @public {AreaChallengeType} - The type of challenge - this.type = config.type; - - // @public {boolean} - this.allowExponents = this.type === AreaChallengeType.VARIABLES; - - // @public {boolean} - Whether transposing is supported - this.transposable = this.type === AreaChallengeType.NUMBERS; - - // @public {boolean} - this.shufflable = config.shufflable; - - // @public {boolean} - this.unique = config.unique; - - // @public {GenericLayout} - this.layout = GenericLayout.fromValues( config.horizontal.length, config.vertical.length ); - } + getPromptString: function() { + const hasAreaEntry = isEditable( this.totalType ); + const numProductEntries = _.flatten( this.productTypes ).filter( isEditable ).length; + const numPartitionEntries = this.partitionTypes.horizontal.concat( this.partitionTypes.vertical ).filter( isEditable ).length; - areaModelCommon.register( 'AreaChallengeDescription', AreaChallengeDescription ); + const text = promptMap[ getPromptKey( hasAreaEntry, numProductEntries, numPartitionEntries ) ]; + assert && assert( text ); + + return text; + }, /** - * Returns a string key used for looking up the proper prompt in promptMap below. - * @private + * Creates a permuted/transposed version of this description, where allowed. + * @public * - * @param {boolean} hasAreaEntry - * @param {number} numProductEntries - * @param {number} numPartitionEntries - * @returns {string} + * @returns {AreaChallengeDescription} */ - function getPromptKey( hasAreaEntry, numProductEntries, numPartitionEntries ) { - return hasAreaEntry + ',' + numProductEntries + ',' + numPartitionEntries; - } + getPermutedDescription: function() { + const options = { + horizontal: this.partitionTypes.horizontal, + vertical: this.partitionTypes.vertical, + products: this.productTypes, + total: this.totalType, + horizontalTotal: this.dimensionTypes.horizontal, + verticalTotal: this.dimensionTypes.vertical, + type: this.type, + transposable: this.transposable, + unique: this.unique + }; + + if ( this.shufflable ) { + // Horizontal shuffle + const horizontalPermutation = phet.joist.random.sample( permutations[ options.horizontal.length ] ); + options.horizontal = horizontalPermutation.apply( options.horizontal ); + options.products = options.products.map( function( row ) { + return horizontalPermutation.apply( row ); + } ); + + // Vertical shuffle + const verticalPermutation = phet.joist.random.sample( permutations[ options.vertical.length ] ); + options.vertical = verticalPermutation.apply( options.vertical ); + options.products = verticalPermutation.apply( options.products ); + } - const promptMap = {}; - promptMap[ getPromptKey( true, 0, 0 ) ] = levelPromptTotalAreaString; - promptMap[ getPromptKey( false, 1, 0 ) ] = levelPromptOneProductTextString; - promptMap[ getPromptKey( false, 2, 0 ) ] = levelPromptTwoProductsString; - promptMap[ getPromptKey( true, 1, 0 ) ] = levelPromptOneProductTotalAreaString; - promptMap[ getPromptKey( false, 1, 1 ) ] = levelPromptOneProductOneLengthString; - promptMap[ getPromptKey( false, 0, 2 ) ] = levelPromptTwoLengthsString; - promptMap[ getPromptKey( false, 0, 3 ) ] = levelPromptThreeLengthsString; - - function isEditable( type ) { - return type === EntryType.EDITABLE; - } + if ( this.transposable && phet.joist.random.nextBoolean() ) { + const tmpPartition = options.horizontal; + options.horizontal = options.vertical; + options.vertical = tmpPartition; - inherit( Object, AreaChallengeDescription, { - /** - * Returns the string representing the prompt for this challenge (what should be done to solve it). - * @public - * - * @returns {string} - */ - getPromptString: function() { - const hasAreaEntry = isEditable( this.totalType ); - const numProductEntries = _.flatten( this.productTypes ).filter( isEditable ).length; - const numPartitionEntries = this.partitionTypes.horizontal.concat( this.partitionTypes.vertical ).filter( isEditable ).length; - - const text = promptMap[ getPromptKey( hasAreaEntry, numProductEntries, numPartitionEntries ) ]; - assert && assert( text ); - - return text; - }, - - /** - * Creates a permuted/transposed version of this description, where allowed. - * @public - * - * @returns {AreaChallengeDescription} - */ - getPermutedDescription: function() { - const options = { - horizontal: this.partitionTypes.horizontal, - vertical: this.partitionTypes.vertical, - products: this.productTypes, - total: this.totalType, - horizontalTotal: this.dimensionTypes.horizontal, - verticalTotal: this.dimensionTypes.vertical, - type: this.type, - transposable: this.transposable, - unique: this.unique - }; - - if ( this.shufflable ) { - // Horizontal shuffle - const horizontalPermutation = phet.joist.random.sample( permutations[ options.horizontal.length ] ); - options.horizontal = horizontalPermutation.apply( options.horizontal ); - options.products = options.products.map( function( row ) { - return horizontalPermutation.apply( row ); - } ); + const tmpTotal = options.horizontalTotal; + options.horizontalTotal = options.verticalTotal; + options.verticalTotal = tmpTotal; - // Vertical shuffle - const verticalPermutation = phet.joist.random.sample( permutations[ options.vertical.length ] ); - options.vertical = verticalPermutation.apply( options.vertical ); - options.products = verticalPermutation.apply( options.products ); - } - - if ( this.transposable && phet.joist.random.nextBoolean() ) { - const tmpPartition = options.horizontal; - options.horizontal = options.vertical; - options.vertical = tmpPartition; - - const tmpTotal = options.horizontalTotal; - options.horizontalTotal = options.verticalTotal; - options.verticalTotal = tmpTotal; - - options.products = _.range( options.vertical.length ).map( function( verticalIndex ) { - return _.range( options.horizontal.length ).map( function( horizontalIndex ) { - return options.products[ horizontalIndex ][ verticalIndex ]; - } ); + options.products = _.range( options.vertical.length ).map( function( verticalIndex ) { + return _.range( options.horizontal.length ).map( function( horizontalIndex ) { + return options.products[ horizontalIndex ][ verticalIndex ]; } ); - } - - return new AreaChallengeDescription( options ); - }, - - /** - * Returns a conditional value (like a ternary) based on whether this is a number or variable challenge. - * @public - * - * @param {*} numberTypeValue - * @param {*} variableTypeValue - * @returns {*} - */ - numberOrVariable: function( numberTypeValue, variableTypeValue ) { - return this.type === AreaChallengeType.VARIABLES ? variableTypeValue : numberTypeValue; + } ); } - } ); - - /*---------------------------------------------------------------------------* - * Numbers 1 - *----------------------------------------------------------------------------*/ - - // L1-1 - AreaChallengeDescription.LEVEL_1_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L1-2 - AreaChallengeDescription.LEVEL_1_NUMBERS_2 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ EDITABLE, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L1-3 - AreaChallengeDescription.LEVEL_1_NUMBERS_3 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L1-4 - AreaChallengeDescription.LEVEL_1_NUMBERS_4 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ EDITABLE, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L1-5 - AreaChallengeDescription.LEVEL_1_NUMBERS_5 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ GIVEN, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L1-6 - AreaChallengeDescription.LEVEL_1_NUMBERS_6 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Numbers 2 - *----------------------------------------------------------------------------*/ - - // L2-1 - AreaChallengeDescription.LEVEL_2_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN ], - [ GIVEN, EDITABLE ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L2-2 - AreaChallengeDescription.LEVEL_2_NUMBERS_2 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L2-3 - AreaChallengeDescription.LEVEL_2_NUMBERS_3 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN, GIVEN ], - [ GIVEN, EDITABLE, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L2-4 - AreaChallengeDescription.LEVEL_2_NUMBERS_4 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN, GIVEN ], - [ GIVEN, GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L2-5 - AreaChallengeDescription.LEVEL_2_NUMBERS_5 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN, GIVEN ], - [ GIVEN, EDITABLE, GIVEN ], - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Numbers 3 - *----------------------------------------------------------------------------*/ - - // L3-1 - AreaChallengeDescription.LEVEL_3_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE ], - vertical: [ GIVEN ], - products: [ - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L3-2 - AreaChallengeDescription.LEVEL_3_NUMBERS_2 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: DYNAMIC, - type: AreaChallengeType.NUMBERS - } ); - - // L3-3 - AreaChallengeDescription.LEVEL_3_NUMBERS_3 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L3-4 - AreaChallengeDescription.LEVEL_3_NUMBERS_4 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: DYNAMIC, - type: AreaChallengeType.NUMBERS - } ); - - // L3-5 - AreaChallengeDescription.LEVEL_3_NUMBERS_5 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ GIVEN, DYNAMIC ], - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L3-6 - AreaChallengeDescription.LEVEL_3_NUMBERS_6 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ DYNAMIC, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Numbers 4 - *----------------------------------------------------------------------------*/ - - // L4-1 - AreaChallengeDescription.LEVEL_4_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, EDITABLE ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ], - [ GIVEN, DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L4-2 - AreaChallengeDescription.LEVEL_4_NUMBERS_2 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ], - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L4-3 - AreaChallengeDescription.LEVEL_4_NUMBERS_3 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ], - [ GIVEN, DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L4-4 - AreaChallengeDescription.LEVEL_4_NUMBERS_4 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, EDITABLE ], - vertical: [ GIVEN, GIVEN, GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ], - [ GIVEN, DYNAMIC, GIVEN ], - [ GIVEN, GIVEN, DYNAMIC ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - // L4-5 - AreaChallengeDescription.LEVEL_4_NUMBERS_5 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN, GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ], - [ GIVEN, DYNAMIC, GIVEN ], - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Numbers 5 - *----------------------------------------------------------------------------*/ - - // L5-1 - AreaChallengeDescription.LEVEL_5_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.NUMBERS - } ); - - // L5-3 - AreaChallengeDescription.LEVEL_5_NUMBERS_3 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Numbers 6 - *----------------------------------------------------------------------------*/ - - // L6-1 - AreaChallengeDescription.LEVEL_6_NUMBERS_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ GIVEN, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.NUMBERS - } ); - - /*---------------------------------------------------------------------------* - * Variables 1 - *----------------------------------------------------------------------------*/ - - // L1-1 - AreaChallengeDescription.LEVEL_1_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ EDITABLE, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L1-2 - AreaChallengeDescription.LEVEL_1_VARIABLES_2 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L1-3 - AreaChallengeDescription.LEVEL_1_VARIABLES_3 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ EDITABLE, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L1-4 - AreaChallengeDescription.LEVEL_1_VARIABLES_4 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - /*---------------------------------------------------------------------------* - * Variables 2 - *----------------------------------------------------------------------------*/ - - // L2-1 - AreaChallengeDescription.LEVEL_2_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN ], - [ GIVEN, EDITABLE ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L2-2 - AreaChallengeDescription.LEVEL_2_VARIABLES_2 = new AreaChallengeDescription( { - horizontal: [ GIVEN, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ EDITABLE, GIVEN ], - [ GIVEN, GIVEN ] - ], - total: EDITABLE, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - /*---------------------------------------------------------------------------* - * Variables 3 - *----------------------------------------------------------------------------*/ - - // L3-1 - AreaChallengeDescription.LEVEL_3_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: DYNAMIC, - type: AreaChallengeType.VARIABLES - } ); - - // L3-2 - AreaChallengeDescription.LEVEL_3_VARIABLES_2 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE ], - vertical: [ GIVEN ], - products: [ - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L3-3 - AreaChallengeDescription.LEVEL_3_VARIABLES_3 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, EDITABLE ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L3-4 - AreaChallengeDescription.LEVEL_3_VARIABLES_4 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: DYNAMIC, - type: AreaChallengeType.VARIABLES - } ); - - // L3-5 - AreaChallengeDescription.LEVEL_3_VARIABLES_5 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, EDITABLE, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ DYNAMIC, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L3-6 - AreaChallengeDescription.LEVEL_3_VARIABLES_6 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN, GIVEN ], - vertical: [ GIVEN ], - products: [ - [ GIVEN, EDITABLE, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - /*---------------------------------------------------------------------------* - * Variables 4 - *----------------------------------------------------------------------------*/ - - // L4-1 - AreaChallengeDescription.LEVEL_4_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE, GIVEN ], - products: [ - [ GIVEN, DYNAMIC ], - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - // L4-2 - AreaChallengeDescription.LEVEL_4_VARIABLES_2 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ GIVEN, GIVEN ], - products: [ - [ GIVEN, EDITABLE ], - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: GIVEN, - verticalTotal: GIVEN, - type: AreaChallengeType.VARIABLES - } ); - - /*---------------------------------------------------------------------------* - * Variables 5 - *----------------------------------------------------------------------------*/ - - // L5-1 - AreaChallengeDescription.LEVEL_5_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.VARIABLES - } ); - - // L5-2 - AreaChallengeDescription.LEVEL_5_VARIABLES_2 = new AreaChallengeDescription( { - horizontal: [ EDITABLE, GIVEN, GIVEN ], - vertical: [ EDITABLE ], - products: [ - [ GIVEN, GIVEN, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.VARIABLES - } ); - - /*---------------------------------------------------------------------------* - * Variables 6 - *----------------------------------------------------------------------------*/ - - // L6-1 - AreaChallengeDescription.LEVEL_6_VARIABLES_1 = new AreaChallengeDescription( { - horizontal: [ GIVEN, EDITABLE ], - vertical: [ GIVEN, EDITABLE ], - products: [ - [ GIVEN, DYNAMIC ], - [ DYNAMIC, GIVEN ] - ], - total: GIVEN, - horizontalTotal: DYNAMIC, - verticalTotal: DYNAMIC, - type: AreaChallengeType.VARIABLES, - shufflable: false, - unique: false - } ); - - return AreaChallengeDescription; + + return new AreaChallengeDescription( options ); + }, + + /** + * Returns a conditional value (like a ternary) based on whether this is a number or variable challenge. + * @public + * + * @param {*} numberTypeValue + * @param {*} variableTypeValue + * @returns {*} + */ + numberOrVariable: function( numberTypeValue, variableTypeValue ) { + return this.type === AreaChallengeType.VARIABLES ? variableTypeValue : numberTypeValue; + } +} ); + +/*---------------------------------------------------------------------------* +* Numbers 1 +*----------------------------------------------------------------------------*/ + +// L1-1 +AreaChallengeDescription.LEVEL_1_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L1-2 +AreaChallengeDescription.LEVEL_1_NUMBERS_2 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ EDITABLE, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L1-3 +AreaChallengeDescription.LEVEL_1_NUMBERS_3 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L1-4 +AreaChallengeDescription.LEVEL_1_NUMBERS_4 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ EDITABLE, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L1-5 +AreaChallengeDescription.LEVEL_1_NUMBERS_5 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ GIVEN, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L1-6 +AreaChallengeDescription.LEVEL_1_NUMBERS_6 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Numbers 2 +*----------------------------------------------------------------------------*/ + +// L2-1 +AreaChallengeDescription.LEVEL_2_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN ], + [ GIVEN, EDITABLE ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L2-2 +AreaChallengeDescription.LEVEL_2_NUMBERS_2 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L2-3 +AreaChallengeDescription.LEVEL_2_NUMBERS_3 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN, GIVEN ], + [ GIVEN, EDITABLE, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L2-4 +AreaChallengeDescription.LEVEL_2_NUMBERS_4 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN, GIVEN ], + [ GIVEN, GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L2-5 +AreaChallengeDescription.LEVEL_2_NUMBERS_5 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN, GIVEN ], + [ GIVEN, EDITABLE, GIVEN ], + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Numbers 3 +*----------------------------------------------------------------------------*/ + +// L3-1 +AreaChallengeDescription.LEVEL_3_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE ], + vertical: [ GIVEN ], + products: [ + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L3-2 +AreaChallengeDescription.LEVEL_3_NUMBERS_2 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: DYNAMIC, + type: AreaChallengeType.NUMBERS +} ); + +// L3-3 +AreaChallengeDescription.LEVEL_3_NUMBERS_3 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L3-4 +AreaChallengeDescription.LEVEL_3_NUMBERS_4 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: DYNAMIC, + type: AreaChallengeType.NUMBERS +} ); + +// L3-5 +AreaChallengeDescription.LEVEL_3_NUMBERS_5 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ GIVEN, DYNAMIC ], + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L3-6 +AreaChallengeDescription.LEVEL_3_NUMBERS_6 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ DYNAMIC, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Numbers 4 +*----------------------------------------------------------------------------*/ + +// L4-1 +AreaChallengeDescription.LEVEL_4_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, EDITABLE ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ], + [ GIVEN, DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L4-2 +AreaChallengeDescription.LEVEL_4_NUMBERS_2 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ], + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L4-3 +AreaChallengeDescription.LEVEL_4_NUMBERS_3 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ], + [ GIVEN, DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L4-4 +AreaChallengeDescription.LEVEL_4_NUMBERS_4 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, EDITABLE ], + vertical: [ GIVEN, GIVEN, GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ], + [ GIVEN, DYNAMIC, GIVEN ], + [ GIVEN, GIVEN, DYNAMIC ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +// L4-5 +AreaChallengeDescription.LEVEL_4_NUMBERS_5 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN, GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ], + [ GIVEN, DYNAMIC, GIVEN ], + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Numbers 5 +*----------------------------------------------------------------------------*/ + +// L5-1 +AreaChallengeDescription.LEVEL_5_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.NUMBERS +} ); + +// L5-3 +AreaChallengeDescription.LEVEL_5_NUMBERS_3 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Numbers 6 +*----------------------------------------------------------------------------*/ + +// L6-1 +AreaChallengeDescription.LEVEL_6_NUMBERS_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ GIVEN, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.NUMBERS +} ); + +/*---------------------------------------------------------------------------* +* Variables 1 +*----------------------------------------------------------------------------*/ + +// L1-1 +AreaChallengeDescription.LEVEL_1_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ EDITABLE, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L1-2 +AreaChallengeDescription.LEVEL_1_VARIABLES_2 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L1-3 +AreaChallengeDescription.LEVEL_1_VARIABLES_3 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ EDITABLE, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L1-4 +AreaChallengeDescription.LEVEL_1_VARIABLES_4 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +/*---------------------------------------------------------------------------* +* Variables 2 +*----------------------------------------------------------------------------*/ + +// L2-1 +AreaChallengeDescription.LEVEL_2_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN ], + [ GIVEN, EDITABLE ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L2-2 +AreaChallengeDescription.LEVEL_2_VARIABLES_2 = new AreaChallengeDescription( { + horizontal: [ GIVEN, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ EDITABLE, GIVEN ], + [ GIVEN, GIVEN ] + ], + total: EDITABLE, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +/*---------------------------------------------------------------------------* +* Variables 3 +*----------------------------------------------------------------------------*/ + +// L3-1 +AreaChallengeDescription.LEVEL_3_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: DYNAMIC, + type: AreaChallengeType.VARIABLES +} ); + +// L3-2 +AreaChallengeDescription.LEVEL_3_VARIABLES_2 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE ], + vertical: [ GIVEN ], + products: [ + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L3-3 +AreaChallengeDescription.LEVEL_3_VARIABLES_3 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, EDITABLE ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L3-4 +AreaChallengeDescription.LEVEL_3_VARIABLES_4 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: DYNAMIC, + type: AreaChallengeType.VARIABLES } ); + +// L3-5 +AreaChallengeDescription.LEVEL_3_VARIABLES_5 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, EDITABLE, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ DYNAMIC, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L3-6 +AreaChallengeDescription.LEVEL_3_VARIABLES_6 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN, GIVEN ], + vertical: [ GIVEN ], + products: [ + [ GIVEN, EDITABLE, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +/*---------------------------------------------------------------------------* +* Variables 4 +*----------------------------------------------------------------------------*/ + +// L4-1 +AreaChallengeDescription.LEVEL_4_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE, GIVEN ], + products: [ + [ GIVEN, DYNAMIC ], + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +// L4-2 +AreaChallengeDescription.LEVEL_4_VARIABLES_2 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ GIVEN, GIVEN ], + products: [ + [ GIVEN, EDITABLE ], + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: GIVEN, + verticalTotal: GIVEN, + type: AreaChallengeType.VARIABLES +} ); + +/*---------------------------------------------------------------------------* +* Variables 5 +*----------------------------------------------------------------------------*/ + +// L5-1 +AreaChallengeDescription.LEVEL_5_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.VARIABLES +} ); + +// L5-2 +AreaChallengeDescription.LEVEL_5_VARIABLES_2 = new AreaChallengeDescription( { + horizontal: [ EDITABLE, GIVEN, GIVEN ], + vertical: [ EDITABLE ], + products: [ + [ GIVEN, GIVEN, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.VARIABLES +} ); + +/*---------------------------------------------------------------------------* +* Variables 6 +*----------------------------------------------------------------------------*/ + +// L6-1 +AreaChallengeDescription.LEVEL_6_VARIABLES_1 = new AreaChallengeDescription( { + horizontal: [ GIVEN, EDITABLE ], + vertical: [ GIVEN, EDITABLE ], + products: [ + [ GIVEN, DYNAMIC ], + [ DYNAMIC, GIVEN ] + ], + total: GIVEN, + horizontalTotal: DYNAMIC, + verticalTotal: DYNAMIC, + type: AreaChallengeType.VARIABLES, + shufflable: false, + unique: false +} ); + +export default AreaChallengeDescription; \ No newline at end of file diff --git a/js/game/model/AreaChallengeType.js b/js/game/model/AreaChallengeType.js index 5fa7c5ae..85d55778 100644 --- a/js/game/model/AreaChallengeType.js +++ b/js/game/model/AreaChallengeType.js @@ -5,27 +5,23 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const AreaChallengeType = { - NUMBERS: 'NUMBERS', - VARIABLES: 'VARIABLES' - }; +const AreaChallengeType = { + NUMBERS: 'NUMBERS', + VARIABLES: 'VARIABLES' +}; - areaModelCommon.register( 'AreaChallengeType', AreaChallengeType ); +areaModelCommon.register( 'AreaChallengeType', AreaChallengeType ); - // @public {Array.} - All values the enumeration can take. - AreaChallengeType.VALUES = [ - AreaChallengeType.NUMBERS, - AreaChallengeType.VARIABLES - ]; +// @public {Array.} - All values the enumeration can take. +AreaChallengeType.VALUES = [ + AreaChallengeType.NUMBERS, + AreaChallengeType.VARIABLES +]; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( AreaChallengeType ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( AreaChallengeType ); } - return AreaChallengeType; -} ); +export default AreaChallengeType; \ No newline at end of file diff --git a/js/game/model/AreaLevel.js b/js/game/model/AreaLevel.js index e950a9e1..e700846b 100644 --- a/js/game/model/AreaLevel.js +++ b/js/game/model/AreaLevel.js @@ -5,149 +5,145 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaChallenge = require( 'AREA_MODEL_COMMON/game/model/AreaChallenge' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const NumberProperty = require( 'AXON/NumberProperty' ); - /** - * @constructor - * @extends {Object} - * - * @param {number} number - * @param {AreaChallengeType} type - * @param {Property.} colorProperty - * @param {Array.} challengeDescriptions - */ - function AreaLevel( number, type, colorProperty, challengeDescriptions ) { - const self = this; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import NumberProperty from '../../../../axon/js/NumberProperty.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaChallenge from './AreaChallenge.js'; +import GameState from './GameState.js'; - // @public {number} - Will be the value 1 for "Level 1". Not using the 0-based values used in VEGAS, so sometimes - // this value will need to be decremented when passed to VEGAS components. - this.number = number; +/** + * @constructor + * @extends {Object} + * + * @param {number} number + * @param {AreaChallengeType} type + * @param {Property.} colorProperty + * @param {Array.} challengeDescriptions + */ +function AreaLevel( number, type, colorProperty, challengeDescriptions ) { + const self = this; - // @public {AreaChallengeType} - this.type = type; + // @public {number} - Will be the value 1 for "Level 1". Not using the 0-based values used in VEGAS, so sometimes + // this value will need to be decremented when passed to VEGAS components. + this.number = number; - // @public {Property.} - this.colorProperty = colorProperty; + // @public {AreaChallengeType} + this.type = type; - // @public {Array.} - Descriptions for each type of level - this.challengeDescriptions = challengeDescriptions; + // @public {Property.} + this.colorProperty = colorProperty; - // @public {Property.} - Ranges from 0 to AreaModelCommonConstants.PERFECT_SCORE - // (since 2 points are rewarded for first attempt correct) - this.scoreProperty = new NumberProperty( 0 ); + // @public {Array.} - Descriptions for each type of level + this.challengeDescriptions = challengeDescriptions; - // @public {Array.} - this.challenges = this.generateChallenges(); + // @public {Property.} - Ranges from 0 to AreaModelCommonConstants.PERFECT_SCORE + // (since 2 points are rewarded for first attempt correct) + this.scoreProperty = new NumberProperty( 0 ); + + // @public {Array.} + this.challenges = this.generateChallenges(); + + // @public {Property.} - The index of the current challenge. + this.challengeIndexProperty = new NumberProperty( 0 ); + + // @public {Property.} + this.currentChallengeProperty = new DerivedProperty( [ this.challengeIndexProperty ], function( index ) { + return self.challenges[ index ]; + } ); - // @public {Property.} - The index of the current challenge. - this.challengeIndexProperty = new NumberProperty( 0 ); + // @public {boolean} - Whether the level is finished + this.finished = false; +} - // @public {Property.} - this.currentChallengeProperty = new DerivedProperty( [ this.challengeIndexProperty ], function( index ) { - return self.challenges[ index ]; +areaModelCommon.register( 'AreaLevel', AreaLevel ); + +export default inherit( Object, AreaLevel, { + /** + * Generates six challenges. + * @private + * + * @returns {Array.} + */ + generateChallenges: function() { + + // Always include the first description as the first challenge + let descriptions = [ this.challengeDescriptions[ 0 ] ]; + + // Shuffle the rest of them in a random order + descriptions = descriptions.concat( phet.joist.random.shuffle( descriptions.slice( 1 ) ) ); + + // Then fill with random challenges if there are any more spaces + while ( descriptions.length < AreaModelCommonConstants.NUM_CHALLENGES ) { + descriptions.push( phet.joist.random.sample( this.challengeDescriptions ) ); + } + + // Generate based on the descriptions + return descriptions.map( function( description ) { + return new AreaChallenge( description ); } ); + }, - // @public {boolean} - Whether the level is finished - this.finished = false; - } + /** + * Selects the level (resetting progress and generates a new challenge). It is not the same as starting the level, + * It's more of a "switch to" operation, since there will already be challenges. We want to delay the resetting of + * the level until it's selected again (unless it was already finished). + * @public + */ + select: function() { + if ( this.finished ) { + this.finished = false; + this.reset(); + } + }, + + /** + * Marks the level as finished. This means challenges will be regenerated if the level is selected again. + * @public + */ + finish: function() { + this.finished = true; + }, - areaModelCommon.register( 'AreaLevel', AreaLevel ); - - return inherit( Object, AreaLevel, { - /** - * Generates six challenges. - * @private - * - * @returns {Array.} - */ - generateChallenges: function() { - - // Always include the first description as the first challenge - let descriptions = [ this.challengeDescriptions[ 0 ] ]; - - // Shuffle the rest of them in a random order - descriptions = descriptions.concat( phet.joist.random.shuffle( descriptions.slice( 1 ) ) ); - - // Then fill with random challenges if there are any more spaces - while ( descriptions.length < AreaModelCommonConstants.NUM_CHALLENGES ) { - descriptions.push( phet.joist.random.sample( this.challengeDescriptions ) ); - } - - // Generate based on the descriptions - return descriptions.map( function( description ) { - return new AreaChallenge( description ); - } ); - }, - - /** - * Selects the level (resetting progress and generates a new challenge). It is not the same as starting the level, - * It's more of a "switch to" operation, since there will already be challenges. We want to delay the resetting of - * the level until it's selected again (unless it was already finished). - * @public - */ - select: function() { - if ( this.finished ) { - this.finished = false; - this.reset(); - } - }, - - /** - * Marks the level as finished. This means challenges will be regenerated if the level is selected again. - * @public - */ - finish: function() { - this.finished = true; - }, - - /** - * Move to the next challenge. - * @public - */ - next: function() { - if ( this.challengeIndexProperty.value === AreaModelCommonConstants.NUM_CHALLENGES - 1 ) { - this.finish(); - this.currentChallengeProperty.value.stateProperty.value = GameState.LEVEL_COMPLETE; - } - else { - this.challengeIndexProperty.value += 1; - } - }, - - /** - * When we start over, we want to reset the score, but not immediately change the challenges yet (we'll wait until - * we re-select this level). - * @public - * - * See https://github.com/phetsims/area-model-common/issues/87 and - * https://github.com/phetsims/area-model-common/issues/96. - */ - startOver: function() { - this.scoreProperty.reset(); + /** + * Move to the next challenge. + * @public + */ + next: function() { + if ( this.challengeIndexProperty.value === AreaModelCommonConstants.NUM_CHALLENGES - 1 ) { this.finish(); - }, + this.currentChallengeProperty.value.stateProperty.value = GameState.LEVEL_COMPLETE; + } + else { + this.challengeIndexProperty.value += 1; + } + }, - /** - * Returns the model to its initial state. - * @public - */ - reset: function() { - this.challenges = this.generateChallenges(); + /** + * When we start over, we want to reset the score, but not immediately change the challenges yet (we'll wait until + * we re-select this level). + * @public + * + * See https://github.com/phetsims/area-model-common/issues/87 and + * https://github.com/phetsims/area-model-common/issues/96. + */ + startOver: function() { + this.scoreProperty.reset(); + this.finish(); + }, + + /** + * Returns the model to its initial state. + * @public + */ + reset: function() { + this.challenges = this.generateChallenges(); - this.scoreProperty.reset(); - this.challengeIndexProperty.reset(); + this.scoreProperty.reset(); + this.challengeIndexProperty.reset(); - this.challengeIndexProperty.notifyListenersStatic(); - } - } ); -} ); + this.challengeIndexProperty.notifyListenersStatic(); + } +} ); \ No newline at end of file diff --git a/js/game/model/Entry.js b/js/game/model/Entry.js index 084aa661..8b8969d9 100644 --- a/js/game/model/Entry.js +++ b/js/game/model/Entry.js @@ -5,71 +5,68 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const EntryDisplayType = require( 'AREA_MODEL_COMMON/game/model/EntryDisplayType' ); - const EntryStatus = require( 'AREA_MODEL_COMMON/game/model/EntryStatus' ); - const EntryType = require( 'AREA_MODEL_COMMON/game/model/EntryType' ); - const inherit = require( 'PHET_CORE/inherit' ); - const InputMethod = require( 'AREA_MODEL_COMMON/game/model/InputMethod' ); - const merge = require( 'PHET_CORE/merge' ); - const Property = require( 'AXON/Property' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Term from '../../common/model/Term.js'; +import EntryDisplayType from './EntryDisplayType.js'; +import EntryStatus from './EntryStatus.js'; +import EntryType from './EntryType.js'; +import InputMethod from './InputMethod.js'; - /** - * @constructor - * @extends {Object} - * - * @param {Term|null} value - The initial value - * @param {Object} [options] - */ - function Entry( value, options ) { - options = merge( { - type: EntryType.GIVEN, - displayType: EntryDisplayType.HIDDEN, - inputMethod: InputMethod.CONSTANT, - numberOfDigits: 0, - correctValue: null // Only used for the total coefficients - }, options ); +/** + * @constructor + * @extends {Object} + * + * @param {Term|null} value - The initial value + * @param {Object} [options] + */ +function Entry( value, options ) { + options = merge( { + type: EntryType.GIVEN, + displayType: EntryDisplayType.HIDDEN, + inputMethod: InputMethod.CONSTANT, + numberOfDigits: 0, + correctValue: null // Only used for the total coefficients + }, options ); - // Always start off by editing null, and it should be the default value. - if ( options.displayType === EntryDisplayType.EDITABLE ) { - value = null; - } + // Always start off by editing null, and it should be the default value. + if ( options.displayType === EntryDisplayType.EDITABLE ) { + value = null; + } - // @public {Property.} - The current value of the entry - this.valueProperty = new Property( value, { - useDeepEquality: true, - isValidValue: Term.isTermOrNull - } ); + // @public {Property.} - The current value of the entry + this.valueProperty = new Property( value, { + useDeepEquality: true, + isValidValue: Term.isTermOrNull + } ); - // @public {EntryType} - Whether we are dynamic/editable/given. - this.type = options.type; + // @public {EntryType} - Whether we are dynamic/editable/given. + this.type = options.type; - // @public {EntryDisplayType} - Whether we are a readout or editable/hidden - this.displayType = options.displayType; + // @public {EntryDisplayType} - Whether we are a readout or editable/hidden + this.displayType = options.displayType; - // @public {InputMethod} - What format should be used if we are edited? (Need different keypads or a polynomial - // input) - this.inputMethod = options.inputMethod; + // @public {InputMethod} - What format should be used if we are edited? (Need different keypads or a polynomial + // input) + this.inputMethod = options.inputMethod; - // @public {number} - this.digits = options.numberOfDigits; + // @public {number} + this.digits = options.numberOfDigits; - // @public {Property.} - this.statusProperty = new Property( EntryStatus.DIRTY ); + // @public {Property.} + this.statusProperty = new Property( EntryStatus.DIRTY ); - // @public {Property.} - Our value, except for null if there is an error highlight - this.nonErrorValueProperty = new DerivedProperty( [ this.valueProperty, this.statusProperty ], function( value, highlight ) { - return ( highlight === EntryStatus.INCORRECT ) ? null : value; - } ); - } + // @public {Property.} - Our value, except for null if there is an error highlight + this.nonErrorValueProperty = new DerivedProperty( [ this.valueProperty, this.statusProperty ], function( value, highlight ) { + return ( highlight === EntryStatus.INCORRECT ) ? null : value; + } ); +} - areaModelCommon.register( 'Entry', Entry ); +areaModelCommon.register( 'Entry', Entry ); - return inherit( Object, Entry ); -} ); +inherit( Object, Entry ); +export default Entry; \ No newline at end of file diff --git a/js/game/model/EntryDisplayType.js b/js/game/model/EntryDisplayType.js index bf5ddd3b..a8d22132 100644 --- a/js/game/model/EntryDisplayType.js +++ b/js/game/model/EntryDisplayType.js @@ -5,29 +5,25 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const EntryDisplayType = { - EDITABLE: 'EDITABLE', - READOUT: 'READOUT', - HIDDEN: 'HIDDEN' - }; +const EntryDisplayType = { + EDITABLE: 'EDITABLE', + READOUT: 'READOUT', + HIDDEN: 'HIDDEN' +}; - areaModelCommon.register( 'EntryDisplayType', EntryDisplayType ); +areaModelCommon.register( 'EntryDisplayType', EntryDisplayType ); - // @public {Array.} - All values the enumeration can take. - EntryDisplayType.VALUES = [ - EntryDisplayType.EDITABLE, // editable, and shows the edited value - EntryDisplayType.READOUT, // just the value shown, does not look editable - EntryDisplayType.HIDDEN // nothing shown - ]; +// @public {Array.} - All values the enumeration can take. +EntryDisplayType.VALUES = [ + EntryDisplayType.EDITABLE, // editable, and shows the edited value + EntryDisplayType.READOUT, // just the value shown, does not look editable + EntryDisplayType.HIDDEN // nothing shown +]; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( EntryDisplayType ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( EntryDisplayType ); } - return EntryDisplayType; -} ); +export default EntryDisplayType; \ No newline at end of file diff --git a/js/game/model/EntryStatus.js b/js/game/model/EntryStatus.js index 7c3a5850..aa6ac384 100644 --- a/js/game/model/EntryStatus.js +++ b/js/game/model/EntryStatus.js @@ -5,29 +5,25 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const EntryStatus = { - NORMAL: 'NORMAL', - DIRTY: 'DIRTY', // needs to be interacted with before submitting - INCORRECT: 'INCORRECT' // was wrong after submission - }; +const EntryStatus = { + NORMAL: 'NORMAL', + DIRTY: 'DIRTY', // needs to be interacted with before submitting + INCORRECT: 'INCORRECT' // was wrong after submission +}; - areaModelCommon.register( 'EntryStatus', EntryStatus ); +areaModelCommon.register( 'EntryStatus', EntryStatus ); - // @public {Array.} - All values the enumeration can take. - EntryStatus.VALUES = [ - EntryStatus.NORMAL, - EntryStatus.DIRTY, - EntryStatus.INCORRECT - ]; +// @public {Array.} - All values the enumeration can take. +EntryStatus.VALUES = [ + EntryStatus.NORMAL, + EntryStatus.DIRTY, + EntryStatus.INCORRECT +]; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( EntryStatus ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( EntryStatus ); } - return EntryStatus; -} ); +export default EntryStatus; \ No newline at end of file diff --git a/js/game/model/EntryType.js b/js/game/model/EntryType.js index 76f92e52..332983dd 100644 --- a/js/game/model/EntryType.js +++ b/js/game/model/EntryType.js @@ -5,48 +5,44 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const EntryDisplayType = require( 'AREA_MODEL_COMMON/game/model/EntryDisplayType' ); - - const EntryType = { - EDITABLE: 'EDITABLE', - DYNAMIC: 'DYNAMIC', - GIVEN: 'GIVEN' - }; - - areaModelCommon.register( 'EntryType', EntryType ); - - // @public {Array.} - All values the enumeration can take. - EntryType.VALUES = [ - EntryType.EDITABLE, // the user inputs this value - EntryType.DYNAMIC, // this value can change (be computed) based on the user's input - EntryType.GIVEN // this value is fixed for a given challenge - ]; - - const gameToDisplayMap = {}; - gameToDisplayMap[ EntryType.EDITABLE ] = EntryDisplayType.EDITABLE; - gameToDisplayMap[ EntryType.DYNAMIC ] = EntryDisplayType.READOUT; - gameToDisplayMap[ EntryType.GIVEN ] = EntryDisplayType.READOUT; - - /** - * Returns the preferred display type for a given game value. - * @public - * - * @param {EntryType} type - * @returns {boolean} - */ - EntryType.toDisplayType = function( type ) { - assert && assert( _.includes( EntryType.VALUES, type ) ); - - return gameToDisplayMap[ type ]; - }; - - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( EntryType ); } - - return EntryType; -} ); + +import areaModelCommon from '../../areaModelCommon.js'; +import EntryDisplayType from './EntryDisplayType.js'; + +const EntryType = { + EDITABLE: 'EDITABLE', + DYNAMIC: 'DYNAMIC', + GIVEN: 'GIVEN' +}; + +areaModelCommon.register( 'EntryType', EntryType ); + +// @public {Array.} - All values the enumeration can take. +EntryType.VALUES = [ + EntryType.EDITABLE, // the user inputs this value + EntryType.DYNAMIC, // this value can change (be computed) based on the user's input + EntryType.GIVEN // this value is fixed for a given challenge +]; + +const gameToDisplayMap = {}; +gameToDisplayMap[ EntryType.EDITABLE ] = EntryDisplayType.EDITABLE; +gameToDisplayMap[ EntryType.DYNAMIC ] = EntryDisplayType.READOUT; +gameToDisplayMap[ EntryType.GIVEN ] = EntryDisplayType.READOUT; + +/** + * Returns the preferred display type for a given game value. + * @public + * + * @param {EntryType} type + * @returns {boolean} + */ +EntryType.toDisplayType = function( type ) { + assert && assert( _.includes( EntryType.VALUES, type ) ); + + return gameToDisplayMap[ type ]; +}; + +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( EntryType ); } + +export default EntryType; \ No newline at end of file diff --git a/js/game/model/GameAreaDisplay.js b/js/game/model/GameAreaDisplay.js index d122f0fd..ed62ad47 100644 --- a/js/game/model/GameAreaDisplay.js +++ b/js/game/model/GameAreaDisplay.js @@ -5,88 +5,85 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaChallenge = require( 'AREA_MODEL_COMMON/game/model/AreaChallenge' ); - const AreaChallengeDescription = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeDescription' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryType = require( 'AREA_MODEL_COMMON/game/model/EntryType' ); - const GenericAreaDisplay = require( 'AREA_MODEL_COMMON/generic/model/GenericAreaDisplay' ); - const inherit = require( 'PHET_CORE/inherit' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Property = require( 'AXON/Property' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import GenericAreaDisplay from '../../generic/model/GenericAreaDisplay.js'; +import AreaChallenge from './AreaChallenge.js'; +import AreaChallengeDescription from './AreaChallengeDescription.js'; +import Entry from './Entry.js'; +import EntryType from './EntryType.js'; - /** - * @constructor - * @extends {GenericAreaDisplay} - * - * @param {Property.} areaChallengeProperty - */ - function GameAreaDisplay( areaChallengeProperty ) { - const self = this; +/** + * @constructor + * @extends {GenericAreaDisplay} + * + * @param {Property.} areaChallengeProperty + */ +function GameAreaDisplay( areaChallengeProperty ) { + const self = this; - // This placeholder will never be seen in the user interface, it is to help make sure areaChallengeProperty is never - // null, see below. - const placeholderChallenge = new AreaChallenge( AreaChallengeDescription.LEVEL_1_NUMBERS_1 ); + // This placeholder will never be seen in the user interface, it is to help make sure areaChallengeProperty is never + // null, see below. + const placeholderChallenge = new AreaChallenge( AreaChallengeDescription.LEVEL_1_NUMBERS_1 ); - // @public {Property.} - Always has an AreaChallenge, unlike the passed-in nullable variety. This is - // because we want to show the view of the last challenge as we animate back to the level-selection screen. - this.areaChallengeProperty = new Property( placeholderChallenge ); - areaChallengeProperty.link( function( areaChallenge ) { - if ( areaChallenge ) { - self.areaChallengeProperty.value = areaChallenge; - } - } ); + // @public {Property.} - Always has an AreaChallenge, unlike the passed-in nullable variety. This is + // because we want to show the view of the last challenge as we animate back to the level-selection screen. + this.areaChallengeProperty = new Property( placeholderChallenge ); + areaChallengeProperty.link( function( areaChallenge ) { + if ( areaChallenge ) { + self.areaChallengeProperty.value = areaChallenge; + } + } ); - GenericAreaDisplay.call( this, new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'area' ) ) ); + GenericAreaDisplay.call( this, new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'area' ) ) ); - // @public {OrientationPair.>} - Values for dimension line label and product box, null is - // hidden. - // NOTE: Overridden from the AreaDisplay version. - this.totalProperties = OrientationPair.create( function( orientation ) { - return new DynamicProperty( self.areaChallengeProperty, { - derive: function( areaChallenge ) { - return areaChallenge.totalProperties.get( orientation ); - } - } ); + // @public {OrientationPair.>} - Values for dimension line label and product box, null is + // hidden. + // NOTE: Overridden from the AreaDisplay version. + this.totalProperties = OrientationPair.create( function( orientation ) { + return new DynamicProperty( self.areaChallengeProperty, { + derive: function( areaChallenge ) { + return areaChallenge.totalProperties.get( orientation ); + } } ); + } ); - // @public {OrientationPair.>>} - // Partition sizes. Inner values may be changed by the view client. + // @public {OrientationPair.>>} + // Partition sizes. Inner values may be changed by the view client. - this.partitionSizeEntriesProperties = OrientationPair.create( function( orientation ) { - return new DerivedProperty( [ self.areaChallengeProperty ], function( areaChallenge ) { - // If there's only one value on a side (and it's a given), there is no use showing a size here. - if ( areaChallenge.partitionSizeEntries.get( orientation ).length === 1 && - areaChallenge.description.partitionTypes.get( orientation )[ 0 ] === EntryType.GIVEN ) { - return [ new Entry( null ) ]; - } - else { - return areaChallenge.partitionSizeEntries.get( orientation ); - } - } ); + this.partitionSizeEntriesProperties = OrientationPair.create( function( orientation ) { + return new DerivedProperty( [ self.areaChallengeProperty ], function( areaChallenge ) { + // If there's only one value on a side (and it's a given), there is no use showing a size here. + if ( areaChallenge.partitionSizeEntries.get( orientation ).length === 1 && + areaChallenge.description.partitionTypes.get( orientation )[ 0 ] === EntryType.GIVEN ) { + return [ new Entry( null ) ]; + } + else { + return areaChallenge.partitionSizeEntries.get( orientation ); + } } ); + } ); - // @public {Property.>} - Reference to a 2D array for the grid of partial products. - // First index is vertical (for the row), second is horizontal (for the column) - this.partialProductEntriesProperty = new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'partialProductSizeEntries' ) ); + // @public {Property.>} - Reference to a 2D array for the grid of partial products. + // First index is vertical (for the row), second is horizontal (for the column) + this.partialProductEntriesProperty = new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'partialProductSizeEntries' ) ); - // @public {Property.>} - Reference to an array of editable properties for the total area. - // Uses just one for an editable "constant" value, and multiple properties for polynomial entry (one per term). - this.totalEntriesProperty = new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'totalCoefficientEntries' ) ); + // @public {Property.>} - Reference to an array of editable properties for the total area. + // Uses just one for an editable "constant" value, and multiple properties for polynomial entry (one per term). + this.totalEntriesProperty = new DerivedProperty( [ this.areaChallengeProperty ], _.property( 'totalCoefficientEntries' ) ); - // @public {Property.} - The "total area" property reference - this.totalProperty = new DynamicProperty( this.areaChallengeProperty, { - derive: 'totalProperty' - } ); - } + // @public {Property.} - The "total area" property reference + this.totalProperty = new DynamicProperty( this.areaChallengeProperty, { + derive: 'totalProperty' + } ); +} - areaModelCommon.register( 'GameAreaDisplay', GameAreaDisplay ); +areaModelCommon.register( 'GameAreaDisplay', GameAreaDisplay ); - return inherit( GenericAreaDisplay, GameAreaDisplay ); -} ); +inherit( GenericAreaDisplay, GameAreaDisplay ); +export default GameAreaDisplay; \ No newline at end of file diff --git a/js/game/model/GameAreaModel.js b/js/game/model/GameAreaModel.js index 01d9f287..79adee8a 100644 --- a/js/game/model/GameAreaModel.js +++ b/js/game/model/GameAreaModel.js @@ -5,177 +5,173 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaLevel = require( 'AREA_MODEL_COMMON/game/model/AreaLevel' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryStatus = require( 'AREA_MODEL_COMMON/game/model/EntryStatus' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaLevel from './AreaLevel.js'; +import Entry from './Entry.js'; +import EntryStatus from './EntryStatus.js'; +import GameState from './GameState.js'; + +/** + * @constructor + * @extends {Object} + * + * @param {Array.} levels + * @param {boolean} hasExponents + */ +function GameAreaModel( levels, hasExponents ) { + + // @public {Array.} + this.levels = levels; + + // @public {boolean} + this.hasExponents = hasExponents; + + // @public {Property.} - The current level + this.currentLevelProperty = new Property( null, { + isValidValue: function( value ) { + return value === null || value instanceof AreaLevel; + } + } ); + + // @public {Property.} + this.currentChallengeProperty = new DynamicProperty( this.currentLevelProperty, { + derive: 'currentChallengeProperty' + } ); + this.currentChallengeProperty.lazyLink( this.activeEntryProperty.reset.bind( this.activeEntryProperty ) ); + + // @public {Property.} - This is null when there is no current challenge (e.g. level selection) + this.stateProperty = new DynamicProperty( this.currentChallengeProperty, { + derive: 'stateProperty', + bidirectional: true + }, { + validValues: GameState.VALUES.concat( [ null ] ) + } ); + + // @public {Property.} - Whether the check button should be enabled + this.allowCheckingProperty = new DynamicProperty( this.currentChallengeProperty, { + derive: 'allowCheckingProperty', + defaultValue: false + } ); +} + +areaModelCommon.register( 'GameAreaModel', GameAreaModel ); + +export default inherit( Object, GameAreaModel, { /** - * @constructor - * @extends {Object} + * Selects a given level, making it the current level. + * @public * - * @param {Array.} levels - * @param {boolean} hasExponents + * @param {AreaLevel} level */ - function GameAreaModel( levels, hasExponents ) { + selectLevel: function( level ) { + level.select(); + this.currentLevelProperty.value = level; + }, - // @public {Array.} - this.levels = levels; + /** + * Sets the value of the current editable property to that of the provided term. + * @public + * + * @param {Term} term + */ + setActiveTerm: function( term ) { + // Appearance change for https://github.com/phetsims/area-model-common/issues/42, handles only showing the + // "wrong" values for the variables 6-1 case (non-unique) + this.currentChallengeProperty.value.checkNonUniqueChanges(); - // @public {boolean} - this.hasExponents = hasExponents; + this.activeEntryProperty.value.valueProperty.value = term; + this.activeEntryProperty.value.statusProperty.value = EntryStatus.NORMAL; + this.activeEntryProperty.value = null; + }, - // @public {Property.} - The current level - this.currentLevelProperty = new Property( null, { - isValidValue: function( value ) { - return value === null || value instanceof AreaLevel; - } - } ); + /** + * Checks the user's input against the known answer. + * @public + */ + check: function() { + // Close any keypads, see https://github.com/phetsims/area-model-common/issues/66 + this.activeEntryProperty.value = null; - // @public {Property.} - this.currentChallengeProperty = new DynamicProperty( this.currentLevelProperty, { - derive: 'currentChallengeProperty' - } ); - this.currentChallengeProperty.lazyLink( this.activeEntryProperty.reset.bind( this.activeEntryProperty ) ); - - // @public {Property.} - This is null when there is no current challenge (e.g. level selection) - this.stateProperty = new DynamicProperty( this.currentChallengeProperty, { - derive: 'stateProperty', - bidirectional: true - }, { - validValues: GameState.VALUES.concat( [ null ] ) - } ); + this.currentLevelProperty.value.scoreProperty.value += challenge.check(); + }, - // @public {Property.} - Whether the check button should be enabled - this.allowCheckingProperty = new DynamicProperty( this.currentChallengeProperty, { - derive: 'allowCheckingProperty', - defaultValue: false - } ); - } + /** + * Move to try another time. + * @public + */ + tryAgain: function() { + if ( this.currentChallengeProperty.value ) { + this.currentChallengeProperty.value.tryAgain(); + } + }, + + /** + * Move to the next challenge. + * @public + */ + next: function() { + if ( this.currentLevelProperty.value ) { + this.currentLevelProperty.value.next(); + } + }, - areaModelCommon.register( 'GameAreaModel', GameAreaModel ); - - return inherit( Object, GameAreaModel, { - /** - * Selects a given level, making it the current level. - * @public - * - * @param {AreaLevel} level - */ - selectLevel: function( level ) { - level.select(); - this.currentLevelProperty.value = level; - }, - - /** - * Sets the value of the current editable property to that of the provided term. - * @public - * - * @param {Term} term - */ - setActiveTerm: function( term ) { - // Appearance change for https://github.com/phetsims/area-model-common/issues/42, handles only showing the - // "wrong" values for the variables 6-1 case (non-unique) - this.currentChallengeProperty.value.checkNonUniqueChanges(); - - this.activeEntryProperty.value.valueProperty.value = term; - this.activeEntryProperty.value.statusProperty.value = EntryStatus.NORMAL; - this.activeEntryProperty.value = null; - }, - - /** - * Checks the user's input against the known answer. - * @public - */ - check: function() { - // Close any keypads, see https://github.com/phetsims/area-model-common/issues/66 - this.activeEntryProperty.value = null; - - const challenge = this.currentChallengeProperty.value; - - this.currentLevelProperty.value.scoreProperty.value += challenge.check(); - }, - - /** - * Move to try another time. - * @public - */ - tryAgain: function() { - if ( this.currentChallengeProperty.value ) { - this.currentChallengeProperty.value.tryAgain(); - } - }, - - /** - * Move to the next challenge. - * @public - */ - next: function() { - if ( this.currentLevelProperty.value ) { - this.currentLevelProperty.value.next(); - } - }, - - /** - * Goes to the level selection. - * @public - */ - moveToLevelSelection: function() { - this.currentLevelProperty.value = null; // move to no level - }, - - /** - * Shows the answer. - * @public - */ - showAnswer: function() { - if ( this.currentChallengeProperty.value ) { - this.currentChallengeProperty.value.showAnswers(); - this.currentChallengeProperty.value.stateProperty.value = GameState.SHOW_SOLUTION; - this.activeEntryProperty.reset(); - } - }, - - /** - * Fills in the answers without moving to the "SHOW_SOLUTION" state. - * @public - */ - cheat: function() { - if ( this.currentChallengeProperty.value ) { - - // filling in the correct answers to the entries - this.currentChallengeProperty.value.showAnswers(); - - // unselecting the edited one and closing the keypad if necessary - this.activeEntryProperty.reset(); - } - }, - - /** - * Returns the model to its initial state. - * @public - */ - reset: function() { + /** + * Goes to the level selection. + * @public + */ + moveToLevelSelection: function() { + this.currentLevelProperty.value = null; // move to no level + }, + + /** + * Shows the answer. + * @public + */ + showAnswer: function() { + if ( this.currentChallengeProperty.value ) { + this.currentChallengeProperty.value.showAnswers(); + this.currentChallengeProperty.value.stateProperty.value = GameState.SHOW_SOLUTION; this.activeEntryProperty.reset(); - this.currentLevelProperty.reset(); - this.levels.forEach( function( level ) { - level.reset(); - } ); } - } ); -} ); + }, + + /** + * Fills in the answers without moving to the "SHOW_SOLUTION" state. + * @public + */ + cheat: function() { + if ( this.currentChallengeProperty.value ) { + + // filling in the correct answers to the entries + this.currentChallengeProperty.value.showAnswers(); + + // unselecting the edited one and closing the keypad if necessary + this.activeEntryProperty.reset(); + } + }, + + /** + * Returns the model to its initial state. + * @public + */ + reset: function() { + this.activeEntryProperty.reset(); + this.currentLevelProperty.reset(); + this.levels.forEach( function( level ) { + level.reset(); + } ); + } +} ); \ No newline at end of file diff --git a/js/game/model/GameState.js b/js/game/model/GameState.js index c6630cce..78fe6a98 100644 --- a/js/game/model/GameState.js +++ b/js/game/model/GameState.js @@ -6,47 +6,43 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const GameState = { - // "check" button, editable - FIRST_ATTEMPT: 'FIRST_ATTEMPT', - SECOND_ATTEMPT: 'SECOND_ATTEMPT', +const GameState = { + // "check" button, editable + FIRST_ATTEMPT: 'FIRST_ATTEMPT', + SECOND_ATTEMPT: 'SECOND_ATTEMPT', - // "next" button, happy face with +1 or +2 depending on score. NOT editable - CORRECT_ANSWER: 'CORRECT_ANSWER', + // "next" button, happy face with +1 or +2 depending on score. NOT editable + CORRECT_ANSWER: 'CORRECT_ANSWER', - // "try again" button, sad face (editable?) - triggers next state on edit? - WRONG_FIRST_ANSWER: 'WRONG_FIRST_ANSWER', + // "try again" button, sad face (editable?) - triggers next state on edit? + WRONG_FIRST_ANSWER: 'WRONG_FIRST_ANSWER', - // "show solution" button, sad face (editable?) - no trigger on edit? - WRONG_SECOND_ANSWER: 'WRONG_SECOND_ANSWER', + // "show solution" button, sad face (editable?) - no trigger on edit? + WRONG_SECOND_ANSWER: 'WRONG_SECOND_ANSWER', - // "next" button, NOT editable, replaced with a solution - SHOW_SOLUTION: 'SHOW_SOLUTION', + // "next" button, NOT editable, replaced with a solution + SHOW_SOLUTION: 'SHOW_SOLUTION', - LEVEL_COMPLETE: 'LEVEL_COMPLETE' - }; + LEVEL_COMPLETE: 'LEVEL_COMPLETE' +}; - areaModelCommon.register( 'GameState', GameState ); +areaModelCommon.register( 'GameState', GameState ); - // @public {Array.} - All values the enumeration can take. - GameState.VALUES = [ - GameState.FIRST_ATTEMPT, - GameState.SECOND_ATTEMPT, - GameState.CORRECT_ANSWER, - GameState.WRONG_FIRST_ANSWER, - GameState.WRONG_SECOND_ANSWER, - GameState.SHOW_SOLUTION, - GameState.LEVEL_COMPLETE - ]; +// @public {Array.} - All values the enumeration can take. +GameState.VALUES = [ + GameState.FIRST_ATTEMPT, + GameState.SECOND_ATTEMPT, + GameState.CORRECT_ANSWER, + GameState.WRONG_FIRST_ANSWER, + GameState.WRONG_SECOND_ANSWER, + GameState.SHOW_SOLUTION, + GameState.LEVEL_COMPLETE +]; - // verify that enum is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( GameState ); } +// verify that enum is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( GameState ); } - return GameState; -} ); +export default GameState; \ No newline at end of file diff --git a/js/game/model/GenericGameAreaModel.js b/js/game/model/GenericGameAreaModel.js index d30112fb..4abbb0a6 100644 --- a/js/game/model/GenericGameAreaModel.js +++ b/js/game/model/GenericGameAreaModel.js @@ -5,65 +5,62 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaChallengeDescription = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeDescription' ); - const AreaChallengeType = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeType' ); - const AreaLevel = require( 'AREA_MODEL_COMMON/game/model/AreaLevel' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GameAreaModel = require( 'AREA_MODEL_COMMON/game/model/GameAreaModel' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import AreaChallengeDescription from './AreaChallengeDescription.js'; +import AreaChallengeType from './AreaChallengeType.js'; +import AreaLevel from './AreaLevel.js'; +import GameAreaModel from './GameAreaModel.js'; - /** - * @constructor - * @extends {Object} - */ - function GenericGameAreaModel() { - GameAreaModel.call( this, [ - new AreaLevel( 1, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_1_NUMBERS_1, - AreaChallengeDescription.LEVEL_1_NUMBERS_2, - AreaChallengeDescription.LEVEL_1_NUMBERS_3, - AreaChallengeDescription.LEVEL_1_NUMBERS_4, - AreaChallengeDescription.LEVEL_1_NUMBERS_5, - AreaChallengeDescription.LEVEL_1_NUMBERS_6 - ] ), - new AreaLevel( 2, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_2_NUMBERS_1, - AreaChallengeDescription.LEVEL_2_NUMBERS_2, - AreaChallengeDescription.LEVEL_2_NUMBERS_3, - AreaChallengeDescription.LEVEL_2_NUMBERS_4, - AreaChallengeDescription.LEVEL_2_NUMBERS_5 - ] ), - new AreaLevel( 3, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_3_NUMBERS_1, - AreaChallengeDescription.LEVEL_3_NUMBERS_2, - AreaChallengeDescription.LEVEL_3_NUMBERS_3, - AreaChallengeDescription.LEVEL_3_NUMBERS_4, - AreaChallengeDescription.LEVEL_3_NUMBERS_5, - AreaChallengeDescription.LEVEL_3_NUMBERS_6 - ] ), - new AreaLevel( 4, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_4_NUMBERS_1, - AreaChallengeDescription.LEVEL_4_NUMBERS_2, - AreaChallengeDescription.LEVEL_4_NUMBERS_3, - AreaChallengeDescription.LEVEL_4_NUMBERS_4, - AreaChallengeDescription.LEVEL_4_NUMBERS_5 - ] ), - new AreaLevel( 5, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_5_NUMBERS_1, - AreaChallengeDescription.LEVEL_5_NUMBERS_3 - ] ), - new AreaLevel( 6, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_6_NUMBERS_1 - ] ) - ], false ); - } +/** + * @constructor + * @extends {Object} + */ +function GenericGameAreaModel() { + GameAreaModel.call( this, [ + new AreaLevel( 1, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_1_NUMBERS_1, + AreaChallengeDescription.LEVEL_1_NUMBERS_2, + AreaChallengeDescription.LEVEL_1_NUMBERS_3, + AreaChallengeDescription.LEVEL_1_NUMBERS_4, + AreaChallengeDescription.LEVEL_1_NUMBERS_5, + AreaChallengeDescription.LEVEL_1_NUMBERS_6 + ] ), + new AreaLevel( 2, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_2_NUMBERS_1, + AreaChallengeDescription.LEVEL_2_NUMBERS_2, + AreaChallengeDescription.LEVEL_2_NUMBERS_3, + AreaChallengeDescription.LEVEL_2_NUMBERS_4, + AreaChallengeDescription.LEVEL_2_NUMBERS_5 + ] ), + new AreaLevel( 3, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_3_NUMBERS_1, + AreaChallengeDescription.LEVEL_3_NUMBERS_2, + AreaChallengeDescription.LEVEL_3_NUMBERS_3, + AreaChallengeDescription.LEVEL_3_NUMBERS_4, + AreaChallengeDescription.LEVEL_3_NUMBERS_5, + AreaChallengeDescription.LEVEL_3_NUMBERS_6 + ] ), + new AreaLevel( 4, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_4_NUMBERS_1, + AreaChallengeDescription.LEVEL_4_NUMBERS_2, + AreaChallengeDescription.LEVEL_4_NUMBERS_3, + AreaChallengeDescription.LEVEL_4_NUMBERS_4, + AreaChallengeDescription.LEVEL_4_NUMBERS_5 + ] ), + new AreaLevel( 5, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_5_NUMBERS_1, + AreaChallengeDescription.LEVEL_5_NUMBERS_3 + ] ), + new AreaLevel( 6, AreaChallengeType.NUMBERS, AreaModelCommonColorProfile.numbersIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_6_NUMBERS_1 + ] ) + ], false ); +} - areaModelCommon.register( 'GenericGameAreaModel', GenericGameAreaModel ); +areaModelCommon.register( 'GenericGameAreaModel', GenericGameAreaModel ); - return inherit( GameAreaModel, GenericGameAreaModel ); -} ); +inherit( GameAreaModel, GenericGameAreaModel ); +export default GenericGameAreaModel; \ No newline at end of file diff --git a/js/game/model/InputMethod.js b/js/game/model/InputMethod.js index 4cda9966..2983eae2 100644 --- a/js/game/model/InputMethod.js +++ b/js/game/model/InputMethod.js @@ -5,42 +5,38 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - - const InputMethod = { - CONSTANT: 'CONSTANT', - TERM: 'TERM', - POLYNOMIAL_2: 'POLYNOMIAL_2', // with x^2 - POLYNOMIAL_1: 'POLYNOMIAL_1' // without x^2 - }; - - areaModelCommon.register( 'InputMethod', InputMethod ); - - /** - * Whether an entry needs polynomial or term input. - * @public - * - * @param {InputMethod} inputMethod - * @returns {boolean} - */ - InputMethod.isPolynomial = function( inputMethod ) { - return inputMethod === InputMethod.POLYNOMIAL_1 || inputMethod === InputMethod.POLYNOMIAL_2; - }; - - // @public {Array.} - All values the enumeration can take. - InputMethod.VALUES = [ - InputMethod.CONSTANT, - InputMethod.TERM, - InputMethod.POLYNOMIAL_2, - InputMethod.POLYNOMIAL_1 - ]; - - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( InputMethod ); } - - return InputMethod; -} ); + +import areaModelCommon from '../../areaModelCommon.js'; + +const InputMethod = { + CONSTANT: 'CONSTANT', + TERM: 'TERM', + POLYNOMIAL_2: 'POLYNOMIAL_2', // with x^2 + POLYNOMIAL_1: 'POLYNOMIAL_1' // without x^2 +}; + +areaModelCommon.register( 'InputMethod', InputMethod ); + +/** + * Whether an entry needs polynomial or term input. + * @public + * + * @param {InputMethod} inputMethod + * @returns {boolean} + */ +InputMethod.isPolynomial = function( inputMethod ) { + return inputMethod === InputMethod.POLYNOMIAL_1 || inputMethod === InputMethod.POLYNOMIAL_2; +}; + +// @public {Array.} - All values the enumeration can take. +InputMethod.VALUES = [ + InputMethod.CONSTANT, + InputMethod.TERM, + InputMethod.POLYNOMIAL_2, + InputMethod.POLYNOMIAL_1 +]; + +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( InputMethod ); } + +export default InputMethod; \ No newline at end of file diff --git a/js/game/model/VariablesGameAreaModel.js b/js/game/model/VariablesGameAreaModel.js index 88adf3fd..5df5aa22 100644 --- a/js/game/model/VariablesGameAreaModel.js +++ b/js/game/model/VariablesGameAreaModel.js @@ -5,57 +5,54 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaChallengeDescription = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeDescription' ); - const AreaChallengeType = require( 'AREA_MODEL_COMMON/game/model/AreaChallengeType' ); - const AreaLevel = require( 'AREA_MODEL_COMMON/game/model/AreaLevel' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GameAreaModel = require( 'AREA_MODEL_COMMON/game/model/GameAreaModel' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import AreaChallengeDescription from './AreaChallengeDescription.js'; +import AreaChallengeType from './AreaChallengeType.js'; +import AreaLevel from './AreaLevel.js'; +import GameAreaModel from './GameAreaModel.js'; - /** - * @constructor - * @extends {Object} - */ - function VariablesGameAreaModel() { - GameAreaModel.call( this, [ - new AreaLevel( 1, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_1_VARIABLES_1, - AreaChallengeDescription.LEVEL_1_VARIABLES_2, - AreaChallengeDescription.LEVEL_1_VARIABLES_3, - AreaChallengeDescription.LEVEL_1_VARIABLES_4 - ] ), - new AreaLevel( 2, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_2_VARIABLES_1, - AreaChallengeDescription.LEVEL_2_VARIABLES_2 - ] ), - new AreaLevel( 3, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_3_VARIABLES_1, - AreaChallengeDescription.LEVEL_3_VARIABLES_2, - AreaChallengeDescription.LEVEL_3_VARIABLES_3, - AreaChallengeDescription.LEVEL_3_VARIABLES_4, - AreaChallengeDescription.LEVEL_3_VARIABLES_5, - AreaChallengeDescription.LEVEL_3_VARIABLES_6 - ] ), - new AreaLevel( 4, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_4_VARIABLES_1, - AreaChallengeDescription.LEVEL_4_VARIABLES_2 - ] ), - new AreaLevel( 5, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_5_VARIABLES_1, - AreaChallengeDescription.LEVEL_5_VARIABLES_2 - ] ), - new AreaLevel( 6, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ - AreaChallengeDescription.LEVEL_6_VARIABLES_1 - ] ) - ], true ); - } +/** + * @constructor + * @extends {Object} + */ +function VariablesGameAreaModel() { + GameAreaModel.call( this, [ + new AreaLevel( 1, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_1_VARIABLES_1, + AreaChallengeDescription.LEVEL_1_VARIABLES_2, + AreaChallengeDescription.LEVEL_1_VARIABLES_3, + AreaChallengeDescription.LEVEL_1_VARIABLES_4 + ] ), + new AreaLevel( 2, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_2_VARIABLES_1, + AreaChallengeDescription.LEVEL_2_VARIABLES_2 + ] ), + new AreaLevel( 3, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_3_VARIABLES_1, + AreaChallengeDescription.LEVEL_3_VARIABLES_2, + AreaChallengeDescription.LEVEL_3_VARIABLES_3, + AreaChallengeDescription.LEVEL_3_VARIABLES_4, + AreaChallengeDescription.LEVEL_3_VARIABLES_5, + AreaChallengeDescription.LEVEL_3_VARIABLES_6 + ] ), + new AreaLevel( 4, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_4_VARIABLES_1, + AreaChallengeDescription.LEVEL_4_VARIABLES_2 + ] ), + new AreaLevel( 5, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_5_VARIABLES_1, + AreaChallengeDescription.LEVEL_5_VARIABLES_2 + ] ), + new AreaLevel( 6, AreaChallengeType.VARIABLES, AreaModelCommonColorProfile.variablesIconBackgroundProperty, [ + AreaChallengeDescription.LEVEL_6_VARIABLES_1 + ] ) + ], true ); +} - areaModelCommon.register( 'VariablesGameAreaModel', VariablesGameAreaModel ); +areaModelCommon.register( 'VariablesGameAreaModel', VariablesGameAreaModel ); - return inherit( GameAreaModel, VariablesGameAreaModel ); -} ); +inherit( GameAreaModel, VariablesGameAreaModel ); +export default VariablesGameAreaModel; \ No newline at end of file diff --git a/js/game/view/GameAreaDisplayNode.js b/js/game/view/GameAreaDisplayNode.js index decab225..36c74b6c 100644 --- a/js/game/view/GameAreaDisplayNode.js +++ b/js/game/view/GameAreaDisplayNode.js @@ -7,198 +7,195 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryType = require( 'AREA_MODEL_COMMON/game/model/EntryType' ); - const GameEditableLabelNode = require( 'AREA_MODEL_COMMON/game/view/GameEditableLabelNode' ); - const GenericAreaDisplayNode = require( 'AREA_MODEL_COMMON/generic/view/GenericAreaDisplayNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const InputMethod = require( 'AREA_MODEL_COMMON/game/model/InputMethod' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Property = require( 'AXON/Property' ); - const RangeLabelNode = require( 'AREA_MODEL_COMMON/common/view/RangeLabelNode' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const TermKeypadPanel = require( 'AREA_MODEL_COMMON/generic/view/TermKeypadPanel' ); - - // constants - const MAX_PARTITIONS = 3; // The maximum number of partitions for a specific dimension - - /** - * @constructor - * @extends {Node} - * - * @param {GameAreaDisplay} areaDisplay - * @param {Property.} activeEntryProperty - * @param {Property.} gameStateProperty - * @param {function} setActiveTerm - function( {Term|null} ) - Called when the value of the edited term should be set. - */ - function GameAreaDisplayNode( areaDisplay, activeEntryProperty, gameStateProperty, setActiveTerm ) { - const self = this; - - Node.call( this ); - - const singleOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_SINGLE_OFFSET; - const firstOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_FIRST_OFFSET; - const secondOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_SECOND_OFFSET; - const fullOffset = AreaModelCommonConstants.AREA_SIZE; - - // Background fill and stroke - this.addChild( new Rectangle( 0, 0, AreaModelCommonConstants.AREA_SIZE, AreaModelCommonConstants.AREA_SIZE, { - fill: AreaModelCommonColorProfile.areaBackgroundProperty, - stroke: AreaModelCommonColorProfile.areaBorderProperty - } ) ); - - this.addChild( GenericAreaDisplayNode.createPartitionLines( areaDisplay.layoutProperty, AreaModelCommonConstants.AREA_SIZE ) ); - - // Range views - const tickVariations = { - 1: [ 0, fullOffset ], - 2: [ 0, singleOffset, fullOffset ], - 3: [ 0, firstOffset, secondOffset, fullOffset ] - }; - Orientation.VALUES.forEach( function( orientation ) { - const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); - const termListProperty = areaDisplay.totalProperties.get( orientation ); - const tickLocationsProperty = new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { - return tickVariations[ layout.getPartitionQuantity( orientation ) ]; - } ); - self.addChild( new RangeLabelNode( termListProperty, orientation, tickLocationsProperty, colorProperty, false ) ); - } ); - // {OrientationPair.>>} - The visual centers of all of the partitions. - // This duplicates some logic from GenericArea's coordinateRangeProperty handling, but here we need the full-length - // array every time. - const centerProperties = OrientationPair.create( function( orientation ) { - return [ - new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { - const partitionCount = layout.getPartitionQuantity( orientation ); - if ( partitionCount === 1 ) { - return fullOffset / 2; - } - else if ( partitionCount === 2 ) { - return singleOffset / 2; - } - else if ( partitionCount === 3 ) { - return firstOffset / 2; - } - } ), - new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { - const partitionCount = layout.getPartitionQuantity( orientation ); - if ( partitionCount === 2 ) { - return ( fullOffset + singleOffset ) / 2; - } - else if ( partitionCount === 3 ) { - return ( secondOffset + firstOffset ) / 2; - } - else { - return 0; // no need to position here, since this will never be used with a partitionCount of 1 - } - } ), - new Property( ( fullOffset + secondOffset ) / 2 ) - ]; - } ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import RangeLabelNode from '../../common/view/RangeLabelNode.js'; +import GenericAreaDisplayNode from '../../generic/view/GenericAreaDisplayNode.js'; +import TermKeypadPanel from '../../generic/view/TermKeypadPanel.js'; +import Entry from '../model/Entry.js'; +import EntryType from '../model/EntryType.js'; +import InputMethod from '../model/InputMethod.js'; +import GameEditableLabelNode from './GameEditableLabelNode.js'; + +// constants +const MAX_PARTITIONS = 3; // The maximum number of partitions for a specific dimension - // Partition size labels - Orientation.VALUES.forEach( function( orientation ) { - _.range( 0, MAX_PARTITIONS ).forEach( function( partitionIndex ) { - const entryProperty = new DerivedProperty( - [ areaDisplay.partitionSizeEntriesProperties.get( orientation ) ], - function( entries ) { - return entries[ partitionIndex ] ? entries[ partitionIndex ] : new Entry( null ); - } ); - const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); - - const label = new GameEditableLabelNode( { - entryProperty: entryProperty, - gameStateProperty: gameStateProperty, - activeEntryProperty: activeEntryProperty, - colorProperty: colorProperty, - allowExponentsProperty: areaDisplay.allowExponentsProperty, - orientation: orientation +/** + * @constructor + * @extends {Node} + * + * @param {GameAreaDisplay} areaDisplay + * @param {Property.} activeEntryProperty + * @param {Property.} gameStateProperty + * @param {function} setActiveTerm - function( {Term|null} ) - Called when the value of the edited term should be set. + */ +function GameAreaDisplayNode( areaDisplay, activeEntryProperty, gameStateProperty, setActiveTerm ) { + const self = this; + + Node.call( this ); + + const singleOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_SINGLE_OFFSET; + const firstOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_FIRST_OFFSET; + const secondOffset = AreaModelCommonConstants.AREA_SIZE * AreaModelCommonConstants.GENERIC_SECOND_OFFSET; + const fullOffset = AreaModelCommonConstants.AREA_SIZE; + + // Background fill and stroke + this.addChild( new Rectangle( 0, 0, AreaModelCommonConstants.AREA_SIZE, AreaModelCommonConstants.AREA_SIZE, { + fill: AreaModelCommonColorProfile.areaBackgroundProperty, + stroke: AreaModelCommonColorProfile.areaBorderProperty + } ) ); + + this.addChild( GenericAreaDisplayNode.createPartitionLines( areaDisplay.layoutProperty, AreaModelCommonConstants.AREA_SIZE ) ); + + // Range views + const tickVariations = { + 1: [ 0, fullOffset ], + 2: [ 0, singleOffset, fullOffset ], + 3: [ 0, firstOffset, secondOffset, fullOffset ] + }; + Orientation.VALUES.forEach( function( orientation ) { + const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); + const termListProperty = areaDisplay.totalProperties.get( orientation ); + const tickLocationsProperty = new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { + return tickVariations[ layout.getPartitionQuantity( orientation ) ]; + } ); + self.addChild( new RangeLabelNode( termListProperty, orientation, tickLocationsProperty, colorProperty, false ) ); + } ); + + // {OrientationPair.>>} - The visual centers of all of the partitions. + // This duplicates some logic from GenericArea's coordinateRangeProperty handling, but here we need the full-length + // array every time. + const centerProperties = OrientationPair.create( function( orientation ) { + return [ + new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { + const partitionCount = layout.getPartitionQuantity( orientation ); + if ( partitionCount === 1 ) { + return fullOffset / 2; + } + else if ( partitionCount === 2 ) { + return singleOffset / 2; + } + else if ( partitionCount === 3 ) { + return firstOffset / 2; + } + } ), + new DerivedProperty( [ areaDisplay.layoutProperty ], function( layout ) { + const partitionCount = layout.getPartitionQuantity( orientation ); + if ( partitionCount === 2 ) { + return ( fullOffset + singleOffset ) / 2; + } + else if ( partitionCount === 3 ) { + return ( secondOffset + firstOffset ) / 2; + } + else { + return 0; // no need to position here, since this will never be used with a partitionCount of 1 + } + } ), + new Property( ( fullOffset + secondOffset ) / 2 ) + ]; + } ); + + // Partition size labels + Orientation.VALUES.forEach( function( orientation ) { + _.range( 0, MAX_PARTITIONS ).forEach( function( partitionIndex ) { + const entryProperty = new DerivedProperty( + [ areaDisplay.partitionSizeEntriesProperties.get( orientation ) ], + function( entries ) { + return entries[ partitionIndex ] ? entries[ partitionIndex ] : new Entry( null ); } ); + const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); - label[ orientation.opposite.coordinate ] = AreaModelCommonConstants.PARTITION_OFFSET.get( orientation ); - self.addChild( label ); - - centerProperties.get( orientation )[ partitionIndex ].link( function( location ) { - label[ orientation.coordinate ] = location; - } ); + const label = new GameEditableLabelNode( { + entryProperty: entryProperty, + gameStateProperty: gameStateProperty, + activeEntryProperty: activeEntryProperty, + colorProperty: colorProperty, + allowExponentsProperty: areaDisplay.allowExponentsProperty, + orientation: orientation } ); - } ); - // Labels for each partitioned area - _.range( 0, MAX_PARTITIONS ).forEach( function( horizontalIndex ) { - _.range( 0, MAX_PARTITIONS ).forEach( function( verticalIndex ) { - const entryProperty = new DerivedProperty( [ areaDisplay.partialProductEntriesProperty ], function( values ) { - return ( values[ verticalIndex ] && values[ verticalIndex ][ horizontalIndex ] ) - ? values[ verticalIndex ][ horizontalIndex ] - : new Entry( null ); - } ); + label[ orientation.opposite.coordinate ] = AreaModelCommonConstants.PARTITION_OFFSET.get( orientation ); + self.addChild( label ); - const colorProperty = new DerivedProperty( [ - entryProperty, - AreaModelCommonColorProfile.dynamicPartialProductProperty, - AreaModelCommonColorProfile.fixedPartialProductProperty - ], function( entry, dynamicColor, fixedColor ) { - if ( entry && entry.type === EntryType.DYNAMIC ) { - return dynamicColor; - } - else { - return fixedColor; - } - } ); + centerProperties.get( orientation )[ partitionIndex ].link( function( location ) { + label[ orientation.coordinate ] = location; + } ); + } ); + } ); + + // Labels for each partitioned area + _.range( 0, MAX_PARTITIONS ).forEach( function( horizontalIndex ) { + _.range( 0, MAX_PARTITIONS ).forEach( function( verticalIndex ) { + const entryProperty = new DerivedProperty( [ areaDisplay.partialProductEntriesProperty ], function( values ) { + return ( values[ verticalIndex ] && values[ verticalIndex ][ horizontalIndex ] ) + ? values[ verticalIndex ][ horizontalIndex ] + : new Entry( null ); + } ); - const label = new GameEditableLabelNode( { - entryProperty: entryProperty, - gameStateProperty: gameStateProperty, - activeEntryProperty: activeEntryProperty, - colorProperty: colorProperty, - allowExponentsProperty: areaDisplay.allowExponentsProperty, - orientation: Orientation.VERTICAL, - labelFont: AreaModelCommonConstants.GAME_PARTIAL_PRODUCT_LABEL_FONT, - editFont: AreaModelCommonConstants.GAME_PARTIAL_PRODUCT_EDIT_FONT - } ); - self.addChild( label ); + const colorProperty = new DerivedProperty( [ + entryProperty, + AreaModelCommonColorProfile.dynamicPartialProductProperty, + AreaModelCommonColorProfile.fixedPartialProductProperty + ], function( entry, dynamicColor, fixedColor ) { + if ( entry && entry.type === EntryType.DYNAMIC ) { + return dynamicColor; + } + else { + return fixedColor; + } + } ); - centerProperties.horizontal[ horizontalIndex ].linkAttribute( label, 'x' ); - centerProperties.vertical[ verticalIndex ].linkAttribute( label, 'y' ); + const label = new GameEditableLabelNode( { + entryProperty: entryProperty, + gameStateProperty: gameStateProperty, + activeEntryProperty: activeEntryProperty, + colorProperty: colorProperty, + allowExponentsProperty: areaDisplay.allowExponentsProperty, + orientation: Orientation.VERTICAL, + labelFont: AreaModelCommonConstants.GAME_PARTIAL_PRODUCT_LABEL_FONT, + editFont: AreaModelCommonConstants.GAME_PARTIAL_PRODUCT_EDIT_FONT } ); - } ); + self.addChild( label ); - const digitsProperty = new DerivedProperty( [ activeEntryProperty ], function( entry ) { - return entry ? entry.digits : 1; + centerProperties.horizontal[ horizontalIndex ].linkAttribute( label, 'x' ); + centerProperties.vertical[ verticalIndex ].linkAttribute( label, 'y' ); } ); + } ); - const keypadOptions = { - // padding constant allows it to fit between the area and the other panels - x: AreaModelCommonConstants.AREA_SIZE + AreaModelCommonConstants.KEYPAD_LEFT_PADDING, - top: 0 - }; - const noExponentKeypadPanel = new TermKeypadPanel( digitsProperty, false, false, setActiveTerm, keypadOptions ); - const exponentKeypadPanel = new TermKeypadPanel( digitsProperty, true, true, setActiveTerm, keypadOptions ); + const digitsProperty = new DerivedProperty( [ activeEntryProperty ], function( entry ) { + return entry ? entry.digits : 1; + } ); - this.addChild( noExponentKeypadPanel ); - this.addChild( exponentKeypadPanel ); + const keypadOptions = { + // padding constant allows it to fit between the area and the other panels + x: AreaModelCommonConstants.AREA_SIZE + AreaModelCommonConstants.KEYPAD_LEFT_PADDING, + top: 0 + }; + const noExponentKeypadPanel = new TermKeypadPanel( digitsProperty, false, false, setActiveTerm, keypadOptions ); + const exponentKeypadPanel = new TermKeypadPanel( digitsProperty, true, true, setActiveTerm, keypadOptions ); - activeEntryProperty.link( function( newEntry ) { - noExponentKeypadPanel.clear(); - exponentKeypadPanel.clear(); + this.addChild( noExponentKeypadPanel ); + this.addChild( exponentKeypadPanel ); - noExponentKeypadPanel.visible = newEntry !== null && newEntry.inputMethod === InputMethod.CONSTANT; - exponentKeypadPanel.visible = newEntry !== null && newEntry.inputMethod === InputMethod.TERM; - } ); - } + activeEntryProperty.link( function( newEntry ) { + noExponentKeypadPanel.clear(); + exponentKeypadPanel.clear(); + + noExponentKeypadPanel.visible = newEntry !== null && newEntry.inputMethod === InputMethod.CONSTANT; + exponentKeypadPanel.visible = newEntry !== null && newEntry.inputMethod === InputMethod.TERM; + } ); +} - areaModelCommon.register( 'GameAreaDisplayNode', GameAreaDisplayNode ); +areaModelCommon.register( 'GameAreaDisplayNode', GameAreaDisplayNode ); - return inherit( Node, GameAreaDisplayNode ); -} ); +inherit( Node, GameAreaDisplayNode ); +export default GameAreaDisplayNode; \ No newline at end of file diff --git a/js/game/view/GameAreaScreenView.js b/js/game/view/GameAreaScreenView.js index 3be36f68..ba16fd3c 100644 --- a/js/game/view/GameAreaScreenView.js +++ b/js/game/view/GameAreaScreenView.js @@ -7,543 +7,539 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonGlobals = require( 'AREA_MODEL_COMMON/common/AreaModelCommonGlobals' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const Easing = require( 'TWIXT/Easing' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryDisplayType = require( 'AREA_MODEL_COMMON/game/model/EntryDisplayType' ); - const FaceNode = require( 'SCENERY_PHET/FaceNode' ); - const FaceWithPointsNode = require( 'SCENERY_PHET/FaceWithPointsNode' ); - const FiniteStatusBar = require( 'VEGAS/FiniteStatusBar' ); - const GameAreaDisplay = require( 'AREA_MODEL_COMMON/game/model/GameAreaDisplay' ); - const GameAreaDisplayNode = require( 'AREA_MODEL_COMMON/game/view/GameAreaDisplayNode' ); - const GameAreaModel = require( 'AREA_MODEL_COMMON/game/model/GameAreaModel' ); - const GameAudio = require( 'AREA_MODEL_COMMON/game/view/GameAudio' ); - const GameEditableLabelNode = require( 'AREA_MODEL_COMMON/game/view/GameEditableLabelNode' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const GenericFactorsNode = require( 'AREA_MODEL_COMMON/generic/view/GenericFactorsNode' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LevelCompletedNode = require( 'VEGAS/LevelCompletedNode' ); - const LevelSelectionButton = require( 'VEGAS/LevelSelectionButton' ); - const Node = require( 'SCENERY/nodes/Node' ); - const NumberProperty = require( 'AXON/NumberProperty' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Panel = require( 'SUN/Panel' ); - const PolynomialEditNode = require( 'AREA_MODEL_COMMON/game/view/PolynomialEditNode' ); - const Property = require( 'AXON/Property' ); - const RectangularPushButton = require( 'SUN/buttons/RectangularPushButton' ); - const ResetAllButton = require( 'SCENERY_PHET/buttons/ResetAllButton' ); - const RewardNode = require( 'VEGAS/RewardNode' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const ScoreDisplayLabeledStars = require( 'VEGAS/ScoreDisplayLabeledStars' ); - const ScoreDisplayStars = require( 'VEGAS/ScoreDisplayStars' ); - const ScreenView = require( 'JOIST/ScreenView' ); - const StarNode = require( 'SCENERY_PHET/StarNode' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const Text = require( 'SCENERY/nodes/Text' ); - const TransitionNode = require( 'TWIXT/TransitionNode' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - // strings - const checkString = require( 'string!VEGAS/check' ); - const chooseYourLevelString = require( 'string!VEGAS/chooseYourLevel' ); - const dimensionsString = require( 'string!AREA_MODEL_COMMON/dimensions' ); - const nextString = require( 'string!VEGAS/next' ); - const showAnswerString = require( 'string!VEGAS/showAnswer' ); - const totalAreaOfModelString = require( 'string!AREA_MODEL_COMMON/totalAreaOfModel' ); - const tryAgainString = require( 'string!VEGAS/tryAgain' ); - - // images - const level1IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-1-icon.png' ); - const level2IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-2-icon.png' ); - const level3IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-3-icon.png' ); - const level4IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-4-icon.png' ); - const level5IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-5-icon.png' ); - const level6IconImage = require( 'mipmap!AREA_MODEL_COMMON/level-6-icon.png' ); - - // constants - const LEVEL_ICON_IMAGES = [ - level1IconImage, - level2IconImage, - level3IconImage, - level4IconImage, - level5IconImage, - level6IconImage - ]; - /** - * @constructor - * @extends {ScreenView} - * - * @param {GameAreaModel} model - */ - function GameAreaScreenView( model ) { - assert && assert( model instanceof GameAreaModel ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import NumberProperty from '../../../../axon/js/NumberProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import ScreenView from '../../../../joist/js/ScreenView.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import ResetAllButton from '../../../../scenery-phet/js/buttons/ResetAllButton.js'; +import FaceNode from '../../../../scenery-phet/js/FaceNode.js'; +import FaceWithPointsNode from '../../../../scenery-phet/js/FaceWithPointsNode.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import StarNode from '../../../../scenery-phet/js/StarNode.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Image from '../../../../scenery/js/nodes/Image.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import RectangularPushButton from '../../../../sun/js/buttons/RectangularPushButton.js'; +import Panel from '../../../../sun/js/Panel.js'; +import Easing from '../../../../twixt/js/Easing.js'; +import TransitionNode from '../../../../twixt/js/TransitionNode.js'; +import FiniteStatusBar from '../../../../vegas/js/FiniteStatusBar.js'; +import LevelCompletedNode from '../../../../vegas/js/LevelCompletedNode.js'; +import LevelSelectionButton from '../../../../vegas/js/LevelSelectionButton.js'; +import RewardNode from '../../../../vegas/js/RewardNode.js'; +import ScoreDisplayLabeledStars from '../../../../vegas/js/ScoreDisplayLabeledStars.js'; +import ScoreDisplayStars from '../../../../vegas/js/ScoreDisplayStars.js'; +import vegasStrings from '../../../../vegas/js/vegas-strings.js'; +import level1IconImage from '../../../mipmaps/level-1-icon_png.js'; +import level2IconImage from '../../../mipmaps/level-2-icon_png.js'; +import level3IconImage from '../../../mipmaps/level-3-icon_png.js'; +import level4IconImage from '../../../mipmaps/level-4-icon_png.js'; +import level5IconImage from '../../../mipmaps/level-5-icon_png.js'; +import level6IconImage from '../../../mipmaps/level-6-icon_png.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonGlobals from '../../common/AreaModelCommonGlobals.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import GenericFactorsNode from '../../generic/view/GenericFactorsNode.js'; +import Entry from '../model/Entry.js'; +import EntryDisplayType from '../model/EntryDisplayType.js'; +import GameAreaDisplay from '../model/GameAreaDisplay.js'; +import GameAreaModel from '../model/GameAreaModel.js'; +import GameState from '../model/GameState.js'; +import GameAreaDisplayNode from './GameAreaDisplayNode.js'; +import GameAudio from './GameAudio.js'; +import GameEditableLabelNode from './GameEditableLabelNode.js'; +import PolynomialEditNode from './PolynomialEditNode.js'; + +const checkString = vegasStrings.check; +const chooseYourLevelString = vegasStrings.chooseYourLevel; +const dimensionsString = areaModelCommonStrings.dimensions; +const nextString = vegasStrings.next; +const showAnswerString = vegasStrings.showAnswer; +const totalAreaOfModelString = areaModelCommonStrings.totalAreaOfModel; +const tryAgainString = vegasStrings.tryAgain; + + +// constants +const LEVEL_ICON_IMAGES = [ + level1IconImage, + level2IconImage, + level3IconImage, + level4IconImage, + level5IconImage, + level6IconImage +]; - const self = this; - - ScreenView.call( this ); +/** + * @constructor + * @extends {ScreenView} + * + * @param {GameAreaModel} model + */ +function GameAreaScreenView( model ) { + assert && assert( model instanceof GameAreaModel ); - // @private {Node} - The "left" half of the sliding layer, displayed first - this.levelSelectionLayer = new Node(); + const self = this; - // @private {Node} - The "right" half of the sliding layer, will slide into view when the user selects a level - this.challengeLayer = new Node(); + ScreenView.call( this ); - // @private {GameAudio} - Responsible for all audio - this.audio = new GameAudio( model ); + // @private {Node} - The "left" half of the sliding layer, displayed first + this.levelSelectionLayer = new Node(); - // @private {TransitionNode} - this.transitionNode = new TransitionNode( this.visibleBoundsProperty, { - content: this.levelSelectionLayer, - useBoundsClip: false, // better performance without the clipping - cachedNodes: [ this.levelSelectionLayer, this.challengeLayer ] - } ); - this.addChild( this.transitionNode ); - model.currentLevelProperty.lazyLink( function( level ) { - if ( level ) { - self.transitionNode.slideLeftTo( self.challengeLayer, { - duration: 0.4, - targetOptions: { - easing: Easing.QUADRATIC_IN_OUT - } - } ); - } - else { - self.transitionNode.dissolveTo( self.levelSelectionLayer, { - duration: 0.4, - gamma: 2.2, - targetOptions: { - easing: Easing.LINEAR - } - } ); - } - } ); + // @private {Node} - The "right" half of the sliding layer, will slide into view when the user selects a level + this.challengeLayer = new Node(); - const levelIcons = LEVEL_ICON_IMAGES.map( function( iconImage ) { - return new Image( iconImage ); - } ); + // @private {GameAudio} - Responsible for all audio + this.audio = new GameAudio( model ); - const buttonSpacing = 30; - const levelButtons = model.levels.map( function( level, index ) { - return new LevelSelectionButton( levelIcons[ index ], level.scoreProperty, { - scoreDisplayConstructor: ScoreDisplayStars, - scoreDisplayOptions: { - numberOfStars: AreaModelCommonConstants.NUM_CHALLENGES, - perfectScore: AreaModelCommonConstants.PERFECT_SCORE - }, - listener: function() { - model.selectLevel( level ); - }, - baseColor: level.colorProperty + // @private {TransitionNode} + this.transitionNode = new TransitionNode( this.visibleBoundsProperty, { + content: this.levelSelectionLayer, + useBoundsClip: false, // better performance without the clipping + cachedNodes: [ this.levelSelectionLayer, this.challengeLayer ] + } ); + this.addChild( this.transitionNode ); + model.currentLevelProperty.lazyLink( function( level ) { + if ( level ) { + self.transitionNode.slideLeftTo( self.challengeLayer, { + duration: 0.4, + targetOptions: { + easing: Easing.QUADRATIC_IN_OUT + } } ); - } ); + } + else { + self.transitionNode.dissolveTo( self.levelSelectionLayer, { + duration: 0.4, + gamma: 2.2, + targetOptions: { + easing: Easing.LINEAR + } + } ); + } + } ); - this.levelSelectionLayer.addChild( new VBox( { - children: _.chunk( levelButtons, 3 ).map( function( children ) { - return new HBox( { - children: children, - spacing: buttonSpacing - } ); - } ), - spacing: buttonSpacing, - center: this.layoutBounds.center - } ) ); - - this.levelSelectionLayer.addChild( new Text( chooseYourLevelString, { - centerX: this.layoutBounds.centerX, - centerY: ( this.layoutBounds.top + this.levelSelectionLayer.top ) / 2, - font: new PhetFont( 30 ) - } ) ); - - // Status bar - let lastKnownLevel = null; - // Create a property that holds the "last known" level, so that we don't change the view when we are switching - // away from the current level back to the level selection. - const lastLevelProperty = new DerivedProperty( [ model.currentLevelProperty ], function( level ) { - level = level || lastKnownLevel; - lastKnownLevel = level; - return level; - } ); - const scoreProperty = new DynamicProperty( lastLevelProperty, { - derive: 'scoreProperty' - } ); - const statusBar = new FiniteStatusBar( this.layoutBounds, this.visibleBoundsProperty, scoreProperty, { - challengeIndexProperty: new DynamicProperty( lastLevelProperty, { - derive: 'challengeIndexProperty', - defaultValue: 1 - } ), - numberOfChallengesProperty: new NumberProperty( AreaModelCommonConstants.NUM_CHALLENGES ), - levelProperty: new DerivedProperty( [ lastLevelProperty ], function( level ) { - return level ? level.number : 1; - } ), - scoreDisplayConstructor: ScoreDisplayLabeledStars, + const levelIcons = LEVEL_ICON_IMAGES.map( function( iconImage ) { + return new Image( iconImage ); + } ); + + const buttonSpacing = 30; + const levelButtons = model.levels.map( function( level, index ) { + return new LevelSelectionButton( levelIcons[ index ], level.scoreProperty, { + scoreDisplayConstructor: ScoreDisplayStars, scoreDisplayOptions: { numberOfStars: AreaModelCommonConstants.NUM_CHALLENGES, perfectScore: AreaModelCommonConstants.PERFECT_SCORE }, - startOverButtonOptions: { - listener: function() { - // Reset the level on "Start Over", see https://github.com/phetsims/area-model-common/issues/87 - model.currentLevelProperty.value.startOver(); - model.currentLevelProperty.value = null; - } - }, - font: AreaModelCommonConstants.GAME_STATUS_BAR_NON_BOLD_FONT, - levelTextOptions: { - font: AreaModelCommonConstants.GAME_STATUS_BAR_BOLD_FONT + listener: function() { + model.selectLevel( level ); }, - floatToTop: true, - barFill: new DynamicProperty( lastLevelProperty, { - derive: 'colorProperty', - defaultValue: 'black' - } ) - } ); - this.challengeLayer.addChild( statusBar ); - - // Prompt - const promptText = new Text( ' ', { - font: AreaModelCommonConstants.GAME_STATUS_BAR_PROMPT_FONT, - pickable: false, - maxWidth: 600, - top: this.layoutBounds.top + statusBar.height + 20 - } ); - this.challengeLayer.addChild( promptText ); - new DynamicProperty( model.currentLevelProperty, { - derive: 'currentChallengeProperty' - } ).link( function( challenge ) { - // Could be null - if ( challenge ) { - promptText.text = challenge.description.getPromptString(); - // Center around the area's center. - promptText.centerX = self.layoutBounds.left + AreaModelCommonConstants.GAME_AREA_OFFSET.x + AreaModelCommonConstants.AREA_SIZE / 2; - // Don't let it go off the left side of the screen - promptText.left = Math.max( promptText.left, self.layoutBounds.left + 20 ); - } + baseColor: level.colorProperty } ); + } ); - // Reset All button - const resetAllButton = new ResetAllButton( { + this.levelSelectionLayer.addChild( new VBox( { + children: _.chunk( levelButtons, 3 ).map( function( children ) { + return new HBox( { + children: children, + spacing: buttonSpacing + } ); + } ), + spacing: buttonSpacing, + center: this.layoutBounds.center + } ) ); + + this.levelSelectionLayer.addChild( new Text( chooseYourLevelString, { + centerX: this.layoutBounds.centerX, + centerY: ( this.layoutBounds.top + this.levelSelectionLayer.top ) / 2, + font: new PhetFont( 30 ) + } ) ); + + // Status bar + let lastKnownLevel = null; + // Create a property that holds the "last known" level, so that we don't change the view when we are switching + // away from the current level back to the level selection. + const lastLevelProperty = new DerivedProperty( [ model.currentLevelProperty ], function( level ) { + level = level || lastKnownLevel; + lastKnownLevel = level; + return level; + } ); + const scoreProperty = new DynamicProperty( lastLevelProperty, { + derive: 'scoreProperty' + } ); + const statusBar = new FiniteStatusBar( this.layoutBounds, this.visibleBoundsProperty, scoreProperty, { + challengeIndexProperty: new DynamicProperty( lastLevelProperty, { + derive: 'challengeIndexProperty', + defaultValue: 1 + } ), + numberOfChallengesProperty: new NumberProperty( AreaModelCommonConstants.NUM_CHALLENGES ), + levelProperty: new DerivedProperty( [ lastLevelProperty ], function( level ) { + return level ? level.number : 1; + } ), + scoreDisplayConstructor: ScoreDisplayLabeledStars, + scoreDisplayOptions: { + numberOfStars: AreaModelCommonConstants.NUM_CHALLENGES, + perfectScore: AreaModelCommonConstants.PERFECT_SCORE + }, + startOverButtonOptions: { listener: function() { - model.reset(); - }, - right: this.layoutBounds.right - AreaModelCommonConstants.LAYOUT_SPACING, - bottom: this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING - } ); - this.levelSelectionLayer.addChild( resetAllButton ); + // Reset the level on "Start Over", see https://github.com/phetsims/area-model-common/issues/87 + model.currentLevelProperty.value.startOver(); + model.currentLevelProperty.value = null; + } + }, + font: AreaModelCommonConstants.GAME_STATUS_BAR_NON_BOLD_FONT, + levelTextOptions: { + font: AreaModelCommonConstants.GAME_STATUS_BAR_BOLD_FONT + }, + floatToTop: true, + barFill: new DynamicProperty( lastLevelProperty, { + derive: 'colorProperty', + defaultValue: 'black' + } ) + } ); + this.challengeLayer.addChild( statusBar ); + + // Prompt + const promptText = new Text( ' ', { + font: AreaModelCommonConstants.GAME_STATUS_BAR_PROMPT_FONT, + pickable: false, + maxWidth: 600, + top: this.layoutBounds.top + statusBar.height + 20 + } ); + this.challengeLayer.addChild( promptText ); + new DynamicProperty( model.currentLevelProperty, { + derive: 'currentChallengeProperty' + } ).link( function( challenge ) { + // Could be null + if ( challenge ) { + promptText.text = challenge.description.getPromptString(); + // Center around the area's center. + promptText.centerX = self.layoutBounds.left + AreaModelCommonConstants.GAME_AREA_OFFSET.x + AreaModelCommonConstants.AREA_SIZE / 2; + // Don't let it go off the left side of the screen + promptText.left = Math.max( promptText.left, self.layoutBounds.left + 20 ); + } + } ); - /*---------------------------------------------------------------------------* - * Area display - *----------------------------------------------------------------------------*/ + // Reset All button + const resetAllButton = new ResetAllButton( { + listener: function() { + model.reset(); + }, + right: this.layoutBounds.right - AreaModelCommonConstants.LAYOUT_SPACING, + bottom: this.layoutBounds.bottom - AreaModelCommonConstants.LAYOUT_SPACING + } ); + this.levelSelectionLayer.addChild( resetAllButton ); - // @private {GameAreaDisplay} - this.areaDisplay = new GameAreaDisplay( model.currentChallengeProperty ); + /*---------------------------------------------------------------------------* + * Area display + *----------------------------------------------------------------------------*/ - const gameAreaNode = new GameAreaDisplayNode( this.areaDisplay, model.activeEntryProperty, model.stateProperty, function( term ) { - model.setActiveTerm( term ); - } ); - this.challengeLayer.addChild( gameAreaNode ); - gameAreaNode.translation = this.layoutBounds.leftTop.plus( AreaModelCommonConstants.GAME_AREA_OFFSET ); + // @private {GameAreaDisplay} + this.areaDisplay = new GameAreaDisplay( model.currentChallengeProperty ); - /*---------------------------------------------------------------------------* - * Panels - *----------------------------------------------------------------------------*/ + const gameAreaNode = new GameAreaDisplayNode( this.areaDisplay, model.activeEntryProperty, model.stateProperty, function( term ) { + model.setActiveTerm( term ); + } ); + this.challengeLayer.addChild( gameAreaNode ); + gameAreaNode.translation = this.layoutBounds.leftTop.plus( AreaModelCommonConstants.GAME_AREA_OFFSET ); - const panelAlignGroup = AreaModelCommonGlobals.panelAlignGroup; + /*---------------------------------------------------------------------------* + * Panels + *----------------------------------------------------------------------------*/ - const factorsNode = new GenericFactorsNode( this.areaDisplay.totalProperties, this.areaDisplay.allowExponentsProperty ); - const factorsContent = this.createPanel( dimensionsString, panelAlignGroup, factorsNode ); + const panelAlignGroup = AreaModelCommonGlobals.panelAlignGroup; - // If we have a polynomial, don't use this editable property (use the polynomial editor component instead) - const totalTermEntryProperty = new DerivedProperty( [ this.areaDisplay.totalEntriesProperty ], function( totalEntries ) { - return totalEntries.length === 1 ? totalEntries[ 0 ] : new Entry( null ); - } ); + const factorsNode = new GenericFactorsNode( this.areaDisplay.totalProperties, this.areaDisplay.allowExponentsProperty ); + const factorsContent = this.createPanel( dimensionsString, panelAlignGroup, factorsNode ); - const totalNode = new GameEditableLabelNode( { - entryProperty: totalTermEntryProperty, - gameStateProperty: model.stateProperty, - activeEntryProperty: model.activeEntryProperty, - colorProperty: AreaModelCommonColorProfile.totalEditableProperty, - allowExponentsProperty: this.areaDisplay.allowExponentsProperty, - orientation: Orientation.HORIZONTAL, - labelFont: AreaModelCommonConstants.GAME_TOTAL_FONT, - editFont: AreaModelCommonConstants.GAME_TOTAL_FONT - } ); - const polynomialEditNode = new PolynomialEditNode( this.areaDisplay.totalProperty, this.areaDisplay.totalEntriesProperty, function() { - if ( model.stateProperty.value === GameState.WRONG_FIRST_ANSWER ) { - model.stateProperty.value = GameState.SECOND_ATTEMPT; - } - } ); - const polynomialReadoutText = new RichText( '?', { - font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT, - maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX - } ); - this.areaDisplay.totalProperty.link( function( total ) { - if ( total ) { - polynomialReadoutText.text = total.toRichString( false ); - } - } ); + // If we have a polynomial, don't use this editable property (use the polynomial editor component instead) + const totalTermEntryProperty = new DerivedProperty( [ this.areaDisplay.totalEntriesProperty ], function( totalEntries ) { + return totalEntries.length === 1 ? totalEntries[ 0 ] : new Entry( null ); + } ); - const totalContainer = new Node(); - Property.multilink( - [ this.areaDisplay.totalEntriesProperty, model.stateProperty ], - function( totalEntries, gameState ) { - if ( totalEntries.length > 1 ) { - if ( totalEntries[ 0 ].displayType === EntryDisplayType.EDITABLE && - gameState !== GameState.CORRECT_ANSWER && - gameState !== GameState.SHOW_SOLUTION ) { - totalContainer.children = [ polynomialEditNode ]; - } - else { - totalContainer.children = [ polynomialReadoutText ]; - } + const totalNode = new GameEditableLabelNode( { + entryProperty: totalTermEntryProperty, + gameStateProperty: model.stateProperty, + activeEntryProperty: model.activeEntryProperty, + colorProperty: AreaModelCommonColorProfile.totalEditableProperty, + allowExponentsProperty: this.areaDisplay.allowExponentsProperty, + orientation: Orientation.HORIZONTAL, + labelFont: AreaModelCommonConstants.GAME_TOTAL_FONT, + editFont: AreaModelCommonConstants.GAME_TOTAL_FONT + } ); + const polynomialEditNode = new PolynomialEditNode( this.areaDisplay.totalProperty, this.areaDisplay.totalEntriesProperty, function() { + if ( model.stateProperty.value === GameState.WRONG_FIRST_ANSWER ) { + model.stateProperty.value = GameState.SECOND_ATTEMPT; + } + } ); + const polynomialReadoutText = new RichText( '?', { + font: AreaModelCommonConstants.TOTAL_AREA_LABEL_FONT, + maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX + } ); + this.areaDisplay.totalProperty.link( function( total ) { + if ( total ) { + polynomialReadoutText.text = total.toRichString( false ); + } + } ); + + const totalContainer = new Node(); + Property.multilink( + [ this.areaDisplay.totalEntriesProperty, model.stateProperty ], + function( totalEntries, gameState ) { + if ( totalEntries.length > 1 ) { + if ( totalEntries[ 0 ].displayType === EntryDisplayType.EDITABLE && + gameState !== GameState.CORRECT_ANSWER && + gameState !== GameState.SHOW_SOLUTION ) { + totalContainer.children = [ polynomialEditNode ]; } else { - totalContainer.children = [ totalNode ]; + totalContainer.children = [ polynomialReadoutText ]; } - } ); - - const productContent = this.createPanel( totalAreaOfModelString, panelAlignGroup, totalContainer ); - - const panelBox = new VBox( { - children: [ - factorsContent, - productContent - ], - spacing: AreaModelCommonConstants.LAYOUT_SPACING + } + else { + totalContainer.children = [ totalNode ]; + } } ); - this.challengeLayer.addChild( new AlignBox( panelBox, { - alignBounds: this.layoutBounds, - xAlign: 'right', - yAlign: 'top', - topMargin: gameAreaNode.y, - rightMargin: AreaModelCommonConstants.LAYOUT_SPACING - } ) ); - - /** - * Creates a game-style button that may be enabled via a property - * - * @param {string} label - * @param {function} listener - The callback for when the button is pressed - * @param {Property.} [enabledProperty] - */ - function createGameButton( label, listener, enabledProperty ) { - const button = new RectangularPushButton( { - content: new Text( label, { - font: AreaModelCommonConstants.BUTTON_FONT, - maxWidth: 200 - } ), - touchAreaXDilation: 10, - touchAreaYDilation: 10, - listener: listener, - baseColor: AreaModelCommonColorProfile.gameButtonBackgroundProperty, - centerX: panelBox.centerX, - top: panelBox.bottom + 80 - } ); - enabledProperty && enabledProperty.link( function( enabled ) { - button.enabled = enabled; - } ); - self.challengeLayer.addChild( button ); - return button; - } - const checkButton = createGameButton( checkString, function() { - model.check(); - }, model.allowCheckingProperty ); + const productContent = this.createPanel( totalAreaOfModelString, panelAlignGroup, totalContainer ); - const tryAgainButton = createGameButton( tryAgainString, function() { - model.tryAgain(); - } ); + const panelBox = new VBox( { + children: [ + factorsContent, + productContent + ], + spacing: AreaModelCommonConstants.LAYOUT_SPACING + } ); + this.challengeLayer.addChild( new AlignBox( panelBox, { + alignBounds: this.layoutBounds, + xAlign: 'right', + yAlign: 'top', + topMargin: gameAreaNode.y, + rightMargin: AreaModelCommonConstants.LAYOUT_SPACING + } ) ); - const nextButton = createGameButton( nextString, function() { - model.next(); + /** + * Creates a game-style button that may be enabled via a property + * + * @param {string} label + * @param {function} listener - The callback for when the button is pressed + * @param {Property.} [enabledProperty] + */ + function createGameButton( label, listener, enabledProperty ) { + const button = new RectangularPushButton( { + content: new Text( label, { + font: AreaModelCommonConstants.BUTTON_FONT, + maxWidth: 200 + } ), + touchAreaXDilation: 10, + touchAreaYDilation: 10, + listener: listener, + baseColor: AreaModelCommonColorProfile.gameButtonBackgroundProperty, + centerX: panelBox.centerX, + top: panelBox.bottom + 80 } ); - - const showAnswerButton = createGameButton( showAnswerString, function() { - model.showAnswer(); + enabledProperty && enabledProperty.link( function( enabled ) { + button.enabled = enabled; } ); + self.challengeLayer.addChild( button ); + return button; + } - // Cheat button, see https://github.com/phetsims/area-model-common/issues/116 and - // https://github.com/phetsims/area-model-common/issues/163 - if ( phet.chipper.queryParameters.showAnswers ) { - var cheatButton = new RectangularPushButton( { - content: new FaceNode( 40 ), - top: showAnswerButton.bottom + 10, - centerX: showAnswerButton.centerX, - listener: function() { - model.cheat(); - } - } ); - this.challengeLayer.addChild( cheatButton ); - } + const checkButton = createGameButton( checkString, function() { + model.check(); + }, model.allowCheckingProperty ); - const faceScoreNode = new FaceWithPointsNode( { - faceDiameter: 90, - pointsAlignment: 'rightBottom', - pointsFont: AreaModelCommonConstants.SCORE_INCREASE_FONT, - spacing: 10, - centerX: showAnswerButton.centerX, // a bit unclean, since the text hasn't been positioned yet. - top: showAnswerButton.bottom + 10 + const tryAgainButton = createGameButton( tryAgainString, function() { + model.tryAgain(); + } ); + + const nextButton = createGameButton( nextString, function() { + model.next(); + } ); + + const showAnswerButton = createGameButton( showAnswerString, function() { + model.showAnswer(); + } ); + + // Cheat button, see https://github.com/phetsims/area-model-common/issues/116 and + // https://github.com/phetsims/area-model-common/issues/163 + if ( phet.chipper.queryParameters.showAnswers ) { + var cheatButton = new RectangularPushButton( { + content: new FaceNode( 40 ), + top: showAnswerButton.bottom + 10, + centerX: showAnswerButton.centerX, + listener: function() { + model.cheat(); + } } ); - this.challengeLayer.addChild( faceScoreNode ); - - const levelCompleteContainer = new Node(); - this.challengeLayer.addChild( levelCompleteContainer ); - - // @private {RewardNode|null} - We need to step it when there is one - this.rewardNode = null; - - const rewardNodes = RewardNode.createRandomNodes( [ - new FaceNode( 40, { headStroke: 'black', headLineWidth: 1.5 } ), - new StarNode() - ], 100 ); - Orientation.VALUES.forEach( function( orientation ) { - const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); - - _.range( 1, 10 ).forEach( function( digit ) { - [ -1, 1 ].forEach( function( sign ) { - const powers = model.hasExponents ? [ 0, 1, 2 ] : [ 0, 0, 0 ]; - powers.forEach( function( power ) { - rewardNodes.push( new RichText( new Term( sign * digit, power ).toRichString( false ), { - font: AreaModelCommonConstants.REWARD_NODE_FONT, - fill: colorProperty - } ) ); - } ); + this.challengeLayer.addChild( cheatButton ); + } + + const faceScoreNode = new FaceWithPointsNode( { + faceDiameter: 90, + pointsAlignment: 'rightBottom', + pointsFont: AreaModelCommonConstants.SCORE_INCREASE_FONT, + spacing: 10, + centerX: showAnswerButton.centerX, // a bit unclean, since the text hasn't been positioned yet. + top: showAnswerButton.bottom + 10 + } ); + this.challengeLayer.addChild( faceScoreNode ); + + const levelCompleteContainer = new Node(); + this.challengeLayer.addChild( levelCompleteContainer ); + + // @private {RewardNode|null} - We need to step it when there is one + this.rewardNode = null; + + const rewardNodes = RewardNode.createRandomNodes( [ + new FaceNode( 40, { headStroke: 'black', headLineWidth: 1.5 } ), + new StarNode() + ], 100 ); + Orientation.VALUES.forEach( function( orientation ) { + const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); + + _.range( 1, 10 ).forEach( function( digit ) { + [ -1, 1 ].forEach( function( sign ) { + const powers = model.hasExponents ? [ 0, 1, 2 ] : [ 0, 0, 0 ]; + powers.forEach( function( power ) { + rewardNodes.push( new RichText( new Term( sign * digit, power ).toRichString( false ), { + font: AreaModelCommonConstants.REWARD_NODE_FONT, + fill: colorProperty + } ) ); } ); } ); } ); + } ); - let levelCompletedNode = null; - - model.stateProperty.link( function( state, oldState ) { - // When we switch back to level selection, try to leave things as they were. - if ( state !== null ) { - gameAreaNode.visible = state !== GameState.LEVEL_COMPLETE; - panelBox.visible = state !== GameState.LEVEL_COMPLETE; - statusBar.visible = state !== GameState.LEVEL_COMPLETE; - promptText.visible = state !== GameState.LEVEL_COMPLETE; - levelCompleteContainer.visible = state === GameState.LEVEL_COMPLETE; - checkButton.visible = state === GameState.FIRST_ATTEMPT || + let levelCompletedNode = null; + + model.stateProperty.link( function( state, oldState ) { + // When we switch back to level selection, try to leave things as they were. + if ( state !== null ) { + gameAreaNode.visible = state !== GameState.LEVEL_COMPLETE; + panelBox.visible = state !== GameState.LEVEL_COMPLETE; + statusBar.visible = state !== GameState.LEVEL_COMPLETE; + promptText.visible = state !== GameState.LEVEL_COMPLETE; + levelCompleteContainer.visible = state === GameState.LEVEL_COMPLETE; + checkButton.visible = state === GameState.FIRST_ATTEMPT || + state === GameState.SECOND_ATTEMPT; + tryAgainButton.visible = state === GameState.WRONG_FIRST_ANSWER; + nextButton.visible = state === GameState.CORRECT_ANSWER || + state === GameState.SHOW_SOLUTION; + showAnswerButton.visible = state === GameState.WRONG_SECOND_ANSWER; + faceScoreNode.visible = state === GameState.CORRECT_ANSWER || + state === GameState.WRONG_FIRST_ANSWER || + state === GameState.WRONG_SECOND_ANSWER; + if ( cheatButton ) { + cheatButton.visible = state === GameState.FIRST_ATTEMPT || state === GameState.SECOND_ATTEMPT; - tryAgainButton.visible = state === GameState.WRONG_FIRST_ANSWER; - nextButton.visible = state === GameState.CORRECT_ANSWER || - state === GameState.SHOW_SOLUTION; - showAnswerButton.visible = state === GameState.WRONG_SECOND_ANSWER; - faceScoreNode.visible = state === GameState.CORRECT_ANSWER || - state === GameState.WRONG_FIRST_ANSWER || - state === GameState.WRONG_SECOND_ANSWER; - if ( cheatButton ) { - cheatButton.visible = state === GameState.FIRST_ATTEMPT || - state === GameState.SECOND_ATTEMPT; - } } - if ( state === GameState.CORRECT_ANSWER ) { - faceScoreNode.smile(); - faceScoreNode.setPoints( oldState === GameState.FIRST_ATTEMPT ? 2 : 1 ); - } - else if ( state === GameState.WRONG_FIRST_ANSWER || state === GameState.WRONG_SECOND_ANSWER ) { - faceScoreNode.frown(); - } - if ( state === GameState.LEVEL_COMPLETE ) { - const level = model.currentLevelProperty.value; - - levelCompletedNode && levelCompletedNode.dispose(); - levelCompletedNode = new LevelCompletedNode( - level.number, - level.scoreProperty.value, - AreaModelCommonConstants.PERFECT_SCORE, - AreaModelCommonConstants.NUM_CHALLENGES, - false, 0, 0, 0, - function() { - model.moveToLevelSelection(); - }, { - cornerRadius: 8, - center: self.layoutBounds.center, - fill: level.colorProperty, - contentMaxWidth: 400 - } ); - - levelCompleteContainer.children = [ - levelCompletedNode - ]; - - if ( level.scoreProperty.value === AreaModelCommonConstants.PERFECT_SCORE ) { - self.rewardNode = new RewardNode( { - nodes: rewardNodes - } ); - levelCompleteContainer.insertChild( 0, self.rewardNode ); - } + } + if ( state === GameState.CORRECT_ANSWER ) { + faceScoreNode.smile(); + faceScoreNode.setPoints( oldState === GameState.FIRST_ATTEMPT ? 2 : 1 ); + } + else if ( state === GameState.WRONG_FIRST_ANSWER || state === GameState.WRONG_SECOND_ANSWER ) { + faceScoreNode.frown(); + } + if ( state === GameState.LEVEL_COMPLETE ) { + const level = model.currentLevelProperty.value; + + levelCompletedNode && levelCompletedNode.dispose(); + levelCompletedNode = new LevelCompletedNode( + level.number, + level.scoreProperty.value, + AreaModelCommonConstants.PERFECT_SCORE, + AreaModelCommonConstants.NUM_CHALLENGES, + false, 0, 0, 0, + function() { + model.moveToLevelSelection(); + }, { + cornerRadius: 8, + center: self.layoutBounds.center, + fill: level.colorProperty, + contentMaxWidth: 400 + } ); + + levelCompleteContainer.children = [ + levelCompletedNode + ]; + + if ( level.scoreProperty.value === AreaModelCommonConstants.PERFECT_SCORE ) { + self.rewardNode = new RewardNode( { + nodes: rewardNodes + } ); + levelCompleteContainer.insertChild( 0, self.rewardNode ); } - else { - if ( self.rewardNode ) { - self.rewardNode.detach(); - self.rewardNode.dispose(); - self.rewardNode = null; - } + } + else { + if ( self.rewardNode ) { + self.rewardNode.detach(); + self.rewardNode.dispose(); + self.rewardNode = null; } - } ); - } + } + } ); +} - areaModelCommon.register( 'GameAreaScreenView', GameAreaScreenView ); - - return inherit( ScreenView, GameAreaScreenView, { - /** - * Creates a panel interior with the title left-aligned, and the content somewhat offset from the left with a - * guaranteed margin. - * @private - * - * @param {string} titleString - * @param {AlignGroup} panelAlignGroup - * @param {Node} content - */ - createPanel: function( titleString, panelAlignGroup, content ) { - const panelContent = new VBox( { - children: [ - new AlignBox( new Text( titleString, { - font: AreaModelCommonConstants.TITLE_FONT, - maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX - } ), { - group: panelAlignGroup, - xAlign: 'left' - } ), - new AlignBox( content, { - group: panelAlignGroup, - xAlign: 'center' - } ) - ], - spacing: 10 - } ); - return new Panel( panelContent, { - xMargin: 15, - yMargin: 10, - fill: AreaModelCommonColorProfile.panelBackgroundProperty, - stroke: AreaModelCommonColorProfile.panelBorderProperty, - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS - } ); - }, +areaModelCommon.register( 'GameAreaScreenView', GameAreaScreenView ); - /** - * Steps forward in time. - * @public - * - * @param {number} dt - */ - step: function( dt ) { - this.transitionNode.step( dt ); +export default inherit( ScreenView, GameAreaScreenView, { + /** + * Creates a panel interior with the title left-aligned, and the content somewhat offset from the left with a + * guaranteed margin. + * @private + * + * @param {string} titleString + * @param {AlignGroup} panelAlignGroup + * @param {Node} content + */ + createPanel: function( titleString, panelAlignGroup, content ) { + const panelContent = new VBox( { + children: [ + new AlignBox( new Text( titleString, { + font: AreaModelCommonConstants.TITLE_FONT, + maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX + } ), { + group: panelAlignGroup, + xAlign: 'left' + } ), + new AlignBox( content, { + group: panelAlignGroup, + xAlign: 'center' + } ) + ], + spacing: 10 + } ); + return new Panel( panelContent, { + xMargin: 15, + yMargin: 10, + fill: AreaModelCommonColorProfile.panelBackgroundProperty, + stroke: AreaModelCommonColorProfile.panelBorderProperty, + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS + } ); + }, - this.rewardNode && this.rewardNode.step( dt ); - } - } ); -} ); + /** + * Steps forward in time. + * @public + * + * @param {number} dt + */ + step: function( dt ) { + this.transitionNode.step( dt ); + + this.rewardNode && this.rewardNode.step( dt ); + } +} ); \ No newline at end of file diff --git a/js/game/view/GameAudio.js b/js/game/view/GameAudio.js index 386e208c..aceb20b0 100644 --- a/js/game/view/GameAudio.js +++ b/js/game/view/GameAudio.js @@ -5,51 +5,48 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const GameAudioPlayer = require( 'VEGAS/GameAudioPlayer' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import GameAudioPlayer from '../../../../vegas/js/GameAudioPlayer.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import GameState from '../model/GameState.js'; - /** - * @constructor - * @extends {Object} - * - * @param {GameAreaModel} model - */ - function GameAudio( model ) { - const audioPlayer = new GameAudioPlayer(); +/** + * @constructor + * @extends {Object} + * + * @param {GameAreaModel} model + */ +function GameAudio( model ) { + const audioPlayer = new GameAudioPlayer(); - model.stateProperty.link( function( state, oldState ) { - // If we just moved to/from level section (outside of a level), don't fire sounds. - if ( state === null || oldState === null ) { return; } + model.stateProperty.link( function( state, oldState ) { + // If we just moved to/from level section (outside of a level), don't fire sounds. + if ( state === null || oldState === null ) { return; } - if ( state === GameState.CORRECT_ANSWER ) { - audioPlayer.correctAnswer(); + if ( state === GameState.CORRECT_ANSWER ) { + audioPlayer.correctAnswer(); + } + if ( state === GameState.WRONG_FIRST_ANSWER || state === GameState.WRONG_SECOND_ANSWER ) { + audioPlayer.wrongAnswer(); + } + if ( state === GameState.LEVEL_COMPLETE ) { + const score = model.currentLevelProperty.value.scoreProperty.value; + if ( score === AreaModelCommonConstants.PERFECT_SCORE ) { + audioPlayer.gameOverPerfectScore(); } - if ( state === GameState.WRONG_FIRST_ANSWER || state === GameState.WRONG_SECOND_ANSWER ) { - audioPlayer.wrongAnswer(); + else if ( score === 0 ) { + audioPlayer.gameOverZeroScore(); } - if ( state === GameState.LEVEL_COMPLETE ) { - const score = model.currentLevelProperty.value.scoreProperty.value; - if ( score === AreaModelCommonConstants.PERFECT_SCORE ) { - audioPlayer.gameOverPerfectScore(); - } - else if ( score === 0 ) { - audioPlayer.gameOverZeroScore(); - } - else { - audioPlayer.gameOverImperfectScore(); - } + else { + audioPlayer.gameOverImperfectScore(); } - } ); - } + } + } ); +} - areaModelCommon.register( 'GameAudio', GameAudio ); +areaModelCommon.register( 'GameAudio', GameAudio ); - return inherit( Object, GameAudio ); -} ); +inherit( Object, GameAudio ); +export default GameAudio; \ No newline at end of file diff --git a/js/game/view/GameEditableLabelNode.js b/js/game/view/GameEditableLabelNode.js index 188c94af..7386020e 100644 --- a/js/game/view/GameEditableLabelNode.js +++ b/js/game/view/GameEditableLabelNode.js @@ -7,157 +7,154 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const EntryDisplayType = require( 'AREA_MODEL_COMMON/game/model/EntryDisplayType' ); - const EntryStatus = require( 'AREA_MODEL_COMMON/game/model/EntryStatus' ); - const GameState = require( 'AREA_MODEL_COMMON/game/model/GameState' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const TermEditNode = require( 'AREA_MODEL_COMMON/generic/view/TermEditNode' ); - const validate = require( 'AXON/validate' ); - const Vector2 = require( 'DOT/Vector2' ); - - /** - * @constructor - * @extends {Node} - * - * @param {Object} config - See constructor - */ - function GameEditableLabelNode( config ) { - - config = merge( { - // required - entryProperty: null, // {Property.} - gameStateProperty: null, // {Property.} - activeEntryProperty: null, // {Property.} - colorProperty: null, // {Property.} - allowExponentsProperty: null, // {Property.} - orientation: null, // {Orientation} - - // optional - labelFont: AreaModelCommonConstants.GAME_MAIN_LABEL_FONT, - editFont: AreaModelCommonConstants.GAME_MAIN_EDIT_FONT - }, config ); - - assert && assert( config.entryProperty instanceof Property ); - assert && assert( config.gameStateProperty instanceof Property ); - assert && assert( config.activeEntryProperty instanceof Property ); - assert && assert( config.colorProperty instanceof Property ); - assert && assert( config.allowExponentsProperty instanceof Property ); - validate( config.orientation, { validValues: Orientation.VALUES } ); - - Node.call( this ); - - // Helpful to break out some values - const entryProperty = config.entryProperty; - const gameStateProperty = config.gameStateProperty; - const activeEntryProperty = config.activeEntryProperty; - const colorProperty = config.colorProperty; - const allowExponentsProperty = config.allowExponentsProperty; - const orientation = config.orientation; - - const valueProperty = new DynamicProperty( entryProperty, { - derive: 'valueProperty', - bidirectional: true - } ); - const digitsProperty = new DerivedProperty( [ entryProperty ], _.property( 'digits' ) ); - const statusProperty = new DynamicProperty( entryProperty, { - derive: 'statusProperty' - } ); - const isActiveProperty = new DerivedProperty( - [ entryProperty, activeEntryProperty ], - function( entry, activeEntry ) { - return entry === activeEntry; - } ); - - const readoutText = new RichText( '?', { - fill: colorProperty, - font: config.labelFont - } ); - this.addChild( readoutText ); - valueProperty.link( function( termOrList ) { - readoutText.text = termOrList === null ? '?' : termOrList.toRichString( false ); - readoutText.center = Vector2.ZERO; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import validate from '../../../../axon/js/validate.js'; +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import TermEditNode from '../../generic/view/TermEditNode.js'; +import EntryDisplayType from '../model/EntryDisplayType.js'; +import EntryStatus from '../model/EntryStatus.js'; +import GameState from '../model/GameState.js'; + +/** + * @constructor + * @extends {Node} + * + * @param {Object} config - See constructor + */ +function GameEditableLabelNode( config ) { + + config = merge( { + // required + entryProperty: null, // {Property.} + gameStateProperty: null, // {Property.} + activeEntryProperty: null, // {Property.} + colorProperty: null, // {Property.} + allowExponentsProperty: null, // {Property.} + orientation: null, // {Orientation} + + // optional + labelFont: AreaModelCommonConstants.GAME_MAIN_LABEL_FONT, + editFont: AreaModelCommonConstants.GAME_MAIN_EDIT_FONT + }, config ); + + assert && assert( config.entryProperty instanceof Property ); + assert && assert( config.gameStateProperty instanceof Property ); + assert && assert( config.activeEntryProperty instanceof Property ); + assert && assert( config.colorProperty instanceof Property ); + assert && assert( config.allowExponentsProperty instanceof Property ); + validate( config.orientation, { validValues: Orientation.VALUES } ); + + Node.call( this ); + + // Helpful to break out some values + const entryProperty = config.entryProperty; + const gameStateProperty = config.gameStateProperty; + const activeEntryProperty = config.activeEntryProperty; + const colorProperty = config.colorProperty; + const allowExponentsProperty = config.allowExponentsProperty; + const orientation = config.orientation; + + const valueProperty = new DynamicProperty( entryProperty, { + derive: 'valueProperty', + bidirectional: true + } ); + const digitsProperty = new DerivedProperty( [ entryProperty ], _.property( 'digits' ) ); + const statusProperty = new DynamicProperty( entryProperty, { + derive: 'statusProperty' + } ); + const isActiveProperty = new DerivedProperty( + [ entryProperty, activeEntryProperty ], + function( entry, activeEntry ) { + return entry === activeEntry; } ); - const textColorProperty = new DerivedProperty( - [ statusProperty, colorProperty, AreaModelCommonColorProfile.errorStatusProperty ], - function( highlight, color, errorColor ) { - if ( highlight === EntryStatus.INCORRECT ) { - return errorColor; - } - else { - return color; - } - } ); - const borderColorProperty = new DerivedProperty( [ - statusProperty, - colorProperty, - AreaModelCommonColorProfile.errorStatusProperty, - AreaModelCommonColorProfile.dirtyStatusProperty - ], function( highlight, color, errorColor, dirtyColor ) { - if ( highlight === EntryStatus.NORMAL ) { + const readoutText = new RichText( '?', { + fill: colorProperty, + font: config.labelFont + } ); + this.addChild( readoutText ); + + valueProperty.link( function( termOrList ) { + readoutText.text = termOrList === null ? '?' : termOrList.toRichString( false ); + readoutText.center = Vector2.ZERO; + } ); + + const textColorProperty = new DerivedProperty( + [ statusProperty, colorProperty, AreaModelCommonColorProfile.errorStatusProperty ], + function( highlight, color, errorColor ) { + if ( highlight === EntryStatus.INCORRECT ) { + return errorColor; + } + else { return color; } - else if ( highlight === EntryStatus.DIRTY ) { - return dirtyColor; + } ); + const borderColorProperty = new DerivedProperty( [ + statusProperty, + colorProperty, + AreaModelCommonColorProfile.errorStatusProperty, + AreaModelCommonColorProfile.dirtyStatusProperty + ], function( highlight, color, errorColor, dirtyColor ) { + if ( highlight === EntryStatus.NORMAL ) { + return color; + } + else if ( highlight === EntryStatus.DIRTY ) { + return dirtyColor; + } + else { + return errorColor; + } + } ); + const termEditNode = new TermEditNode( new Property( orientation ), valueProperty, { + textColorProperty: textColorProperty, + borderColorProperty: borderColorProperty, + isActiveProperty: isActiveProperty, + digitCountProperty: digitsProperty, + allowExponentsProperty: allowExponentsProperty, + editCallback: function() { + if ( gameStateProperty.value === GameState.WRONG_FIRST_ANSWER ) { + gameStateProperty.value = GameState.SECOND_ATTEMPT; + } + if ( activeEntryProperty.value !== entryProperty.value ) { + activeEntryProperty.value = entryProperty.value; } else { - return errorColor; + // Pressing on the edit button when that keypad is already open will instead close the keypad. + // See https://github.com/phetsims/area-model-common/issues/127 + activeEntryProperty.value = null; } - } ); - const termEditNode = new TermEditNode( new Property( orientation ), valueProperty, { - textColorProperty: textColorProperty, - borderColorProperty: borderColorProperty, - isActiveProperty: isActiveProperty, - digitCountProperty: digitsProperty, - allowExponentsProperty: allowExponentsProperty, - editCallback: function() { - if ( gameStateProperty.value === GameState.WRONG_FIRST_ANSWER ) { - gameStateProperty.value = GameState.SECOND_ATTEMPT; - } - if ( activeEntryProperty.value !== entryProperty.value ) { - activeEntryProperty.value = entryProperty.value; - } - else { - // Pressing on the edit button when that keypad is already open will instead close the keypad. - // See https://github.com/phetsims/area-model-common/issues/127 - activeEntryProperty.value = null; - } - }, - font: config.editFont - } ); - this.addChild( termEditNode ); + }, + font: config.editFont + } ); + this.addChild( termEditNode ); - function centerTermEditNode() { - termEditNode.center = Vector2.ZERO; - } + function centerTermEditNode() { + termEditNode.center = Vector2.ZERO; + } - digitsProperty.link( centerTermEditNode ); - allowExponentsProperty.link( centerTermEditNode ); + digitsProperty.link( centerTermEditNode ); + allowExponentsProperty.link( centerTermEditNode ); - Property.multilink( [ entryProperty, gameStateProperty ], function( entry, gameState ) { - const isReadoutOverride = gameState === GameState.CORRECT_ANSWER || gameState === GameState.SHOW_SOLUTION; - readoutText.visible = entry.displayType === EntryDisplayType.READOUT || - ( isReadoutOverride && entry.displayType === EntryDisplayType.EDITABLE ); - termEditNode.visible = entry.displayType === EntryDisplayType.EDITABLE && !isReadoutOverride; - } ); - } + Property.multilink( [ entryProperty, gameStateProperty ], function( entry, gameState ) { + const isReadoutOverride = gameState === GameState.CORRECT_ANSWER || gameState === GameState.SHOW_SOLUTION; + readoutText.visible = entry.displayType === EntryDisplayType.READOUT || + ( isReadoutOverride && entry.displayType === EntryDisplayType.EDITABLE ); + termEditNode.visible = entry.displayType === EntryDisplayType.EDITABLE && !isReadoutOverride; + } ); +} - areaModelCommon.register( 'GameEditableLabelNode', GameEditableLabelNode ); +areaModelCommon.register( 'GameEditableLabelNode', GameEditableLabelNode ); - return inherit( Node, GameEditableLabelNode ); -} ); +inherit( Node, GameEditableLabelNode ); +export default GameEditableLabelNode; \ No newline at end of file diff --git a/js/game/view/PolynomialEditNode.js b/js/game/view/PolynomialEditNode.js index 2f59f074..1542155d 100644 --- a/js/game/view/PolynomialEditNode.js +++ b/js/game/view/PolynomialEditNode.js @@ -7,219 +7,216 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const Entry = require( 'AREA_MODEL_COMMON/game/model/Entry' ); - const EntryStatus = require( 'AREA_MODEL_COMMON/game/model/EntryStatus' ); - const inherit = require( 'PHET_CORE/inherit' ); - const InputMethod = require( 'AREA_MODEL_COMMON/game/model/InputMethod' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const NumberPicker = require( 'SCENERY_PHET/NumberPicker' ); - const Polynomial = require( 'AREA_MODEL_COMMON/common/model/Polynomial' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const Text = require( 'SCENERY/nodes/Text' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} polynomialProperty - * @param {Property.>} totalEntriesProperty - * @param {function} editedCallback - Called with no arguments when something is edited - */ - function PolynomialEditNode( polynomialProperty, totalEntriesProperty, editedCallback ) { - const longestString = new Polynomial( [ - new Term( -9, 2 ), - new Term( -9, 1 ), - new Term( -9, 0 ) - ] ).toRichString(); - - const readoutText = new RichText( longestString, { - font: AreaModelCommonConstants.POLYNOMIAL_EDIT_READOUT_FONT - } ); - - const readoutBackgroundRectangle = Rectangle.bounds( readoutText.bounds.dilatedXY( 30, 5 ), { - cornerRadius: 3, - stroke: 'black', - fill: 'white' - } ); - readoutText.centerY = readoutBackgroundRectangle.centerY; // Don't reposition vertically with exponents - polynomialProperty.link( function( polynomial ) { - readoutText.text = polynomial === null ? '0' : polynomial.toRichString(); - readoutText.centerX = readoutBackgroundRectangle.centerX; - } ); - const readout = new Node( { - children: [ - readoutBackgroundRectangle, - readoutText - ] - } ); - - const editFont = AreaModelCommonConstants.GAME_POLYNOMIAL_EDIT_FONT; - - // {Property.} - const constantEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { - return totalEntries.length > 1 ? totalEntries[ 0 ] : new Entry( null ); - } ); - const xEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { - return totalEntries.length > 1 ? totalEntries[ 1 ] : new Entry( null ); - } ); - const xSquaredEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { - return totalEntries.length > 2 ? totalEntries[ 2 ] : new Entry( null ); - } ); - const constantProperty = new DynamicProperty( constantEntryProperty, { - derive: 'valueProperty', - map: function( term ) { - return term === null ? 0 : term.coefficient; - }, - inverseMap: function( number ) { - return new Term( number, 0 ); - }, - bidirectional: true - } ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Range from '../../../../dot/js/Range.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import NumberPicker from '../../../../scenery-phet/js/NumberPicker.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import Polynomial from '../../common/model/Polynomial.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import Entry from '../model/Entry.js'; +import EntryStatus from '../model/EntryStatus.js'; +import InputMethod from '../model/InputMethod.js'; - const xProperty = new DynamicProperty( xEntryProperty, { - derive: 'valueProperty', - map: function( term ) { - return term === null ? 0 : term.coefficient; - }, - inverseMap: function( number ) { - return new Term( number, 1 ); - }, - bidirectional: true - } ); - - const xSquaredProperty = new DynamicProperty( xSquaredEntryProperty, { - derive: 'valueProperty', - map: function( term ) { - return term === null ? 0 : term.coefficient; - }, - inverseMap: function( number ) { - return new Term( number, 2 ); - }, - bidirectional: true - } ); - - // When one is changed, we want to make sure that all entries are not marked as dirty internally (so that the user - // can submit after just changing one value). This is done by providing an actual value to the property. - function provideEntryValues() { - [ constantEntryProperty, xEntryProperty, xSquaredEntryProperty ].forEach( function( entryProperty, index ) { - const valueProperty = entryProperty.value.valueProperty; - if ( valueProperty.value === null ) { - valueProperty.value = new Term( 0, index ); - } - } ); - } - - function linkProperty( property, entryProperty ) { - property.link( function() { - // Only flag the values as edited when the user makes a change (not when we set it as part of a challenge) - if ( property.isExternallyChanging ) { - editedCallback(); - provideEntryValues(); - entryProperty.value.statusProperty.value = EntryStatus.NORMAL; - } - } ); - } - - linkProperty( constantProperty, constantEntryProperty ); - linkProperty( xProperty, xEntryProperty ); - linkProperty( xSquaredProperty, xSquaredEntryProperty ); - - // [-81,81] is the actual range we need for editable values, - // see https://github.com/phetsims/area-model-common/issues/94 - const rangeProperty = new Property( new Range( -81, 81 ) ); - - function getPickerColorProperty( entryProperty ) { - return new DerivedProperty( [ - new DynamicProperty( entryProperty, { derive: 'statusProperty' } ), - AreaModelCommonColorProfile.errorStatusProperty, - AreaModelCommonColorProfile.dirtyStatusProperty - ], function( highlight, errorColor, dirtyColor ) { - if ( highlight === EntryStatus.NORMAL ) { - return 'black'; - } - else if ( highlight === EntryStatus.DIRTY ) { - return dirtyColor; - } - else { - return errorColor; - } - } ); - } - - const constantPicker = new NumberPicker( constantProperty, rangeProperty, { - color: getPickerColorProperty( constantEntryProperty ) - } ); - const xPicker = new NumberPicker( xProperty, rangeProperty, { - color: getPickerColorProperty( xEntryProperty ) - } ); - const xSquaredPicker = new NumberPicker( xSquaredProperty, rangeProperty, { - color: getPickerColorProperty( xSquaredEntryProperty ) +/** + * @constructor + * @extends {Node} + * + * @param {Property.} polynomialProperty + * @param {Property.>} totalEntriesProperty + * @param {function} editedCallback - Called with no arguments when something is edited + */ +function PolynomialEditNode( polynomialProperty, totalEntriesProperty, editedCallback ) { + const longestString = new Polynomial( [ + new Term( -9, 2 ), + new Term( -9, 1 ), + new Term( -9, 0 ) + ] ).toRichString(); + + const readoutText = new RichText( longestString, { + font: AreaModelCommonConstants.POLYNOMIAL_EDIT_READOUT_FONT + } ); + + const readoutBackgroundRectangle = Rectangle.bounds( readoutText.bounds.dilatedXY( 30, 5 ), { + cornerRadius: 3, + stroke: 'black', + fill: 'white' + } ); + readoutText.centerY = readoutBackgroundRectangle.centerY; // Don't reposition vertically with exponents + polynomialProperty.link( function( polynomial ) { + readoutText.text = polynomial === null ? '0' : polynomial.toRichString(); + readoutText.centerX = readoutBackgroundRectangle.centerX; + } ); + const readout = new Node( { + children: [ + readoutBackgroundRectangle, + readoutText + ] + } ); + + const editFont = AreaModelCommonConstants.GAME_POLYNOMIAL_EDIT_FONT; + + // {Property.} + const constantEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { + return totalEntries.length > 1 ? totalEntries[ 0 ] : new Entry( null ); + } ); + const xEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { + return totalEntries.length > 1 ? totalEntries[ 1 ] : new Entry( null ); + } ); + const xSquaredEntryProperty = new DerivedProperty( [ totalEntriesProperty ], function( totalEntries ) { + return totalEntries.length > 2 ? totalEntries[ 2 ] : new Entry( null ); + } ); + + const constantProperty = new DynamicProperty( constantEntryProperty, { + derive: 'valueProperty', + map: function( term ) { + return term === null ? 0 : term.coefficient; + }, + inverseMap: function( number ) { + return new Term( number, 0 ); + }, + bidirectional: true + } ); + + const xProperty = new DynamicProperty( xEntryProperty, { + derive: 'valueProperty', + map: function( term ) { + return term === null ? 0 : term.coefficient; + }, + inverseMap: function( number ) { + return new Term( number, 1 ); + }, + bidirectional: true + } ); + + const xSquaredProperty = new DynamicProperty( xSquaredEntryProperty, { + derive: 'valueProperty', + map: function( term ) { + return term === null ? 0 : term.coefficient; + }, + inverseMap: function( number ) { + return new Term( number, 2 ); + }, + bidirectional: true + } ); + + // When one is changed, we want to make sure that all entries are not marked as dirty internally (so that the user + // can submit after just changing one value). This is done by providing an actual value to the property. + function provideEntryValues() { + [ constantEntryProperty, xEntryProperty, xSquaredEntryProperty ].forEach( function( entryProperty, index ) { + const valueProperty = entryProperty.value.valueProperty; + if ( valueProperty.value === null ) { + valueProperty.value = new Term( 0, index ); + } } ); + } - const xText = new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING, { font: editFont } ); - const xSquaredText = new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2', { font: editFont } ); - const plus1 = new Text( MathSymbols.PLUS, { font: editFont } ); - const plus2 = new Text( MathSymbols.PLUS, { font: editFont } ); - - const xSquaredChildren = [ - xSquaredPicker, - xSquaredText, - plus1, - xPicker, - xText, - plus2, - constantPicker - ]; - const xChildren = [ - xPicker, - xText, - plus2, - constantPicker - ]; - - const pickerContainer = new Node(); - // Hide the x^2 term if we won't use it - constantEntryProperty.link( function( constantEntry ) { - pickerContainer.children = constantEntry.inputMethod === InputMethod.POLYNOMIAL_2 - ? xSquaredChildren - : xChildren; + function linkProperty( property, entryProperty ) { + property.link( function() { + // Only flag the values as edited when the user makes a change (not when we set it as part of a challenge) + if ( property.isExternallyChanging ) { + editedCallback(); + provideEntryValues(); + entryProperty.value.statusProperty.value = EntryStatus.NORMAL; + } } ); + } - xSquaredChildren.forEach( function( node, index ) { - if ( index > 0 ) { - node.left = xSquaredChildren[ index - 1 ].right + 5; + linkProperty( constantProperty, constantEntryProperty ); + linkProperty( xProperty, xEntryProperty ); + linkProperty( xSquaredProperty, xSquaredEntryProperty ); + + // [-81,81] is the actual range we need for editable values, + // see https://github.com/phetsims/area-model-common/issues/94 + const rangeProperty = new Property( new Range( -81, 81 ) ); + + function getPickerColorProperty( entryProperty ) { + return new DerivedProperty( [ + new DynamicProperty( entryProperty, { derive: 'statusProperty' } ), + AreaModelCommonColorProfile.errorStatusProperty, + AreaModelCommonColorProfile.dirtyStatusProperty + ], function( highlight, errorColor, dirtyColor ) { + if ( highlight === EntryStatus.NORMAL ) { + return 'black'; + } + else if ( highlight === EntryStatus.DIRTY ) { + return dirtyColor; + } + else { + return errorColor; } - } ); - constantPicker.centerY = xText.centerY; - xPicker.centerY = xText.centerY; - xSquaredPicker.centerY = xText.centerY; - - VBox.call( this, { - children: [ - readout, - pickerContainer - ], - spacing: 10 } ); } - areaModelCommon.register( 'PolynomialEditNode', PolynomialEditNode ); - - return inherit( VBox, PolynomialEditNode ); -} ); + const constantPicker = new NumberPicker( constantProperty, rangeProperty, { + color: getPickerColorProperty( constantEntryProperty ) + } ); + const xPicker = new NumberPicker( xProperty, rangeProperty, { + color: getPickerColorProperty( xEntryProperty ) + } ); + const xSquaredPicker = new NumberPicker( xSquaredProperty, rangeProperty, { + color: getPickerColorProperty( xSquaredEntryProperty ) + } ); + + const xText = new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING, { font: editFont } ); + const xSquaredText = new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2', { font: editFont } ); + const plus1 = new Text( MathSymbols.PLUS, { font: editFont } ); + const plus2 = new Text( MathSymbols.PLUS, { font: editFont } ); + + const xSquaredChildren = [ + xSquaredPicker, + xSquaredText, + plus1, + xPicker, + xText, + plus2, + constantPicker + ]; + const xChildren = [ + xPicker, + xText, + plus2, + constantPicker + ]; + + const pickerContainer = new Node(); + // Hide the x^2 term if we won't use it + constantEntryProperty.link( function( constantEntry ) { + pickerContainer.children = constantEntry.inputMethod === InputMethod.POLYNOMIAL_2 + ? xSquaredChildren + : xChildren; + } ); + + xSquaredChildren.forEach( function( node, index ) { + if ( index > 0 ) { + node.left = xSquaredChildren[ index - 1 ].right + 5; + } + } ); + constantPicker.centerY = xText.centerY; + xPicker.centerY = xText.centerY; + xSquaredPicker.centerY = xText.centerY; + + VBox.call( this, { + children: [ + readout, + pickerContainer + ], + spacing: 10 + } ); +} + +areaModelCommon.register( 'PolynomialEditNode', PolynomialEditNode ); + +inherit( VBox, PolynomialEditNode ); +export default PolynomialEditNode; \ No newline at end of file diff --git a/js/generic/model/GenericArea.js b/js/generic/model/GenericArea.js index b274108f..cc3ab30a 100644 --- a/js/generic/model/GenericArea.js +++ b/js/generic/model/GenericArea.js @@ -7,127 +7,123 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const Area = require( 'AREA_MODEL_COMMON/common/model/Area' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonQueryParameters = require( 'AREA_MODEL_COMMON/common/AreaModelCommonQueryParameters' ); - const GenericPartition = require( 'AREA_MODEL_COMMON/generic/model/GenericPartition' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - /** - * @constructor - * @extends {Area} - * - * @param {GenericLayout} layout - * @param {boolean} allowExponents - Whether the user is able to add powers of x. - */ - function GenericArea( layout, allowExponents ) { - assert && assert( typeof allowExponents === 'boolean' ); - - const self = this; - - // If we allow powers of X, we'll only allow 1 digit in front. - const firstDigitCount = allowExponents ? 1 : 3; - const secondDigitCount = allowExponents ? 1 : 2; - const thirdDigitCount = 1; - - const horizontalPartitions = [ - new GenericPartition( Orientation.HORIZONTAL, firstDigitCount ), - new GenericPartition( Orientation.HORIZONTAL, secondDigitCount ), - new GenericPartition( Orientation.HORIZONTAL, thirdDigitCount ) - ].slice( 0, layout.size.width ); - - const verticalPartitions = [ - new GenericPartition( Orientation.VERTICAL, firstDigitCount ), - new GenericPartition( Orientation.VERTICAL, secondDigitCount ), - new GenericPartition( Orientation.VERTICAL, thirdDigitCount ) - ].slice( 0, layout.size.height ); - - Area.call( - this, - new OrientationPair( horizontalPartitions, verticalPartitions ), - AreaModelCommonColorProfile.genericColorProperties, - 1, - allowExponents - ); - - if ( AreaModelCommonQueryParameters.maximumCalculationSize ) { - horizontalPartitions.forEach( function( partition, index ) { - partition.sizeProperty.value = new Term( -Math.pow( 10, partition.digitCount ) + 1, allowExponents ? 2 - index : 0 ); - } ); - verticalPartitions.forEach( function( partition, index ) { - partition.sizeProperty.value = new Term( -Math.pow( 10, partition.digitCount ) + 1, allowExponents ? 2 - index : 0 ); - } ); - } +import Property from '../../../../axon/js/Property.js'; +import Range from '../../../../dot/js/Range.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonQueryParameters from '../../common/AreaModelCommonQueryParameters.js'; +import Area from '../../common/model/Area.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import GenericPartition from './GenericPartition.js'; - // @public {GenericLayout} - this.layout = layout; - - // Set up partition coordinate/size - Orientation.VALUES.forEach( function( orientation ) { - const partitionCount = layout.getPartitionQuantity( orientation ); - const partitions = self.partitions.get( orientation ); - - if ( partitionCount === 1 ) { - partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, 1 ); - } - else if ( partitionCount === 2 ) { - partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, AreaModelCommonConstants.GENERIC_SINGLE_OFFSET ); - partitions[ 1 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_SINGLE_OFFSET, 1 ); - } - else if ( partitionCount === 3 ) { - partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, AreaModelCommonConstants.GENERIC_FIRST_OFFSET ); - partitions[ 1 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_FIRST_OFFSET, AreaModelCommonConstants.GENERIC_SECOND_OFFSET ); - partitions[ 2 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_SECOND_OFFSET, 1 ); - } +/** + * @constructor + * @extends {Area} + * + * @param {GenericLayout} layout + * @param {boolean} allowExponents - Whether the user is able to add powers of x. + */ +function GenericArea( layout, allowExponents ) { + assert && assert( typeof allowExponents === 'boolean' ); + + const self = this; + + // If we allow powers of X, we'll only allow 1 digit in front. + const firstDigitCount = allowExponents ? 1 : 3; + const secondDigitCount = allowExponents ? 1 : 2; + const thirdDigitCount = 1; + + const horizontalPartitions = [ + new GenericPartition( Orientation.HORIZONTAL, firstDigitCount ), + new GenericPartition( Orientation.HORIZONTAL, secondDigitCount ), + new GenericPartition( Orientation.HORIZONTAL, thirdDigitCount ) + ].slice( 0, layout.size.width ); + + const verticalPartitions = [ + new GenericPartition( Orientation.VERTICAL, firstDigitCount ), + new GenericPartition( Orientation.VERTICAL, secondDigitCount ), + new GenericPartition( Orientation.VERTICAL, thirdDigitCount ) + ].slice( 0, layout.size.height ); + + Area.call( + this, + new OrientationPair( horizontalPartitions, verticalPartitions ), + AreaModelCommonColorProfile.genericColorProperties, + 1, + allowExponents + ); + + if ( AreaModelCommonQueryParameters.maximumCalculationSize ) { + horizontalPartitions.forEach( function( partition, index ) { + partition.sizeProperty.value = new Term( -Math.pow( 10, partition.digitCount ) + 1, allowExponents ? 2 - index : 0 ); + } ); + verticalPartitions.forEach( function( partition, index ) { + partition.sizeProperty.value = new Term( -Math.pow( 10, partition.digitCount ) + 1, allowExponents ? 2 - index : 0 ); } ); - - // @public {Property.} - If it exists, the partition being actively edited. - this.activePartitionProperty = new Property( null ); } - areaModelCommon.register( 'GenericArea', GenericArea ); - - return inherit( Area, GenericArea, { - /** - * Resets the area to its initial values. - * @public - * @override - */ - reset: function() { - Area.prototype.reset.call( this ); - - this.allPartitions.forEach( function( partition ) { - partition.sizeProperty.reset(); - } ); - - this.activePartitionProperty.reset(); - }, - - /** - * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 - * @public - * @override - */ - erase: function() { - Area.prototype.erase.call( this ); - - // Clear all partition values - this.allPartitions.forEach( function( partition ) { - partition.sizeProperty.value = null; - } ); - - this.activePartitionProperty.reset(); + // @public {GenericLayout} + this.layout = layout; + + // Set up partition coordinate/size + Orientation.VALUES.forEach( function( orientation ) { + const partitionCount = layout.getPartitionQuantity( orientation ); + const partitions = self.partitions.get( orientation ); + + if ( partitionCount === 1 ) { + partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, 1 ); + } + else if ( partitionCount === 2 ) { + partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, AreaModelCommonConstants.GENERIC_SINGLE_OFFSET ); + partitions[ 1 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_SINGLE_OFFSET, 1 ); + } + else if ( partitionCount === 3 ) { + partitions[ 0 ].coordinateRangeProperty.value = new Range( 0, AreaModelCommonConstants.GENERIC_FIRST_OFFSET ); + partitions[ 1 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_FIRST_OFFSET, AreaModelCommonConstants.GENERIC_SECOND_OFFSET ); + partitions[ 2 ].coordinateRangeProperty.value = new Range( AreaModelCommonConstants.GENERIC_SECOND_OFFSET, 1 ); } } ); -} ); + + // @public {Property.} - If it exists, the partition being actively edited. + this.activePartitionProperty = new Property( null ); +} + +areaModelCommon.register( 'GenericArea', GenericArea ); + +export default inherit( Area, GenericArea, { + /** + * Resets the area to its initial values. + * @public + * @override + */ + reset: function() { + Area.prototype.reset.call( this ); + + this.allPartitions.forEach( function( partition ) { + partition.sizeProperty.reset(); + } ); + + this.activePartitionProperty.reset(); + }, + + /** + * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 + * @public + * @override + */ + erase: function() { + Area.prototype.erase.call( this ); + + // Clear all partition values + this.allPartitions.forEach( function( partition ) { + partition.sizeProperty.value = null; + } ); + + this.activePartitionProperty.reset(); + } +} ); \ No newline at end of file diff --git a/js/generic/model/GenericAreaDisplay.js b/js/generic/model/GenericAreaDisplay.js index bcb750cc..9fdcb2f9 100644 --- a/js/generic/model/GenericAreaDisplay.js +++ b/js/generic/model/GenericAreaDisplay.js @@ -5,33 +5,30 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaDisplay = require( 'AREA_MODEL_COMMON/common/model/AreaDisplay' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaDisplay from '../../common/model/AreaDisplay.js'; - /** - * @constructor - * @extends {AreaDisplay} - * - * @param {Property.} areaProperty - */ - function GenericAreaDisplay( areaProperty ) { - AreaDisplay.call( this, areaProperty ); +/** + * @constructor + * @extends {AreaDisplay} + * + * @param {Property.} areaProperty + */ +function GenericAreaDisplay( areaProperty ) { + AreaDisplay.call( this, areaProperty ); - // @public {Property.} - this.layoutProperty = this.wrapObject( _.property( 'layout' ) ); + // @public {Property.} + this.layoutProperty = this.wrapObject( _.property( 'layout' ) ); - // @public {Property.} - this.activePartitionProperty = this.wrapProperty( _.property( 'activePartitionProperty' ), { - bidirectional: true - } ); - } + // @public {Property.} + this.activePartitionProperty = this.wrapProperty( _.property( 'activePartitionProperty' ), { + bidirectional: true + } ); +} - areaModelCommon.register( 'GenericAreaDisplay', GenericAreaDisplay ); +areaModelCommon.register( 'GenericAreaDisplay', GenericAreaDisplay ); - return inherit( AreaDisplay, GenericAreaDisplay ); -} ); +inherit( AreaDisplay, GenericAreaDisplay ); +export default GenericAreaDisplay; \ No newline at end of file diff --git a/js/generic/model/GenericAreaModel.js b/js/generic/model/GenericAreaModel.js index 952e1ba6..64163179 100644 --- a/js/generic/model/GenericAreaModel.js +++ b/js/generic/model/GenericAreaModel.js @@ -5,81 +5,77 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonModel = require( 'AREA_MODEL_COMMON/common/model/AreaModelCommonModel' ); - const GenericArea = require( 'AREA_MODEL_COMMON/generic/model/GenericArea' ); - const GenericAreaDisplay = require( 'AREA_MODEL_COMMON/generic/model/GenericAreaDisplay' ); - const GenericLayout = require( 'AREA_MODEL_COMMON/generic/model/GenericLayout' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Property = require( 'AXON/Property' ); +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonModel from '../../common/model/AreaModelCommonModel.js'; +import GenericArea from './GenericArea.js'; +import GenericAreaDisplay from './GenericAreaDisplay.js'; +import GenericLayout from './GenericLayout.js'; - // constants - const DEFAULT_LAYOUT = GenericLayout.TWO_BY_TWO; +// constants +const DEFAULT_LAYOUT = GenericLayout.TWO_BY_TWO; - /** - * @constructor - * @extends {AreaModelCommonModel} - * - * @param {Object} [options] - */ - function GenericAreaModel( options ) { - const self = this; +/** + * @constructor + * @extends {AreaModelCommonModel} + * + * @param {Object} [options] + */ +function GenericAreaModel( options ) { + const self = this; - assert && assert( options === undefined || typeof options === 'object', 'If provided, options should be an object' ); + assert && assert( options === undefined || typeof options === 'object', 'If provided, options should be an object' ); - options = merge( { - allowExponents: false - }, options ); + options = merge( { + allowExponents: false + }, options ); - // @public {Property.} - The current layout that is visible/selected. - this.genericLayoutProperty = new Property( DEFAULT_LAYOUT ); + // @public {Property.} - The current layout that is visible/selected. + this.genericLayoutProperty = new Property( DEFAULT_LAYOUT ); - const areas = GenericLayout.VALUES.map( function( layout ) { - return new GenericArea( layout, options.allowExponents ); - } ); + const areas = GenericLayout.VALUES.map( function( layout ) { + return new GenericArea( layout, options.allowExponents ); + } ); - const defaultArea = _.find( areas, function( area ) { - return area.layout === DEFAULT_LAYOUT; - } ); + const defaultArea = _.find( areas, function( area ) { + return area.layout === DEFAULT_LAYOUT; + } ); - AreaModelCommonModel.call( this, areas, defaultArea, options ); + AreaModelCommonModel.call( this, areas, defaultArea, options ); - // Adjust the current area based on the layout. - this.genericLayoutProperty.link( function( layout ) { - self.currentAreaProperty.value = _.find( self.areas, function( area ) { - return area.layout === layout; - } ); + // Adjust the current area based on the layout. + this.genericLayoutProperty.link( function( layout ) { + self.currentAreaProperty.value = _.find( self.areas, function( area ) { + return area.layout === layout; } ); - } + } ); +} - areaModelCommon.register( 'GenericAreaModel', GenericAreaModel ); +areaModelCommon.register( 'GenericAreaModel', GenericAreaModel ); - return inherit( AreaModelCommonModel, GenericAreaModel, { - /** - * Returns a concrete AreaDisplay subtype - * @protected - * - * @param {Property.} areaProperty - * @returns {GenericAreaDisplay} - */ - createAreaDisplay: function( areaProperty ) { - return new GenericAreaDisplay( areaProperty ); - }, +export default inherit( AreaModelCommonModel, GenericAreaModel, { + /** + * Returns a concrete AreaDisplay subtype + * @protected + * + * @param {Property.} areaProperty + * @returns {GenericAreaDisplay} + */ + createAreaDisplay: function( areaProperty ) { + return new GenericAreaDisplay( areaProperty ); + }, - /** - * Returns the model to its initial state. - * @public - * @override - */ - reset: function() { - AreaModelCommonModel.prototype.reset.call( this ); + /** + * Returns the model to its initial state. + * @public + * @override + */ + reset: function() { + AreaModelCommonModel.prototype.reset.call( this ); - this.genericLayoutProperty.reset(); - } - } ); -} ); + this.genericLayoutProperty.reset(); + } +} ); \ No newline at end of file diff --git a/js/generic/model/GenericLayout.js b/js/generic/model/GenericLayout.js index 33700269..6f12a35f 100644 --- a/js/generic/model/GenericLayout.js +++ b/js/generic/model/GenericLayout.js @@ -5,101 +5,97 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const Dimension2 = require( 'DOT/Dimension2' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const validate = require( 'AXON/validate' ); +import validate from '../../../../axon/js/validate.js'; +import Dimension2 from '../../../../dot/js/Dimension2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +/** + * @constructor + * @extends {Object} + * @private (use enumeration of objects) + * + * @param {Dimension2} size + */ +function GenericLayout( size ) { + // @public {Dimension2} - Dimension describes how many partitions are available in each orientation. + this.size = size; +} + +areaModelCommon.register( 'GenericLayout', GenericLayout ); + +inherit( Object, GenericLayout, { /** - * @constructor - * @extends {Object} - * @private (use enumeration of objects) + * Returns the number of partitions for the specific orientation. + * @public * - * @param {Dimension2} size + * @param {Orientation} orientation + * @returns {number} */ - function GenericLayout( size ) { - // @public {Dimension2} - Dimension describes how many partitions are available in each orientation. - this.size = size; - } - - areaModelCommon.register( 'GenericLayout', GenericLayout ); - - inherit( Object, GenericLayout, { - /** - * Returns the number of partitions for the specific orientation. - * @public - * - * @param {Orientation} orientation - * @returns {number} - */ - getPartitionQuantity: function( orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); + getPartitionQuantity: function( orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - return orientation === Orientation.HORIZONTAL ? this.size.width : this.size.height; - } - } ); + return orientation === Orientation.HORIZONTAL ? this.size.width : this.size.height; + } +} ); - // @public {GenericLayout} - GenericLayout.ONE_BY_ONE = new GenericLayout( new Dimension2( 1, 1 ) ); - GenericLayout.ONE_BY_TWO = new GenericLayout( new Dimension2( 1, 2 ) ); - GenericLayout.ONE_BY_THREE = new GenericLayout( new Dimension2( 1, 3 ) ); - GenericLayout.TWO_BY_ONE = new GenericLayout( new Dimension2( 2, 1 ) ); - GenericLayout.TWO_BY_TWO = new GenericLayout( new Dimension2( 2, 2 ) ); - GenericLayout.TWO_BY_THREE = new GenericLayout( new Dimension2( 2, 3 ) ); - GenericLayout.THREE_BY_ONE = new GenericLayout( new Dimension2( 3, 1 ) ); - GenericLayout.THREE_BY_TWO = new GenericLayout( new Dimension2( 3, 2 ) ); - GenericLayout.THREE_BY_THREE = new GenericLayout( new Dimension2( 3, 3 ) ); +// @public {GenericLayout} +GenericLayout.ONE_BY_ONE = new GenericLayout( new Dimension2( 1, 1 ) ); +GenericLayout.ONE_BY_TWO = new GenericLayout( new Dimension2( 1, 2 ) ); +GenericLayout.ONE_BY_THREE = new GenericLayout( new Dimension2( 1, 3 ) ); +GenericLayout.TWO_BY_ONE = new GenericLayout( new Dimension2( 2, 1 ) ); +GenericLayout.TWO_BY_TWO = new GenericLayout( new Dimension2( 2, 2 ) ); +GenericLayout.TWO_BY_THREE = new GenericLayout( new Dimension2( 2, 3 ) ); +GenericLayout.THREE_BY_ONE = new GenericLayout( new Dimension2( 3, 1 ) ); +GenericLayout.THREE_BY_TWO = new GenericLayout( new Dimension2( 3, 2 ) ); +GenericLayout.THREE_BY_THREE = new GenericLayout( new Dimension2( 3, 3 ) ); - // @public {Array.} - All values the enumeration can take. - GenericLayout.VALUES = [ - GenericLayout.ONE_BY_ONE, - GenericLayout.ONE_BY_TWO, - GenericLayout.ONE_BY_THREE, - GenericLayout.TWO_BY_ONE, - GenericLayout.TWO_BY_TWO, - GenericLayout.TWO_BY_THREE, - GenericLayout.THREE_BY_ONE, - GenericLayout.THREE_BY_TWO, - GenericLayout.THREE_BY_THREE - ]; +// @public {Array.} - All values the enumeration can take. +GenericLayout.VALUES = [ + GenericLayout.ONE_BY_ONE, + GenericLayout.ONE_BY_TWO, + GenericLayout.ONE_BY_THREE, + GenericLayout.TWO_BY_ONE, + GenericLayout.TWO_BY_TWO, + GenericLayout.TWO_BY_THREE, + GenericLayout.THREE_BY_ONE, + GenericLayout.THREE_BY_TWO, + GenericLayout.THREE_BY_THREE +]; - /** - * Returns the layout value given a specific width and height. - * @public - * - * @param {number} width - * @param {number} height - */ - GenericLayout.fromValues = function( width, height ) { - assert && assert( typeof width === 'number' && isFinite( width ) && width % 1 === 0 && width >= 1 && width <= 3 ); - assert && assert( typeof height === 'number' && isFinite( height ) && height % 1 === 0 && height >= 1 && height <= 3 ); +/** + * Returns the layout value given a specific width and height. + * @public + * + * @param {number} width + * @param {number} height + */ +GenericLayout.fromValues = function( width, height ) { + assert && assert( typeof width === 'number' && isFinite( width ) && width % 1 === 0 && width >= 1 && width <= 3 ); + assert && assert( typeof height === 'number' && isFinite( height ) && height % 1 === 0 && height >= 1 && height <= 3 ); - return { - 1: { - 1: GenericLayout.ONE_BY_ONE, - 2: GenericLayout.ONE_BY_TWO, - 3: GenericLayout.ONE_BY_THREE - }, - 2: { - 1: GenericLayout.TWO_BY_ONE, - 2: GenericLayout.TWO_BY_TWO, - 3: GenericLayout.TWO_BY_THREE - }, - 3: { - 1: GenericLayout.THREE_BY_ONE, - 2: GenericLayout.THREE_BY_TWO, - 3: GenericLayout.THREE_BY_THREE - } - }[ width ][ height ]; - }; + return { + 1: { + 1: GenericLayout.ONE_BY_ONE, + 2: GenericLayout.ONE_BY_TWO, + 3: GenericLayout.ONE_BY_THREE + }, + 2: { + 1: GenericLayout.TWO_BY_ONE, + 2: GenericLayout.TWO_BY_TWO, + 3: GenericLayout.TWO_BY_THREE + }, + 3: { + 1: GenericLayout.THREE_BY_ONE, + 2: GenericLayout.THREE_BY_TWO, + 3: GenericLayout.THREE_BY_THREE + } + }[ width ][ height ]; +}; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( GenericLayout ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( GenericLayout ); } - return GenericLayout; -} ); +export default GenericLayout; \ No newline at end of file diff --git a/js/generic/model/GenericPartition.js b/js/generic/model/GenericPartition.js index 4ac13e97..caeafce3 100644 --- a/js/generic/model/GenericPartition.js +++ b/js/generic/model/GenericPartition.js @@ -5,35 +5,32 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Partition = require( 'AREA_MODEL_COMMON/common/model/Partition' ); - const validate = require( 'AXON/validate' ); +import validate from '../../../../axon/js/validate.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Partition from '../../common/model/Partition.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; - /** - * @constructor - * @extends {Partition} - * - * @param {Orientation} orientation - * @param {number} digitCount - */ - function GenericPartition( orientation, digitCount ) { - validate( orientation, { validValues: Orientation.VALUES } ); - assert && assert( typeof digitCount === 'number' ); +/** + * @constructor + * @extends {Partition} + * + * @param {Orientation} orientation + * @param {number} digitCount + */ +function GenericPartition( orientation, digitCount ) { + validate( orientation, { validValues: Orientation.VALUES } ); + assert && assert( typeof digitCount === 'number' ); - Partition.call( this, orientation, AreaModelCommonColorProfile.genericColorProperties.get( orientation ) ); + Partition.call( this, orientation, AreaModelCommonColorProfile.genericColorProperties.get( orientation ) ); - // @public {number} - How many digits to allow in the editor - this.digitCount = digitCount; - } + // @public {number} - How many digits to allow in the editor + this.digitCount = digitCount; +} - areaModelCommon.register( 'GenericPartition', GenericPartition ); +areaModelCommon.register( 'GenericPartition', GenericPartition ); - return inherit( Partition, GenericPartition ); -} ); +inherit( Partition, GenericPartition ); +export default GenericPartition; \ No newline at end of file diff --git a/js/generic/view/GenericAreaDisplayNode.js b/js/generic/view/GenericAreaDisplayNode.js index b526ed41..25bfd3f4 100644 --- a/js/generic/view/GenericAreaDisplayNode.js +++ b/js/generic/view/GenericAreaDisplayNode.js @@ -7,185 +7,181 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaDisplayNode = require( 'AREA_MODEL_COMMON/common/view/AreaDisplayNode' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const GenericPartitionedAreaNode = require( 'AREA_MODEL_COMMON/generic/view/GenericPartitionedAreaNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const PartitionSizeEditNode = require( 'AREA_MODEL_COMMON/generic/view/PartitionSizeEditNode' ); - const PoolableLayerNode = require( 'AREA_MODEL_COMMON/common/view/PoolableLayerNode' ); - const Property = require( 'AXON/Property' ); - const TermKeypadPanel = require( 'AREA_MODEL_COMMON/generic/view/TermKeypadPanel' ); - const Vector2 = require( 'DOT/Vector2' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaDisplayNode from '../../common/view/AreaDisplayNode.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import PoolableLayerNode from '../../common/view/PoolableLayerNode.js'; +import GenericPartitionedAreaNode from './GenericPartitionedAreaNode.js'; +import PartitionSizeEditNode from './PartitionSizeEditNode.js'; +import TermKeypadPanel from './TermKeypadPanel.js'; + +/** + * @constructor + * @extends {AreaDisplayNode} + * + * @param {GenericAreaDisplay} areaDisplay + * @param {boolean} allowExponents - Whether the user is able to add powers of x. + * @param {Property.} partialProductsChoiceProperty + * @param {Object} [nodeOptions] + */ +function GenericAreaDisplayNode( areaDisplay, allowExponents, partialProductsChoiceProperty, nodeOptions ) { + assert && assert( typeof allowExponents === 'boolean' ); + assert && assert( partialProductsChoiceProperty instanceof Property ); + + const self = this; + + AreaDisplayNode.call( this, areaDisplay, partialProductsChoiceProperty, { + allowExponents: allowExponents, + isProportional: false + } ); + + this.areaLayer.addChild( this.backgroundNode ); + + // Sign-colored partition area backgrounds (effectively pooled) + this.areaLayer.addChild( new PoolableLayerNode( { + arrayProperty: areaDisplay.partitionedAreasProperty, + createNode: function( partitionedArea ) { + return new GenericPartitionedAreaNode( new Property( partitionedArea ), self.modelViewTransformProperty ); + }, + getItemProperty: function( partitionedAreaNode ) { + return partitionedAreaNode.partitionedAreaProperty; + } + } ) ); + + this.areaLayer.addChild( this.borderNode ); + + // Partition lines + this.areaLayer.addChild( GenericAreaDisplayNode.createPartitionLines( areaDisplay.layoutProperty, this.viewSize ) ); + + // Edit readouts/buttons + this.labelLayer.addChild( new PoolableLayerNode( { + arrayProperty: areaDisplay.allPartitionsProperty, + createNode: function( partition ) { + return new PartitionSizeEditNode( + areaDisplay.activePartitionProperty, + new Property( partition ), + self.modelViewTransformProperty, + allowExponents + ); + }, + getItemProperty: function( editNode ) { + return editNode.partitionProperty; + } + } ) ); + + // Keypad + const digitCountProperty = new DerivedProperty( [ areaDisplay.activePartitionProperty ], function( activePartition ) { + return activePartition === null ? 1 : activePartition.digitCount; + } ); + const termKeypadPanel = new TermKeypadPanel( digitCountProperty, allowExponents, true, function( term ) { + // Update the size of the partition. + areaDisplay.activePartitionProperty.value.sizeProperty.value = term; + + // Hide the keypad. + areaDisplay.activePartitionProperty.value = null; + }, { + x: this.viewSize + AreaModelCommonConstants.KEYPAD_LEFT_PADDING, + centerY: this.viewSize / 2 + } ); + this.labelLayer.addChild( termKeypadPanel ); + + // If this changes, we clear and switch to it + areaDisplay.activePartitionProperty.link( function( newArea ) { + termKeypadPanel.visible = newArea !== null; + termKeypadPanel.clear(); + } ); + + this.mutate( nodeOptions ); +} + +areaModelCommon.register( 'GenericAreaDisplayNode', GenericAreaDisplayNode ); + +export default inherit( AreaDisplayNode, GenericAreaDisplayNode, { /** - * @constructor - * @extends {AreaDisplayNode} - * - * @param {GenericAreaDisplay} areaDisplay - * @param {boolean} allowExponents - Whether the user is able to add powers of x. - * @param {Property.} partialProductsChoiceProperty - * @param {Object} [nodeOptions] + * Positions all of the partial products labels. + * @protected + * @override */ - function GenericAreaDisplayNode( areaDisplay, allowExponents, partialProductsChoiceProperty, nodeOptions ) { - assert && assert( typeof allowExponents === 'boolean' ); - assert && assert( partialProductsChoiceProperty instanceof Property ); - + positionProductLabels: function() { const self = this; - AreaDisplayNode.call( this, areaDisplay, partialProductsChoiceProperty, { - allowExponents: allowExponents, - isProportional: false - } ); - - this.areaLayer.addChild( this.backgroundNode ); - - // Sign-colored partition area backgrounds (effectively pooled) - this.areaLayer.addChild( new PoolableLayerNode( { - arrayProperty: areaDisplay.partitionedAreasProperty, - createNode: function( partitionedArea ) { - return new GenericPartitionedAreaNode( new Property( partitionedArea ), self.modelViewTransformProperty ); - }, - getItemProperty: function( partitionedAreaNode ) { - return partitionedAreaNode.partitionedAreaProperty; - } - } ) ); - - this.areaLayer.addChild( this.borderNode ); - - // Partition lines - this.areaLayer.addChild( GenericAreaDisplayNode.createPartitionLines( areaDisplay.layoutProperty, this.viewSize ) ); - - // Edit readouts/buttons - this.labelLayer.addChild( new PoolableLayerNode( { - arrayProperty: areaDisplay.allPartitionsProperty, - createNode: function( partition ) { - return new PartitionSizeEditNode( - areaDisplay.activePartitionProperty, - new Property( partition ), - self.modelViewTransformProperty, - allowExponents - ); - }, - getItemProperty: function( editNode ) { - return editNode.partitionProperty; - } - } ) ); - - // Keypad - const digitCountProperty = new DerivedProperty( [ areaDisplay.activePartitionProperty ], function( activePartition ) { - return activePartition === null ? 1 : activePartition.digitCount; + this.productLabels.forEach( function( productLabel ) { + Orientation.VALUES.forEach( function( orientation ) { + const range = productLabel.partitionedAreaProperty.value.partitions.get( orientation ).coordinateRangeProperty.value; + if ( range !== null ) { + productLabel[ orientation.coordinate ] = orientation.modelToView( self.modelViewTransformProperty.value, range.getCenter() ); + } + } ); } ); - const termKeypadPanel = new TermKeypadPanel( digitCountProperty, allowExponents, true, function( term ) { - // Update the size of the partition. - areaDisplay.activePartitionProperty.value.sizeProperty.value = term; - - // Hide the keypad. - areaDisplay.activePartitionProperty.value = null; - }, { - x: this.viewSize + AreaModelCommonConstants.KEYPAD_LEFT_PADDING, - centerY: this.viewSize / 2 + } +}, { + /** + * Creates a partition line (view only) + * @private + * + * @param {Orientation} orientation + * @param {number} offset + * @param {number} viewSize - In view units, the size of the main area + * @param {Property.} visibilityProperty + */ + createPartitionLine: function( orientation, offset, viewSize, visibilityProperty ) { + const firstPoint = new Vector2( 0, 0 ); + const secondPoint = new Vector2( 0, 0 ); + + firstPoint[ orientation.coordinate ] = offset; + secondPoint[ orientation.coordinate ] = offset; + firstPoint[ orientation.opposite.coordinate ] = viewSize; + secondPoint[ orientation.opposite.coordinate ] = 0; + + const line = new Line( { + p1: firstPoint, + p2: secondPoint, + stroke: AreaModelCommonColorProfile.partitionLineStrokeProperty } ); - this.labelLayer.addChild( termKeypadPanel ); + visibilityProperty.linkAttribute( line, 'visible' ); + return line; + }, - // If this changes, we clear and switch to it - areaDisplay.activePartitionProperty.link( function( newArea ) { - termKeypadPanel.visible = newArea !== null; - termKeypadPanel.clear(); - } ); + /** + * Creates a set of generic partition lines. + * @public + * + * @param {Property.} layoutProperty + * @param {number} viewSize + * @returns {Node} + */ + createPartitionLines: function( layoutProperty, viewSize ) { + const singleOffset = viewSize * AreaModelCommonConstants.GENERIC_SINGLE_OFFSET; + const firstOffset = viewSize * AreaModelCommonConstants.GENERIC_FIRST_OFFSET; + const secondOffset = viewSize * AreaModelCommonConstants.GENERIC_SECOND_OFFSET; - this.mutate( nodeOptions ); - } + const resultNode = new Node(); - areaModelCommon.register( 'GenericAreaDisplayNode', GenericAreaDisplayNode ); - - return inherit( AreaDisplayNode, GenericAreaDisplayNode, { - /** - * Positions all of the partial products labels. - * @protected - * @override - */ - positionProductLabels: function() { - const self = this; - - this.productLabels.forEach( function( productLabel ) { - Orientation.VALUES.forEach( function( orientation ) { - const range = productLabel.partitionedAreaProperty.value.partitions.get( orientation ).coordinateRangeProperty.value; - if ( range !== null ) { - productLabel[ orientation.coordinate ] = orientation.modelToView( self.modelViewTransformProperty.value, range.getCenter() ); - } - } ); + Orientation.VALUES.forEach( function( orientation ) { + const hasTwoProperty = new DerivedProperty( [ layoutProperty ], function( layout ) { + return layout.getPartitionQuantity( orientation ) === 2; } ); - } - }, { - /** - * Creates a partition line (view only) - * @private - * - * @param {Orientation} orientation - * @param {number} offset - * @param {number} viewSize - In view units, the size of the main area - * @param {Property.} visibilityProperty - */ - createPartitionLine: function( orientation, offset, viewSize, visibilityProperty ) { - const firstPoint = new Vector2( 0, 0 ); - const secondPoint = new Vector2( 0, 0 ); - - firstPoint[ orientation.coordinate ] = offset; - secondPoint[ orientation.coordinate ] = offset; - firstPoint[ orientation.opposite.coordinate ] = viewSize; - secondPoint[ orientation.opposite.coordinate ] = 0; - - const line = new Line( { - p1: firstPoint, - p2: secondPoint, - stroke: AreaModelCommonColorProfile.partitionLineStrokeProperty + const hasThreeProperty = new DerivedProperty( [ layoutProperty ], function( layout ) { + return layout.getPartitionQuantity( orientation ) === 3; } ); - visibilityProperty.linkAttribute( line, 'visible' ); - return line; - }, - - /** - * Creates a set of generic partition lines. - * @public - * - * @param {Property.} layoutProperty - * @param {number} viewSize - * @returns {Node} - */ - createPartitionLines: function( layoutProperty, viewSize ) { - const singleOffset = viewSize * AreaModelCommonConstants.GENERIC_SINGLE_OFFSET; - const firstOffset = viewSize * AreaModelCommonConstants.GENERIC_FIRST_OFFSET; - const secondOffset = viewSize * AreaModelCommonConstants.GENERIC_SECOND_OFFSET; - - const resultNode = new Node(); - Orientation.VALUES.forEach( function( orientation ) { - const hasTwoProperty = new DerivedProperty( [ layoutProperty ], function( layout ) { - return layout.getPartitionQuantity( orientation ) === 2; - } ); - const hasThreeProperty = new DerivedProperty( [ layoutProperty ], function( layout ) { - return layout.getPartitionQuantity( orientation ) === 3; - } ); - - const singleLine = GenericAreaDisplayNode.createPartitionLine( orientation, singleOffset, viewSize, hasTwoProperty ); - const firstLine = GenericAreaDisplayNode.createPartitionLine( orientation, firstOffset, viewSize, hasThreeProperty ); - const secondLine = GenericAreaDisplayNode.createPartitionLine( orientation, secondOffset, viewSize, hasThreeProperty ); - resultNode.addChild( singleLine ); - resultNode.addChild( firstLine ); - resultNode.addChild( secondLine ); - } ); + const singleLine = GenericAreaDisplayNode.createPartitionLine( orientation, singleOffset, viewSize, hasTwoProperty ); + const firstLine = GenericAreaDisplayNode.createPartitionLine( orientation, firstOffset, viewSize, hasThreeProperty ); + const secondLine = GenericAreaDisplayNode.createPartitionLine( orientation, secondOffset, viewSize, hasThreeProperty ); + resultNode.addChild( singleLine ); + resultNode.addChild( firstLine ); + resultNode.addChild( secondLine ); + } ); - return resultNode; - } - } ); -} ); + return resultNode; + } +} ); \ No newline at end of file diff --git a/js/generic/view/GenericAreaScreenView.js b/js/generic/view/GenericAreaScreenView.js index 35ce6d88..fbb536a1 100644 --- a/js/generic/view/GenericAreaScreenView.js +++ b/js/generic/view/GenericAreaScreenView.js @@ -7,100 +7,96 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaScreenView = require( 'AREA_MODEL_COMMON/common/view/AreaScreenView' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const GenericAreaDisplayNode = require( 'AREA_MODEL_COMMON/generic/view/GenericAreaDisplayNode' ); - const GenericAreaModel = require( 'AREA_MODEL_COMMON/generic/model/GenericAreaModel' ); - const GenericFactorsNode = require( 'AREA_MODEL_COMMON/generic/view/GenericFactorsNode' ); - const GenericLayoutSelectionNode = require( 'AREA_MODEL_COMMON/generic/view/GenericLayoutSelectionNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Property = require( 'AXON/Property' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import AreaScreenView from '../../common/view/AreaScreenView.js'; +import GenericAreaModel from '../model/GenericAreaModel.js'; +import GenericAreaDisplayNode from './GenericAreaDisplayNode.js'; +import GenericFactorsNode from './GenericFactorsNode.js'; +import GenericLayoutSelectionNode from './GenericLayoutSelectionNode.js'; - /** - * @constructor - * @extends {AreaScreenView} - * - * @param {GenericAreaModel} model - * @param {number} decimalPlaces - */ - function GenericAreaScreenView( model, decimalPlaces ) { - assert && assert( model instanceof GenericAreaModel ); - assert && assert( typeof decimalPlaces === 'number' ); +/** + * @constructor + * @extends {AreaScreenView} + * + * @param {GenericAreaModel} model + * @param {number} decimalPlaces + */ +function GenericAreaScreenView( model, decimalPlaces ) { + assert && assert( model instanceof GenericAreaModel ); + assert && assert( typeof decimalPlaces === 'number' ); - // @private {Node} - this.popupLayer = new Node(); + // @private {Node} + this.popupLayer = new Node(); - // @private {Node|null} - Will be filled in with getRightAlignNodes (we need lazy creation here unfortunately). - // We need to construct it later when factorsBox.width is defined (so we can properly size it), but we can't wait - // until the supertype is fully constructed since then our right align setup will have been constructed fully. - this.layoutSelectionNode = null; + // @private {Node|null} - Will be filled in with getRightAlignNodes (we need lazy creation here unfortunately). + // We need to construct it later when factorsBox.width is defined (so we can properly size it), but we can't wait + // until the supertype is fully constructed since then our right align setup will have been constructed fully. + this.layoutSelectionNode = null; - AreaScreenView.call( this, model, { - isProportional: false, - decimalPlaces: decimalPlaces - } ); + AreaScreenView.call( this, model, { + isProportional: false, + decimalPlaces: decimalPlaces + } ); - this.addChild( this.popupLayer ); - } + this.addChild( this.popupLayer ); +} - areaModelCommon.register( 'GenericAreaScreenView', GenericAreaScreenView ); +areaModelCommon.register( 'GenericAreaScreenView', GenericAreaScreenView ); - return inherit( AreaScreenView, GenericAreaScreenView, { - /** - * @protected - * @override - * - * @returns {Array.} - */ - getRightAlignNodes: function() { - assert && assert( !this.layoutSelectionNode, 'Should not be called multiple times or it will leak memory' ); +export default inherit( AreaScreenView, GenericAreaScreenView, { + /** + * @protected + * @override + * + * @returns {Array.} + */ + getRightAlignNodes: function() { + assert && assert( !this.layoutSelectionNode, 'Should not be called multiple times or it will leak memory' ); - this.layoutSelectionNode = new GenericLayoutSelectionNode( - this.model.genericLayoutProperty, - this.popupLayer, - this.factorsBox.width - ); - return [ this.layoutSelectionNode ].concat( AreaScreenView.prototype.getRightAlignNodes.call( this ) ); - }, + this.layoutSelectionNode = new GenericLayoutSelectionNode( + this.model.genericLayoutProperty, + this.popupLayer, + this.factorsBox.width + ); + return [ this.layoutSelectionNode ].concat( AreaScreenView.prototype.getRightAlignNodes.call( this ) ); + }, - /** - * Creates the main area display view for the screen. - * @public - * @override - * - * @param {GenericAreaModel} model - * @returns {GenericAreaDisplayNode} - */ - createAreaDisplayNode: function( model ) { - return new GenericAreaDisplayNode( model.areaDisplay, model.allowExponents, model.partialProductsChoiceProperty, { - translation: this.getDisplayTranslation() - } ); - }, + /** + * Creates the main area display view for the screen. + * @public + * @override + * + * @param {GenericAreaModel} model + * @returns {GenericAreaDisplayNode} + */ + createAreaDisplayNode: function( model ) { + return new GenericAreaDisplayNode( model.areaDisplay, model.allowExponents, model.partialProductsChoiceProperty, { + translation: this.getDisplayTranslation() + } ); + }, - /** - * Creates the "factors" (dimensions) content for the accordion box. - * @public - * @override - * - * @param {GenericAreaModel} model - * @param {number} decimalPlaces - * @returns {Node} - */ - createFactorsNode: function( model, decimalPlaces ) { - const dynamicProperties = OrientationPair.create( function( orientation ) { - return new DynamicProperty( new DerivedProperty( [ model.currentAreaProperty ], function( area ) { - return area.displayProperties.get( orientation ); - } ) ); - } ); - return new GenericFactorsNode( dynamicProperties, new Property( model.allowExponents ) ); - } - } ); -} ); + /** + * Creates the "factors" (dimensions) content for the accordion box. + * @public + * @override + * + * @param {GenericAreaModel} model + * @param {number} decimalPlaces + * @returns {Node} + */ + createFactorsNode: function( model, decimalPlaces ) { + const dynamicProperties = OrientationPair.create( function( orientation ) { + return new DynamicProperty( new DerivedProperty( [ model.currentAreaProperty ], function( area ) { + return area.displayProperties.get( orientation ); + } ) ); + } ); + return new GenericFactorsNode( dynamicProperties, new Property( model.allowExponents ) ); + } +} ); \ No newline at end of file diff --git a/js/generic/view/GenericFactorsNode.js b/js/generic/view/GenericFactorsNode.js index 2cd5bfa2..0b07c339 100644 --- a/js/generic/view/GenericFactorsNode.js +++ b/js/generic/view/GenericFactorsNode.js @@ -7,134 +7,130 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Text = require( 'SCENERY/nodes/Text' ); - const validate = require( 'AXON/validate' ); - - // constants - const BOX_SIZE = 30; - const PAREN_BOUNDS = new Text( ')(', { - font: AreaModelCommonConstants.FACTORS_PAREN_FONT, - boundsMethod: 'accurate' - } ).bounds; - /** - * @constructor - * @extends {HBox} - * - * @param {OrientationPair.>} displayProperties - The term lists to be displayed - * @param {Property.} allowExponentsProperty - Whether exponents (powers of x) are allowed - */ - function GenericFactorsNode( displayProperties, allowExponentsProperty ) { - const self = this; +import validate from '../../../../axon/js/validate.js'; +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; + +// constants +const BOX_SIZE = 30; +const PAREN_BOUNDS = new Text( ')(', { + font: AreaModelCommonConstants.FACTORS_PAREN_FONT, + boundsMethod: 'accurate' +} ).bounds; - const readouts = displayProperties.map( function( displayProperty, orientation ) { - return self.createOrientationReadout( orientation, displayProperty ); - } ); +/** + * @constructor + * @extends {HBox} + * + * @param {OrientationPair.>} displayProperties - The term lists to be displayed + * @param {Property.} allowExponentsProperty - Whether exponents (powers of x) are allowed + */ +function GenericFactorsNode( displayProperties, allowExponentsProperty ) { + const self = this; - const leftParenText = new Text( '(', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); - const middleParenText = new Text( ')(', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); - const rightParenText = new Text( ')', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); - const xText = new Text( MathSymbols.TIMES, { font: AreaModelCommonConstants.FACTORS_TERM_FONT } ); + const readouts = displayProperties.map( function( displayProperty, orientation ) { + return self.createOrientationReadout( orientation, displayProperty ); + } ); - // Have the X take up at least the same vertical bounds as the parentheses - xText.localBounds = xText.localBounds.union( - new Bounds2( 0, middleParenText.localBounds.minY, 0, middleParenText.localBounds.maxY ) - ); + const leftParenText = new Text( '(', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); + const middleParenText = new Text( ')(', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); + const rightParenText = new Text( ')', { font: AreaModelCommonConstants.FACTORS_PAREN_FONT } ); + const xText = new Text( MathSymbols.TIMES, { font: AreaModelCommonConstants.FACTORS_TERM_FONT } ); - // Center the box vertically, so that when maxWidth kicks in, we stay vertically centered in our area of the box - const box = new HBox( { - spacing: 10, - align: 'origin' - } ); + // Have the X take up at least the same vertical bounds as the parentheses + xText.localBounds = xText.localBounds.union( + new Bounds2( 0, middleParenText.localBounds.minY, 0, middleParenText.localBounds.maxY ) + ); - allowExponentsProperty.link( function( allowExponents ) { - box.children = allowExponents ? [ - leftParenText, - readouts.vertical, - middleParenText, - readouts.horizontal, - rightParenText - ] : [ - readouts.vertical, - xText, - readouts.horizontal - ]; - } ); + // Center the box vertically, so that when maxWidth kicks in, we stay vertically centered in our area of the box + const box = new HBox( { + spacing: 10, + align: 'origin' + } ); - const spacer = new Node(); + allowExponentsProperty.link( function( allowExponents ) { + box.children = allowExponents ? [ + leftParenText, + readouts.vertical, + middleParenText, + readouts.horizontal, + rightParenText + ] : [ + readouts.vertical, + xText, + readouts.horizontal + ]; + } ); - AlignBox.call( this, new Node( { - children: [ box, spacer ], - maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX - } ) ); + const spacer = new Node(); - // Set our alignBounds to the maximum size we can be, so that we remain centered nicely in the accordion box. - allowExponentsProperty.link( function( allowExponents ) { - const maxBounds = Bounds2.NOTHING.copy(); - maxBounds.includeBounds( new RichText( allowExponents ? 'x2' : 'x', { - font: AreaModelCommonConstants.FACTORS_TERM_FONT - } ).bounds ); - maxBounds.includeBounds( PAREN_BOUNDS ); + AlignBox.call( this, new Node( { + children: [ box, spacer ], + maxWidth: AreaModelCommonConstants.PANEL_INTERIOR_MAX + } ) ); - self.alignBounds = new Bounds2( 0, 0, AreaModelCommonConstants.PANEL_INTERIOR_MAX, maxBounds.height ); - spacer.localBounds = new Bounds2( 0, maxBounds.minY, 0, maxBounds.maxY ); - } ); - } + // Set our alignBounds to the maximum size we can be, so that we remain centered nicely in the accordion box. + allowExponentsProperty.link( function( allowExponents ) { + const maxBounds = Bounds2.NOTHING.copy(); + maxBounds.includeBounds( new RichText( allowExponents ? 'x2' : 'x', { + font: AreaModelCommonConstants.FACTORS_TERM_FONT + } ).bounds ); + maxBounds.includeBounds( PAREN_BOUNDS ); - areaModelCommon.register( 'GenericFactorsNode', GenericFactorsNode ); - - return inherit( AlignBox, GenericFactorsNode, { - /** - * Creates a readout for the total sum for a particular orientation. - * @private - * - * @param {Orientation} orientation - * @param {Property.} displayProperty - * @returns {Node} - */ - createOrientationReadout: function( orientation, displayProperty ) { - validate( orientation, { validValues: Orientation.VALUES } ); - - const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); - - const richText = new RichText( '', { - font: AreaModelCommonConstants.FACTORS_TERM_FONT, - fill: colorProperty - } ); - - const box = new Rectangle( 0, 0, BOX_SIZE, BOX_SIZE, { - stroke: colorProperty, - centerY: PAREN_BOUNDS.centerY // So that it is perfectly vertically aligned - } ); - - const node = new Node(); - displayProperty.link( function( termList ) { - if ( termList === null ) { - node.children = [ box ]; - } - else { - richText.text = termList.toRichString(); - node.children = [ richText ]; - } - } ); - - return node; - } + self.alignBounds = new Bounds2( 0, 0, AreaModelCommonConstants.PANEL_INTERIOR_MAX, maxBounds.height ); + spacer.localBounds = new Bounds2( 0, maxBounds.minY, 0, maxBounds.maxY ); } ); -} ); +} + +areaModelCommon.register( 'GenericFactorsNode', GenericFactorsNode ); + +export default inherit( AlignBox, GenericFactorsNode, { + /** + * Creates a readout for the total sum for a particular orientation. + * @private + * + * @param {Orientation} orientation + * @param {Property.} displayProperty + * @returns {Node} + */ + createOrientationReadout: function( orientation, displayProperty ) { + validate( orientation, { validValues: Orientation.VALUES } ); + + const colorProperty = AreaModelCommonColorProfile.genericColorProperties.get( orientation ); + + const richText = new RichText( '', { + font: AreaModelCommonConstants.FACTORS_TERM_FONT, + fill: colorProperty + } ); + + const box = new Rectangle( 0, 0, BOX_SIZE, BOX_SIZE, { + stroke: colorProperty, + centerY: PAREN_BOUNDS.centerY // So that it is perfectly vertically aligned + } ); + + const node = new Node(); + displayProperty.link( function( termList ) { + if ( termList === null ) { + node.children = [ box ]; + } + else { + richText.text = termList.toRichString(); + node.children = [ richText ]; + } + } ); + + return node; + } +} ); \ No newline at end of file diff --git a/js/generic/view/GenericLayoutSelectionNode.js b/js/generic/view/GenericLayoutSelectionNode.js index f663f344..54ec203a 100644 --- a/js/generic/view/GenericLayoutSelectionNode.js +++ b/js/generic/view/GenericLayoutSelectionNode.js @@ -9,248 +9,245 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const FireListener = require( 'SCENERY/listeners/FireListener' ); - const GenericLayout = require( 'AREA_MODEL_COMMON/generic/model/GenericLayout' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Path = require( 'SCENERY/nodes/Path' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Shape = require( 'KITE/Shape' ); - const Text = require( 'SCENERY/nodes/Text' ); - const VBox = require( 'SCENERY/nodes/VBox' ); +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import FireListener from '../../../../scenery/js/listeners/FireListener.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import GenericLayout from '../model/GenericLayout.js'; - /** - * @constructor - * @extends {Node} - * - * @param {Property.} genericLayoutProperty - * @param {Node} listParent - * @param {number} width - */ - function GenericLayoutSelectionNode( genericLayoutProperty, listParent, width ) { - Node.call( this ); - - const self = this; - - // Our rectangles will be stroked, so we need to subtract 1 due to the lineWidth - width -= 1; - - const comboBoxItems = GenericLayout.VALUES.map( function( layout ) { - return { - node: new HBox( { - children: [ - createLayoutIcon( layout.size, 0.7 ), - new Text( layout.size.height + 'x' + layout.size.width, { - font: AreaModelCommonConstants.LAYOUT_FONT - } ) - ], - spacing: 14 - } ), - value: layout - }; - } ); - - const maxItemHeight = Math.max.apply( Math, _.map( _.map( comboBoxItems, 'node' ), 'height' ) ); - const itemMargin = 6; - const arrowMargin = 8; - - const rectHeight = maxItemHeight + 2 * itemMargin; - const rectangle = new Rectangle( { - rectWidth: width, - rectHeight: maxItemHeight + 2 * itemMargin, - fill: 'white', - stroke: 'black', - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, - cursor: 'pointer' - } ); - this.addChild( rectangle ); - - const arrowSize = 15; - const arrow = new Path( new Shape().moveTo( 0, 0 ).lineTo( arrowSize, 0 ).lineTo( arrowSize * 0.5, arrowSize * 0.9 ).close(), { - fill: 'black', - right: rectangle.right - arrowMargin, - centerY: rectangle.centerY, - pickable: false - } ); - this.addChild( arrow ); - - const separatorX = arrow.left - arrowMargin; - this.addChild( new Line( { - x1: separatorX, - y1: 0, - x2: separatorX, - y2: rectHeight, - lineWidth: 0.5, - stroke: 'black', - pickable: false - } ) ); - - const currentLabel = new Node( { - pickable: false - } ); - genericLayoutProperty.link( function( layout ) { - currentLabel.children = [ - _.find( comboBoxItems, function( item ) { - return item.value === layout; - } ).node - ]; - currentLabel.left = itemMargin; - currentLabel.centerY = rectangle.centerY; - } ); - this.addChild( currentLabel ); - - const popup = new Rectangle( { - rectWidth: separatorX, - rectHeight: separatorX, - fill: 'white', - stroke: 'black', - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, - pickable: true - } ); - - const buttonSpacing = 12; - const buttonsNode = new VBox( { - children: [ 1, 2, 3 ].map( function( numVertical ) { - return new HBox( { - children: [ 1, 2, 3 ].map( function( numHorizontal ) { - const layout = GenericLayout.fromValues( numHorizontal, numVertical ); - // NOTE: Yes, it's weird this constant is here. We used to scale most things down by this amount. Now we - // want the same appearance (but without the scaling, because it was bad practice), so to get the icon to - // have the same appearance, a scale factor is needed. - const oldScale = 0.7; - const icon = createLayoutIcon( layout.size, oldScale * oldScale ); - icon.scale( 1 / oldScale ); - icon.pickable = false; - const cornerRadius = 3; - const background = Rectangle.roundedBounds( icon.bounds.dilated( cornerRadius ), cornerRadius, cornerRadius, { - cursor: 'pointer' +/** + * @constructor + * @extends {Node} + * + * @param {Property.} genericLayoutProperty + * @param {Node} listParent + * @param {number} width + */ +function GenericLayoutSelectionNode( genericLayoutProperty, listParent, width ) { + Node.call( this ); + + const self = this; + + // Our rectangles will be stroked, so we need to subtract 1 due to the lineWidth + width -= 1; + + const comboBoxItems = GenericLayout.VALUES.map( function( layout ) { + return { + node: new HBox( { + children: [ + createLayoutIcon( layout.size, 0.7 ), + new Text( layout.size.height + 'x' + layout.size.width, { + font: AreaModelCommonConstants.LAYOUT_FONT + } ) + ], + spacing: 14 + } ), + value: layout + }; + } ); + + const maxItemHeight = Math.max.apply( Math, _.map( _.map( comboBoxItems, 'node' ), 'height' ) ); + const itemMargin = 6; + const arrowMargin = 8; + + const rectHeight = maxItemHeight + 2 * itemMargin; + const rectangle = new Rectangle( { + rectWidth: width, + rectHeight: maxItemHeight + 2 * itemMargin, + fill: 'white', + stroke: 'black', + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, + cursor: 'pointer' + } ); + this.addChild( rectangle ); + + const arrowSize = 15; + const arrow = new Path( new Shape().moveTo( 0, 0 ).lineTo( arrowSize, 0 ).lineTo( arrowSize * 0.5, arrowSize * 0.9 ).close(), { + fill: 'black', + right: rectangle.right - arrowMargin, + centerY: rectangle.centerY, + pickable: false + } ); + this.addChild( arrow ); + + const separatorX = arrow.left - arrowMargin; + this.addChild( new Line( { + x1: separatorX, + y1: 0, + x2: separatorX, + y2: rectHeight, + lineWidth: 0.5, + stroke: 'black', + pickable: false + } ) ); + + const currentLabel = new Node( { + pickable: false + } ); + genericLayoutProperty.link( function( layout ) { + currentLabel.children = [ + _.find( comboBoxItems, function( item ) { + return item.value === layout; + } ).node + ]; + currentLabel.left = itemMargin; + currentLabel.centerY = rectangle.centerY; + } ); + this.addChild( currentLabel ); + + const popup = new Rectangle( { + rectWidth: separatorX, + rectHeight: separatorX, + fill: 'white', + stroke: 'black', + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, + pickable: true + } ); + + const buttonSpacing = 12; + const buttonsNode = new VBox( { + children: [ 1, 2, 3 ].map( function( numVertical ) { + return new HBox( { + children: [ 1, 2, 3 ].map( function( numHorizontal ) { + const layout = GenericLayout.fromValues( numHorizontal, numVertical ); + // NOTE: Yes, it's weird this constant is here. We used to scale most things down by this amount. Now we + // want the same appearance (but without the scaling, because it was bad practice), so to get the icon to + // have the same appearance, a scale factor is needed. + const oldScale = 0.7; + const icon = createLayoutIcon( layout.size, oldScale * oldScale ); + icon.scale( 1 / oldScale ); + icon.pickable = false; + const cornerRadius = 3; + const background = Rectangle.roundedBounds( icon.bounds.dilated( cornerRadius ), cornerRadius, cornerRadius, { + cursor: 'pointer' + } ); + background.touchArea = background.localBounds.dilated( buttonSpacing / 2 ); + const listener = new FireListener( { + fire: function() { + genericLayoutProperty.value = layout; + visibleProperty.value = false; // hide + } + } ); + background.stroke = new DerivedProperty( + [ genericLayoutProperty, AreaModelCommonColorProfile.radioBorderProperty ], + function( currentLayout, highlightColor ) { + if ( currentLayout === layout ) { + return highlightColor; + } + else { + return 'transparent'; + } } ); - background.touchArea = background.localBounds.dilated( buttonSpacing / 2 ); - const listener = new FireListener( { - fire: function() { - genericLayoutProperty.value = layout; - visibleProperty.value = false; // hide + background.fill = new DerivedProperty( + [ listener.isHoveringProperty, AreaModelCommonColorProfile.layoutHoverProperty ], + function( isHovering, hoverColor ) { + if ( isHovering ) { + return hoverColor; + } + else { + return 'transparent'; } } ); - background.stroke = new DerivedProperty( - [ genericLayoutProperty, AreaModelCommonColorProfile.radioBorderProperty ], - function( currentLayout, highlightColor ) { - if ( currentLayout === layout ) { - return highlightColor; - } - else { - return 'transparent'; - } - } ); - background.fill = new DerivedProperty( - [ listener.isHoveringProperty, AreaModelCommonColorProfile.layoutHoverProperty ], - function( isHovering, hoverColor ) { - if ( isHovering ) { - return hoverColor; - } - else { - return 'transparent'; - } - } ); - return new Node( { - children: [ background, icon ], - inputListeners: [ listener ] - } ); - } ), - spacing: buttonSpacing - } ); - } ), - spacing: buttonSpacing - } ); - const panelMargin = 20; - buttonsNode.scale( ( popup.width - 2 * panelMargin ) / buttonsNode.width ); - buttonsNode.center = popup.center; - popup.addChild( buttonsNode ); + return new Node( { + children: [ background, icon ], + inputListeners: [ listener ] + } ); + } ), + spacing: buttonSpacing + } ); + } ), + spacing: buttonSpacing + } ); + const panelMargin = 20; + buttonsNode.scale( ( popup.width - 2 * panelMargin ) / buttonsNode.width ); + buttonsNode.center = popup.center; + popup.addChild( buttonsNode ); + + var visibleProperty = new BooleanProperty( false ); + popup.addInputListener( { + down: function( event ) { + event.handle(); + } + } ); - var visibleProperty = new BooleanProperty( false ); - popup.addInputListener( { - down: function( event ) { - event.handle(); + // Handle dismissing the selection if the user clicks outside + const dismissListener = { + down: function( event ) { + if ( !event.trail.isExtensionOf( self.getUniqueTrail() ) ) { + visibleProperty.value = false; } - } ); + } + }; + visibleProperty.lazyLink( function( visible ) { + if ( visible ) { + const matrix = self.getUniqueTrail().getMatrixTo( listParent.getUniqueTrail() ); + popup.setScaleMagnitude( matrix.getScaleVector().x ); + // We subtract 1 off so that the strokes line up, and we don't get a "double-stroked" effect. + popup.leftTop = matrix.timesVector2( rectangle.leftBottom.plusXY( 0, -1 ) ); + listParent.addChild( popup ); + + phet.joist.display.addInputListener( dismissListener ); + } + else { + listParent.removeChild( popup ); - // Handle dismissing the selection if the user clicks outside - const dismissListener = { - down: function( event ) { - if ( !event.trail.isExtensionOf( self.getUniqueTrail() ) ) { - visibleProperty.value = false; - } - } - }; - visibleProperty.lazyLink( function( visible ) { - if ( visible ) { - const matrix = self.getUniqueTrail().getMatrixTo( listParent.getUniqueTrail() ); - popup.setScaleMagnitude( matrix.getScaleVector().x ); - // We subtract 1 off so that the strokes line up, and we don't get a "double-stroked" effect. - popup.leftTop = matrix.timesVector2( rectangle.leftBottom.plusXY( 0, -1 ) ); - listParent.addChild( popup ); + phet.joist.display.removeInputListener( dismissListener ); + } + } ); - phet.joist.display.addInputListener( dismissListener ); - } - else { - listParent.removeChild( popup ); + rectangle.addInputListener( { + down: function( event ) { + visibleProperty.toggle(); + } + } ); +} - phet.joist.display.removeInputListener( dismissListener ); - } - } ); +areaModelCommon.register( 'GenericLayoutSelectionNode', GenericLayoutSelectionNode ); - rectangle.addInputListener( { - down: function( event ) { - visibleProperty.toggle(); - } - } ); +/** + * Creates a layout icon based on the given size. + * @private + * + * @param {Dimension2} size + * @param {number} lineWidth + * @returns {Node} + */ +function createLayoutIcon( size, lineWidth ) { + const length = 21; + const shape = new Shape().rect( 0, 0, length, length ); + if ( size.width === 2 ) { + shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_SINGLE_OFFSET, 0 ).verticalLineTo( length ); } - - areaModelCommon.register( 'GenericLayoutSelectionNode', GenericLayoutSelectionNode ); - - /** - * Creates a layout icon based on the given size. - * @private - * - * @param {Dimension2} size - * @param {number} lineWidth - * @returns {Node} - */ - function createLayoutIcon( size, lineWidth ) { - const length = 21; - const shape = new Shape().rect( 0, 0, length, length ); - if ( size.width === 2 ) { - shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_SINGLE_OFFSET, 0 ).verticalLineTo( length ); - } - else if ( size.width === 3 ) { - shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_FIRST_OFFSET, 0 ).verticalLineTo( length ); - shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_SECOND_OFFSET, 0 ).verticalLineTo( length ); - } - if ( size.height === 2 ) { - shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_SINGLE_OFFSET ).horizontalLineTo( length ); - } - else if ( size.height === 3 ) { - shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_FIRST_OFFSET ).horizontalLineTo( length ); - shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_SECOND_OFFSET ).horizontalLineTo( length ); - } - return new Path( shape, { - lineWidth: lineWidth, - stroke: AreaModelCommonColorProfile.layoutGridProperty, - fill: AreaModelCommonColorProfile.layoutIconFillProperty - } ); + else if ( size.width === 3 ) { + shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_FIRST_OFFSET, 0 ).verticalLineTo( length ); + shape.moveTo( length * AreaModelCommonConstants.GENERIC_ICON_SECOND_OFFSET, 0 ).verticalLineTo( length ); } - - return inherit( Node, GenericLayoutSelectionNode ); -} ); + if ( size.height === 2 ) { + shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_SINGLE_OFFSET ).horizontalLineTo( length ); + } + else if ( size.height === 3 ) { + shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_FIRST_OFFSET ).horizontalLineTo( length ); + shape.moveTo( 0, length * AreaModelCommonConstants.GENERIC_ICON_SECOND_OFFSET ).horizontalLineTo( length ); + } + return new Path( shape, { + lineWidth: lineWidth, + stroke: AreaModelCommonColorProfile.layoutGridProperty, + fill: AreaModelCommonColorProfile.layoutIconFillProperty + } ); +} + +inherit( Node, GenericLayoutSelectionNode ); +export default GenericLayoutSelectionNode; \ No newline at end of file diff --git a/js/generic/view/GenericPartitionedAreaNode.js b/js/generic/view/GenericPartitionedAreaNode.js index a3789b0b..53b0ae3e 100644 --- a/js/generic/view/GenericPartitionedAreaNode.js +++ b/js/generic/view/GenericPartitionedAreaNode.js @@ -7,79 +7,76 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Property = require( 'AXON/Property' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; - /** - * @constructor - * @extends {Node} - * - * @param {Property.} partitionedAreaProperty - * @param {Property.} modelViewTransformProperty - */ - function GenericPartitionedAreaNode( partitionedAreaProperty, modelViewTransformProperty ) { - const self = this; +/** + * @constructor + * @extends {Node} + * + * @param {Property.} partitionedAreaProperty + * @param {Property.} modelViewTransformProperty + */ +function GenericPartitionedAreaNode( partitionedAreaProperty, modelViewTransformProperty ) { + const self = this; - // We'll set the fill/size/etc. below. - Rectangle.call( this, {} ); + // We'll set the fill/size/etc. below. + Rectangle.call( this, {} ); - // @public {Property.} - Exposed so it can be set later - this.partitionedAreaProperty = partitionedAreaProperty; + // @public {Property.} - Exposed so it can be set later + this.partitionedAreaProperty = partitionedAreaProperty; - // Fill - new DynamicProperty( partitionedAreaProperty, { - derive: 'areaProperty' - } ).link( function( area ) { - if ( area === null || area.coefficient === 0 ) { - self.fill = null; - } - else if ( area.coefficient > 0 ) { - self.fill = AreaModelCommonColorProfile.genericPositiveBackgroundProperty; - } - else { - self.fill = AreaModelCommonColorProfile.genericNegativeBackgroundProperty; - } - } ); + // Fill + new DynamicProperty( partitionedAreaProperty, { + derive: 'areaProperty' + } ).link( function( area ) { + if ( area === null || area.coefficient === 0 ) { + self.fill = null; + } + else if ( area.coefficient > 0 ) { + self.fill = AreaModelCommonColorProfile.genericPositiveBackgroundProperty; + } + else { + self.fill = AreaModelCommonColorProfile.genericNegativeBackgroundProperty; + } + } ); - // Visibility - new DynamicProperty( partitionedAreaProperty, { - derive: 'visibleProperty', - defaultValue: false - } ).linkAttribute( this, 'visible' ); + // Visibility + new DynamicProperty( partitionedAreaProperty, { + derive: 'visibleProperty', + defaultValue: false + } ).linkAttribute( this, 'visible' ); - // Adjust our rectangle dimension/location so that we take up the bounds defined by the partitioned area. Our area - // can change, so we need to swap out or multilink when the area changes (kept so we can dispose it) - let rangeMultilinks = null; // {OrientationPair.|null} - partitionedAreaProperty.link( function( partitionedArea ) { - // Release any previous references - rangeMultilinks && rangeMultilinks.forEach( function( rangeMultilink ) { - rangeMultilink.dispose(); - } ); - rangeMultilinks = null; - if ( partitionedArea ) { - rangeMultilinks = partitionedArea.partitions.map( function( partition, orientation ) { - return Property.multilink( - [ partition.coordinateRangeProperty, modelViewTransformProperty ], - function( range, modelViewTransform ) { - if ( range !== null ) { - self[ orientation.rectCoordinate ] = modelViewTransform.modelToViewX( range.min ); - self[ orientation.rectSize ] = modelViewTransform.modelToViewX( range.getLength() ); - } - } ); - } ); - } + // Adjust our rectangle dimension/location so that we take up the bounds defined by the partitioned area. Our area + // can change, so we need to swap out or multilink when the area changes (kept so we can dispose it) + let rangeMultilinks = null; // {OrientationPair.|null} + partitionedAreaProperty.link( function( partitionedArea ) { + // Release any previous references + rangeMultilinks && rangeMultilinks.forEach( function( rangeMultilink ) { + rangeMultilink.dispose(); } ); - } + rangeMultilinks = null; + if ( partitionedArea ) { + rangeMultilinks = partitionedArea.partitions.map( function( partition, orientation ) { + return Property.multilink( + [ partition.coordinateRangeProperty, modelViewTransformProperty ], + function( range, modelViewTransform ) { + if ( range !== null ) { + self[ orientation.rectCoordinate ] = modelViewTransform.modelToViewX( range.min ); + self[ orientation.rectSize ] = modelViewTransform.modelToViewX( range.getLength() ); + } + } ); + } ); + } + } ); +} - areaModelCommon.register( 'GenericPartitionedAreaNode', GenericPartitionedAreaNode ); +areaModelCommon.register( 'GenericPartitionedAreaNode', GenericPartitionedAreaNode ); - return inherit( Rectangle, GenericPartitionedAreaNode ); -} ); +inherit( Rectangle, GenericPartitionedAreaNode ); +export default GenericPartitionedAreaNode; \ No newline at end of file diff --git a/js/generic/view/PartitionSizeEditNode.js b/js/generic/view/PartitionSizeEditNode.js index 72ead35b..67686071 100644 --- a/js/generic/view/PartitionSizeEditNode.js +++ b/js/generic/view/PartitionSizeEditNode.js @@ -7,92 +7,89 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const Color = require( 'SCENERY/util/Color' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const TermEditNode = require( 'AREA_MODEL_COMMON/generic/view/TermEditNode' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Color from '../../../../scenery/js/util/Color.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import TermEditNode from './TermEditNode.js'; - /** - * @constructor - * @extends {Node} - * - * @param {Property.} activePartitionProperty - * @param {Property.} partitionProperty - * @param {Property.} modelViewTransformProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - */ - function PartitionSizeEditNode( activePartitionProperty, partitionProperty, modelViewTransformProperty, allowExponents ) { - const self = this; +/** + * @constructor + * @extends {Node} + * + * @param {Property.} activePartitionProperty + * @param {Property.} partitionProperty + * @param {Property.} modelViewTransformProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + */ +function PartitionSizeEditNode( activePartitionProperty, partitionProperty, modelViewTransformProperty, allowExponents ) { + const self = this; - // @public {Property.} - Exposed so it can be changed after creation in pooling. - this.partitionProperty = partitionProperty; + // @public {Property.} - Exposed so it can be changed after creation in pooling. + this.partitionProperty = partitionProperty; - const orientationProperty = new DerivedProperty( [ partitionProperty ], function( partition ) { - return partition ? partition.orientation : Orientation.HORIZONTAL; // Default if we have none - } ); - const sizeProperty = new DynamicProperty( partitionProperty, { derive: 'sizeProperty' } ); - const colorProperty = new DynamicProperty( partitionProperty, { - derive: 'colorProperty', - defaultValue: Color.MAGENTA // Should not see this, but need a valid color - } ); + const orientationProperty = new DerivedProperty( [ partitionProperty ], function( partition ) { + return partition ? partition.orientation : Orientation.HORIZONTAL; // Default if we have none + } ); + const sizeProperty = new DynamicProperty( partitionProperty, { derive: 'sizeProperty' } ); + const colorProperty = new DynamicProperty( partitionProperty, { + derive: 'colorProperty', + defaultValue: Color.MAGENTA // Should not see this, but need a valid color + } ); - TermEditNode.call( this, orientationProperty, sizeProperty, { - textColorProperty: colorProperty, - borderColorProperty: colorProperty, - isActiveProperty: new DerivedProperty( - [ activePartitionProperty, partitionProperty ], - function( activePartition, partition ) { - return activePartition === partition; - } ), - digitCountProperty: new DerivedProperty( [ partitionProperty ], function( partition ) { - return partition ? partition.digitCount : 1; // Default if we have none + TermEditNode.call( this, orientationProperty, sizeProperty, { + textColorProperty: colorProperty, + borderColorProperty: colorProperty, + isActiveProperty: new DerivedProperty( + [ activePartitionProperty, partitionProperty ], + function( activePartition, partition ) { + return activePartition === partition; } ), - allowExponentsProperty: new Property( allowExponents ), - editCallback: function() { - if ( activePartitionProperty.value !== partitionProperty.value ) { - activePartitionProperty.value = partitionProperty.value; - } - else { - // Pressing on the edit button when that keypad is already open will instead close the keypad. - // See https://github.com/phetsims/area-model-common/issues/127 - activePartitionProperty.value = null; - } + digitCountProperty: new DerivedProperty( [ partitionProperty ], function( partition ) { + return partition ? partition.digitCount : 1; // Default if we have none + } ), + allowExponentsProperty: new Property( allowExponents ), + editCallback: function() { + if ( activePartitionProperty.value !== partitionProperty.value ) { + activePartitionProperty.value = partitionProperty.value; } - } ); - - // Primary orientation (location of range center) - const coordinateRangeProperty = new DynamicProperty( partitionProperty, { derive: 'coordinateRangeProperty' } ); - Property.multilink( - [ partitionProperty, coordinateRangeProperty, modelViewTransformProperty ], - function( partition, range, modelViewTransform ) { - if ( range && partition ) { - self[ partition.orientation.centerCoordinate ] = partition.orientation.modelToView( modelViewTransform, range.getCenter() ); - } - } ); + else { + // Pressing on the edit button when that keypad is already open will instead close the keypad. + // See https://github.com/phetsims/area-model-common/issues/127 + activePartitionProperty.value = null; + } + } + } ); - // Secondary (offsets) - partitionProperty.link( function( partition ) { - if ( partition ) { - self[ partition.orientation.opposite.centerCoordinate ] = AreaModelCommonConstants.PARTITION_OFFSET.get( partition.orientation ); + // Primary orientation (location of range center) + const coordinateRangeProperty = new DynamicProperty( partitionProperty, { derive: 'coordinateRangeProperty' } ); + Property.multilink( + [ partitionProperty, coordinateRangeProperty, modelViewTransformProperty ], + function( partition, range, modelViewTransform ) { + if ( range && partition ) { + self[ partition.orientation.centerCoordinate ] = partition.orientation.modelToView( modelViewTransform, range.getCenter() ); } } ); - new DynamicProperty( partitionProperty, { - derive: 'visibleProperty', - defaultValue: false - } ).linkAttribute( this, 'visible' ); - } + // Secondary (offsets) + partitionProperty.link( function( partition ) { + if ( partition ) { + self[ partition.orientation.opposite.centerCoordinate ] = AreaModelCommonConstants.PARTITION_OFFSET.get( partition.orientation ); + } + } ); + + new DynamicProperty( partitionProperty, { + derive: 'visibleProperty', + defaultValue: false + } ).linkAttribute( this, 'visible' ); +} - areaModelCommon.register( 'PartitionSizeEditNode', PartitionSizeEditNode ); +areaModelCommon.register( 'PartitionSizeEditNode', PartitionSizeEditNode ); - return inherit( TermEditNode, PartitionSizeEditNode ); -} ); +inherit( TermEditNode, PartitionSizeEditNode ); +export default PartitionSizeEditNode; \ No newline at end of file diff --git a/js/generic/view/TermAccumulator.js b/js/generic/view/TermAccumulator.js index 55a8aca9..c76854c5 100644 --- a/js/generic/view/TermAccumulator.js +++ b/js/generic/view/TermAccumulator.js @@ -7,195 +7,191 @@ * * @author Jonathan Olson { - 'use strict'; - - // modules - const AbstractKeyAccumulator = require( 'SCENERY_PHET/keypad/AbstractKeyAccumulator' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const KeyID = require( 'SCENERY_PHET/keypad/KeyID' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - - // constants - const NONZERO_DIGIT_STRINGS = _.range( 1, 10 ).map( function( n ) { return '' + n; } ); - const DIGIT_STRINGS = _.range( 0, 10 ).map( function( n ) { return '' + n; } ); + +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import AbstractKeyAccumulator from '../../../../scenery-phet/js/keypad/AbstractKeyAccumulator.js'; +import KeyID from '../../../../scenery-phet/js/keypad/KeyID.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import Term from '../../common/model/Term.js'; + +// constants +const NONZERO_DIGIT_STRINGS = _.range( 1, 10 ).map( function( n ) { return '' + n; } ); +const DIGIT_STRINGS = _.range( 0, 10 ).map( function( n ) { return '' + n; } ); + +/** + * @constructor + * @extends {AbstractKeyAccumulator} + * + * @param {Property.} digitCountProperty + */ +function TermAccumulator( digitCountProperty ) { /** - * @constructor - * @extends {AbstractKeyAccumulator} + * Whether a set of proposed keys is allowed, see https://github.com/phetsims/area-model-common/issues/138 + * @public + * @override * - * @param {Property.} digitCountProperty + * @param {Array.} proposedKeys + * @returns {boolean} */ - function TermAccumulator( digitCountProperty ) { - - /** - * Whether a set of proposed keys is allowed, see https://github.com/phetsims/area-model-common/issues/138 - * @public - * @override - * - * @param {Array.} proposedKeys - * @returns {boolean} - */ - this.defaultValidator = function( proposedKeys ) { - let xCount = 0; - let digitCount = 0; - - - proposedKeys.forEach( function( key ) { - if ( key === KeyID.X || key === KeyID.X_SQUARED ) { - xCount++; - } - - if ( _.includes( DIGIT_STRINGS, key ) ) { - digitCount++; - } - } ); - - return xCount <= 1 && digitCount <= digitCountProperty.value; - }; - - // Validators to be passed to AbstractKeyAccumulator - const validators = [ this.defaultValidator ]; - - AbstractKeyAccumulator.call( this, validators ); - - // @public {Property.} - For display - this.richStringProperty = new DerivedProperty( [ this.accumulatedKeysProperty ], function( accumulatedKeys ) { - return accumulatedKeys.map( function( key ) { - if ( key === KeyID.PLUS_MINUS ) { - return MathSymbols.UNARY_MINUS; - } - else if ( key === KeyID.X ) { - return AreaModelCommonConstants.X_VARIABLE_RICH_STRING; - } - else if ( key === KeyID.X_SQUARED ) { - return AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2'; - } - else { - return key; - } - } ).join( '' ); - } ); + this.defaultValidator = function( proposedKeys ) { + let xCount = 0; + let digitCount = 0; - // @public {Property.} - The term used if 'enter' is pressed - this.termProperty = new DerivedProperty( [ this.accumulatedKeysProperty ], function( accumulatedKeys ) { - const lastKey = accumulatedKeys[ accumulatedKeys.length - 1 ]; - let coefficient = 1; - let power = 0; - if ( lastKey === KeyID.X ) { - power = 1; - accumulatedKeys = accumulatedKeys.slice( 0, accumulatedKeys.length - 1 ); + proposedKeys.forEach( function( key ) { + if ( key === KeyID.X || key === KeyID.X_SQUARED ) { + xCount++; } - else if ( lastKey === KeyID.X_SQUARED ) { - power = 2; - accumulatedKeys = accumulatedKeys.slice( 0, accumulatedKeys.length - 1 ); - } - if ( accumulatedKeys[ 0 ] === KeyID.PLUS_MINUS ) { - accumulatedKeys = accumulatedKeys.slice( 1 ); - // handle -x - if ( accumulatedKeys.length === 0 ) { - coefficient = -1; - } - else { - accumulatedKeys = [ '-' ].concat( accumulatedKeys ); - } + if ( _.includes( DIGIT_STRINGS, key ) ) { + digitCount++; } + } ); + + return xCount <= 1 && digitCount <= digitCountProperty.value; + }; + + // Validators to be passed to AbstractKeyAccumulator + const validators = [ this.defaultValidator ]; - const digitString = accumulatedKeys.join( '' ); - if ( digitString === '' || digitString === '-' ) { - if ( power === 0 ) { - return null; - } + AbstractKeyAccumulator.call( this, validators ); + + // @public {Property.} - For display + this.richStringProperty = new DerivedProperty( [ this.accumulatedKeysProperty ], function( accumulatedKeys ) { + return accumulatedKeys.map( function( key ) { + if ( key === KeyID.PLUS_MINUS ) { + return MathSymbols.UNARY_MINUS; + } + else if ( key === KeyID.X ) { + return AreaModelCommonConstants.X_VARIABLE_RICH_STRING; + } + else if ( key === KeyID.X_SQUARED ) { + return AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2'; } else { - coefficient = parseInt( digitString, 10 ); + return key; } + } ).join( '' ); + } ); - return new Term( coefficient, power ); - } ); - } + // @public {Property.} - The term used if 'enter' is pressed + this.termProperty = new DerivedProperty( [ this.accumulatedKeysProperty ], function( accumulatedKeys ) { + const lastKey = accumulatedKeys[ accumulatedKeys.length - 1 ]; - areaModelCommon.register( 'TermAccumulator', TermAccumulator ); - - return inherit( AbstractKeyAccumulator, TermAccumulator, { - /** - * Handles what happens when a key is pressed and create proposed set of keys to be passed to Validator - * @public - * @override - * - * @param {KeyID} keyIdentifier - identifier for the key pressed - */ - handleKeyPressed: function( keyIdentifier ) { - - const currentKeys = this.accumulatedKeysProperty.get(); - - // Whether we have a negative sign in our current input - let negative = _.includes( currentKeys, KeyID.PLUS_MINUS ); - - // The power of x (X or X_SQUARED) in our input (otherwise undefined). This keypad only allows one "power" of X, - // e.g. 0, 1 or 2 (corresponding to multiplying times 1, x, x^2). This is the corresponding key for that power. - let power = _.find( currentKeys, function( key ) { - return key === KeyID.X || key === KeyID.X_SQUARED; - } ); - - // All of the digits in our current input. (just numerical parts, not powers of x or negative signs) - let digits = currentKeys.filter( function( key ) { - return _.includes( DIGIT_STRINGS, key ); - } ); - - // Helpful booleans for what our pressed key is. - const isDigit = _.includes( NONZERO_DIGIT_STRINGS, keyIdentifier ); - const isZero = keyIdentifier === KeyID.ZERO; - const isBackspace = keyIdentifier === KeyID.BACKSPACE; - const isPlusMinus = keyIdentifier === KeyID.PLUS_MINUS; - const isX = keyIdentifier === KeyID.X; - const isXSquared = keyIdentifier === KeyID.X_SQUARED; - - if ( isBackspace ) { - if ( power ) { - power = null; - } - else if ( digits.length ) { - digits.pop(); - } - else { - negative = false; - } - } - else if ( isX || isXSquared ) { - if ( !power ) { - power = keyIdentifier; - } - } - else if ( isPlusMinus ) { - negative = !negative; - } - else if ( isZero ) { - if ( digits[ 0 ] !== KeyID.ZERO ) { - digits.push( keyIdentifier ); - } - } - else if ( isDigit ) { - if ( digits[ 0 ] === KeyID.ZERO ) { - digits = [ keyIdentifier ]; - } - else { - digits.push( keyIdentifier ); - } + let coefficient = 1; + let power = 0; + if ( lastKey === KeyID.X ) { + power = 1; + accumulatedKeys = accumulatedKeys.slice( 0, accumulatedKeys.length - 1 ); + } + else if ( lastKey === KeyID.X_SQUARED ) { + power = 2; + accumulatedKeys = accumulatedKeys.slice( 0, accumulatedKeys.length - 1 ); + } + if ( accumulatedKeys[ 0 ] === KeyID.PLUS_MINUS ) { + accumulatedKeys = accumulatedKeys.slice( 1 ); + + // handle -x + if ( accumulatedKeys.length === 0 ) { + coefficient = -1; } else { - throw new Error( 'unknown digit: ' + keyIdentifier ); + accumulatedKeys = [ '-' ].concat( accumulatedKeys ); } + } - // Validate and update the keys - const proposedKeys = ( negative ? [ KeyID.PLUS_MINUS ] : [] ).concat( digits ).concat( power ? [ power ] : [] ); - this.validateKeys( proposedKeys ) && this.updateKeys( proposedKeys ); + const digitString = accumulatedKeys.join( '' ); + if ( digitString === '' || digitString === '-' ) { + if ( power === 0 ) { + return null; + } + } + else { + coefficient = parseInt( digitString, 10 ); } + + return new Term( coefficient, power ); } ); -} ); +} + +areaModelCommon.register( 'TermAccumulator', TermAccumulator ); + +export default inherit( AbstractKeyAccumulator, TermAccumulator, { + /** + * Handles what happens when a key is pressed and create proposed set of keys to be passed to Validator + * @public + * @override + * + * @param {KeyID} keyIdentifier - identifier for the key pressed + */ + handleKeyPressed: function( keyIdentifier ) { + + const currentKeys = this.accumulatedKeysProperty.get(); + + // Whether we have a negative sign in our current input + let negative = _.includes( currentKeys, KeyID.PLUS_MINUS ); + + // The power of x (X or X_SQUARED) in our input (otherwise undefined). This keypad only allows one "power" of X, + // e.g. 0, 1 or 2 (corresponding to multiplying times 1, x, x^2). This is the corresponding key for that power. + let power = _.find( currentKeys, function( key ) { + return key === KeyID.X || key === KeyID.X_SQUARED; + } ); + + // All of the digits in our current input. (just numerical parts, not powers of x or negative signs) + let digits = currentKeys.filter( function( key ) { + return _.includes( DIGIT_STRINGS, key ); + } ); + + // Helpful booleans for what our pressed key is. + const isDigit = _.includes( NONZERO_DIGIT_STRINGS, keyIdentifier ); + const isZero = keyIdentifier === KeyID.ZERO; + const isBackspace = keyIdentifier === KeyID.BACKSPACE; + const isPlusMinus = keyIdentifier === KeyID.PLUS_MINUS; + const isX = keyIdentifier === KeyID.X; + const isXSquared = keyIdentifier === KeyID.X_SQUARED; + + if ( isBackspace ) { + if ( power ) { + power = null; + } + else if ( digits.length ) { + digits.pop(); + } + else { + negative = false; + } + } + else if ( isX || isXSquared ) { + if ( !power ) { + power = keyIdentifier; + } + } + else if ( isPlusMinus ) { + negative = !negative; + } + else if ( isZero ) { + if ( digits[ 0 ] !== KeyID.ZERO ) { + digits.push( keyIdentifier ); + } + } + else if ( isDigit ) { + if ( digits[ 0 ] === KeyID.ZERO ) { + digits = [ keyIdentifier ]; + } + else { + digits.push( keyIdentifier ); + } + } + else { + throw new Error( 'unknown digit: ' + keyIdentifier ); + } + + // Validate and update the keys + const proposedKeys = ( negative ? [ KeyID.PLUS_MINUS ] : [] ).concat( digits ).concat( power ? [ power ] : [] ); + this.validateKeys( proposedKeys ) && this.updateKeys( proposedKeys ); + } +} ); \ No newline at end of file diff --git a/js/generic/view/TermEditNode.js b/js/generic/view/TermEditNode.js index 5b3868c4..b8a8aad7 100644 --- a/js/generic/view/TermEditNode.js +++ b/js/generic/view/TermEditNode.js @@ -7,140 +7,137 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const Color = require( 'SCENERY/util/Color' ); - const FireListener = require( 'SCENERY/listeners/FireListener' ); - const FontAwesomeNode = require( 'SUN/FontAwesomeNode' ); - const inherit = require( 'PHET_CORE/inherit' ); - const LayoutBox = require( 'SCENERY/nodes/LayoutBox' ); - const merge = require( 'PHET_CORE/merge' ); - const NumberProperty = require( 'AXON/NumberProperty' ); - const Property = require( 'AXON/Property' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const RectangularPushButton = require( 'SUN/buttons/RectangularPushButton' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} orientationProperty - * @param {Property.} termProperty - * @param {Object} [options] - */ - function TermEditNode( orientationProperty, termProperty, options ) { - assert && assert( orientationProperty instanceof Property ); - assert && assert( termProperty instanceof Property ); - - options = merge( { - // {Property.} - The color of the readout text - textColorProperty: new Property( Color.BLACK ), - - // {Property.} - The color of the border around the readout - borderColorProperty: new Property( Color.BLACK ), - - // {Property.} - Whether this term is the one being edited right now - isActiveProperty: new BooleanProperty( false ), - - // {Property.} - How many digits are allowed to be used for this term - digitCountProperty: new NumberProperty( 1 ), - - // {Property.} - Whether exponents are allowed for this term - allowExponentsProperty: new BooleanProperty( false ), - - // {function} - Called with no arguments when this term should start being edited - editCallback: _.noop, - - // {Font} - font: AreaModelCommonConstants.TERM_EDIT_READOUT_FONT - }, options ); - - const self = this; - - const readoutText = new RichText( '', { - fill: options.textColorProperty, - font: options.font - } ); - - const readoutBackground = new Rectangle( { - stroke: options.borderColorProperty, - cornerRadius: 4, - children: [ - readoutText - ], - // Allow clicking the readout to edit, see https://github.com/phetsims/area-model-common/issues/23 - cursor: 'pointer', - inputListeners: [ - new FireListener( { - fire: options.editCallback - } ) - ] - } ); - - LayoutBox.call( this, { - orientation: orientationProperty.value.layoutBoxOrientation, - spacing: 4, - children: [ - readoutBackground, - new RectangularPushButton( { - content: new FontAwesomeNode( 'pencil_square_o', { - scale: 0.4, - xMargin: 6, - yMargin: 4 - } ), - listener: function() { - options.editCallback(); - }, - baseColor: AreaModelCommonColorProfile.editButtonBackgroundProperty - } ) - ] - } ); - orientationProperty.link( function( orientation ) { - self.orientation = orientation.layoutBoxOrientation; - } ); - - options.isActiveProperty.link( function( isActive ) { - readoutBackground.fill = isActive - ? AreaModelCommonColorProfile.editActiveBackgroundProperty - : AreaModelCommonColorProfile.editInactiveBackgroundProperty; - } ); - - function updateText() { - if ( termProperty.value === null ) { - readoutText.text = ''; - } - else { - readoutText.text = termProperty.value.toRichString( false ); - } - - readoutText.center = readoutBackground.selfBounds.center; - readoutBackground.touchArea = readoutBackground.parentToLocalBounds( self.localBounds ).dilated( 6 ); - } - function updateDigits() { - readoutText.text = Term.getLargestGenericString( options.allowExponentsProperty.value, options.digitCountProperty.value ); - readoutBackground.rectWidth = readoutText.width + 5; - readoutBackground.rectHeight = readoutText.height + 5; - updateText(); +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import NumberProperty from '../../../../axon/js/NumberProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import FireListener from '../../../../scenery/js/listeners/FireListener.js'; +import LayoutBox from '../../../../scenery/js/nodes/LayoutBox.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Color from '../../../../scenery/js/util/Color.js'; +import RectangularPushButton from '../../../../sun/js/buttons/RectangularPushButton.js'; +import FontAwesomeNode from '../../../../sun/js/FontAwesomeNode.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; + +/** + * @constructor + * @extends {Node} + * + * @param {Property.} orientationProperty + * @param {Property.} termProperty + * @param {Object} [options] + */ +function TermEditNode( orientationProperty, termProperty, options ) { + assert && assert( orientationProperty instanceof Property ); + assert && assert( termProperty instanceof Property ); + + options = merge( { + // {Property.} - The color of the readout text + textColorProperty: new Property( Color.BLACK ), + + // {Property.} - The color of the border around the readout + borderColorProperty: new Property( Color.BLACK ), + + // {Property.} - Whether this term is the one being edited right now + isActiveProperty: new BooleanProperty( false ), + + // {Property.} - How many digits are allowed to be used for this term + digitCountProperty: new NumberProperty( 1 ), + + // {Property.} - Whether exponents are allowed for this term + allowExponentsProperty: new BooleanProperty( false ), + + // {function} - Called with no arguments when this term should start being edited + editCallback: _.noop, + + // {Font} + font: AreaModelCommonConstants.TERM_EDIT_READOUT_FONT + }, options ); + + const self = this; + + const readoutText = new RichText( '', { + fill: options.textColorProperty, + font: options.font + } ); + + const readoutBackground = new Rectangle( { + stroke: options.borderColorProperty, + cornerRadius: 4, + children: [ + readoutText + ], + // Allow clicking the readout to edit, see https://github.com/phetsims/area-model-common/issues/23 + cursor: 'pointer', + inputListeners: [ + new FireListener( { + fire: options.editCallback + } ) + ] + } ); + + LayoutBox.call( this, { + orientation: orientationProperty.value.layoutBoxOrientation, + spacing: 4, + children: [ + readoutBackground, + new RectangularPushButton( { + content: new FontAwesomeNode( 'pencil_square_o', { + scale: 0.4, + xMargin: 6, + yMargin: 4 + } ), + listener: function() { + options.editCallback(); + }, + baseColor: AreaModelCommonColorProfile.editButtonBackgroundProperty + } ) + ] + } ); + orientationProperty.link( function( orientation ) { + self.orientation = orientation.layoutBoxOrientation; + } ); + + options.isActiveProperty.link( function( isActive ) { + readoutBackground.fill = isActive + ? AreaModelCommonColorProfile.editActiveBackgroundProperty + : AreaModelCommonColorProfile.editInactiveBackgroundProperty; + } ); + + function updateText() { + if ( termProperty.value === null ) { + readoutText.text = ''; + } + else { + readoutText.text = termProperty.value.toRichString( false ); } - termProperty.lazyLink( updateText ); - options.digitCountProperty.lazyLink( updateDigits ); - options.allowExponentsProperty.lazyLink( updateDigits ); - orientationProperty.lazyLink( updateDigits ); + readoutText.center = readoutBackground.selfBounds.center; + readoutBackground.touchArea = readoutBackground.parentToLocalBounds( self.localBounds ).dilated( 6 ); + } - updateDigits(); + function updateDigits() { + readoutText.text = Term.getLargestGenericString( options.allowExponentsProperty.value, options.digitCountProperty.value ); + readoutBackground.rectWidth = readoutText.width + 5; + readoutBackground.rectHeight = readoutText.height + 5; + updateText(); } - areaModelCommon.register( 'TermEditNode', TermEditNode ); + termProperty.lazyLink( updateText ); + options.digitCountProperty.lazyLink( updateDigits ); + options.allowExponentsProperty.lazyLink( updateDigits ); + orientationProperty.lazyLink( updateDigits ); + + updateDigits(); +} + +areaModelCommon.register( 'TermEditNode', TermEditNode ); - return inherit( LayoutBox, TermEditNode ); -} ); +inherit( LayoutBox, TermEditNode ); +export default TermEditNode; \ No newline at end of file diff --git a/js/generic/view/TermKeypadPanel.js b/js/generic/view/TermKeypadPanel.js index 647606b4..ec4bbba1 100644 --- a/js/generic/view/TermKeypadPanel.js +++ b/js/generic/view/TermKeypadPanel.js @@ -7,174 +7,170 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const BackspaceIcon = require( 'SCENERY_PHET/BackspaceIcon' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Key = require( 'SCENERY_PHET/keypad/Key' ); - const KeyID = require( 'SCENERY_PHET/keypad/KeyID' ); - const Keypad = require( 'SCENERY_PHET/keypad/Keypad' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Panel = require( 'SUN/Panel' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const RectangularPushButton = require( 'SUN/buttons/RectangularPushButton' ); - const RichText = require( 'SCENERY/nodes/RichText' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - const TermAccumulator = require( 'AREA_MODEL_COMMON/generic/view/TermAccumulator' ); - const Text = require( 'SCENERY/nodes/Text' ); - const VBox = require( 'SCENERY/nodes/VBox' ); - - // strings - const enterString = require( 'string!AREA_MODEL_COMMON/enter' ); - - // layout constants - const positiveKeys = [ - [ - new Key( '7', KeyID.SEVEN ), - new Key( '8', KeyID.EIGHT ), - new Key( '9', KeyID.NINE ) - ], - [ - new Key( '4', KeyID.FOUR ), - new Key( '5', KeyID.FIVE ), - new Key( '6', KeyID.SIX ) - ], - [ - new Key( '1', KeyID.ONE ), - new Key( '2', KeyID.TWO ), - new Key( '3', KeyID.THREE ) - ] - ]; - const zeroAndBackspace = [ - new Key( '0', KeyID.ZERO ), - new Key( ( new BackspaceIcon( { scale: 1.5 } ) ), KeyID.BACKSPACE ) - ]; - const noExponentLayout = positiveKeys.concat( [ - [ new Key( MathSymbols.PLUS + '/' + MathSymbols.MINUS, KeyID.PLUS_MINUS ) ].concat( zeroAndBackspace ) - ] ); - const noNegativeLayout = positiveKeys.concat( [ - [ null ].concat( zeroAndBackspace ) - ] ); - const exponentLayout = noExponentLayout.concat( [ - [ - null, - new Key( new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2', { font: AreaModelCommonConstants.KEYPAD_FONT } ), KeyID.X_SQUARED ), - new Key( new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING, { font: AreaModelCommonConstants.KEYPAD_FONT } ), KeyID.X ) - ] - ] ); - /** - * @constructor - * @extends {Panel} - * - * @param {Property.} digitCountProperty - * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed - * @param {boolean} allowNegative - * @param {function} enterCallback - function( {Term|null} ) - The entered term, or null if there is no valid term entered. - * @param {Object} [nodeOptions] - */ - function TermKeypadPanel( digitCountProperty, allowExponents, allowNegative, enterCallback, nodeOptions ) { - assert && assert( allowNegative || !allowExponents, 'We have no non-negative exponent keyboard layout' ); - - // Handles logic for key-presses and conversion to strings/Terms. - const termAccumulator = new TermAccumulator( digitCountProperty ); - - // @private {Keypad} - this.keypad = new Keypad( allowExponents ? exponentLayout : ( allowNegative ? noExponentLayout : noNegativeLayout ), { - accumulator: termAccumulator - } ); - - const readoutBackground = new Rectangle( { - fill: AreaModelCommonColorProfile.keypadReadoutBackgroundProperty, - stroke: AreaModelCommonColorProfile.keypadReadoutBorderProperty, - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS - } ); - - const readoutTextOptions = { - font: AreaModelCommonConstants.KEYPAD_READOUT_FONT - }; - - const readoutText = new RichText( '', readoutTextOptions ); - - function updateText( string ) { - // Trick to be able to position an empty string - readoutText.visible = string.length > 0; - if ( readoutText.visible ) { - readoutText.text = string; - readoutText.centerX = readoutBackground.centerX; - } - } +import inherit from '../../../../phet-core/js/inherit.js'; +import BackspaceIcon from '../../../../scenery-phet/js/BackspaceIcon.js'; +import Key from '../../../../scenery-phet/js/keypad/Key.js'; +import KeyID from '../../../../scenery-phet/js/keypad/KeyID.js'; +import Keypad from '../../../../scenery-phet/js/keypad/Keypad.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import RichText from '../../../../scenery/js/nodes/RichText.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import RectangularPushButton from '../../../../sun/js/buttons/RectangularPushButton.js'; +import Panel from '../../../../sun/js/Panel.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import TermAccumulator from './TermAccumulator.js'; + +const enterString = areaModelCommonStrings.enter; + +// layout constants +const positiveKeys = [ + [ + new Key( '7', KeyID.SEVEN ), + new Key( '8', KeyID.EIGHT ), + new Key( '9', KeyID.NINE ) + ], + [ + new Key( '4', KeyID.FOUR ), + new Key( '5', KeyID.FIVE ), + new Key( '6', KeyID.SIX ) + ], + [ + new Key( '1', KeyID.ONE ), + new Key( '2', KeyID.TWO ), + new Key( '3', KeyID.THREE ) + ] +]; +const zeroAndBackspace = [ + new Key( '0', KeyID.ZERO ), + new Key( ( new BackspaceIcon( { scale: 1.5 } ) ), KeyID.BACKSPACE ) +]; +const noExponentLayout = positiveKeys.concat( [ + [ new Key( MathSymbols.PLUS + '/' + MathSymbols.MINUS, KeyID.PLUS_MINUS ) ].concat( zeroAndBackspace ) +] ); +const noNegativeLayout = positiveKeys.concat( [ + [ null ].concat( zeroAndBackspace ) +] ); +const exponentLayout = noExponentLayout.concat( [ + [ + null, + new Key( new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING + '2', { font: AreaModelCommonConstants.KEYPAD_FONT } ), KeyID.X_SQUARED ), + new Key( new RichText( AreaModelCommonConstants.X_VARIABLE_RICH_STRING, { font: AreaModelCommonConstants.KEYPAD_FONT } ), KeyID.X ) + ] +] ); + +/** + * @constructor + * @extends {Panel} + * + * @param {Property.} digitCountProperty + * @param {boolean} allowExponents - Whether exponents (powers of x) are allowed + * @param {boolean} allowNegative + * @param {function} enterCallback - function( {Term|null} ) - The entered term, or null if there is no valid term entered. + * @param {Object} [nodeOptions] + */ +function TermKeypadPanel( digitCountProperty, allowExponents, allowNegative, enterCallback, nodeOptions ) { + assert && assert( allowNegative || !allowExponents, 'We have no non-negative exponent keyboard layout' ); - // Update the text when the accumulator's string output changes - termAccumulator.richStringProperty.link( updateText ); + // Handles logic for key-presses and conversion to strings/Terms. + const termAccumulator = new TermAccumulator( digitCountProperty ); - // When the active partition changes, resize the background to fit to the largest size. - digitCountProperty.link( function( digitCount ) { - // Temporarily use a different string - readoutText.text = Term.getLargestGenericString( allowExponents, digitCount ); + // @private {Keypad} + this.keypad = new Keypad( allowExponents ? exponentLayout : ( allowNegative ? noExponentLayout : noNegativeLayout ), { + accumulator: termAccumulator + } ); - // Update the background - readoutBackground.setRectBounds( readoutText.bounds.dilatedXY( 10, 1 ) ); + const readoutBackground = new Rectangle( { + fill: AreaModelCommonColorProfile.keypadReadoutBackgroundProperty, + stroke: AreaModelCommonColorProfile.keypadReadoutBorderProperty, + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS + } ); - // Reposition our text - readoutText.center = readoutBackground.center; + const readoutTextOptions = { + font: AreaModelCommonConstants.KEYPAD_READOUT_FONT + }; - // Reset the text value back to what it should be. - updateText( termAccumulator.richStringProperty.value ); - } ); + const readoutText = new RichText( '', readoutTextOptions ); - Panel.call( this, new VBox( { - children: [ - new Node( { - // We position the text over the background manually - children: [ - readoutBackground, - readoutText - ] - } ), - this.keypad, - new RectangularPushButton( { - content: new Text( enterString, { - font: AreaModelCommonConstants.KEYPAD_FONT, - maxWidth: 100 - } ), - touchAreaXDilation: 5, - touchAreaYDilation: 5, - xMargin: 15, - yMargin: 5, - listener: function() { - enterCallback( termAccumulator.termProperty.value ); - }, - baseColor: AreaModelCommonColorProfile.keypadEnterBackgroundProperty - } ) - ], - spacing: 10 - } ), { - cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, - xMargin: 15, - yMargin: 15, - fill: AreaModelCommonColorProfile.keypadPanelBackgroundProperty, - stroke: AreaModelCommonColorProfile.keypadPanelBorderProperty - } ); - - this.mutate( nodeOptions ); + function updateText( string ) { + // Trick to be able to position an empty string + readoutText.visible = string.length > 0; + if ( readoutText.visible ) { + readoutText.text = string; + readoutText.centerX = readoutBackground.centerX; + } } - areaModelCommon.register( 'TermKeypadPanel', TermKeypadPanel ); + // Update the text when the accumulator's string output changes + termAccumulator.richStringProperty.link( updateText ); - return inherit( Panel, TermKeypadPanel, { - /** - * Clears the keypad's content. - * @public - */ - clear: function() { - this.keypad.clear(); - } + // When the active partition changes, resize the background to fit to the largest size. + digitCountProperty.link( function( digitCount ) { + // Temporarily use a different string + readoutText.text = Term.getLargestGenericString( allowExponents, digitCount ); + + // Update the background + readoutBackground.setRectBounds( readoutText.bounds.dilatedXY( 10, 1 ) ); + + // Reposition our text + readoutText.center = readoutBackground.center; + + // Reset the text value back to what it should be. + updateText( termAccumulator.richStringProperty.value ); + } ); + + Panel.call( this, new VBox( { + children: [ + new Node( { + // We position the text over the background manually + children: [ + readoutBackground, + readoutText + ] + } ), + this.keypad, + new RectangularPushButton( { + content: new Text( enterString, { + font: AreaModelCommonConstants.KEYPAD_FONT, + maxWidth: 100 + } ), + touchAreaXDilation: 5, + touchAreaYDilation: 5, + xMargin: 15, + yMargin: 5, + listener: function() { + enterCallback( termAccumulator.termProperty.value ); + }, + baseColor: AreaModelCommonColorProfile.keypadEnterBackgroundProperty + } ) + ], + spacing: 10 + } ), { + cornerRadius: AreaModelCommonConstants.PANEL_CORNER_RADIUS, + xMargin: 15, + yMargin: 15, + fill: AreaModelCommonColorProfile.keypadPanelBackgroundProperty, + stroke: AreaModelCommonColorProfile.keypadPanelBorderProperty } ); -} ); + + this.mutate( nodeOptions ); +} + +areaModelCommon.register( 'TermKeypadPanel', TermKeypadPanel ); + +export default inherit( Panel, TermKeypadPanel, { + /** + * Clears the keypad's content. + * @public + */ + clear: function() { + this.keypad.clear(); + } +} ); \ No newline at end of file diff --git a/js/proportional/model/PartitionLineChoice.js b/js/proportional/model/PartitionLineChoice.js index 52bc1666..0e2114bf 100644 --- a/js/proportional/model/PartitionLineChoice.js +++ b/js/proportional/model/PartitionLineChoice.js @@ -5,29 +5,25 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); +import areaModelCommon from '../../areaModelCommon.js'; - const PartitionLineChoice = { - NONE: 'NONE', // No partition lines - ONE: 'ONE', // One at a time (toggles between the two) - BOTH: 'BOTH' // Both partition lines available at all times - }; +const PartitionLineChoice = { + NONE: 'NONE', // No partition lines + ONE: 'ONE', // One at a time (toggles between the two) + BOTH: 'BOTH' // Both partition lines available at all times +}; - areaModelCommon.register( 'PartitionLineChoice', PartitionLineChoice ); +areaModelCommon.register( 'PartitionLineChoice', PartitionLineChoice ); - // @public {Array.} - All values the enumeration can take. - PartitionLineChoice.VALUES = [ - PartitionLineChoice.NONE, - PartitionLineChoice.ONE, - PartitionLineChoice.BOTH - ]; +// @public {Array.} - All values the enumeration can take. +PartitionLineChoice.VALUES = [ + PartitionLineChoice.NONE, + PartitionLineChoice.ONE, + PartitionLineChoice.BOTH +]; - // verify that enumeration is immutable, without the runtime penalty in production code - if ( assert ) { Object.freeze( PartitionLineChoice ); } +// verify that enumeration is immutable, without the runtime penalty in production code +if ( assert ) { Object.freeze( PartitionLineChoice ); } - return PartitionLineChoice; -} ); +export default PartitionLineChoice; \ No newline at end of file diff --git a/js/proportional/model/ProportionalArea.js b/js/proportional/model/ProportionalArea.js index a0dd1669..438a027c 100644 --- a/js/proportional/model/ProportionalArea.js +++ b/js/proportional/model/ProportionalArea.js @@ -5,218 +5,214 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const Area = require( 'AREA_MODEL_COMMON/common/model/Area' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const NumberProperty = require( 'AXON/NumberProperty' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Partition = require( 'AREA_MODEL_COMMON/common/model/Partition' ); - const PartitionLineChoice = require( 'AREA_MODEL_COMMON/proportional/model/PartitionLineChoice' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const Term = require( 'AREA_MODEL_COMMON/common/model/Term' ); - /** - * @constructor - * @extends {Area} - * - * @param {Object} [options] - */ - function ProportionalArea( options ) { - const self = this; - - options = merge( { - maximumSize: 20, // {number} - Maximum size our area can take up - minimumSize: 1, // {number} - Minimum size our area can take up - initialWidth: 1, // {number} - Initial width - initialHeight: 1, // {number} - Initial height - eraseWidth: 1, // {number} - The width that will be set with the erase button - eraseHeight: 1, // {number} - The height that will be set with the erase button - initialHorizontalSplit: 0, // {number} - Initial location (if any) of a horizontal partition split - initialVerticalSplit: 0, // {number} - Initial location (if any) of a vertical partition split - snapSize: 1, // {number} - Smallest unit size (that is snapped to) - partitionSnapSize: 10, // {number} - Smallest left/top partition size - gridSpacing: 1, // {number} - Space between grid lines - smallTileSize: 1, // {number} - Size of the smallest tile available (or for the thin tiles, the shorter length) - largeTileSize: 10, // {number} - Size of the largest tile available (or for the thin tiles, the longer length) - tilesAvailable: true, // {boolean} - Whether tiles can be shown on this area - countingAvailable: false, // {boolean} - Whether numbers can be shown on each grid section - partitionLineChoice: PartitionLineChoice.BOTH // {PartitionLineChoice} - What partition lines are shown - }, options ); - - // @public {OrientationPair.>} - Width/height of the contained area. - this.activeTotalProperties = new OrientationPair( - new NumberProperty( options.initialWidth ), - new NumberProperty( options.initialHeight ) - ); - - // @public {Property.} - If PartitionLineChoice.ONE is active, which partition line is active - this.visiblePartitionOrientationProperty = new Property( Orientation.HORIZONTAL ); - - // @public {OrientationPair.>} - Location of the partition lines - this.partitionSplitProperties = new OrientationPair( - new NumberProperty( options.initialHorizontalSplit ), - new NumberProperty( options.initialVerticalSplit ) - ); - - // @public {OrientationPair.>} - this.partitionSplitUserControlledProperties = new OrientationPair( - new BooleanProperty( false ), - new BooleanProperty( false ) - ); - - // @public {number} - this.maximumSize = options.maximumSize; - this.minimumSize = options.minimumSize; - this.eraseWidth = options.eraseWidth; - this.eraseHeight = options.eraseHeight; - this.snapSize = options.snapSize; - this.partitionSnapSize = options.partitionSnapSize; - this.gridSpacing = options.gridSpacing; - this.smallTileSize = options.smallTileSize; - this.largeTileSize = options.largeTileSize; - - // @public {boolean} - this.tilesAvailable = options.tilesAvailable; - this.countingAvailable = options.countingAvailable; - - // @public {PartitionLineChoice} - this.partitionLineChoice = options.partitionLineChoice; - - // @public {OrientationPair.} - Whether to display arrows next to each partition line that - // indicates it is draggable. - this.hasHintArrows = new OrientationPair( new BooleanProperty( true ), new BooleanProperty( true ) ); - - // @public {OrientationPair.>} - Whether the partition line for each orientation is visible - this.partitionSplitVisibleProperties = OrientationPair.create( function( orientation ) { - return new DerivedProperty( - [ self.activeTotalProperties.get( orientation ), self.visiblePartitionOrientationProperty ], - function( totalSize, visibleOrientation ) { - if ( options.partitionLineChoice === PartitionLineChoice.NONE ) { return false; } - if ( options.partitionLineChoice === PartitionLineChoice.ONE && orientation !== visibleOrientation ) { return false; } - - // Given the number of digits in the decimals sim (with potential future changes), 1e-7 should be sufficiently - // small (but not too small). - return totalSize >= ( self.partitionSnapSize + self.snapSize ) - 1e-7; - } ); - } ); +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import NumberProperty from '../../../../axon/js/NumberProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Range from '../../../../dot/js/Range.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import Area from '../../common/model/Area.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import Partition from '../../common/model/Partition.js'; +import Term from '../../common/model/Term.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import PartitionLineChoice from './PartitionLineChoice.js'; - // @public {OrientationPair.>} - Like partitionSplitProperties, but null if the partition line is not visible - this.visiblePartitionLineSplitProperties = OrientationPair.create( function( orientation ) { - return new DerivedProperty( - [ self.partitionSplitProperties.get( orientation ), self.partitionSplitVisibleProperties.get( orientation ) ], - function( partitionSplit, partitionVisible ) { - return partitionVisible ? partitionSplit : null; - } ); - } ); +/** + * @constructor + * @extends {Area} + * + * @param {Object} [options] + */ +function ProportionalArea( options ) { + const self = this; + + options = merge( { + maximumSize: 20, // {number} - Maximum size our area can take up + minimumSize: 1, // {number} - Minimum size our area can take up + initialWidth: 1, // {number} - Initial width + initialHeight: 1, // {number} - Initial height + eraseWidth: 1, // {number} - The width that will be set with the erase button + eraseHeight: 1, // {number} - The height that will be set with the erase button + initialHorizontalSplit: 0, // {number} - Initial location (if any) of a horizontal partition split + initialVerticalSplit: 0, // {number} - Initial location (if any) of a vertical partition split + snapSize: 1, // {number} - Smallest unit size (that is snapped to) + partitionSnapSize: 10, // {number} - Smallest left/top partition size + gridSpacing: 1, // {number} - Space between grid lines + smallTileSize: 1, // {number} - Size of the smallest tile available (or for the thin tiles, the shorter length) + largeTileSize: 10, // {number} - Size of the largest tile available (or for the thin tiles, the longer length) + tilesAvailable: true, // {boolean} - Whether tiles can be shown on this area + countingAvailable: false, // {boolean} - Whether numbers can be shown on each grid section + partitionLineChoice: PartitionLineChoice.BOTH // {PartitionLineChoice} - What partition lines are shown + }, options ); + + // @public {OrientationPair.>} - Width/height of the contained area. + this.activeTotalProperties = new OrientationPair( + new NumberProperty( options.initialWidth ), + new NumberProperty( options.initialHeight ) + ); + + // @public {Property.} - If PartitionLineChoice.ONE is active, which partition line is active + this.visiblePartitionOrientationProperty = new Property( Orientation.HORIZONTAL ); + + // @public {OrientationPair.>} - Location of the partition lines + this.partitionSplitProperties = new OrientationPair( + new NumberProperty( options.initialHorizontalSplit ), + new NumberProperty( options.initialVerticalSplit ) + ); + + // @public {OrientationPair.>} + this.partitionSplitUserControlledProperties = new OrientationPair( + new BooleanProperty( false ), + new BooleanProperty( false ) + ); + + // @public {number} + this.maximumSize = options.maximumSize; + this.minimumSize = options.minimumSize; + this.eraseWidth = options.eraseWidth; + this.eraseHeight = options.eraseHeight; + this.snapSize = options.snapSize; + this.partitionSnapSize = options.partitionSnapSize; + this.gridSpacing = options.gridSpacing; + this.smallTileSize = options.smallTileSize; + this.largeTileSize = options.largeTileSize; + + // @public {boolean} + this.tilesAvailable = options.tilesAvailable; + this.countingAvailable = options.countingAvailable; + + // @public {PartitionLineChoice} + this.partitionLineChoice = options.partitionLineChoice; + + // @public {OrientationPair.} - Whether to display arrows next to each partition line that + // indicates it is draggable. + this.hasHintArrows = new OrientationPair( new BooleanProperty( true ), new BooleanProperty( true ) ); + + // @public {OrientationPair.>} - Whether the partition line for each orientation is visible + this.partitionSplitVisibleProperties = OrientationPair.create( function( orientation ) { + return new DerivedProperty( + [ self.activeTotalProperties.get( orientation ), self.visiblePartitionOrientationProperty ], + function( totalSize, visibleOrientation ) { + if ( options.partitionLineChoice === PartitionLineChoice.NONE ) { return false; } + if ( options.partitionLineChoice === PartitionLineChoice.ONE && orientation !== visibleOrientation ) { return false; } + + // Given the number of digits in the decimals sim (with potential future changes), 1e-7 should be sufficiently + // small (but not too small). + return totalSize >= ( self.partitionSnapSize + self.snapSize ) - 1e-7; + } ); + } ); - const horizontalPartitions = [ - new Partition( Orientation.HORIZONTAL, AreaModelCommonColorProfile.proportionalWidthProperty ), - new Partition( Orientation.HORIZONTAL, AreaModelCommonColorProfile.proportionalWidthProperty ) - ]; - - const verticalPartitions = [ - new Partition( Orientation.VERTICAL, AreaModelCommonColorProfile.proportionalHeightProperty ), - new Partition( Orientation.VERTICAL, AreaModelCommonColorProfile.proportionalHeightProperty ) - ]; - - // @public {OrientationPair.} - The primary (upper/left) and secondary (lower/right) - // partitions, separated out for easy access. - this.primaryPartitions = new OrientationPair( horizontalPartitions[ 0 ], verticalPartitions[ 0 ] ); - this.secondaryPartitions = new OrientationPair( horizontalPartitions[ 1 ], verticalPartitions[ 1 ] ); - - Area.call( - this, - new OrientationPair( horizontalPartitions, verticalPartitions ), - AreaModelCommonColorProfile.proportionalColorProperties, - this.maximumSize, - false - ); - - // Keep partition sizes up-to-date - Orientation.VALUES.forEach( function( orientation ) { - Property.multilink( - [ self.activeTotalProperties.get( orientation ), self.visiblePartitionLineSplitProperties.get( orientation ) ], - function( size, split ) { - // Ignore splits at the boundary or outside our active area. - if ( split <= 0 || split >= size ) { - split = null; - } - - const primaryPartition = self.primaryPartitions.get( orientation ); - const secondaryPartition = self.secondaryPartitions.get( orientation ); - - secondaryPartition.visibleProperty.value = split !== null; - - if ( split ) { - primaryPartition.sizeProperty.value = new Term( split ); - secondaryPartition.sizeProperty.value = new Term( size - split ); - primaryPartition.coordinateRangeProperty.value = new Range( 0, split ); - secondaryPartition.coordinateRangeProperty.value = new Range( split, size ); - } - else { - primaryPartition.sizeProperty.value = new Term( size ); - secondaryPartition.sizeProperty.value = null; - primaryPartition.coordinateRangeProperty.value = new Range( 0, size ); - secondaryPartition.coordinateRangeProperty.value = null; - } - } ); - - // Remove splits that are at or past the current boundary. - self.activeTotalProperties.get( orientation ).link( function( total ) { - if ( self.partitionSplitProperties.get( orientation ).value >= total ) { - self.partitionSplitProperties.get( orientation ).value = self.partitionSplitUserControlledProperties.get( orientation ).value ? total : 0; + // @public {OrientationPair.>} - Like partitionSplitProperties, but null if the partition line is not visible + this.visiblePartitionLineSplitProperties = OrientationPair.create( function( orientation ) { + return new DerivedProperty( + [ self.partitionSplitProperties.get( orientation ), self.partitionSplitVisibleProperties.get( orientation ) ], + function( partitionSplit, partitionVisible ) { + return partitionVisible ? partitionSplit : null; + } ); + } ); + + const horizontalPartitions = [ + new Partition( Orientation.HORIZONTAL, AreaModelCommonColorProfile.proportionalWidthProperty ), + new Partition( Orientation.HORIZONTAL, AreaModelCommonColorProfile.proportionalWidthProperty ) + ]; + + const verticalPartitions = [ + new Partition( Orientation.VERTICAL, AreaModelCommonColorProfile.proportionalHeightProperty ), + new Partition( Orientation.VERTICAL, AreaModelCommonColorProfile.proportionalHeightProperty ) + ]; + + // @public {OrientationPair.} - The primary (upper/left) and secondary (lower/right) + // partitions, separated out for easy access. + this.primaryPartitions = new OrientationPair( horizontalPartitions[ 0 ], verticalPartitions[ 0 ] ); + this.secondaryPartitions = new OrientationPair( horizontalPartitions[ 1 ], verticalPartitions[ 1 ] ); + + Area.call( + this, + new OrientationPair( horizontalPartitions, verticalPartitions ), + AreaModelCommonColorProfile.proportionalColorProperties, + this.maximumSize, + false + ); + + // Keep partition sizes up-to-date + Orientation.VALUES.forEach( function( orientation ) { + Property.multilink( + [ self.activeTotalProperties.get( orientation ), self.visiblePartitionLineSplitProperties.get( orientation ) ], + function( size, split ) { + // Ignore splits at the boundary or outside our active area. + if ( split <= 0 || split >= size ) { + split = null; + } + + const primaryPartition = self.primaryPartitions.get( orientation ); + const secondaryPartition = self.secondaryPartitions.get( orientation ); + + secondaryPartition.visibleProperty.value = split !== null; + + if ( split ) { + primaryPartition.sizeProperty.value = new Term( split ); + secondaryPartition.sizeProperty.value = new Term( size - split ); + primaryPartition.coordinateRangeProperty.value = new Range( 0, split ); + secondaryPartition.coordinateRangeProperty.value = new Range( split, size ); + } + else { + primaryPartition.sizeProperty.value = new Term( size ); + secondaryPartition.sizeProperty.value = null; + primaryPartition.coordinateRangeProperty.value = new Range( 0, size ); + secondaryPartition.coordinateRangeProperty.value = null; } } ); - } ); - } - areaModelCommon.register( 'ProportionalArea', ProportionalArea ); - - return inherit( Area, ProportionalArea, { - /** - * Returns a string like 10x10 that can be used for the size. - * @public - * - * @returns {string} - */ - getDimensionString: function() { - return this.maximumSize + 'x' + this.maximumSize; - }, - - /** - * Resets the area to its initial values. - * @public - * @override - */ - reset: function() { - Area.prototype.reset.call( this ); - - this.hasHintArrows.reset(); - this.partitionSplitProperties.reset(); - this.visiblePartitionOrientationProperty.reset(); - this.activeTotalProperties.reset(); - }, - - /** - * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 - * @public - * @override - */ - erase: function() { - Area.prototype.erase.call( this ); - - this.activeTotalProperties.horizontal.value = this.eraseWidth; - this.activeTotalProperties.vertical.value = this.eraseHeight; - } + // Remove splits that are at or past the current boundary. + self.activeTotalProperties.get( orientation ).link( function( total ) { + if ( self.partitionSplitProperties.get( orientation ).value >= total ) { + self.partitionSplitProperties.get( orientation ).value = self.partitionSplitUserControlledProperties.get( orientation ).value ? total : 0; + } + } ); } ); -} ); +} + +areaModelCommon.register( 'ProportionalArea', ProportionalArea ); + +export default inherit( Area, ProportionalArea, { + /** + * Returns a string like 10x10 that can be used for the size. + * @public + * + * @returns {string} + */ + getDimensionString: function() { + return this.maximumSize + 'x' + this.maximumSize; + }, + + /** + * Resets the area to its initial values. + * @public + * @override + */ + reset: function() { + Area.prototype.reset.call( this ); + + this.hasHintArrows.reset(); + this.partitionSplitProperties.reset(); + this.visiblePartitionOrientationProperty.reset(); + this.activeTotalProperties.reset(); + }, + + /** + * Erase the area to a 1x1, see https://github.com/phetsims/area-model-common/issues/77 + * @public + * @override + */ + erase: function() { + Area.prototype.erase.call( this ); + + this.activeTotalProperties.horizontal.value = this.eraseWidth; + this.activeTotalProperties.vertical.value = this.eraseHeight; + } +} ); \ No newline at end of file diff --git a/js/proportional/model/ProportionalAreaDisplay.js b/js/proportional/model/ProportionalAreaDisplay.js index 4c32db1d..50897011 100644 --- a/js/proportional/model/ProportionalAreaDisplay.js +++ b/js/proportional/model/ProportionalAreaDisplay.js @@ -5,69 +5,66 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaDisplay = require( 'AREA_MODEL_COMMON/common/model/AreaDisplay' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const inherit = require( 'PHET_CORE/inherit' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaDisplay from '../../common/model/AreaDisplay.js'; - /** - * @constructor - * @extends {AreaDisplay} - * - * @param {Property.} areaProperty - */ - function ProportionalAreaDisplay( areaProperty ) { - AreaDisplay.call( this, areaProperty ); +/** + * @constructor + * @extends {AreaDisplay} + * + * @param {Property.} areaProperty + */ +function ProportionalAreaDisplay( areaProperty ) { + AreaDisplay.call( this, areaProperty ); - // @public {OrientationPair.>} - this.activeTotalProperties = this.wrapOrientationPairProperty( _.property( 'activeTotalProperties' ), { - bidirectional: true - } ); + // @public {OrientationPair.>} + this.activeTotalProperties = this.wrapOrientationPairProperty( _.property( 'activeTotalProperties' ), { + bidirectional: true + } ); - // @public {Property.} - this.visiblePartitionOrientationProperty = this.wrapProperty( _.property( 'visiblePartitionOrientationProperty' ) ); + // @public {Property.} + this.visiblePartitionOrientationProperty = this.wrapProperty( _.property( 'visiblePartitionOrientationProperty' ) ); - // @public {OrientationPair.>} - this.partitionSplitProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitProperties' ), { - bidirectional: true - } ); + // @public {OrientationPair.>} + this.partitionSplitProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitProperties' ), { + bidirectional: true + } ); - // @public {OrientationPair.>} - this.partitionSplitUserControlledProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitUserControlledProperties' ), { - bidirectional: true - } ); + // @public {OrientationPair.>} + this.partitionSplitUserControlledProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitUserControlledProperties' ), { + bidirectional: true + } ); - // @public {Property.} - this.maximumSizeProperty = this.wrapObject( _.property( 'maximumSize' ) ); - this.snapSizeProperty = this.wrapObject( _.property( 'snapSize' ) ); - this.partitionSnapSizeProperty = this.wrapObject( _.property( 'partitionSnapSize' ) ); - this.smallTileSizeProperty = this.wrapObject( _.property( 'smallTileSize' ) ); - this.largeTileSizeProperty = this.wrapObject( _.property( 'largeTileSize' ) ); + // @public {Property.} + this.maximumSizeProperty = this.wrapObject( _.property( 'maximumSize' ) ); + this.snapSizeProperty = this.wrapObject( _.property( 'snapSize' ) ); + this.partitionSnapSizeProperty = this.wrapObject( _.property( 'partitionSnapSize' ) ); + this.smallTileSizeProperty = this.wrapObject( _.property( 'smallTileSize' ) ); + this.largeTileSizeProperty = this.wrapObject( _.property( 'largeTileSize' ) ); - // @public {Property.} - this.tilesAvailableProperty = this.wrapObject( _.property( 'tilesAvailable' ) ); - this.countingAvailableProperty = this.wrapObject( _.property( 'countingAvailable' ) ); + // @public {Property.} + this.tilesAvailableProperty = this.wrapObject( _.property( 'tilesAvailable' ) ); + this.countingAvailableProperty = this.wrapObject( _.property( 'countingAvailable' ) ); - // @public {OrientationPair.>} - this.hasHintArrows = this.wrapOrientationPairProperty( _.property( 'hasHintArrows' ), { - bidirectional: true - } ); + // @public {OrientationPair.>} + this.hasHintArrows = this.wrapOrientationPairProperty( _.property( 'hasHintArrows' ), { + bidirectional: true + } ); - // @public {OrientationPair.>} - this.partitionSplitVisibleProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitVisibleProperties' ) ); + // @public {OrientationPair.>} + this.partitionSplitVisibleProperties = this.wrapOrientationPairProperty( _.property( 'partitionSplitVisibleProperties' ) ); - // @public {OrientationPair.>} - this.visiblePartitionLineSplitProperties = this.wrapOrientationPairProperty( _.property( 'visiblePartitionLineSplitProperties' ) ); + // @public {OrientationPair.>} + this.visiblePartitionLineSplitProperties = this.wrapOrientationPairProperty( _.property( 'visiblePartitionLineSplitProperties' ) ); - // @public {OrientationPair.>} - this.primaryPartitionsProperty = this.wrapOrientationPair( _.property( 'primaryPartitions' ) ); - this.secondaryPartitionsProperty = this.wrapOrientationPair( _.property( 'secondaryPartitions' ) ); - } + // @public {OrientationPair.>} + this.primaryPartitionsProperty = this.wrapOrientationPair( _.property( 'primaryPartitions' ) ); + this.secondaryPartitionsProperty = this.wrapOrientationPair( _.property( 'secondaryPartitions' ) ); +} - areaModelCommon.register( 'ProportionalAreaDisplay', ProportionalAreaDisplay ); +areaModelCommon.register( 'ProportionalAreaDisplay', ProportionalAreaDisplay ); - return inherit( AreaDisplay, ProportionalAreaDisplay ); -} ); +inherit( AreaDisplay, ProportionalAreaDisplay ); +export default ProportionalAreaDisplay; \ No newline at end of file diff --git a/js/proportional/model/ProportionalAreaModel.js b/js/proportional/model/ProportionalAreaModel.js index 5dbffa6b..5796293d 100644 --- a/js/proportional/model/ProportionalAreaModel.js +++ b/js/proportional/model/ProportionalAreaModel.js @@ -5,106 +5,102 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonModel = require( 'AREA_MODEL_COMMON/common/model/AreaModelCommonModel' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PhetFont = require( 'SCENERY_PHET/PhetFont' ); - const ProportionalArea = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalArea' ); - const ProportionalAreaDisplay = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaDisplay' ); - const TextBounds = require( 'SCENERY/util/TextBounds' ); - const Utils = require( 'DOT/Utils' ); - - // constants - const TEST_FONT = new PhetFont( 12 ); - /** - * @constructor - * @extends {AreaModelCommonModel} - * - * @param {Array.} areaOptionObjects - An array of options objects to be passed to the ProportionalArea - * constructors. - * @param {Object} [options] - */ - function ProportionalAreaModel( areaOptionObjects, options ) { +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import Utils from '../../../../dot/js/Utils.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import PhetFont from '../../../../scenery-phet/js/PhetFont.js'; +import TextBounds from '../../../../scenery/js/util/TextBounds.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonModel from '../../common/model/AreaModelCommonModel.js'; +import ProportionalArea from './ProportionalArea.js'; +import ProportionalAreaDisplay from './ProportionalAreaDisplay.js'; - options = merge( { - isProportional: true, - initialAreaBoxExpanded: true - }, options ); +// constants +const TEST_FONT = new PhetFont( 12 ); - const areas = areaOptionObjects.map( function( options ) { - return new ProportionalArea( options ); - } ); +/** + * @constructor + * @extends {AreaModelCommonModel} + * + * @param {Array.} areaOptionObjects - An array of options objects to be passed to the ProportionalArea + * constructors. + * @param {Object} [options] + */ +function ProportionalAreaModel( areaOptionObjects, options ) { - AreaModelCommonModel.call( this, areas, areas[ 0 ], options ); + options = merge( { + isProportional: true, + initialAreaBoxExpanded: true + }, options ); - // @public {BooleanProperty} - this.gridLinesVisibleProperty = new BooleanProperty( true ); + const areas = areaOptionObjects.map( function( options ) { + return new ProportionalArea( options ); + } ); - // @public {BooleanProperty} - this.tilesVisibleProperty = new BooleanProperty( false ); + AreaModelCommonModel.call( this, areas, areas[ 0 ], options ); - // @public {BooleanProperty} - this.countingVisibleProperty = new BooleanProperty( true ); + // @public {BooleanProperty} + this.gridLinesVisibleProperty = new BooleanProperty( true ); - // @public {BooleanProperty} - this.calculationBoxVisibleProperty = new BooleanProperty( false ); - } + // @public {BooleanProperty} + this.tilesVisibleProperty = new BooleanProperty( false ); - areaModelCommon.register( 'ProportionalAreaModel', ProportionalAreaModel ); - - return inherit( AreaModelCommonModel, ProportionalAreaModel, { - /** - * Returns a concrete AreaDisplay subtype - * @protected - * - * @param {Property.} areaProperty - * @returns {ProportionalAreaDisplay} - */ - createAreaDisplay: function( areaProperty ) { - return new ProportionalAreaDisplay( areaProperty ); - }, - - /** - * Returns a string that should be the longest string possible for our given areas. - * @public - * - * @returns {string} - */ - getMaximumAreaString: function() { - let maxString = '9'; - let maxLength = 0; - this.areas.forEach( function( area ) { - const representativeSize = area.snapSize + area.maximumSize; - // Round because of floating point precision - const string = '' + Utils.toFixedNumber( representativeSize * representativeSize, 8 ); // Square for area - const length = TextBounds.approximateCanvasWidth( TEST_FONT, string ); - if ( length > maxLength ) { - maxLength = length; - maxString = string; - } - } ); - return maxString; - }, - - /** - * Returns the model to its initial state. - * @public - * @override - */ - reset: function() { - AreaModelCommonModel.prototype.reset.call( this ); - - this.gridLinesVisibleProperty.reset(); - this.tilesVisibleProperty.reset(); - this.countingVisibleProperty.reset(); - this.calculationBoxVisibleProperty.reset(); - } - } ); -} ); + // @public {BooleanProperty} + this.countingVisibleProperty = new BooleanProperty( true ); + + // @public {BooleanProperty} + this.calculationBoxVisibleProperty = new BooleanProperty( false ); +} + +areaModelCommon.register( 'ProportionalAreaModel', ProportionalAreaModel ); + +export default inherit( AreaModelCommonModel, ProportionalAreaModel, { + /** + * Returns a concrete AreaDisplay subtype + * @protected + * + * @param {Property.} areaProperty + * @returns {ProportionalAreaDisplay} + */ + createAreaDisplay: function( areaProperty ) { + return new ProportionalAreaDisplay( areaProperty ); + }, + + /** + * Returns a string that should be the longest string possible for our given areas. + * @public + * + * @returns {string} + */ + getMaximumAreaString: function() { + let maxString = '9'; + let maxLength = 0; + this.areas.forEach( function( area ) { + const representativeSize = area.snapSize + area.maximumSize; + // Round because of floating point precision + const string = '' + Utils.toFixedNumber( representativeSize * representativeSize, 8 ); // Square for area + const length = TextBounds.approximateCanvasWidth( TEST_FONT, string ); + if ( length > maxLength ) { + maxLength = length; + maxString = string; + } + } ); + return maxString; + }, + + /** + * Returns the model to its initial state. + * @public + * @override + */ + reset: function() { + AreaModelCommonModel.prototype.reset.call( this ); + + this.gridLinesVisibleProperty.reset(); + this.tilesVisibleProperty.reset(); + this.countingVisibleProperty.reset(); + this.calculationBoxVisibleProperty.reset(); + } +} ); \ No newline at end of file diff --git a/js/proportional/view/CalculationBox.js b/js/proportional/view/CalculationBox.js index 90931f31..89923d83 100644 --- a/js/proportional/view/CalculationBox.js +++ b/js/proportional/view/CalculationBox.js @@ -7,98 +7,94 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonAccordionBox = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonAccordionBox' ); - const Bounds2 = require( 'DOT/Bounds2' ); - const CalculationLinesNode = require( 'AREA_MODEL_COMMON/common/view/calculation/CalculationLinesNode' ); - const inherit = require( 'PHET_CORE/inherit' ); +import Bounds2 from '../../../../dot/js/Bounds2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaCalculationChoice from '../../common/model/AreaCalculationChoice.js'; +import AreaModelCommonAccordionBox from '../../common/view/AreaModelCommonAccordionBox.js'; +import CalculationLinesNode from '../../common/view/calculation/CalculationLinesNode.js'; - // strings - const calculationString = require( 'string!AREA_MODEL_COMMON/calculation' ); +const calculationString = areaModelCommonStrings.calculation; - // a11y strings - const calculationBoxTitleString = AreaModelCommonA11yStrings.calculationBoxTitle.value; - const calculationBoxDescriptionString = AreaModelCommonA11yStrings.calculationBoxDescription.value; +// a11y strings +const calculationBoxTitleString = AreaModelCommonA11yStrings.calculationBoxTitle.value; +const calculationBoxDescriptionString = AreaModelCommonA11yStrings.calculationBoxDescription.value; - // constants - const MARGIN = 8; +// constants +const MARGIN = 8; - /** - * @constructor - * @extends {AreaModelCommonAccordionBox} - * - * @param {ProportionalAreaModel} model - * @param {Bounds2} bounds - Where to lay out the box in view space - * @param {Object} [nodeOptions] - */ - function CalculationBox( model, bounds, nodeOptions ) { - - const self = this; - - // @private {ProportionalAreaModel} - this.model = model; - - // @private {CalculationLinesNode} - this.calculationLinesNode = new CalculationLinesNode( model ); - - const alignBox = new AlignBox( this.calculationLinesNode, { - // Since our AccordionBox expands by our MARGIN, we need to set content bounds without that - alignBounds: bounds.eroded( MARGIN ), - pickable: false - } ); - - AreaModelCommonAccordionBox.call( this, calculationString, model.calculationBoxVisibleProperty, alignBox, { - // Different margins than our other accordion boxes - contentXMargin: MARGIN, - contentYMargin: MARGIN, - - // Different spacing - maxTitleWidth: 290, - - // We don't have room for the normal spacing, so we need to make things closer together than they normally are. - contentXSpacing: -10, - - // a11y - labelTagName: 'h3', - labelContent: calculationBoxTitleString, - titleBarOptions: { - descriptionContent: calculationBoxDescriptionString - } - } ); - - model.areaCalculationChoiceProperty.link( function( choice ) { - assert && assert( choice !== AreaCalculationChoice.LINE_BY_LINE, 'Should be HIDDEN or SHOW_ALL_LINES' ); - self.visible = choice !== AreaCalculationChoice.HIDDEN; - } ); - - // Resize things so our AccordionBox is the correct size (we can't get bounds correct initially, because of the - // expand button shifting content) - alignBox.alignBounds = new Bounds2( - 0, - 0, - alignBox.alignBounds.width - ( this.width - bounds.width ), - alignBox.alignBounds.height - ( this.height - bounds.height ) - ); - - this.mutate( nodeOptions ); - } +/** + * @constructor + * @extends {AreaModelCommonAccordionBox} + * + * @param {ProportionalAreaModel} model + * @param {Bounds2} bounds - Where to lay out the box in view space + * @param {Object} [nodeOptions] + */ +function CalculationBox( model, bounds, nodeOptions ) { + + const self = this; + + // @private {ProportionalAreaModel} + this.model = model; + + // @private {CalculationLinesNode} + this.calculationLinesNode = new CalculationLinesNode( model ); + + const alignBox = new AlignBox( this.calculationLinesNode, { + // Since our AccordionBox expands by our MARGIN, we need to set content bounds without that + alignBounds: bounds.eroded( MARGIN ), + pickable: false + } ); - areaModelCommon.register( 'CalculationBox', CalculationBox ); + AreaModelCommonAccordionBox.call( this, calculationString, model.calculationBoxVisibleProperty, alignBox, { + // Different margins than our other accordion boxes + contentXMargin: MARGIN, + contentYMargin: MARGIN, - return inherit( AreaModelCommonAccordionBox, CalculationBox, { - /** - * Updates the content of the calculation box (if needed). - * @public - */ - update: function() { - this.calculationLinesNode.update(); + // Different spacing + maxTitleWidth: 290, + + // We don't have room for the normal spacing, so we need to make things closer together than they normally are. + contentXSpacing: -10, + + // a11y + labelTagName: 'h3', + labelContent: calculationBoxTitleString, + titleBarOptions: { + descriptionContent: calculationBoxDescriptionString } } ); -} ); + + model.areaCalculationChoiceProperty.link( function( choice ) { + assert && assert( choice !== AreaCalculationChoice.LINE_BY_LINE, 'Should be HIDDEN or SHOW_ALL_LINES' ); + self.visible = choice !== AreaCalculationChoice.HIDDEN; + } ); + + // Resize things so our AccordionBox is the correct size (we can't get bounds correct initially, because of the + // expand button shifting content) + alignBox.alignBounds = new Bounds2( + 0, + 0, + alignBox.alignBounds.width - ( this.width - bounds.width ), + alignBox.alignBounds.height - ( this.height - bounds.height ) + ); + + this.mutate( nodeOptions ); +} + +areaModelCommon.register( 'CalculationBox', CalculationBox ); + +export default inherit( AreaModelCommonAccordionBox, CalculationBox, { + /** + * Updates the content of the calculation box (if needed). + * @public + */ + update: function() { + this.calculationLinesNode.update(); + } +} ); \ No newline at end of file diff --git a/js/proportional/view/CountingAreaNode.js b/js/proportional/view/CountingAreaNode.js index 8793a127..b5d6c455 100644 --- a/js/proportional/view/CountingAreaNode.js +++ b/js/proportional/view/CountingAreaNode.js @@ -7,138 +7,134 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Text = require( 'SCENERY/nodes/Text' ); - const Vector2 = require( 'DOT/Vector2' ); +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; - // constants - const scratchVector = new Vector2( 0, 0 ); // Created so we can minimize object creation and garbage collection +// constants +const scratchVector = new Vector2( 0, 0 ); // Created so we can minimize object creation and garbage collection - /** - * @constructor - * @extends {Node} - * - * @param {OrientationPair.>} activeTotalProperties - * @param {Property.} modelViewTransformProperty - * @param {Property.} countingVisibleProperty - */ - function CountingAreaNode( activeTotalProperties, modelViewTransformProperty, countingVisibleProperty ) { +/** + * @constructor + * @extends {Node} + * + * @param {OrientationPair.>} activeTotalProperties + * @param {Property.} modelViewTransformProperty + * @param {Property.} countingVisibleProperty + */ +function CountingAreaNode( activeTotalProperties, modelViewTransformProperty, countingVisibleProperty ) { - Node.call( this ); + Node.call( this ); - const self = this; + const self = this; - // @private {OrientationPair.>} - this.activeTotalProperties = activeTotalProperties; + // @private {OrientationPair.>} + this.activeTotalProperties = activeTotalProperties; - // @private {Property.} - this.modelViewTransformProperty = modelViewTransformProperty; + // @private {Property.} + this.modelViewTransformProperty = modelViewTransformProperty; - // @private {Property.} - this.countingVisibleProperty = countingVisibleProperty; + // @private {Property.} + this.countingVisibleProperty = countingVisibleProperty; - // @private {Array.} - We reuse these to avoid GC/performance issues - this.textNodes = []; + // @private {Array.} - We reuse these to avoid GC/performance issues + this.textNodes = []; - // @private {boolean} - Whether we should be redrawn - this.dirty = true; + // @private {boolean} - Whether we should be redrawn + this.dirty = true; - // Things we depend on - function invalidate() { - self.dirty = true; - } + // Things we depend on + function invalidate() { + self.dirty = true; + } - countingVisibleProperty.link( invalidate ); - activeTotalProperties.horizontal.link( invalidate ); - activeTotalProperties.vertical.link( invalidate ); - modelViewTransformProperty.link( invalidate ); + countingVisibleProperty.link( invalidate ); + activeTotalProperties.horizontal.link( invalidate ); + activeTotalProperties.vertical.link( invalidate ); + modelViewTransformProperty.link( invalidate ); - countingVisibleProperty.linkAttribute( this, 'visible' ); - } + countingVisibleProperty.linkAttribute( this, 'visible' ); +} - areaModelCommon.register( 'CountingAreaNode', CountingAreaNode ); - - return inherit( Node, CountingAreaNode, { - /** - * Creates a reusable text node with a given number. - * @private - * - * @param {number} number - * @returns {Text} - */ - createTextNode: function( number ) { - const text = new Text( number, { - font: AreaModelCommonConstants.COUNTING_FONT, - fill: AreaModelCommonColorProfile.countingLabelProperty - } ); - this.textNodes.push( text ); - this.addChild( text ); - return text; - }, - - /** - * Returns the reusable text node with a given number. - * @private - * - * @param {number} number - * @returns {Text} - */ - getTextNode: function( number ) { - let text = this.textNodes[ number - 1 ]; - if ( !text ) { - text = this.createTextNode( number ); - } - return text; - }, +areaModelCommon.register( 'CountingAreaNode', CountingAreaNode ); + +export default inherit( Node, CountingAreaNode, { + /** + * Creates a reusable text node with a given number. + * @private + * + * @param {number} number + * @returns {Text} + */ + createTextNode: function( number ) { + const text = new Text( number, { + font: AreaModelCommonConstants.COUNTING_FONT, + fill: AreaModelCommonColorProfile.countingLabelProperty + } ); + this.textNodes.push( text ); + this.addChild( text ); + return text; + }, + + /** + * Returns the reusable text node with a given number. + * @private + * + * @param {number} number + * @returns {Text} + */ + getTextNode: function( number ) { + let text = this.textNodes[ number - 1 ]; + if ( !text ) { + text = this.createTextNode( number ); + } + return text; + }, - /** - * Updates the view for tiled areas (since it is somewhat expensive to re-draw, and we don't want it being done - * multiple times per frame. - * @private - */ - update: function() { - const modelViewTransform = this.modelViewTransformProperty.value; + /** + * Updates the view for tiled areas (since it is somewhat expensive to re-draw, and we don't want it being done + * multiple times per frame. + * @private + */ + update: function() { + const modelViewTransform = this.modelViewTransformProperty.value; - // Ignore updates if we are not dirty - if ( !this.dirty ) { return; } - this.dirty = false; + // Ignore updates if we are not dirty + if ( !this.dirty ) { return; } + this.dirty = false; - if ( !this.countingVisibleProperty.value ) { return; } + if ( !this.countingVisibleProperty.value ) { return; } - // Coordinate mapping into the view - const modelToViewX = modelViewTransform.modelToViewX.bind( modelViewTransform ); - const modelToViewY = modelViewTransform.modelToViewY.bind( modelViewTransform ); + // Coordinate mapping into the view + const modelToViewX = modelViewTransform.modelToViewX.bind( modelViewTransform ); + const modelToViewY = modelViewTransform.modelToViewY.bind( modelViewTransform ); - const width = this.activeTotalProperties.horizontal.value; - const height = this.activeTotalProperties.vertical.value; + const width = this.activeTotalProperties.horizontal.value; + const height = this.activeTotalProperties.vertical.value; - let cellNumber = 1; - for ( let row = 0; row < height; row++ ) { - const rowCenter = modelToViewY( row + 0.5 ); + let cellNumber = 1; + for ( let row = 0; row < height; row++ ) { + const rowCenter = modelToViewY( row + 0.5 ); - for ( let col = 0; col < width; col++ ) { - const colCenter = modelToViewX( col + 0.5 ); + for ( let col = 0; col < width; col++ ) { + const colCenter = modelToViewX( col + 0.5 ); - const text = this.getTextNode( cellNumber ); - text.center = scratchVector.setXY( colCenter, rowCenter ); - text.visible = true; + const text = this.getTextNode( cellNumber ); + text.center = scratchVector.setXY( colCenter, rowCenter ); + text.visible = true; - cellNumber++; - } + cellNumber++; } + } - // Hide the rest of the text nodes (that should NOT show up) - for ( ; cellNumber - 1 < this.textNodes.length; cellNumber++ ) { - this.textNodes[ cellNumber - 1 ].visible = false; - } + // Hide the rest of the text nodes (that should NOT show up) + for ( ; cellNumber - 1 < this.textNodes.length; cellNumber++ ) { + this.textNodes[ cellNumber - 1 ].visible = false; } - } ); -} ); + } +} ); \ No newline at end of file diff --git a/js/proportional/view/PartitionRadioButtonGroup.js b/js/proportional/view/PartitionRadioButtonGroup.js index 490816a6..fd97320a 100644 --- a/js/proportional/view/PartitionRadioButtonGroup.js +++ b/js/proportional/view/PartitionRadioButtonGroup.js @@ -7,105 +7,101 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonRadioButtonGroup' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Path = require( 'SCENERY/nodes/Path' ); - const ProportionalPartitionLineNode = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalPartitionLineNode' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const Vector2 = require( 'DOT/Vector2' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import Vector2 from '../../../../dot/js/Vector2.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import AreaModelCommonRadioButtonGroup from '../../common/view/AreaModelCommonRadioButtonGroup.js'; +import ProportionalPartitionLineNode from './ProportionalPartitionLineNode.js'; - // a11y strings - const horizontalPartitionString = AreaModelCommonA11yStrings.horizontalPartition.value; - const partitionSelectionDescriptionString = AreaModelCommonA11yStrings.partitionSelectionDescription.value; - const verticalPartitionString = AreaModelCommonA11yStrings.verticalPartition.value; +// a11y strings +const horizontalPartitionString = AreaModelCommonA11yStrings.horizontalPartition.value; +const partitionSelectionDescriptionString = AreaModelCommonA11yStrings.partitionSelectionDescription.value; +const verticalPartitionString = AreaModelCommonA11yStrings.verticalPartition.value; +/** + * @constructor + * @extends {AreaModelCommonRadioButtonGroup} + * + * @param {Property.} currentAreaOrientationProperty + * @param {AlignGroup} selectionButtonAlignGroup + */ +function PartitionRadioButtonGroup( currentAreaOrientationProperty, selectionButtonAlignGroup ) { + AreaModelCommonRadioButtonGroup.call( this, currentAreaOrientationProperty, Orientation.VALUES.map( function( orientation ) { + const icon = PartitionRadioButtonGroup.createPartitionOrientationIcon( orientation, currentAreaOrientationProperty ); + return { + value: orientation, + node: new AlignBox( icon, { group: selectionButtonAlignGroup } ), + + // a11y + labelContent: orientation === Orientation.HORIZONTAL ? verticalPartitionString : horizontalPartitionString + }; + } ), { + // Less margin than others desired here + buttonContentXMargin: 7, + buttonContentYMargin: 7, + + // a11y + descriptionContent: partitionSelectionDescriptionString + } ); +} + +areaModelCommon.register( 'PartitionRadioButtonGroup', PartitionRadioButtonGroup ); + +export default inherit( AreaModelCommonRadioButtonGroup, PartitionRadioButtonGroup, {}, { /** - * @constructor - * @extends {AreaModelCommonRadioButtonGroup} + * Creates an icon showing a switch to partition lines of a given orientation. + * @private * + * @param {Orientation} orientation * @param {Property.} currentAreaOrientationProperty - * @param {AlignGroup} selectionButtonAlignGroup + * @returns {Node} */ - function PartitionRadioButtonGroup( currentAreaOrientationProperty, selectionButtonAlignGroup ) { - AreaModelCommonRadioButtonGroup.call( this, currentAreaOrientationProperty, Orientation.VALUES.map( function( orientation ) { - const icon = PartitionRadioButtonGroup.createPartitionOrientationIcon( orientation, currentAreaOrientationProperty ); - return { - value: orientation, - node: new AlignBox( icon, { group: selectionButtonAlignGroup } ), - - // a11y - labelContent: orientation === Orientation.HORIZONTAL ? verticalPartitionString : horizontalPartitionString - }; - } ), { - // Less margin than others desired here - buttonContentXMargin: 7, - buttonContentYMargin: 7, - - // a11y - descriptionContent: partitionSelectionDescriptionString + createPartitionOrientationIcon: function( orientation, currentAreaOrientationProperty ) { + // The size of our rectangle + const sizes = new OrientationPair( 36, 24 ); + const background = new Rectangle( 0, 0, sizes.horizontal, sizes.vertical, { + stroke: AreaModelCommonColorProfile.partitionLineIconBorderProperty, + fill: AreaModelCommonColorProfile.partitionLineIconBackgroundProperty } ); - } - areaModelCommon.register( 'PartitionRadioButtonGroup', PartitionRadioButtonGroup ); + // Expand bounds a bit, to allow room for the line-handle icon part (so we have even padding) + background.localBounds = background.localBounds.dilated( 7 ); - return inherit( AreaModelCommonRadioButtonGroup, PartitionRadioButtonGroup, {}, { - /** - * Creates an icon showing a switch to partition lines of a given orientation. - * @private - * - * @param {Orientation} orientation - * @param {Property.} currentAreaOrientationProperty - * @returns {Node} - */ - createPartitionOrientationIcon: function( orientation, currentAreaOrientationProperty ) { - // The size of our rectangle - const sizes = new OrientationPair( 36, 24 ); - const background = new Rectangle( 0, 0, sizes.horizontal, sizes.vertical, { - stroke: AreaModelCommonColorProfile.partitionLineIconBorderProperty, - fill: AreaModelCommonColorProfile.partitionLineIconBackgroundProperty - } ); + const p1 = new Vector2( 0, 0 ); + const p2 = new Vector2( 0, 0 ); + p1[ orientation.coordinate ] = sizes.get( orientation ) * 2 / 3; + p2[ orientation.coordinate ] = sizes.get( orientation ) * 2 / 3; + p2[ orientation.opposite.coordinate ] = sizes.get( orientation.opposite ) * 1.1; - // Expand bounds a bit, to allow room for the line-handle icon part (so we have even padding) - background.localBounds = background.localBounds.dilated( 7 ); + background.children = [ + new Line( p1, p2, { + stroke: AreaModelCommonColorProfile.partitionLineIconLineProperty + } ), + new Path( ProportionalPartitionLineNode.HANDLE_ARROW_SHAPES.get( orientation ), { + fill: new DerivedProperty( + [ + currentAreaOrientationProperty, + AreaModelCommonColorProfile.proportionalColorProperties.get( orientation ), + AreaModelCommonColorProfile.partitionLineIconHandleProperty + ], + function( currentOrientation, widthColor, handleColor ) { + return currentOrientation === orientation ? widthColor : handleColor; + } ), + scale: 0.5, + translation: p2 + } ) + ]; - const p1 = new Vector2( 0, 0 ); - const p2 = new Vector2( 0, 0 ); - p1[ orientation.coordinate ] = sizes.get( orientation ) * 2 / 3; - p2[ orientation.coordinate ] = sizes.get( orientation ) * 2 / 3; - p2[ orientation.opposite.coordinate ] = sizes.get( orientation.opposite ) * 1.1; - - background.children = [ - new Line( p1, p2, { - stroke: AreaModelCommonColorProfile.partitionLineIconLineProperty - } ), - new Path( ProportionalPartitionLineNode.HANDLE_ARROW_SHAPES.get( orientation ), { - fill: new DerivedProperty( - [ - currentAreaOrientationProperty, - AreaModelCommonColorProfile.proportionalColorProperties.get( orientation ), - AreaModelCommonColorProfile.partitionLineIconHandleProperty - ], - function( currentOrientation, widthColor, handleColor ) { - return currentOrientation === orientation ? widthColor : handleColor; - } ), - scale: 0.5, - translation: p2 - } ) - ]; - - return background; - } - } ); -} ); + return background; + } +} ); \ No newline at end of file diff --git a/js/proportional/view/ProportionalAreaDisplayNode.js b/js/proportional/view/ProportionalAreaDisplayNode.js index 5ac693d6..97c75cf4 100644 --- a/js/proportional/view/ProportionalAreaDisplayNode.js +++ b/js/proportional/view/ProportionalAreaDisplayNode.js @@ -7,389 +7,385 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AreaDisplayNode = require( 'AREA_MODEL_COMMON/common/view/AreaDisplayNode' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const CountingAreaNode = require( 'AREA_MODEL_COMMON/proportional/view/CountingAreaNode' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const ProportionalAreaGridLinesNode = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaGridLinesNode' ); - const ProportionalDragHandle = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalDragHandle' ); - const ProportionalPartitionLineNode = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalPartitionLineNode' ); - const Range = require( 'DOT/Range' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); - const TiledAreaNode = require( 'AREA_MODEL_COMMON/proportional/view/TiledAreaNode' ); - const Utils = require( 'DOT/Utils' ); - - // a11y strings - const areaGridString = AreaModelCommonA11yStrings.areaGrid.value; - const areaGridRectanglePatternString = AreaModelCommonA11yStrings.areaGridRectanglePattern.value; - const countingNumbersPatternString = AreaModelCommonA11yStrings.countingNumbersPattern.value; - /** - * @constructor - * @extends {AreaDisplayNode} - * - * @param {ProportionalAreaDisplay} areaDisplay - * @param {Property.} partialProductsChoiceProperty - * @param {Object} [options] - * @param {Object} [nodeOptions] - */ - function ProportionalAreaDisplayNode( areaDisplay, partialProductsChoiceProperty, options, nodeOptions ) { +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Range from '../../../../dot/js/Range.js'; +import Utils from '../../../../dot/js/Utils.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaDisplayNode from '../../common/view/AreaDisplayNode.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import CountingAreaNode from './CountingAreaNode.js'; +import ProportionalAreaGridLinesNode from './ProportionalAreaGridLinesNode.js'; +import ProportionalDragHandle from './ProportionalDragHandle.js'; +import ProportionalPartitionLineNode from './ProportionalPartitionLineNode.js'; +import TiledAreaNode from './TiledAreaNode.js'; + +// a11y strings +const areaGridString = AreaModelCommonA11yStrings.areaGrid.value; +const areaGridRectanglePatternString = AreaModelCommonA11yStrings.areaGridRectanglePattern.value; +const countingNumbersPatternString = AreaModelCommonA11yStrings.countingNumbersPattern.value; - const self = this; +/** + * @constructor + * @extends {AreaDisplayNode} + * + * @param {ProportionalAreaDisplay} areaDisplay + * @param {Property.} partialProductsChoiceProperty + * @param {Object} [options] + * @param {Object} [nodeOptions] + */ +function ProportionalAreaDisplayNode( areaDisplay, partialProductsChoiceProperty, options, nodeOptions ) { - options = merge( { + const self = this; - // Meant to be overridden - gridLinesVisibleProperty: new BooleanProperty( false ), - tilesVisibleProperty: new BooleanProperty( false ), - countingVisibleProperty: new BooleanProperty( false ), - useTileLikeBackground: false, - useLargeArea: false, + options = merge( { - // Specified for supertype - isProportional: true - }, options ); + // Meant to be overridden + gridLinesVisibleProperty: new BooleanProperty( false ), + tilesVisibleProperty: new BooleanProperty( false ), + countingVisibleProperty: new BooleanProperty( false ), + useTileLikeBackground: false, + useLargeArea: false, - nodeOptions = merge( { - // a11y - tagName: 'div', - labelTagName: 'h3', - labelContent: areaGridString - }, nodeOptions ); + // Specified for supertype + isProportional: true + }, options ); - AreaDisplayNode.call( this, areaDisplay, partialProductsChoiceProperty, options ); + nodeOptions = merge( { + // a11y + tagName: 'div', + labelTagName: 'h3', + labelContent: areaGridString + }, nodeOptions ); - const countingLabel = new Node( { - tagName: 'span' - } ); - this.accessibleParagraphNode.insertChild( 0, countingLabel ); - options.countingVisibleProperty.linkAttribute( countingLabel, 'visible' ); + AreaDisplayNode.call( this, areaDisplay, partialProductsChoiceProperty, options ); - const areaAccessibleLabel = new Node( { - tagName: 'span' + const countingLabel = new Node( { + tagName: 'span' + } ); + this.accessibleParagraphNode.insertChild( 0, countingLabel ); + options.countingVisibleProperty.linkAttribute( countingLabel, 'visible' ); + + const areaAccessibleLabel = new Node( { + tagName: 'span' + } ); + this.accessibleParagraphNode.insertChild( 0, areaAccessibleLabel ); + Property.multilink( areaDisplay.activeTotalProperties.values, function( width, height ) { + areaAccessibleLabel.innerContent = StringUtils.fillIn( areaGridRectanglePatternString, { + width: width, + height: height } ); - this.accessibleParagraphNode.insertChild( 0, areaAccessibleLabel ); - Property.multilink( areaDisplay.activeTotalProperties.values, function( width, height ) { - areaAccessibleLabel.innerContent = StringUtils.fillIn( areaGridRectanglePatternString, { - width: width, - height: height - } ); - countingLabel.innerContent = StringUtils.fillIn( countingNumbersPatternString, { - count: Utils.toFixedNumber( width * height, Utils.numberOfDecimalPlaces( width ) + Utils.numberOfDecimalPlaces( height ) ) - } ); + countingLabel.innerContent = StringUtils.fillIn( countingNumbersPatternString, { + count: Utils.toFixedNumber( width * height, Utils.numberOfDecimalPlaces( width ) + Utils.numberOfDecimalPlaces( height ) ) } ); + } ); - // Background fill - this.areaLayer.addChild( this.backgroundNode ); + // Background fill + this.areaLayer.addChild( this.backgroundNode ); - // Grid lines - const gridLinesNode = new ProportionalAreaGridLinesNode( areaDisplay.areaProperty, this.modelViewTransformProperty ); - this.areaLayer.addChild( gridLinesNode ); - options.gridLinesVisibleProperty.linkAttribute( gridLinesNode, 'visible' ); + // Grid lines + const gridLinesNode = new ProportionalAreaGridLinesNode( areaDisplay.areaProperty, this.modelViewTransformProperty ); + this.areaLayer.addChild( gridLinesNode ); + options.gridLinesVisibleProperty.linkAttribute( gridLinesNode, 'visible' ); - // Active area background - const activeAreaBackground = new Rectangle( { - fill: options.useTileLikeBackground - ? AreaModelCommonColorProfile.semiTransparentSmallTileProperty - : AreaModelCommonColorProfile.proportionalActiveAreaBackgroundProperty, - stroke: AreaModelCommonColorProfile.proportionalActiveAreaBorderProperty + // Active area background + const activeAreaBackground = new Rectangle( { + fill: options.useTileLikeBackground + ? AreaModelCommonColorProfile.semiTransparentSmallTileProperty + : AreaModelCommonColorProfile.proportionalActiveAreaBackgroundProperty, + stroke: AreaModelCommonColorProfile.proportionalActiveAreaBorderProperty + } ); + Property.multilink( + [ areaDisplay.activeTotalProperties.horizontal, this.modelViewTransformProperty ], + function( totalWidth, modelViewTransform ) { + activeAreaBackground.rectWidth = modelViewTransform.modelToViewX( totalWidth ); } ); - Property.multilink( - [ areaDisplay.activeTotalProperties.horizontal, this.modelViewTransformProperty ], - function( totalWidth, modelViewTransform ) { - activeAreaBackground.rectWidth = modelViewTransform.modelToViewX( totalWidth ); - } ); - Property.multilink( - [ areaDisplay.activeTotalProperties.vertical, this.modelViewTransformProperty ], - function( totalHeight, modelViewTransform ) { - activeAreaBackground.rectHeight = modelViewTransform.modelToViewY( totalHeight ); - } ); - this.areaLayer.addChild( activeAreaBackground ); + Property.multilink( + [ areaDisplay.activeTotalProperties.vertical, this.modelViewTransformProperty ], + function( totalHeight, modelViewTransform ) { + activeAreaBackground.rectHeight = modelViewTransform.modelToViewY( totalHeight ); + } ); + this.areaLayer.addChild( activeAreaBackground ); - const tilesVisibleProperty = new DerivedProperty( - [ areaDisplay.tilesAvailableProperty, options.tilesVisibleProperty ], - function( tilesAvailable, tilesVisible ) { - return tilesAvailable && tilesVisible; - } ); + const tilesVisibleProperty = new DerivedProperty( + [ areaDisplay.tilesAvailableProperty, options.tilesVisibleProperty ], + function( tilesAvailable, tilesVisible ) { + return tilesAvailable && tilesVisible; + } ); - // @private {TiledAreaNode|null} - Tiles (optionally enabled) - this.tiledAreaNode = new TiledAreaNode( areaDisplay, this.modelViewTransformProperty, tilesVisibleProperty ); - this.areaLayer.addChild( this.tiledAreaNode ); + // @private {TiledAreaNode|null} - Tiles (optionally enabled) + this.tiledAreaNode = new TiledAreaNode( areaDisplay, this.modelViewTransformProperty, tilesVisibleProperty ); + this.areaLayer.addChild( this.tiledAreaNode ); - // Background stroke - this.areaLayer.addChild( this.borderNode ); + // Background stroke + this.areaLayer.addChild( this.borderNode ); - // Active area drag handle - this.areaLayer.addChild( new ProportionalDragHandle( - areaDisplay.areaProperty, - areaDisplay.activeTotalProperties, - this.modelViewTransformProperty - ) ); + // Active area drag handle + this.areaLayer.addChild( new ProportionalDragHandle( + areaDisplay.areaProperty, + areaDisplay.activeTotalProperties, + this.modelViewTransformProperty + ) ); - const countingVisibleProperty = new DerivedProperty( - [ areaDisplay.countingAvailableProperty, options.countingVisibleProperty ], - function( countingAvailable, countingVisible ) { - return countingAvailable && countingVisible; - } ); + const countingVisibleProperty = new DerivedProperty( + [ areaDisplay.countingAvailableProperty, options.countingVisibleProperty ], + function( countingAvailable, countingVisible ) { + return countingAvailable && countingVisible; + } ); - // @private {CountingAreaNode|null} - Counts of numbers for squares (optionally enabled) - this.countingAreaNode = new CountingAreaNode( - areaDisplay.activeTotalProperties, - this.modelViewTransformProperty, - countingVisibleProperty + // @private {CountingAreaNode|null} - Counts of numbers for squares (optionally enabled) + this.countingAreaNode = new CountingAreaNode( + areaDisplay.activeTotalProperties, + this.modelViewTransformProperty, + countingVisibleProperty + ); + this.areaLayer.addChild( this.countingAreaNode ); + + // Partition lines + Orientation.VALUES.forEach( function( orientation ) { + self.areaLayer.addChild( new ProportionalPartitionLineNode( + areaDisplay, + self.modelViewTransformProperty, + orientation ) ); - this.areaLayer.addChild( this.countingAreaNode ); - - // Partition lines - Orientation.VALUES.forEach( function( orientation ) { - self.areaLayer.addChild( new ProportionalPartitionLineNode( - areaDisplay, - self.modelViewTransformProperty, - orientation ) + } ); + + // Partition labels + Orientation.VALUES.forEach( function( orientation ) { + const partitionsProperties = areaDisplay.partitionsProperties.get( orientation ); + + // because we will have at most 2 + const labels = [ 0, 1 ].map( function( index ) { + const partitionProperty = new DerivedProperty( [ partitionsProperties ], function( partitions ) { + return partitions[ index ]; + } ); + const label = self.createPartitionLabel( + partitionProperty, + areaDisplay.secondaryPartitionsProperty.get( orientation ), + index, + orientation ); + self.labelLayer.addChild( label ); + return label; } ); - // Partition labels - Orientation.VALUES.forEach( function( orientation ) { - const partitionsProperties = areaDisplay.partitionsProperties.get( orientation ); - - // because we will have at most 2 - const labels = [ 0, 1 ].map( function( index ) { - const partitionProperty = new DerivedProperty( [ partitionsProperties ], function( partitions ) { - return partitions[ index ]; - } ); - const label = self.createPartitionLabel( - partitionProperty, - areaDisplay.secondaryPartitionsProperty.get( orientation ), - index, - orientation - ); - self.labelLayer.addChild( label ); - return label; + const labelListener = self.positionPartitionLabels.bind( self, orientation, labels ); + partitionsProperties.link( function( partitions, oldPartitions ) { + oldPartitions && oldPartitions.forEach( function( partition ) { + partition.coordinateRangeProperty.unlink( labelListener ); } ); - - const labelListener = self.positionPartitionLabels.bind( self, orientation, labels ); - partitionsProperties.link( function( partitions, oldPartitions ) { - oldPartitions && oldPartitions.forEach( function( partition ) { - partition.coordinateRangeProperty.unlink( labelListener ); - } ); - partitions.forEach( function( partition ) { - partition.coordinateRangeProperty.link( labelListener ); - } ); - labelListener(); + partitions.forEach( function( partition ) { + partition.coordinateRangeProperty.link( labelListener ); } ); - areaDisplay.primaryPartitionsProperty.get( orientation ).link( labelListener ); - areaDisplay.secondaryPartitionsProperty.get( orientation ).link( labelListener ); + labelListener(); } ); + areaDisplay.primaryPartitionsProperty.get( orientation ).link( labelListener ); + areaDisplay.secondaryPartitionsProperty.get( orientation ).link( labelListener ); + } ); - this.mutate( nodeOptions ); - } + this.mutate( nodeOptions ); +} - areaModelCommon.register( 'ProportionalAreaDisplayNode', ProportionalAreaDisplayNode ); - - return inherit( AreaDisplayNode, ProportionalAreaDisplayNode, { - /** - * Updates expensive-to-update things. - * @public - */ - update: function() { - AreaDisplayNode.prototype.update.call( this ); - - this.tiledAreaNode.update(); - this.countingAreaNode.update(); - }, - - /** - * Returns the partial product node at the given horizontal/vertical indices. - * @private - * - * @param {number} horizontalIndex - * @param {number} verticalIndex - * @returns {PartialProductLabelNode} - */ - getProductLabel: function( horizontalIndex, verticalIndex ) { - const horizontalPartitions = this.areaDisplay.partitionsProperties.horizontal.value; - const verticalPartitions = this.areaDisplay.partitionsProperties.vertical.value; - - return _.find( this.productLabels, function( productLabel ) { - const partitions = productLabel.partitionedAreaProperty.value.partitions; - return partitions.get( Orientation.HORIZONTAL ) === horizontalPartitions[ horizontalIndex ] && - partitions.get( Orientation.VERTICAL ) === verticalPartitions[ verticalIndex ]; - } ); - }, - - /** - * Positions all of the partial products labels. - * @protected - * @override - */ - positionProductLabels: function() { - const self = this; - - // {OrientationPair.>} - Current view ranges (if non-null) for each orientation - const rangesPair = this.areaDisplay.partitionsProperties.map( function( partitionsProperties, orientation ) { - return partitionsProperties.value.map( function( partition ) { - const range = partition.coordinateRangeProperty.value; - if ( range === null ) { - return null; - } - return new Range( - orientation.modelToView( self.modelViewTransformProperty.value, range.min ), - orientation.modelToView( self.modelViewTransformProperty.value, range.max ) - ); - } ); - } ); +areaModelCommon.register( 'ProportionalAreaDisplayNode', ProportionalAreaDisplayNode ); - // First, center the labels (if they have defined ranges) - this.productLabels.forEach( function( productLabel ) { - rangesPair.forEach( function( ranges, orientation ) { - const partition = productLabel.partitionedAreaProperty.value.partitions.get( orientation ); - const range = ranges[ _.indexOf( self.areaDisplay.partitionsProperties.get( orientation ).value, partition ) ]; - if ( range ) { - productLabel[ orientation.coordinate ] = range.getCenter(); - } - } ); - } ); +export default inherit( AreaDisplayNode, ProportionalAreaDisplayNode, { + /** + * Updates expensive-to-update things. + * @public + */ + update: function() { + AreaDisplayNode.prototype.update.call( this ); + + this.tiledAreaNode.update(); + this.countingAreaNode.update(); + }, + + /** + * Returns the partial product node at the given horizontal/vertical indices. + * @private + * + * @param {number} horizontalIndex + * @param {number} verticalIndex + * @returns {PartialProductLabelNode} + */ + getProductLabel: function( horizontalIndex, verticalIndex ) { + const horizontalPartitions = this.areaDisplay.partitionsProperties.horizontal.value; + const verticalPartitions = this.areaDisplay.partitionsProperties.vertical.value; + + return _.find( this.productLabels, function( productLabel ) { + const partitions = productLabel.partitionedAreaProperty.value.partitions; + return partitions.get( Orientation.HORIZONTAL ) === horizontalPartitions[ horizontalIndex ] && + partitions.get( Orientation.VERTICAL ) === verticalPartitions[ verticalIndex ]; + } ); + }, - // Handle each row separately - [ 0, 1 ].forEach( function( verticalIndex ) { - const verticalRange = rangesPair.vertical[ verticalIndex ]; - - // Bail if this row isn't shown at all. - if ( verticalRange === null ) { return; } - - const leftLabel = self.getProductLabel( 0, verticalIndex ); - const rightLabel = self.getProductLabel( 1, verticalIndex ); - - // We may not be able to access labels if we are in a partial state (some properties have changed, but others - // have not). - if ( leftLabel && rightLabel ) { - const isRightPartitionVisible = rightLabel.partitionedAreaProperty.value.visibleProperty.value; - const leftOverlapBump = 22; - const labelOverlapBump = 10; - - const hasLeftOverlap = rangesPair.vertical[ 1 ] !== null && leftLabel.left < -5; - const canAvoidLeftOverlap = leftLabel.top - leftOverlapBump >= verticalRange.min - 5; - const hasLabelOverlap = isRightPartitionVisible && leftLabel.right > rightLabel.left; - const canAvoidLabelOverlap = leftLabel.top - labelOverlapBump >= verticalRange.min - 3; - - let leftOffset = 0; - let rightOffset = 0; - if ( hasLeftOverlap && canAvoidLeftOverlap ) { - leftOffset = leftOverlapBump; - } - if ( hasLabelOverlap && canAvoidLabelOverlap ) { - const labelOverlapOffset = Math.max( labelOverlapBump, verticalRange.getLength() / 6 ); - leftOffset = Math.max( leftOffset, labelOverlapOffset ); - rightOffset = labelOverlapOffset; - } - - // Ignore Intellij inspections, we know what we are doing. - if ( leftOffset ) { - leftLabel.y -= leftOffset; - } - if ( rightOffset && isRightPartitionVisible ) { - rightLabel.y += rightOffset; - } + /** + * Positions all of the partial products labels. + * @protected + * @override + */ + positionProductLabels: function() { + const self = this; + + // {OrientationPair.>} - Current view ranges (if non-null) for each orientation + const rangesPair = this.areaDisplay.partitionsProperties.map( function( partitionsProperties, orientation ) { + return partitionsProperties.value.map( function( partition ) { + const range = partition.coordinateRangeProperty.value; + if ( range === null ) { + return null; } + return new Range( + orientation.modelToView( self.modelViewTransformProperty.value, range.min ), + orientation.modelToView( self.modelViewTransformProperty.value, range.max ) + ); } ); - }, + } ); - /** - * Position the partition labels (along the top/side). - * @private - * - * @param {Orientation} orientation - * @param {Node} labels - */ - positionPartitionLabels: function( orientation, labels ) { - const primaryRange = this.areaDisplay.primaryPartitionsProperty.get( orientation ).value.coordinateRangeProperty.value; - const secondaryRange = this.areaDisplay.secondaryPartitionsProperty.get( orientation ).value.coordinateRangeProperty.value; + // First, center the labels (if they have defined ranges) + this.productLabels.forEach( function( productLabel ) { + rangesPair.forEach( function( ranges, orientation ) { + const partition = productLabel.partitionedAreaProperty.value.partitions.get( orientation ); + const range = ranges[ _.indexOf( self.areaDisplay.partitionsProperties.get( orientation ).value, partition ) ]; + if ( range ) { + productLabel[ orientation.coordinate ] = range.getCenter(); + } + } ); + } ); - const min = orientation.modelToView( this.modelViewTransformProperty.value, primaryRange.min ); - const middle = orientation.modelToView( this.modelViewTransformProperty.value, primaryRange.max ); - const max = secondaryRange ? orientation.modelToView( this.modelViewTransformProperty.value, secondaryRange.max ) : 0; + // Handle each row separately + [ 0, 1 ].forEach( function( verticalIndex ) { + const verticalRange = rangesPair.vertical[ verticalIndex ]; - labels[ 0 ][ orientation.coordinate ] = ( min + middle ) / 2; - labels[ 1 ][ orientation.coordinate ] = ( middle + max ) / 2; + // Bail if this row isn't shown at all. + if ( verticalRange === null ) { return; } - const pad = orientation === Orientation.HORIZONTAL ? 2 : 0; + const leftLabel = self.getProductLabel( 0, verticalIndex ); + const rightLabel = self.getProductLabel( 1, verticalIndex ); - if ( secondaryRange && labels[ 0 ][ orientation.maxSide ] > labels[ 1 ][ orientation.minSide ] - pad * 2 ) { - const center = ( labels[ 0 ][ orientation.maxSide ] + labels[ 1 ][ orientation.minSide ] ) / 2; + // We may not be able to access labels if we are in a partial state (some properties have changed, but others + // have not). + if ( leftLabel && rightLabel ) { + const isRightPartitionVisible = rightLabel.partitionedAreaProperty.value.visibleProperty.value; + const leftOverlapBump = 22; + const labelOverlapBump = 10; - labels[ 0 ][ orientation.maxSide ] = center - pad; - labels[ 1 ][ orientation.minSide ] = center + pad; - } - }, - - /** - * Creates a partition label for the given orientation. - * @private - * - * @param {Property.} partitionProperty - * @param {Property.} secondaryPartitionProperty - The partition that is empty if there is only one - * @param {number} index - The index of the partition - * @param {Orientation} orientation - * @returns {Node} - */ - createPartitionLabel: function( partitionProperty, secondaryPartitionProperty, index, orientation ) { - const text = new Text( '', { - font: AreaModelCommonConstants.PROPORTIONAL_PARTITION_READOUT_FONT, - fill: new DynamicProperty( partitionProperty, { derive: 'colorProperty' } ) - } ); + const hasLeftOverlap = rangesPair.vertical[ 1 ] !== null && leftLabel.left < -5; + const canAvoidLeftOverlap = leftLabel.top - leftOverlapBump >= verticalRange.min - 5; + const hasLabelOverlap = isRightPartitionVisible && leftLabel.right > rightLabel.left; + const canAvoidLabelOverlap = leftLabel.top - labelOverlapBump >= verticalRange.min - 3; - const labelContainer = new Node( { - children: [ text ] - } ); + let leftOffset = 0; + let rightOffset = 0; + if ( hasLeftOverlap && canAvoidLeftOverlap ) { + leftOffset = leftOverlapBump; + } + if ( hasLabelOverlap && canAvoidLabelOverlap ) { + const labelOverlapOffset = Math.max( labelOverlapBump, verticalRange.getLength() / 6 ); + leftOffset = Math.max( leftOffset, labelOverlapOffset ); + rightOffset = labelOverlapOffset; + } - // Text label - new DynamicProperty( partitionProperty, { - derive: 'sizeProperty' - } ).link( function( size ) { - if ( size === null ) { - text.text = ''; + // Ignore Intellij inspections, we know what we are doing. + if ( leftOffset ) { + leftLabel.y -= leftOffset; } - else { - text.text = size.toRichString( false ); - text[ orientation.centerCoordinate ] = 0; + if ( rightOffset && isRightPartitionVisible ) { + rightLabel.y += rightOffset; } - } ); + } + } ); + }, + + /** + * Position the partition labels (along the top/side). + * @private + * + * @param {Orientation} orientation + * @param {Node} labels + */ + positionPartitionLabels: function( orientation, labels ) { + const primaryRange = this.areaDisplay.primaryPartitionsProperty.get( orientation ).value.coordinateRangeProperty.value; + const secondaryRange = this.areaDisplay.secondaryPartitionsProperty.get( orientation ).value.coordinateRangeProperty.value; + + const min = orientation.modelToView( this.modelViewTransformProperty.value, primaryRange.min ); + const middle = orientation.modelToView( this.modelViewTransformProperty.value, primaryRange.max ); + const max = secondaryRange ? orientation.modelToView( this.modelViewTransformProperty.value, secondaryRange.max ) : 0; - // Secondary coordinate - if ( orientation === Orientation.HORIZONTAL ) { - labelContainer.top = AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET.y + 4; + labels[ 0 ][ orientation.coordinate ] = ( min + middle ) / 2; + labels[ 1 ][ orientation.coordinate ] = ( middle + max ) / 2; + + const pad = orientation === Orientation.HORIZONTAL ? 2 : 0; + + if ( secondaryRange && labels[ 0 ][ orientation.maxSide ] > labels[ 1 ][ orientation.minSide ] - pad * 2 ) { + const center = ( labels[ 0 ][ orientation.maxSide ] + labels[ 1 ][ orientation.minSide ] ) / 2; + + labels[ 0 ][ orientation.maxSide ] = center - pad; + labels[ 1 ][ orientation.minSide ] = center + pad; + } + }, + + /** + * Creates a partition label for the given orientation. + * @private + * + * @param {Property.} partitionProperty + * @param {Property.} secondaryPartitionProperty - The partition that is empty if there is only one + * @param {number} index - The index of the partition + * @param {Orientation} orientation + * @returns {Node} + */ + createPartitionLabel: function( partitionProperty, secondaryPartitionProperty, index, orientation ) { + const text = new Text( '', { + font: AreaModelCommonConstants.PROPORTIONAL_PARTITION_READOUT_FONT, + fill: new DynamicProperty( partitionProperty, { derive: 'colorProperty' } ) + } ); + + const labelContainer = new Node( { + children: [ text ] + } ); + + // Text label + new DynamicProperty( partitionProperty, { + derive: 'sizeProperty' + } ).link( function( size ) { + if ( size === null ) { + text.text = ''; } else { - labelContainer.left = AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET.x + 6; + text.text = size.toRichString( false ); + text[ orientation.centerCoordinate ] = 0; } + } ); - const partitionVisibleProperty = new DynamicProperty( partitionProperty, { derive: 'visibleProperty' } ); - const secondaryPartitionSizeProperty = new DynamicProperty( secondaryPartitionProperty, { derive: 'sizeProperty' } ); + // Secondary coordinate + if ( orientation === Orientation.HORIZONTAL ) { + labelContainer.top = AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET.y + 4; + } + else { + labelContainer.left = AreaModelCommonConstants.PROPORTIONAL_RANGE_OFFSET.x + 6; + } - Property.multilink( - [ partitionVisibleProperty, secondaryPartitionSizeProperty ], - function( visible, secondarySize ) { - labelContainer.visible = visible && secondarySize !== null; - } ); + const partitionVisibleProperty = new DynamicProperty( partitionProperty, { derive: 'visibleProperty' } ); + const secondaryPartitionSizeProperty = new DynamicProperty( secondaryPartitionProperty, { derive: 'sizeProperty' } ); - return labelContainer; - } - } ); -} ); + Property.multilink( + [ partitionVisibleProperty, secondaryPartitionSizeProperty ], + function( visible, secondarySize ) { + labelContainer.visible = visible && secondarySize !== null; + } ); + + return labelContainer; + } +} ); \ No newline at end of file diff --git a/js/proportional/view/ProportionalAreaGridLinesNode.js b/js/proportional/view/ProportionalAreaGridLinesNode.js index fa0d3cf3..a47acedb 100644 --- a/js/proportional/view/ProportionalAreaGridLinesNode.js +++ b/js/proportional/view/ProportionalAreaGridLinesNode.js @@ -7,55 +7,52 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Path = require( 'SCENERY/nodes/Path' ); - const Property = require( 'AXON/Property' ); - const Shape = require( 'KITE/Shape' ); - - // constants - const GRID_LINE_WIDTH = 0.5; - const HALF_GRID_LINE_WIDTH = GRID_LINE_WIDTH / 2; - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} areaProperty - * @param {Property.} modelViewTransformProperty - */ - function ProportionalAreaGridLinesNode( areaProperty, modelViewTransformProperty ) { - const self = this; - - Path.call( this, null, { - stroke: AreaModelCommonColorProfile.gridLineProperty - } ); - - Property.multilink( [ areaProperty, modelViewTransformProperty ], function( area, modelViewTransform ) { - const maxX = modelViewTransform.modelToViewX( area.maximumSize ); - const maxY = modelViewTransform.modelToViewY( area.maximumSize ); - - const shape = new Shape(); - for ( let i = area.gridSpacing; i < area.maximumSize; i += area.gridSpacing ) { - const x = modelViewTransform.modelToViewX( i ); - const y = modelViewTransform.modelToViewY( i ); - - shape.moveTo( HALF_GRID_LINE_WIDTH, y ); - shape.lineTo( maxX - HALF_GRID_LINE_WIDTH, y ); - - shape.moveTo( x, HALF_GRID_LINE_WIDTH ); - shape.lineTo( x, maxY - HALF_GRID_LINE_WIDTH ); - } - self.shape = shape; - } ); - } - - areaModelCommon.register( 'ProportionalAreaGridLinesNode', ProportionalAreaGridLinesNode ); - - return inherit( Path, ProportionalAreaGridLinesNode ); -} ); + +import Property from '../../../../axon/js/Property.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; + +// constants +const GRID_LINE_WIDTH = 0.5; +const HALF_GRID_LINE_WIDTH = GRID_LINE_WIDTH / 2; + +/** + * @constructor + * @extends {Node} + * + * @param {Property.} areaProperty + * @param {Property.} modelViewTransformProperty + */ +function ProportionalAreaGridLinesNode( areaProperty, modelViewTransformProperty ) { + const self = this; + + Path.call( this, null, { + stroke: AreaModelCommonColorProfile.gridLineProperty + } ); + + Property.multilink( [ areaProperty, modelViewTransformProperty ], function( area, modelViewTransform ) { + const maxX = modelViewTransform.modelToViewX( area.maximumSize ); + const maxY = modelViewTransform.modelToViewY( area.maximumSize ); + + const shape = new Shape(); + for ( let i = area.gridSpacing; i < area.maximumSize; i += area.gridSpacing ) { + const x = modelViewTransform.modelToViewX( i ); + const y = modelViewTransform.modelToViewY( i ); + + shape.moveTo( HALF_GRID_LINE_WIDTH, y ); + shape.lineTo( maxX - HALF_GRID_LINE_WIDTH, y ); + + shape.moveTo( x, HALF_GRID_LINE_WIDTH ); + shape.lineTo( x, maxY - HALF_GRID_LINE_WIDTH ); + } + self.shape = shape; + } ); +} + +areaModelCommon.register( 'ProportionalAreaGridLinesNode', ProportionalAreaGridLinesNode ); + +inherit( Path, ProportionalAreaGridLinesNode ); +export default ProportionalAreaGridLinesNode; \ No newline at end of file diff --git a/js/proportional/view/ProportionalAreaScreenView.js b/js/proportional/view/ProportionalAreaScreenView.js index fc7c02a3..7a01237c 100644 --- a/js/proportional/view/ProportionalAreaScreenView.js +++ b/js/proportional/view/ProportionalAreaScreenView.js @@ -7,281 +7,277 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignGroup = require( 'SCENERY/nodes/AlignGroup' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonGlobals = require( 'AREA_MODEL_COMMON/common/AreaModelCommonGlobals' ); - const AreaScreenView = require( 'AREA_MODEL_COMMON/common/view/AreaScreenView' ); - const Checkbox = require( 'SUN/Checkbox' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PartitionLineChoice = require( 'AREA_MODEL_COMMON/proportional/model/PartitionLineChoice' ); - const PartitionRadioButtonGroup = require( 'AREA_MODEL_COMMON/proportional/view/PartitionRadioButtonGroup' ); - const Path = require( 'SCENERY/nodes/Path' ); - const ProportionalAreaDisplayNode = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaDisplayNode' ); - const ProportionalAreaModel = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaModel' ); - const ProportionalFactorsNode = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalFactorsNode' ); - const Rectangle = require( 'SCENERY/nodes/Rectangle' ); - const SceneRadioButtonGroup = require( 'AREA_MODEL_COMMON/proportional/view/SceneRadioButtonGroup' ); - const Shape = require( 'KITE/Shape' ); - const Text = require( 'SCENERY/nodes/Text' ); - const VBox = require( 'SCENERY/nodes/VBox' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import merge from '../../../../phet-core/js/merge.js'; +import AlignGroup from '../../../../scenery/js/nodes/AlignGroup.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import Rectangle from '../../../../scenery/js/nodes/Rectangle.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import VBox from '../../../../scenery/js/nodes/VBox.js'; +import Checkbox from '../../../../sun/js/Checkbox.js'; +import areaModelCommonStrings from '../../area-model-common-strings.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonGlobals from '../../common/AreaModelCommonGlobals.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; +import AreaScreenView from '../../common/view/AreaScreenView.js'; +import PartitionLineChoice from '../model/PartitionLineChoice.js'; +import ProportionalAreaModel from '../model/ProportionalAreaModel.js'; +import PartitionRadioButtonGroup from './PartitionRadioButtonGroup.js'; +import ProportionalAreaDisplayNode from './ProportionalAreaDisplayNode.js'; +import ProportionalFactorsNode from './ProportionalFactorsNode.js'; +import SceneRadioButtonGroup from './SceneRadioButtonGroup.js'; - // strings - const partitionString = require( 'string!AREA_MODEL_COMMON/partition' ); +const partitionString = areaModelCommonStrings.partition; - // a11y strings - const base10AreaTilesString = AreaModelCommonA11yStrings.base10AreaTiles.value; - const countingNumbersDescriptionString = AreaModelCommonA11yStrings.countingNumbersDescription.value; - const countingNumbersLabelString = AreaModelCommonA11yStrings.countingNumbersLabel.value; - const gridLinesLabelString = AreaModelCommonA11yStrings.gridLinesLabel.value; +// a11y strings +const base10AreaTilesString = AreaModelCommonA11yStrings.base10AreaTiles.value; +const countingNumbersDescriptionString = AreaModelCommonA11yStrings.countingNumbersDescription.value; +const countingNumbersLabelString = AreaModelCommonA11yStrings.countingNumbersLabel.value; +const gridLinesLabelString = AreaModelCommonA11yStrings.gridLinesLabel.value; - // constants - const RADIO_ICON_SIZE = 30; +// constants +const RADIO_ICON_SIZE = 30; - /** - * @constructor - * @extends {AreaScreenView} - * - * @param {ProportionalAreaModel} model - * @param {Object} [options] - */ - function ProportionalAreaScreenView( model, options ) { - assert && assert( model instanceof ProportionalAreaModel ); +/** + * @constructor + * @extends {AreaScreenView} + * + * @param {ProportionalAreaModel} model + * @param {Object} [options] + */ +function ProportionalAreaScreenView( model, options ) { + assert && assert( model instanceof ProportionalAreaModel ); - options = merge( { - decimalPlaces: 0, - isProportional: true - }, options ); + options = merge( { + decimalPlaces: 0, + isProportional: true + }, options ); - // @private {Node} - Scene selection, created before super call since it will be added in it. - this.sceneSelectionNode = new SceneRadioButtonGroup( model ); + // @private {Node} - Scene selection, created before super call since it will be added in it. + this.sceneSelectionNode = new SceneRadioButtonGroup( model ); - const currentAreaOrientationProperty = new DynamicProperty( model.currentAreaProperty, { - derive: 'visiblePartitionOrientationProperty', - bidirectional: true - } ); + const currentAreaOrientationProperty = new DynamicProperty( model.currentAreaProperty, { + derive: 'visiblePartitionOrientationProperty', + bidirectional: true + } ); - // Should have its own align group, so we don't modify other sizes - const partitionSelectionAlignGroup = new AlignGroup(); + // Should have its own align group, so we don't modify other sizes + const partitionSelectionAlignGroup = new AlignGroup(); - // @private {Node} - Allows controlling which partition is currently visible (if we only show one) - this.partitionSelectionPanel = this.createPanelContent( - partitionString, - AreaModelCommonGlobals.panelAlignGroup, - new PartitionRadioButtonGroup( currentAreaOrientationProperty, partitionSelectionAlignGroup ) - ); + // @private {Node} - Allows controlling which partition is currently visible (if we only show one) + this.partitionSelectionPanel = this.createPanelContent( + partitionString, + AreaModelCommonGlobals.panelAlignGroup, + new PartitionRadioButtonGroup( currentAreaOrientationProperty, partitionSelectionAlignGroup ) + ); - AreaScreenView.call( this, model, options ); + AreaScreenView.call( this, model, options ); - // Checkboxes - const gridCheckbox = new Checkbox( this.createGridIconNode(), model.gridLinesVisibleProperty, { - // a11y - labelTagName: 'label', - labelContent: gridLinesLabelString - } ); - const tileCheckbox = new Checkbox( this.createTileIconNode(), model.tilesVisibleProperty, { - // a11y - labelTagName: 'label', - labelContent: base10AreaTilesString - } ); - const countingCheckbox = new Checkbox( this.createCountingIconNode(), model.countingVisibleProperty, { - // a11y - labelTagName: 'label', - labelContent: countingNumbersLabelString, - descriptionContent: countingNumbersDescriptionString - } ); + // Checkboxes + const gridCheckbox = new Checkbox( this.createGridIconNode(), model.gridLinesVisibleProperty, { + // a11y + labelTagName: 'label', + labelContent: gridLinesLabelString + } ); + const tileCheckbox = new Checkbox( this.createTileIconNode(), model.tilesVisibleProperty, { + // a11y + labelTagName: 'label', + labelContent: base10AreaTilesString + } ); + const countingCheckbox = new Checkbox( this.createCountingIconNode(), model.countingVisibleProperty, { + // a11y + labelTagName: 'label', + labelContent: countingNumbersLabelString, + descriptionContent: countingNumbersDescriptionString + } ); - const checkboxContainer = new VBox( { - children: [gridCheckbox, countingCheckbox, tileCheckbox], - align: 'left', - spacing: 20, - // Manual positioning works best here - top: 50, - left: 600 - } ); - this.addChild( checkboxContainer ); + const checkboxContainer = new VBox( { + children: [ gridCheckbox, countingCheckbox, tileCheckbox ], + align: 'left', + spacing: 20, + // Manual positioning works best here + top: 50, + left: 600 + } ); + this.addChild( checkboxContainer ); - model.currentAreaProperty.link( function( area ) { - checkboxContainer.removeAllChildren(); + model.currentAreaProperty.link( function( area ) { + checkboxContainer.removeAllChildren(); - // Don't show the grid/tiles checkboxes if counting is enabled - if ( !area.countingAvailable ) { - checkboxContainer.addChild( gridCheckbox ); - if ( area.tilesAvailable ) { - checkboxContainer.addChild( tileCheckbox ); - } + // Don't show the grid/tiles checkboxes if counting is enabled + if ( !area.countingAvailable ) { + checkboxContainer.addChild( gridCheckbox ); + if ( area.tilesAvailable ) { + checkboxContainer.addChild( tileCheckbox ); } - else { - checkboxContainer.addChild( countingCheckbox ); - } - } ); + } + else { + checkboxContainer.addChild( countingCheckbox ); + } + } ); - // "Play Area" (a11y) - this.pdomPlayAreaNode.accessibleOrder = [ - this.areaDisplayNode, - this.factorsBox, - this.areaBox, - this.productsSelectionPanel, - this.calculationSelectionPanel, - this.partitionSelectionPanel, - this.calculationNode - ].filter( function( node ) { return node !== undefined; } ); // this.partitionSelectionPanel may not exist + // "Play Area" (a11y) + this.pdomPlayAreaNode.accessibleOrder = [ + this.areaDisplayNode, + this.factorsBox, + this.areaBox, + this.productsSelectionPanel, + this.calculationSelectionPanel, + this.partitionSelectionPanel, + this.calculationNode + ].filter( function( node ) { return node !== undefined; } ); // this.partitionSelectionPanel may not exist - // "Control Panel" (a11y) - this.pdomControlAreaNode.accessibleOrder = [ - gridCheckbox, - tileCheckbox, - countingCheckbox, - this.sceneSelectionNode, - this.resetAllButton - ]; - } + // "Control Panel" (a11y) + this.pdomControlAreaNode.accessibleOrder = [ + gridCheckbox, + tileCheckbox, + countingCheckbox, + this.sceneSelectionNode, + this.resetAllButton + ]; +} - areaModelCommon.register( 'ProportionalAreaScreenView', ProportionalAreaScreenView ); +areaModelCommon.register( 'ProportionalAreaScreenView', ProportionalAreaScreenView ); - return inherit( AreaScreenView, ProportionalAreaScreenView, { - /** - * @protected - * @override - * - * @returns {Array.} - */ - getRightAlignNodes: function() { - return AreaScreenView.prototype.getRightAlignNodes.call( this ).concat( [this.sceneSelectionNode] ); - }, - - /** - * @protected - * @override - * - * @returns {Property.>} - */ - getSelectionNodesProperty: function() { - const self = this; +export default inherit( AreaScreenView, ProportionalAreaScreenView, { + /** + * @protected + * @override + * + * @returns {Array.} + */ + getRightAlignNodes: function() { + return AreaScreenView.prototype.getRightAlignNodes.call( this ).concat( [ this.sceneSelectionNode ] ); + }, - // Use a Property here so we don't recreate when we don't have to (just on area changes) - const hasPartitionSelectionProperty = new DerivedProperty( [this.model.currentAreaProperty], function( area ) { - return area.partitionLineChoice === PartitionLineChoice.ONE; - } ); + /** + * @protected + * @override + * + * @returns {Property.>} + */ + getSelectionNodesProperty: function() { + const self = this; - // Conditionally include our partition selection on top of what else is included - return new DerivedProperty( - [AreaScreenView.prototype.getSelectionNodesProperty.call( this ), hasPartitionSelectionProperty], - function( selectionNodes, hasPartitionSelection ) { - return hasPartitionSelection ? selectionNodes.concat( [self.partitionSelectionPanel] ) : selectionNodes; - } ); - }, + // Use a Property here so we don't recreate when we don't have to (just on area changes) + const hasPartitionSelectionProperty = new DerivedProperty( [ this.model.currentAreaProperty ], function( area ) { + return area.partitionLineChoice === PartitionLineChoice.ONE; + } ); - /** - * Creates the main area display view for the screen. - * @public - * @override - * - * @param {ProportionalAreaModel} model - * @returns {ProportionalAreaDisplayNode} - */ - createAreaDisplayNode: function( model ) { - return new ProportionalAreaDisplayNode( model.areaDisplay, model.partialProductsChoiceProperty, { - gridLinesVisibleProperty: model.gridLinesVisibleProperty, - tilesVisibleProperty: model.tilesVisibleProperty, - countingVisibleProperty: model.countingVisibleProperty, - useTileLikeBackground: this.useTileLikeBackground, - useLargeArea: this.useLargeArea - }, { - translation: this.getDisplayTranslation() + // Conditionally include our partition selection on top of what else is included + return new DerivedProperty( + [ AreaScreenView.prototype.getSelectionNodesProperty.call( this ), hasPartitionSelectionProperty ], + function( selectionNodes, hasPartitionSelection ) { + return hasPartitionSelection ? selectionNodes.concat( [ self.partitionSelectionPanel ] ) : selectionNodes; } ); - }, + }, - /** - * Creates the "factors" (dimensions) content for the accordion box. - * @public - * @override - * - * @param {ProportionalAreaModel} model - * @param {number} decimalPlaces - * @returns {Node} - */ - createFactorsNode: function( model, decimalPlaces ) { - return new ProportionalFactorsNode( model.currentAreaProperty, model.areaDisplay.activeTotalProperties, decimalPlaces ); - }, + /** + * Creates the main area display view for the screen. + * @public + * @override + * + * @param {ProportionalAreaModel} model + * @returns {ProportionalAreaDisplayNode} + */ + createAreaDisplayNode: function( model ) { + return new ProportionalAreaDisplayNode( model.areaDisplay, model.partialProductsChoiceProperty, { + gridLinesVisibleProperty: model.gridLinesVisibleProperty, + tilesVisibleProperty: model.tilesVisibleProperty, + countingVisibleProperty: model.countingVisibleProperty, + useTileLikeBackground: this.useTileLikeBackground, + useLargeArea: this.useLargeArea + }, { + translation: this.getDisplayTranslation() + } ); + }, - /** - * Creates a grid icon. - * @private - * - * @returns {Node} - */ - createGridIconNode: function() { - const gridIconShape = new Shape() - .moveTo( RADIO_ICON_SIZE / 4, 0 ) - .lineTo( RADIO_ICON_SIZE / 4, RADIO_ICON_SIZE ) - .moveTo( RADIO_ICON_SIZE / 2, 0 ) - .lineTo( RADIO_ICON_SIZE / 2, RADIO_ICON_SIZE ) - .moveTo( RADIO_ICON_SIZE * 3 / 4, 0 ) - .lineTo( RADIO_ICON_SIZE * 3 / 4, RADIO_ICON_SIZE ) - .moveTo( 0, RADIO_ICON_SIZE / 4 ) - .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE / 4 ) - .moveTo( 0, RADIO_ICON_SIZE / 2 ) - .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE / 2 ) - .moveTo( 0, RADIO_ICON_SIZE * 3 / 4 ) - .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE * 3 / 4 ); - return new Path( gridIconShape, { - stroke: AreaModelCommonColorProfile.gridIconProperty - } ); - }, + /** + * Creates the "factors" (dimensions) content for the accordion box. + * @public + * @override + * + * @param {ProportionalAreaModel} model + * @param {number} decimalPlaces + * @returns {Node} + */ + createFactorsNode: function( model, decimalPlaces ) { + return new ProportionalFactorsNode( model.currentAreaProperty, model.areaDisplay.activeTotalProperties, decimalPlaces ); + }, - /** - * Creates a tile icon. - * @private - * - * @returns {Node} - */ - createTileIconNode: function() { - const tileIconOptions = { - fill: AreaModelCommonColorProfile.smallTileProperty, - stroke: AreaModelCommonColorProfile.tileIconStrokeProperty, - lineWidth: 0.5 - }; - const SMALL_TILE_ICON_SIZE = RADIO_ICON_SIZE / 10; - return new HBox( { - children: [ - new Rectangle( 0, 0, RADIO_ICON_SIZE, RADIO_ICON_SIZE, tileIconOptions ), - new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, RADIO_ICON_SIZE, tileIconOptions ), - new VBox( { - children: [ - new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ), - new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ), - new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ) - ], - spacing: 0 - } ) - ], - align: 'top', - spacing: RADIO_ICON_SIZE / 8 - } ); - }, + /** + * Creates a grid icon. + * @private + * + * @returns {Node} + */ + createGridIconNode: function() { + const gridIconShape = new Shape() + .moveTo( RADIO_ICON_SIZE / 4, 0 ) + .lineTo( RADIO_ICON_SIZE / 4, RADIO_ICON_SIZE ) + .moveTo( RADIO_ICON_SIZE / 2, 0 ) + .lineTo( RADIO_ICON_SIZE / 2, RADIO_ICON_SIZE ) + .moveTo( RADIO_ICON_SIZE * 3 / 4, 0 ) + .lineTo( RADIO_ICON_SIZE * 3 / 4, RADIO_ICON_SIZE ) + .moveTo( 0, RADIO_ICON_SIZE / 4 ) + .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE / 4 ) + .moveTo( 0, RADIO_ICON_SIZE / 2 ) + .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE / 2 ) + .moveTo( 0, RADIO_ICON_SIZE * 3 / 4 ) + .lineTo( RADIO_ICON_SIZE, RADIO_ICON_SIZE * 3 / 4 ); + return new Path( gridIconShape, { + stroke: AreaModelCommonColorProfile.gridIconProperty + } ); + }, - /** - * Creates a counting icon. - * @private - * - * @returns {Node} - */ - createCountingIconNode: function() { - // Hardcoded string, see https://github.com/phetsims/area-model-common/issues/104 - return new Text( '123', { - font: AreaModelCommonConstants.COUNTING_ICON_FONT - } ); - } - } ); -} ); + /** + * Creates a tile icon. + * @private + * + * @returns {Node} + */ + createTileIconNode: function() { + const tileIconOptions = { + fill: AreaModelCommonColorProfile.smallTileProperty, + stroke: AreaModelCommonColorProfile.tileIconStrokeProperty, + lineWidth: 0.5 + }; + const SMALL_TILE_ICON_SIZE = RADIO_ICON_SIZE / 10; + return new HBox( { + children: [ + new Rectangle( 0, 0, RADIO_ICON_SIZE, RADIO_ICON_SIZE, tileIconOptions ), + new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, RADIO_ICON_SIZE, tileIconOptions ), + new VBox( { + children: [ + new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ), + new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ), + new Rectangle( 0, 0, SMALL_TILE_ICON_SIZE, SMALL_TILE_ICON_SIZE, tileIconOptions ) + ], + spacing: 0 + } ) + ], + align: 'top', + spacing: RADIO_ICON_SIZE / 8 + } ); + }, + + /** + * Creates a counting icon. + * @private + * + * @returns {Node} + */ + createCountingIconNode: function() { + // Hardcoded string, see https://github.com/phetsims/area-model-common/issues/104 + return new Text( '123', { + font: AreaModelCommonConstants.COUNTING_ICON_FONT + } ); + } +} ); \ No newline at end of file diff --git a/js/proportional/view/ProportionalDragHandle.js b/js/proportional/view/ProportionalDragHandle.js index 812f9c74..21e8552c 100644 --- a/js/proportional/view/ProportionalDragHandle.js +++ b/js/proportional/view/ProportionalDragHandle.js @@ -8,208 +8,205 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const Circle = require( 'SCENERY/nodes/Circle' ); - const DragListener = require( 'SCENERY/listeners/DragListener' ); - const inherit = require( 'PHET_CORE/inherit' ); - const KeyboardDragListener = require( 'SCENERY/listeners/KeyboardDragListener' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const Shape = require( 'KITE/Shape' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Utils = require( 'DOT/Utils' ); - const Vector2 = require( 'DOT/Vector2' ); - const Vector2Property = require( 'DOT/Vector2Property' ); - - // a11y strings - const dragHandleString = AreaModelCommonA11yStrings.dragHandle.value; - const dragHandleDescriptionPatternString = AreaModelCommonA11yStrings.dragHandleDescriptionPattern.value; - - // constants - const DRAG_OFFSET = 8; - const DRAG_RADIUS = 10.5; - const CIRCLE_DRAG_OFFSET = DRAG_OFFSET + Math.sqrt( 2 ) / 2 * DRAG_RADIUS; - - /** - * @constructor - * @extends {Node} - * - * @param {Property.} areaProperty - * @param {OrientationPair.>} activeTotalProperties - * @param {Property.} modelViewTransformProperty - */ - function ProportionalDragHandle( areaProperty, activeTotalProperties, modelViewTransformProperty ) { - - const self = this; - - // {Property.} - Whether this is being dragged (we only apply offsets when dragged) - const draggedProperty = new BooleanProperty( false ); - - // The current view "offset" from where the pointer is compared to the point it is controlling - const offsetProperty = new Vector2Property( new Vector2( 0, 0 ) ); - - const line = new Line( { - stroke: AreaModelCommonColorProfile.proportionalDragHandleBorderProperty - } ); - const circle = new Circle( DRAG_RADIUS, { - touchArea: Shape.circle( 0, 0, DRAG_RADIUS * 2 ), - focusHighlight: Shape.circle( 0, 0, DRAG_RADIUS * 1.5 ), - fill: AreaModelCommonColorProfile.proportionalDragHandleBackgroundProperty, - stroke: AreaModelCommonColorProfile.proportionalDragHandleBorderProperty, - cursor: 'pointer', - - // a11y - tagName: 'div', - innerContent: dragHandleString, - focusable: true +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import Utils from '../../../../dot/js/Utils.js'; +import Vector2 from '../../../../dot/js/Vector2.js'; +import Vector2Property from '../../../../dot/js/Vector2Property.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import DragListener from '../../../../scenery/js/listeners/DragListener.js'; +import KeyboardDragListener from '../../../../scenery/js/listeners/KeyboardDragListener.js'; +import Circle from '../../../../scenery/js/nodes/Circle.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; + +// a11y strings +const dragHandleString = AreaModelCommonA11yStrings.dragHandle.value; +const dragHandleDescriptionPatternString = AreaModelCommonA11yStrings.dragHandleDescriptionPattern.value; + +// constants +const DRAG_OFFSET = 8; +const DRAG_RADIUS = 10.5; +const CIRCLE_DRAG_OFFSET = DRAG_OFFSET + Math.sqrt( 2 ) / 2 * DRAG_RADIUS; + +/** + * @constructor + * @extends {Node} + * + * @param {Property.} areaProperty + * @param {OrientationPair.>} activeTotalProperties + * @param {Property.} modelViewTransformProperty + */ +function ProportionalDragHandle( areaProperty, activeTotalProperties, modelViewTransformProperty ) { + + const self = this; + + // {Property.} - Whether this is being dragged (we only apply offsets when dragged) + const draggedProperty = new BooleanProperty( false ); + + // The current view "offset" from where the pointer is compared to the point it is controlling + const offsetProperty = new Vector2Property( new Vector2( 0, 0 ) ); + + const line = new Line( { + stroke: AreaModelCommonColorProfile.proportionalDragHandleBorderProperty + } ); + + const circle = new Circle( DRAG_RADIUS, { + touchArea: Shape.circle( 0, 0, DRAG_RADIUS * 2 ), + focusHighlight: Shape.circle( 0, 0, DRAG_RADIUS * 1.5 ), + fill: AreaModelCommonColorProfile.proportionalDragHandleBackgroundProperty, + stroke: AreaModelCommonColorProfile.proportionalDragHandleBorderProperty, + cursor: 'pointer', + + // a11y + tagName: 'div', + innerContent: dragHandleString, + focusable: true + } ); + + // Potential workaround for https://github.com/phetsims/area-model-common/issues/173 (Safari SVG dirty region issue) + circle.addChild( new Circle( DRAG_RADIUS + 10, { + pickable: false, + fill: 'transparent' + } ) ); + + areaProperty.link( function( area ) { + circle.descriptionContent = StringUtils.fillIn( dragHandleDescriptionPatternString, { + width: area.maximumSize, + height: area.maximumSize } ); + } ); - // Potential workaround for https://github.com/phetsims/area-model-common/issues/173 (Safari SVG dirty region issue) - circle.addChild( new Circle( DRAG_RADIUS + 10, { - pickable: false, - fill: 'transparent' - } ) ); + let initialOffset; - areaProperty.link( function( area ) { - circle.descriptionContent = StringUtils.fillIn( dragHandleDescriptionPatternString, { - width: area.maximumSize, - height: area.maximumSize - } ); - } ); + function updateOffsetProperty( event, listener ) { + const area = areaProperty.value; + const modelViewTransform = modelViewTransformProperty.value; - let initialOffset; + // We use somewhat complicated drag code, since we both snap AND have an offset from where the pointer + // actually is (and we want it to be efficient). + const pointerViewPoint = listener.parentPoint; + const viewPoint = pointerViewPoint.minusScalar( CIRCLE_DRAG_OFFSET ).minus( initialOffset ); + const modelPoint = modelViewTransform.viewToModelPosition( viewPoint ); - function updateOffsetProperty( event, listener ) { - const area = areaProperty.value; - const modelViewTransform = modelViewTransformProperty.value; + const snapSizeInverse = 1 / area.snapSize; - // We use somewhat complicated drag code, since we both snap AND have an offset from where the pointer - // actually is (and we want it to be efficient). - const pointerViewPoint = listener.parentPoint; - const viewPoint = pointerViewPoint.minusScalar( CIRCLE_DRAG_OFFSET ).minus( initialOffset ); - const modelPoint = modelViewTransform.viewToModelPosition( viewPoint ); + let width = Utils.roundSymmetric( modelPoint.x * snapSizeInverse ) / snapSizeInverse; + let height = Utils.roundSymmetric( modelPoint.y * snapSizeInverse ) / snapSizeInverse; - const snapSizeInverse = 1 / area.snapSize; + width = Utils.clamp( width, area.minimumSize, area.maximumSize ); + height = Utils.clamp( height, area.minimumSize, area.maximumSize ); - let width = Utils.roundSymmetric( modelPoint.x * snapSizeInverse ) / snapSizeInverse; - let height = Utils.roundSymmetric( modelPoint.y * snapSizeInverse ) / snapSizeInverse; + activeTotalProperties.horizontal.value = width; + activeTotalProperties.vertical.value = height; - width = Utils.clamp( width, area.minimumSize, area.maximumSize ); - height = Utils.clamp( height, area.minimumSize, area.maximumSize ); + offsetProperty.value = new Vector2( + viewPoint.x - modelViewTransform.modelToViewX( width ), + viewPoint.y - modelViewTransform.modelToViewY( height ) + ); + } - activeTotalProperties.horizontal.value = width; - activeTotalProperties.vertical.value = height; + const dragListener = new DragListener( { + targetNode: this, + applyOffset: false, + start: function( event, listener ) { + initialOffset = listener.localPoint.minusScalar( CIRCLE_DRAG_OFFSET ); + updateOffsetProperty( event, listener ); + }, + drag: updateOffsetProperty + } ); + dragListener.isPressedProperty.link( draggedProperty.set.bind( draggedProperty ) ); + + // Interrupt the drag when one of our parameters changes + areaProperty.lazyLink( dragListener.interrupt.bind( dragListener ) ); + modelViewTransformProperty.lazyLink( dragListener.interrupt.bind( dragListener ) ); + circle.addInputListener( dragListener ); + + Node.call( this, { + children: [ + line, + circle + ] + } ); + + const locationProperty = new Vector2Property( new Vector2( 0, 0 ) ); + + function updateLocationProperty() { + locationProperty.value = new Vector2( + activeTotalProperties.horizontal.value, + activeTotalProperties.vertical.value + ); + } - offsetProperty.value = new Vector2( - viewPoint.x - modelViewTransform.modelToViewX( width ), - viewPoint.y - modelViewTransform.modelToViewY( height ) - ); + updateLocationProperty(); + locationProperty.lazyLink( function( location ) { + activeTotalProperties.horizontal.value = location.x; + activeTotalProperties.vertical.value = location.y; + } ); + activeTotalProperties.horizontal.lazyLink( updateLocationProperty ); + activeTotalProperties.vertical.lazyLink( updateLocationProperty ); + + let keyboardListener; + Property.multilink( [ areaProperty, modelViewTransformProperty ], function( area, modelViewTransform ) { + if ( keyboardListener ) { + circle.interruptInput(); + circle.removeInputListener( keyboardListener ); + keyboardListener.dispose(); } - - const dragListener = new DragListener( { - targetNode: this, - applyOffset: false, - start: function( event, listener ) { - initialOffset = listener.localPoint.minusScalar( CIRCLE_DRAG_OFFSET ); - updateOffsetProperty( event, listener ); + keyboardListener = new KeyboardDragListener( { + downDelta: modelViewTransform.modelToViewDeltaX( area.snapSize ), + shiftDownDelta: modelViewTransform.modelToViewDeltaX( area.snapSize ), + transform: modelViewTransform, + drag: function( delta ) { + let width = activeTotalProperties.horizontal.value; + let height = activeTotalProperties.vertical.value; + + width += delta.x; + height += delta.y; + + width = Utils.roundToInterval( Utils.clamp( width, area.minimumSize, area.maximumSize ), area.snapSize ); + height = Utils.roundToInterval( Utils.clamp( height, area.minimumSize, area.maximumSize ), area.snapSize ); + + activeTotalProperties.horizontal.value = width; + activeTotalProperties.vertical.value = height; }, - drag: updateOffsetProperty - } ); - dragListener.isPressedProperty.link( draggedProperty.set.bind( draggedProperty ) ); - - // Interrupt the drag when one of our parameters changes - areaProperty.lazyLink( dragListener.interrupt.bind( dragListener ) ); - modelViewTransformProperty.lazyLink( dragListener.interrupt.bind( dragListener ) ); - circle.addInputListener( dragListener ); - - Node.call( this, { - children: [ - line, - circle - ] + moveOnHoldDelay: 750, + moveOnHoldInterval: 70 } ); - const locationProperty = new Vector2Property( new Vector2( 0, 0 ) ); + circle.addInputListener( keyboardListener ); + } ); - function updateLocationProperty() { - locationProperty.value = new Vector2( - activeTotalProperties.horizontal.value, - activeTotalProperties.vertical.value - ); + // Apply offsets while dragging for a smoother experience. + // See https://github.com/phetsims/area-model-common/issues/3 + Property.multilink( [ draggedProperty, offsetProperty ], function( dragged, offset ) { + let combinedOffset = 0; + if ( dragged ) { + // Project to the line y=x, and limit for when the user goes to 1x1 or the max. + combinedOffset = Utils.clamp( ( offset.x + offset.y ) / 2, -10, 10 ); } - - updateLocationProperty(); - locationProperty.lazyLink( function( location ) { - activeTotalProperties.horizontal.value = location.x; - activeTotalProperties.vertical.value = location.y; - } ); - activeTotalProperties.horizontal.lazyLink( updateLocationProperty ); - activeTotalProperties.vertical.lazyLink( updateLocationProperty ); - - let keyboardListener; - Property.multilink( [ areaProperty, modelViewTransformProperty ], function( area, modelViewTransform ) { - if ( keyboardListener ) { - circle.interruptInput(); - circle.removeInputListener( keyboardListener ); - keyboardListener.dispose(); - } - keyboardListener = new KeyboardDragListener( { - downDelta: modelViewTransform.modelToViewDeltaX( area.snapSize ), - shiftDownDelta: modelViewTransform.modelToViewDeltaX( area.snapSize ), - transform: modelViewTransform, - drag: function( delta ) { - let width = activeTotalProperties.horizontal.value; - let height = activeTotalProperties.vertical.value; - - width += delta.x; - height += delta.y; - - width = Utils.roundToInterval( Utils.clamp( width, area.minimumSize, area.maximumSize ), area.snapSize ); - height = Utils.roundToInterval( Utils.clamp( height, area.minimumSize, area.maximumSize ), area.snapSize ); - - activeTotalProperties.horizontal.value = width; - activeTotalProperties.vertical.value = height; - }, - moveOnHoldDelay: 750, - moveOnHoldInterval: 70 + line.x2 = line.y2 = combinedOffset + DRAG_OFFSET; + circle.x = circle.y = combinedOffset + CIRCLE_DRAG_OFFSET; + } ); + + // Update the offset of the drag handle + Orientation.VALUES.forEach( function( orientation ) { + Property.multilink( + [ activeTotalProperties.get( orientation ), modelViewTransformProperty ], + function( value, modelViewTransform ) { + self[ orientation.coordinate ] = orientation.modelToView( modelViewTransform, value ); } ); + } ); +} - circle.addInputListener( keyboardListener ); - } ); - - // Apply offsets while dragging for a smoother experience. - // See https://github.com/phetsims/area-model-common/issues/3 - Property.multilink( [ draggedProperty, offsetProperty ], function( dragged, offset ) { - let combinedOffset = 0; - if ( dragged ) { - // Project to the line y=x, and limit for when the user goes to 1x1 or the max. - combinedOffset = Utils.clamp( ( offset.x + offset.y ) / 2, -10, 10 ); - } - line.x2 = line.y2 = combinedOffset + DRAG_OFFSET; - circle.x = circle.y = combinedOffset + CIRCLE_DRAG_OFFSET; - } ); - - // Update the offset of the drag handle - Orientation.VALUES.forEach( function( orientation ) { - Property.multilink( - [ activeTotalProperties.get( orientation ), modelViewTransformProperty ], - function( value, modelViewTransform ) { - self[ orientation.coordinate ] = orientation.modelToView( modelViewTransform, value ); - } ); - } ); - } - - areaModelCommon.register( 'ProportionalDragHandle', ProportionalDragHandle ); +areaModelCommon.register( 'ProportionalDragHandle', ProportionalDragHandle ); - return inherit( Node, ProportionalDragHandle ); -} ); +inherit( Node, ProportionalDragHandle ); +export default ProportionalDragHandle; \ No newline at end of file diff --git a/js/proportional/view/ProportionalFactorsNode.js b/js/proportional/view/ProportionalFactorsNode.js index f3920414..41d8bca5 100644 --- a/js/proportional/view/ProportionalFactorsNode.js +++ b/js/proportional/view/ProportionalFactorsNode.js @@ -7,164 +7,160 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonQueryParameters = require( 'AREA_MODEL_COMMON/common/AreaModelCommonQueryParameters' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const HBox = require( 'SCENERY/nodes/HBox' ); - const inherit = require( 'PHET_CORE/inherit' ); - const MathSymbols = require( 'SCENERY_PHET/MathSymbols' ); - const Node = require( 'SCENERY/nodes/Node' ); - const NumberPicker = require( 'SCENERY_PHET/NumberPicker' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); - const Utils = require( 'DOT/Utils' ); - const validate = require( 'AXON/validate' ); +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import validate from '../../../../axon/js/validate.js'; +import Range from '../../../../dot/js/Range.js'; +import Utils from '../../../../dot/js/Utils.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import MathSymbols from '../../../../scenery-phet/js/MathSymbols.js'; +import NumberPicker from '../../../../scenery-phet/js/NumberPicker.js'; +import HBox from '../../../../scenery/js/nodes/HBox.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonQueryParameters from '../../common/AreaModelCommonQueryParameters.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; - // a11y strings - const factorsTimesPatternString = AreaModelCommonA11yStrings.factorsTimesPattern.value; - const horizontalPickerString = AreaModelCommonA11yStrings.horizontalPicker.value; - const horizontalPickerDescriptionString = AreaModelCommonA11yStrings.horizontalPickerDescription.value; - const verticalPickerString = AreaModelCommonA11yStrings.verticalPicker.value; - const verticalPickerDescriptionString = AreaModelCommonA11yStrings.verticalPickerDescription.value; +// a11y strings +const factorsTimesPatternString = AreaModelCommonA11yStrings.factorsTimesPattern.value; +const horizontalPickerString = AreaModelCommonA11yStrings.horizontalPicker.value; +const horizontalPickerDescriptionString = AreaModelCommonA11yStrings.horizontalPickerDescription.value; +const verticalPickerString = AreaModelCommonA11yStrings.verticalPicker.value; +const verticalPickerDescriptionString = AreaModelCommonA11yStrings.verticalPickerDescription.value; - /** - * @constructor - * @extends {HBox} - * - * @param {Property.} currentAreaProperty - * @param {OrientationPair.>} - activeTotalProperties - * @param {number} decimalPlaces - The number of decimal places to show in the picker (when needed) - */ - function ProportionalFactorsNode( currentAreaProperty, activeTotalProperties, decimalPlaces ) { - Node.call( this ); - - const self = this; +/** + * @constructor + * @extends {HBox} + * + * @param {Property.} currentAreaProperty + * @param {OrientationPair.>} - activeTotalProperties + * @param {number} decimalPlaces - The number of decimal places to show in the picker (when needed) + */ +function ProportionalFactorsNode( currentAreaProperty, activeTotalProperties, decimalPlaces ) { + Node.call( this ); - if ( AreaModelCommonQueryParameters.rawMath ) { - self.tagName = 'div'; - Property.multilink( activeTotalProperties.values, function( horizontalTotal, verticalTotal ) { - self.innerContent = StringUtils.fillIn( factorsTimesPatternString, { - width: horizontalTotal, - height: verticalTotal - } ); - } ); - } - else { - const ns = 'http://www.w3.org/1998/Math/MathML'; - const verticalNode = new Node( { - // a11y - tagName: 'mn', - accessibleNamespace: ns - } ); - activeTotalProperties.vertical.link( function( verticalTotal ) { - verticalNode.innerContent = '' + verticalTotal; - } ); - const horizontalNode = new Node( { - // a11y - tagName: 'mn', - accessibleNamespace: ns - } ); - activeTotalProperties.horizontal.link( function( horizontalTotal ) { - horizontalNode.innerContent = '' + horizontalTotal; - } ); + const self = this; - const mathNode = new Node( { - tagName: 'math', - accessibleNamespace: ns, - children: [ - new Node( { - tagName: 'mrow', - accessibleNamespace: ns, - children: [ - verticalNode, - new Node( { - tagName: 'mo', - accessibleNamespace: ns, - innerContent: '×' - } ), - horizontalNode - ] - } ) - ] + if ( AreaModelCommonQueryParameters.rawMath ) { + self.tagName = 'div'; + Property.multilink( activeTotalProperties.values, function( horizontalTotal, verticalTotal ) { + self.innerContent = StringUtils.fillIn( factorsTimesPatternString, { + width: horizontalTotal, + height: verticalTotal } ); - this.addChild( mathNode ); - } + } ); + } + else { + const ns = 'http://www.w3.org/1998/Math/MathML'; + const verticalNode = new Node( { + // a11y + tagName: 'mn', + accessibleNamespace: ns + } ); + activeTotalProperties.vertical.link( function( verticalTotal ) { + verticalNode.innerContent = '' + verticalTotal; + } ); + const horizontalNode = new Node( { + // a11y + tagName: 'mn', + accessibleNamespace: ns + } ); + activeTotalProperties.horizontal.link( function( horizontalTotal ) { + horizontalNode.innerContent = '' + horizontalTotal; + } ); - this.addChild( new HBox( { + const mathNode = new Node( { + tagName: 'math', + accessibleNamespace: ns, children: [ - this.createPicker( Orientation.VERTICAL, currentAreaProperty, decimalPlaces ), - new Text( MathSymbols.TIMES, { font: AreaModelCommonConstants.FACTORS_TERM_FONT } ), - this.createPicker( Orientation.HORIZONTAL, currentAreaProperty, decimalPlaces ) - ], - spacing: 10 - } ) ); + new Node( { + tagName: 'mrow', + accessibleNamespace: ns, + children: [ + verticalNode, + new Node( { + tagName: 'mo', + accessibleNamespace: ns, + innerContent: '×' + } ), + horizontalNode + ] + } ) + ] + } ); + this.addChild( mathNode ); } - areaModelCommon.register( 'ProportionalFactorsNode', ProportionalFactorsNode ); + this.addChild( new HBox( { + children: [ + this.createPicker( Orientation.VERTICAL, currentAreaProperty, decimalPlaces ), + new Text( MathSymbols.TIMES, { font: AreaModelCommonConstants.FACTORS_TERM_FONT } ), + this.createPicker( Orientation.HORIZONTAL, currentAreaProperty, decimalPlaces ) + ], + spacing: 10 + } ) ); +} - return inherit( Node, ProportionalFactorsNode, { - /** - * Creates a picker that adjusts the specified orientation's total size. - * @private - * - * @param {Orientation} orientation - * @param {Property.} currentAreaProperty - * @param {number} decimalPlaces - */ - createPicker: function( orientation, currentAreaProperty, decimalPlaces ) { - validate( orientation, { validValues: Orientation.VALUES } ); +areaModelCommon.register( 'ProportionalFactorsNode', ProportionalFactorsNode ); - // {Property.>} - const currentTotalProperty = new DerivedProperty( [ currentAreaProperty ], function( area ) { - return area.activeTotalProperties.get( orientation ); - } ); +export default inherit( Node, ProportionalFactorsNode, { + /** + * Creates a picker that adjusts the specified orientation's total size. + * @private + * + * @param {Orientation} orientation + * @param {Property.} currentAreaProperty + * @param {number} decimalPlaces + */ + createPicker: function( orientation, currentAreaProperty, decimalPlaces ) { + validate( orientation, { validValues: Orientation.VALUES } ); - // {Property.} - const bidirectionalProperty = new DynamicProperty( currentTotalProperty, { - bidirectional: true - } ); + // {Property.>} + const currentTotalProperty = new DerivedProperty( [ currentAreaProperty ], function( area ) { + return area.activeTotalProperties.get( orientation ); + } ); - // {Property.} - const rangeProperty = new DerivedProperty( [ currentAreaProperty ], function( area ) { - return new Range( area.minimumSize, area.maximumSize ); - } ); + // {Property.} + const bidirectionalProperty = new DynamicProperty( currentTotalProperty, { + bidirectional: true + } ); - return new NumberPicker( bidirectionalProperty, rangeProperty, { - upFunction: function( value ) { - return Utils.toFixedNumber( value + currentAreaProperty.value.snapSize, decimalPlaces ); - }, - downFunction: function( value ) { - return Utils.toFixedNumber( value - currentAreaProperty.value.snapSize, decimalPlaces ); - }, - decimalPlaces: decimalPlaces, - scale: 1.5, - formatValue: function( value ) { - // Epsilon chosen to avoid round-off errors while not "rounding" any values in the decimals sims improperly. - if ( Utils.equalsEpsilon( value, Utils.roundSymmetric( value ), 1e-6 ) ) { - return Utils.toFixed( value, 0 ); - } - else { - return Utils.toFixed( value, 1 ); - } - }, - color: AreaModelCommonColorProfile.proportionalColorProperties.get( orientation ), + // {Property.} + const rangeProperty = new DerivedProperty( [ currentAreaProperty ], function( area ) { + return new Range( area.minimumSize, area.maximumSize ); + } ); - // a11y - labelContent: orientation === Orientation.HORIZONTAL ? horizontalPickerString : verticalPickerString, - descriptionContent: orientation === Orientation.HORIZONTAL ? horizontalPickerDescriptionString : verticalPickerDescriptionString, - a11yMapValue: value => Utils.toFixedNumber( value, decimalPlaces ) - } ); - } - } ); -} ); + return new NumberPicker( bidirectionalProperty, rangeProperty, { + upFunction: function( value ) { + return Utils.toFixedNumber( value + currentAreaProperty.value.snapSize, decimalPlaces ); + }, + downFunction: function( value ) { + return Utils.toFixedNumber( value - currentAreaProperty.value.snapSize, decimalPlaces ); + }, + decimalPlaces: decimalPlaces, + scale: 1.5, + formatValue: function( value ) { + // Epsilon chosen to avoid round-off errors while not "rounding" any values in the decimals sims improperly. + if ( Utils.equalsEpsilon( value, Utils.roundSymmetric( value ), 1e-6 ) ) { + return Utils.toFixed( value, 0 ); + } + else { + return Utils.toFixed( value, 1 ); + } + }, + color: AreaModelCommonColorProfile.proportionalColorProperties.get( orientation ), + + // a11y + labelContent: orientation === Orientation.HORIZONTAL ? horizontalPickerString : verticalPickerString, + descriptionContent: orientation === Orientation.HORIZONTAL ? horizontalPickerDescriptionString : verticalPickerDescriptionString, + a11yMapValue: value => Utils.toFixedNumber( value, decimalPlaces ) + } ); + } +} ); \ No newline at end of file diff --git a/js/proportional/view/ProportionalPartitionLineNode.js b/js/proportional/view/ProportionalPartitionLineNode.js index bd771f31..01627a71 100644 --- a/js/proportional/view/ProportionalPartitionLineNode.js +++ b/js/proportional/view/ProportionalPartitionLineNode.js @@ -7,241 +7,237 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const AccessibleSlider = require( 'SUN/accessibility/AccessibleSlider' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const ArrowNode = require( 'SCENERY_PHET/ArrowNode' ); - const BooleanProperty = require( 'AXON/BooleanProperty' ); - const DerivedProperty = require( 'AXON/DerivedProperty' ); - const DragListener = require( 'SCENERY/listeners/DragListener' ); - const DynamicProperty = require( 'AXON/DynamicProperty' ); - const FocusHighlightPath = require( 'SCENERY/accessibility/FocusHighlightPath' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Line = require( 'SCENERY/nodes/Line' ); - const Matrix3 = require( 'DOT/Matrix3' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const OrientationPair = require( 'AREA_MODEL_COMMON/common/model/OrientationPair' ); - const Path = require( 'SCENERY/nodes/Path' ); - const Property = require( 'AXON/Property' ); - const Range = require( 'DOT/Range' ); - const Shape = require( 'KITE/Shape' ); - const Utils = require( 'DOT/Utils' ); - const validate = require( 'AXON/validate' ); - - // a11y strings - const horizontalPartitionHandleString = AreaModelCommonA11yStrings.horizontalPartitionHandle.value; - const horizontalPartitionHandleDescriptionString = AreaModelCommonA11yStrings.horizontalPartitionHandleDescription.value; - const verticalPartitionHandleString = AreaModelCommonA11yStrings.verticalPartitionHandle.value; - const verticalPartitionHandleDescriptionString = AreaModelCommonA11yStrings.verticalPartitionHandleDescription.value; - - /** - * @mixes AccessibleSlider - * @constructor - * @extends {Node} - * - * @param {ProportionalAreaDisplay} areaDisplay - * @param {Property.} modelViewTransformProperty - * @param {Orientation} orientation - */ - function ProportionalPartitionLineNode( areaDisplay, modelViewTransformProperty, orientation ) { - validate( orientation, { validValues: Orientation.VALUES } ); - - const self = this; - - Node.call( this ); - - // @private {ProportionalAreaDisplay} - this.areaDisplay = areaDisplay; - - const showHintArrowsProperty = areaDisplay.hasHintArrows.get( orientation ); - - let minHintArrow; - let maxHintArrow; - const hintOffset = 15; - const hintLength = 20; - const arrowOptions = { - fill: 'yellow', - pickable: false - }; - if ( orientation === Orientation.HORIZONTAL ) { - minHintArrow = new ArrowNode( -hintOffset, 0, -( hintLength + hintOffset ), 0, arrowOptions ); - maxHintArrow = new ArrowNode( hintOffset, 0, hintLength + hintOffset, 0, arrowOptions ); - } - else { - minHintArrow = new ArrowNode( 0, -hintOffset, 0, -( hintLength + hintOffset ), arrowOptions ); - maxHintArrow = new ArrowNode( 0, hintOffset, 0, hintLength + hintOffset, arrowOptions ); - } - showHintArrowsProperty.linkAttribute( minHintArrow, 'visible' ); - showHintArrowsProperty.linkAttribute( maxHintArrow, 'visible' ); - - const handleShape = ProportionalPartitionLineNode.HANDLE_ARROW_SHAPES.get( orientation ); - const handleMouseBounds = handleShape.bounds; - const handleTouchBounds = handleMouseBounds.dilated( 5 ); - - // We need to cut off the corners that would overlap between the two partition line handles, so we create a clipping - // area and intersect with that. See https://github.com/phetsims/area-model-common/issues/80. - let handleClipShape = new Shape().moveToPoint( handleTouchBounds.leftTop ) - .lineToPoint( handleTouchBounds.leftBottom ) - .lineToPoint( handleTouchBounds.rightBottom ) - .lineToPoint( handleTouchBounds.rightTop.blend( handleTouchBounds.rightBottom, 0.4 ) ) - .lineToPoint( handleTouchBounds.rightTop.blend( handleTouchBounds.leftTop, 0.4 ) ) - .close(); - if ( orientation === Orientation.VERTICAL ) { - handleClipShape = handleClipShape.transformed( Matrix3.rotation2( Math.PI ) ); - } - const handle = new Path( handleShape, { - mouseArea: Shape.bounds( handleMouseBounds ).shapeIntersection( handleClipShape ), - touchArea: Shape.bounds( handleTouchBounds ).shapeIntersection( handleClipShape ), - fill: areaDisplay.colorProperties.get( orientation ), - stroke: AreaModelCommonColorProfile.partitionLineBorderProperty, - cursor: 'pointer', - children: [ - minHintArrow, - maxHintArrow - ] - } ); +import BooleanProperty from '../../../../axon/js/BooleanProperty.js'; +import DerivedProperty from '../../../../axon/js/DerivedProperty.js'; +import DynamicProperty from '../../../../axon/js/DynamicProperty.js'; +import Property from '../../../../axon/js/Property.js'; +import validate from '../../../../axon/js/validate.js'; +import Matrix3 from '../../../../dot/js/Matrix3.js'; +import Range from '../../../../dot/js/Range.js'; +import Utils from '../../../../dot/js/Utils.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import ArrowNode from '../../../../scenery-phet/js/ArrowNode.js'; +import FocusHighlightPath from '../../../../scenery/js/accessibility/FocusHighlightPath.js'; +import DragListener from '../../../../scenery/js/listeners/DragListener.js'; +import Line from '../../../../scenery/js/nodes/Line.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import AccessibleSlider from '../../../../sun/js/accessibility/AccessibleSlider.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import OrientationPair from '../../common/model/OrientationPair.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; + +// a11y strings +const horizontalPartitionHandleString = AreaModelCommonA11yStrings.horizontalPartitionHandle.value; +const horizontalPartitionHandleDescriptionString = AreaModelCommonA11yStrings.horizontalPartitionHandleDescription.value; +const verticalPartitionHandleString = AreaModelCommonA11yStrings.verticalPartitionHandle.value; +const verticalPartitionHandleDescriptionString = AreaModelCommonA11yStrings.verticalPartitionHandleDescription.value; - const line = new Line( { - stroke: AreaModelCommonColorProfile.partitionLineStrokeProperty, - lineWidth: 2, - cursor: 'pointer' - } ); +/** + * @mixes AccessibleSlider + * @constructor + * @extends {Node} + * + * @param {ProportionalAreaDisplay} areaDisplay + * @param {Property.} modelViewTransformProperty + * @param {Orientation} orientation + */ +function ProportionalPartitionLineNode( areaDisplay, modelViewTransformProperty, orientation ) { + validate( orientation, { validValues: Orientation.VALUES } ); - Node.call( this, { - children: [ - line, - handle - ] - } ); + const self = this; - // Relevant properties - const partitionSplitProperty = areaDisplay.partitionSplitProperties.get( orientation ); - const oppositeActiveTotalProperty = areaDisplay.activeTotalProperties.get( orientation.opposite ); - const activeTotalProperty = areaDisplay.activeTotalProperties.get( orientation ); - - // We need to reverse the accessible property for the vertical case. - // See https://github.com/phetsims/area-model-introduction/issues/2 - const accessibleProperty = orientation === Orientation.HORIZONTAL - ? partitionSplitProperty - : new DynamicProperty( new Property( partitionSplitProperty ), { - bidirectional: true, - map: function( v ) { return -v; }, - inverseMap: function( v ) { return -v; } - }, { - valueType: 'number' // AccessibleSlider doesn't want anything besides a number - } ); - const accessibleRangeProperty = new DerivedProperty( - [ activeTotalProperty, areaDisplay.snapSizeProperty ], - function( total, snapSize ) { - const size = total - snapSize; - return orientation === Orientation.HORIZONTAL ? new Range( 0, size ) : new Range( -size, 0 ); - } ); - - // a11y - this.initializeAccessibleSlider( accessibleProperty, accessibleRangeProperty, new BooleanProperty( true ), { - constrainValue: Utils.roundSymmetric, - keyboardStep: 1, - shiftKeyboardStep: 1, - pageKeyboardStep: 5, - ariaOrientation: orientation.layoutBoxOrientation, - a11yMapValue: function( v ) { - // Reverse the negation above for readouts - return ( orientation === Orientation.HORIZONTAL ? 1 : -1 ) * v; - }, - roundToStepSize: true - } ); + Node.call( this ); - this.labelTagName = 'label'; - this.labelContent = orientation === Orientation.HORIZONTAL ? verticalPartitionHandleString : horizontalPartitionHandleString; - this.descriptionContent = orientation === Orientation.HORIZONTAL ? verticalPartitionHandleDescriptionString : horizontalPartitionHandleDescriptionString; + // @private {ProportionalAreaDisplay} + this.areaDisplay = areaDisplay; - this.focusHighlight = new FocusHighlightPath( handleShape.getOffsetShape( 5 ) ); - handle.addChild( this.focusHighlight ); - this.focusHighlightLayerable = true; + const showHintArrowsProperty = areaDisplay.hasHintArrows.get( orientation ); - // Main coordinate (when dragging) - Property.multilink( [ partitionSplitProperty, modelViewTransformProperty ], function( split, modelViewTransform ) { - self[ orientation.coordinate ] = orientation.modelToView( modelViewTransform, split ); - } ); + let minHintArrow; + let maxHintArrow; + const hintOffset = 15; + const hintLength = 20; + const arrowOptions = { + fill: 'yellow', + pickable: false + }; + if ( orientation === Orientation.HORIZONTAL ) { + minHintArrow = new ArrowNode( -hintOffset, 0, -( hintLength + hintOffset ), 0, arrowOptions ); + maxHintArrow = new ArrowNode( hintOffset, 0, hintLength + hintOffset, 0, arrowOptions ); + } + else { + minHintArrow = new ArrowNode( 0, -hintOffset, 0, -( hintLength + hintOffset ), arrowOptions ); + maxHintArrow = new ArrowNode( 0, hintOffset, 0, hintLength + hintOffset, arrowOptions ); + } + showHintArrowsProperty.linkAttribute( minHintArrow, 'visible' ); + showHintArrowsProperty.linkAttribute( maxHintArrow, 'visible' ); + + const handleShape = ProportionalPartitionLineNode.HANDLE_ARROW_SHAPES.get( orientation ); + const handleMouseBounds = handleShape.bounds; + const handleTouchBounds = handleMouseBounds.dilated( 5 ); + + // We need to cut off the corners that would overlap between the two partition line handles, so we create a clipping + // area and intersect with that. See https://github.com/phetsims/area-model-common/issues/80. + let handleClipShape = new Shape().moveToPoint( handleTouchBounds.leftTop ) + .lineToPoint( handleTouchBounds.leftBottom ) + .lineToPoint( handleTouchBounds.rightBottom ) + .lineToPoint( handleTouchBounds.rightTop.blend( handleTouchBounds.rightBottom, 0.4 ) ) + .lineToPoint( handleTouchBounds.rightTop.blend( handleTouchBounds.leftTop, 0.4 ) ) + .close(); + if ( orientation === Orientation.VERTICAL ) { + handleClipShape = handleClipShape.transformed( Matrix3.rotation2( Math.PI ) ); + } - // Opposite coordinate (how wide the area is in the other direction) - Property.multilink( - [ oppositeActiveTotalProperty, modelViewTransformProperty ], - function( oppositeTotal, modelViewTransform ) { - const offsetValue = orientation.opposite.modelToView( modelViewTransform, oppositeTotal ) + - AreaModelCommonConstants.PARTITION_HANDLE_OFFSET; - handle[ orientation.opposite.coordinate ] = offsetValue; - line[ orientation.opposite.coordinate + '2' ] = offsetValue; - line.mouseArea = line.localBounds.dilated( 4 ); - line.touchArea = line.localBounds.dilated( 8 ); - } ); - - // Visibility - areaDisplay.partitionSplitVisibleProperties.get( orientation ).linkAttribute( self, 'visible' ); - - let dragHandler; - modelViewTransformProperty.link( function( modelViewTransform ) { - if ( dragHandler ) { - self.removeInputListener( dragHandler ); - dragHandler.dispose(); - } - dragHandler = new DragListener( { - transform: modelViewTransform, - drag: function( event, listener ) { - let value = listener.modelPoint[ orientation.coordinate ]; - - value = Utils.roundSymmetric( value / areaDisplay.partitionSnapSizeProperty.value ) * - areaDisplay.partitionSnapSizeProperty.value; - value = Utils.clamp( value, 0, activeTotalProperty.value ); - - // Hint arrows disappear when the actual split changes during a drag, see - // https://github.com/phetsims/area-model-common/issues/68 - const currentSplitValue = partitionSplitProperty.value; - if ( value !== currentSplitValue && value !== 0 ) { - showHintArrowsProperty.value = false; - } - - partitionSplitProperty.value = value; - }, - - end: function() { - if ( partitionSplitProperty.value === activeTotalProperty.value ) { - partitionSplitProperty.value = 0; - } - } - } ); - dragHandler.isUserControlledProperty.link( function( controlled ) { - areaDisplay.partitionSplitUserControlledProperties.get( orientation ).value = controlled; - } ); - self.addInputListener( dragHandler ); + const handle = new Path( handleShape, { + mouseArea: Shape.bounds( handleMouseBounds ).shapeIntersection( handleClipShape ), + touchArea: Shape.bounds( handleTouchBounds ).shapeIntersection( handleClipShape ), + fill: areaDisplay.colorProperties.get( orientation ), + stroke: AreaModelCommonColorProfile.partitionLineBorderProperty, + cursor: 'pointer', + children: [ + minHintArrow, + maxHintArrow + ] + } ); + + const line = new Line( { + stroke: AreaModelCommonColorProfile.partitionLineStrokeProperty, + lineWidth: 2, + cursor: 'pointer' + } ); + + Node.call( this, { + children: [ + line, + handle + ] + } ); + + // Relevant properties + const partitionSplitProperty = areaDisplay.partitionSplitProperties.get( orientation ); + const oppositeActiveTotalProperty = areaDisplay.activeTotalProperties.get( orientation.opposite ); + const activeTotalProperty = areaDisplay.activeTotalProperties.get( orientation ); + + // We need to reverse the accessible property for the vertical case. + // See https://github.com/phetsims/area-model-introduction/issues/2 + const accessibleProperty = orientation === Orientation.HORIZONTAL + ? partitionSplitProperty + : new DynamicProperty( new Property( partitionSplitProperty ), { + bidirectional: true, + map: function( v ) { return -v; }, + inverseMap: function( v ) { return -v; } + }, { + valueType: 'number' // AccessibleSlider doesn't want anything besides a number + } ); + const accessibleRangeProperty = new DerivedProperty( + [ activeTotalProperty, areaDisplay.snapSizeProperty ], + function( total, snapSize ) { + const size = total - snapSize; + return orientation === Orientation.HORIZONTAL ? new Range( 0, size ) : new Range( -size, 0 ); } ); - } - areaModelCommon.register( 'ProportionalPartitionLineNode', ProportionalPartitionLineNode ); + // a11y + this.initializeAccessibleSlider( accessibleProperty, accessibleRangeProperty, new BooleanProperty( true ), { + constrainValue: Utils.roundSymmetric, + keyboardStep: 1, + shiftKeyboardStep: 1, + pageKeyboardStep: 5, + ariaOrientation: orientation.layoutBoxOrientation, + a11yMapValue: function( v ) { + // Reverse the negation above for readouts + return ( orientation === Orientation.HORIZONTAL ? 1 : -1 ) * v; + }, + roundToStepSize: true + } ); - // Handle arrows - const arrowHalfLength = 10; - const arrowHalfWidth = 10; - const verticalArrowShape = new Shape() - .moveTo( -arrowHalfLength, 0 ) - .lineTo( arrowHalfLength, arrowHalfWidth ) - .lineTo( arrowHalfLength, -arrowHalfWidth ) - .close(); - const horizontalArrowShape = verticalArrowShape.transformed( Matrix3.rotation2( Math.PI / 2 ) ); + this.labelTagName = 'label'; + this.labelContent = orientation === Orientation.HORIZONTAL ? verticalPartitionHandleString : horizontalPartitionHandleString; + this.descriptionContent = orientation === Orientation.HORIZONTAL ? verticalPartitionHandleDescriptionString : horizontalPartitionHandleDescriptionString; - inherit( Node, ProportionalPartitionLineNode, {}, { - HANDLE_ARROW_SHAPES: new OrientationPair( horizontalArrowShape, verticalArrowShape ) + this.focusHighlight = new FocusHighlightPath( handleShape.getOffsetShape( 5 ) ); + handle.addChild( this.focusHighlight ); + this.focusHighlightLayerable = true; + + // Main coordinate (when dragging) + Property.multilink( [ partitionSplitProperty, modelViewTransformProperty ], function( split, modelViewTransform ) { + self[ orientation.coordinate ] = orientation.modelToView( modelViewTransform, split ); } ); - AccessibleSlider.mixInto( ProportionalPartitionLineNode ); + // Opposite coordinate (how wide the area is in the other direction) + Property.multilink( + [ oppositeActiveTotalProperty, modelViewTransformProperty ], + function( oppositeTotal, modelViewTransform ) { + const offsetValue = orientation.opposite.modelToView( modelViewTransform, oppositeTotal ) + + AreaModelCommonConstants.PARTITION_HANDLE_OFFSET; + handle[ orientation.opposite.coordinate ] = offsetValue; + line[ orientation.opposite.coordinate + '2' ] = offsetValue; + line.mouseArea = line.localBounds.dilated( 4 ); + line.touchArea = line.localBounds.dilated( 8 ); + } ); + + // Visibility + areaDisplay.partitionSplitVisibleProperties.get( orientation ).linkAttribute( self, 'visible' ); - return ProportionalPartitionLineNode; + let dragHandler; + modelViewTransformProperty.link( function( modelViewTransform ) { + if ( dragHandler ) { + self.removeInputListener( dragHandler ); + dragHandler.dispose(); + } + dragHandler = new DragListener( { + transform: modelViewTransform, + drag: function( event, listener ) { + let value = listener.modelPoint[ orientation.coordinate ]; + + value = Utils.roundSymmetric( value / areaDisplay.partitionSnapSizeProperty.value ) * + areaDisplay.partitionSnapSizeProperty.value; + value = Utils.clamp( value, 0, activeTotalProperty.value ); + + // Hint arrows disappear when the actual split changes during a drag, see + // https://github.com/phetsims/area-model-common/issues/68 + const currentSplitValue = partitionSplitProperty.value; + if ( value !== currentSplitValue && value !== 0 ) { + showHintArrowsProperty.value = false; + } + + partitionSplitProperty.value = value; + }, + + end: function() { + if ( partitionSplitProperty.value === activeTotalProperty.value ) { + partitionSplitProperty.value = 0; + } + } + } ); + dragHandler.isUserControlledProperty.link( function( controlled ) { + areaDisplay.partitionSplitUserControlledProperties.get( orientation ).value = controlled; + } ); + self.addInputListener( dragHandler ); + } ); +} + +areaModelCommon.register( 'ProportionalPartitionLineNode', ProportionalPartitionLineNode ); + +// Handle arrows +const arrowHalfLength = 10; +const arrowHalfWidth = 10; +const verticalArrowShape = new Shape() + .moveTo( -arrowHalfLength, 0 ) + .lineTo( arrowHalfLength, arrowHalfWidth ) + .lineTo( arrowHalfLength, -arrowHalfWidth ) + .close(); +const horizontalArrowShape = verticalArrowShape.transformed( Matrix3.rotation2( Math.PI / 2 ) ); + +inherit( Node, ProportionalPartitionLineNode, {}, { + HANDLE_ARROW_SHAPES: new OrientationPair( horizontalArrowShape, verticalArrowShape ) } ); + +AccessibleSlider.mixInto( ProportionalPartitionLineNode ); + +export default ProportionalPartitionLineNode; \ No newline at end of file diff --git a/js/proportional/view/SceneRadioButtonGroup.js b/js/proportional/view/SceneRadioButtonGroup.js index d4598a39..49a7fbea 100644 --- a/js/proportional/view/SceneRadioButtonGroup.js +++ b/js/proportional/view/SceneRadioButtonGroup.js @@ -7,59 +7,56 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AlignBox = require( 'SCENERY/nodes/AlignBox' ); - const AlignGroup = require( 'SCENERY/nodes/AlignGroup' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonConstants = require( 'AREA_MODEL_COMMON/common/AreaModelCommonConstants' ); - const AreaModelCommonRadioButtonGroup = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonRadioButtonGroup' ); - const inherit = require( 'PHET_CORE/inherit' ); - const StringUtils = require( 'PHETCOMMON/util/StringUtils' ); - const Text = require( 'SCENERY/nodes/Text' ); +import inherit from '../../../../phet-core/js/inherit.js'; +import StringUtils from '../../../../phetcommon/js/util/StringUtils.js'; +import AlignBox from '../../../../scenery/js/nodes/AlignBox.js'; +import AlignGroup from '../../../../scenery/js/nodes/AlignGroup.js'; +import Text from '../../../../scenery/js/nodes/Text.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../../AreaModelCommonA11yStrings.js'; +import AreaModelCommonConstants from '../../common/AreaModelCommonConstants.js'; +import AreaModelCommonRadioButtonGroup from '../../common/view/AreaModelCommonRadioButtonGroup.js'; - // a11y strings - const areaGridSizeString = AreaModelCommonA11yStrings.areaGridSize.value; - const sceneSelectionPatternString = AreaModelCommonA11yStrings.sceneSelectionPattern.value; +// a11y strings +const areaGridSizeString = AreaModelCommonA11yStrings.areaGridSize.value; +const sceneSelectionPatternString = AreaModelCommonA11yStrings.sceneSelectionPattern.value; - /** - * @constructor - * @extends {AreaModelCommonRadioButtonGroup} - * - * @param {ProportionalAreaModel} model - * @param {Object} [nodeOptions] - */ - function SceneRadioButtonGroup( model, nodeOptions ) { - const group = new AlignGroup(); // have all the buttons the same size +/** + * @constructor + * @extends {AreaModelCommonRadioButtonGroup} + * + * @param {ProportionalAreaModel} model + * @param {Object} [nodeOptions] + */ +function SceneRadioButtonGroup( model, nodeOptions ) { + const group = new AlignGroup(); // have all the buttons the same size - assert && assert( model.areas.length === 2 || model.areas.length === 3, - 'We only have strings for the 2 or 3 case (right now)' ); + assert && assert( model.areas.length === 2 || model.areas.length === 3, + 'We only have strings for the 2 or 3 case (right now)' ); - AreaModelCommonRadioButtonGroup.call( this, model.currentAreaProperty, model.areas.map( function( area ) { - return { - value: area, - node: new AlignBox( new Text( area.getDimensionString(), { - font: AreaModelCommonConstants.SYMBOL_FONT - } ), { group: group } ), + AreaModelCommonRadioButtonGroup.call( this, model.currentAreaProperty, model.areas.map( function( area ) { + return { + value: area, + node: new AlignBox( new Text( area.getDimensionString(), { + font: AreaModelCommonConstants.SYMBOL_FONT + } ), { group: group } ), - // a11y - labelContent: StringUtils.fillIn( sceneSelectionPatternString, { - width: area.maximumSize, - height: area.maximumSize - } ) - }; - } ), { // a11y - labelContent: areaGridSizeString - } ); - - this.mutate( nodeOptions ); - } - - areaModelCommon.register( 'SceneRadioButtonGroup', SceneRadioButtonGroup ); - - return inherit( AreaModelCommonRadioButtonGroup, SceneRadioButtonGroup ); -} ); + labelContent: StringUtils.fillIn( sceneSelectionPatternString, { + width: area.maximumSize, + height: area.maximumSize + } ) + }; + } ), { + // a11y + labelContent: areaGridSizeString + } ); + + this.mutate( nodeOptions ); +} + +areaModelCommon.register( 'SceneRadioButtonGroup', SceneRadioButtonGroup ); + +inherit( AreaModelCommonRadioButtonGroup, SceneRadioButtonGroup ); +export default SceneRadioButtonGroup; \ No newline at end of file diff --git a/js/proportional/view/TiledAreaNode.js b/js/proportional/view/TiledAreaNode.js index 4f70cbfd..35a41896 100644 --- a/js/proportional/view/TiledAreaNode.js +++ b/js/proportional/view/TiledAreaNode.js @@ -7,264 +7,260 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Node = require( 'SCENERY/nodes/Node' ); - const Orientation = require( 'PHET_CORE/Orientation' ); - const Path = require( 'SCENERY/nodes/Path' ); - const Property = require( 'AXON/Property' ); - const Shape = require( 'KITE/Shape' ); - const Utils = require( 'DOT/Utils' ); - /** - * @constructor - * @extends {Node} - * - * @param {ProportionalAreaDisplay} areaDisplay - * @param {Property.} modelViewTransformProperty - * @param {Property.} tilesVisibleProperty - */ - function TiledAreaNode( areaDisplay, modelViewTransformProperty, tilesVisibleProperty ) { +import Property from '../../../../axon/js/Property.js'; +import Utils from '../../../../dot/js/Utils.js'; +import Shape from '../../../../kite/js/Shape.js'; +import inherit from '../../../../phet-core/js/inherit.js'; +import Orientation from '../../../../phet-core/js/Orientation.js'; +import Node from '../../../../scenery/js/nodes/Node.js'; +import Path from '../../../../scenery/js/nodes/Path.js'; +import areaModelCommon from '../../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../../common/view/AreaModelCommonColorProfile.js'; - const self = this; +/** + * @constructor + * @extends {Node} + * + * @param {ProportionalAreaDisplay} areaDisplay + * @param {Property.} modelViewTransformProperty + * @param {Property.} tilesVisibleProperty + */ +function TiledAreaNode( areaDisplay, modelViewTransformProperty, tilesVisibleProperty ) { - // @private {Property.} - this.areaDisplay = areaDisplay; + const self = this; - // @private {Property.} - this.modelViewTransformProperty = modelViewTransformProperty; + // @private {Property.} + this.areaDisplay = areaDisplay; - // @private {Property.} - this.tilesVisibleProperty = tilesVisibleProperty; + // @private {Property.} + this.modelViewTransformProperty = modelViewTransformProperty; - // @private {Property.} - this.smallTileSizeProperty = areaDisplay.smallTileSizeProperty; - this.largeTileSizeProperty = areaDisplay.largeTileSizeProperty; - this.maximumSizeProperty = areaDisplay.maximumSizeProperty; + // @private {Property.} + this.tilesVisibleProperty = tilesVisibleProperty; - // @private {boolean} - Whether we should be redrawn - this.dirty = true; + // @private {Property.} + this.smallTileSizeProperty = areaDisplay.smallTileSizeProperty; + this.largeTileSizeProperty = areaDisplay.largeTileSizeProperty; + this.maximumSizeProperty = areaDisplay.maximumSizeProperty; - // Things we depend on - function invalidate() { - self.dirty = true; - } + // @private {boolean} - Whether we should be redrawn + this.dirty = true; - tilesVisibleProperty.lazyLink( invalidate ); - modelViewTransformProperty.lazyLink( invalidate ); - this.smallTileSizeProperty.lazyLink( invalidate ); - this.largeTileSizeProperty.lazyLink( invalidate ); - areaDisplay.allPartitionsProperty.link( function( partitions, oldPartitions ) { - oldPartitions && oldPartitions.forEach( function( partition ) { - partition.visibleProperty.unlink( invalidate ); - partition.coordinateRangeProperty.unlink( invalidate ); - } ); - partitions.forEach( function( partition ) { - partition.visibleProperty.link( invalidate ); - partition.coordinateRangeProperty.link( invalidate ); - } ); - invalidate(); - } ); - invalidate(); + // Things we depend on + function invalidate() { + self.dirty = true; + } - // @private {Path} - Background color paths for each section - this.bigPath = new Path( null, { - fill: AreaModelCommonColorProfile.bigTileProperty + tilesVisibleProperty.lazyLink( invalidate ); + modelViewTransformProperty.lazyLink( invalidate ); + this.smallTileSizeProperty.lazyLink( invalidate ); + this.largeTileSizeProperty.lazyLink( invalidate ); + areaDisplay.allPartitionsProperty.link( function( partitions, oldPartitions ) { + oldPartitions && oldPartitions.forEach( function( partition ) { + partition.visibleProperty.unlink( invalidate ); + partition.coordinateRangeProperty.unlink( invalidate ); } ); - this.horizontalPath = new Path( null, { - fill: AreaModelCommonColorProfile.mediumTileProperty - } ); - this.verticalPath = new Path( null, { - fill: AreaModelCommonColorProfile.mediumTileProperty - } ); - this.smallPath = new Path( null, { - fill: AreaModelCommonColorProfile.smallTileProperty + partitions.forEach( function( partition ) { + partition.visibleProperty.link( invalidate ); + partition.coordinateRangeProperty.link( invalidate ); } ); + invalidate(); + } ); + invalidate(); - // @private {Path} - Grid line paths. We'll use clipping to control where they are visible - this.smallGridPath = new Path( null, { - stroke: AreaModelCommonColorProfile.tileBorderProperty - } ); - this.horizontalGridPath = new Path( null, { - stroke: AreaModelCommonColorProfile.tileBorderProperty - } ); - this.verticalGridPath = new Path( null, { - stroke: AreaModelCommonColorProfile.tileBorderProperty + // @private {Path} - Background color paths for each section + this.bigPath = new Path( null, { + fill: AreaModelCommonColorProfile.bigTileProperty + } ); + this.horizontalPath = new Path( null, { + fill: AreaModelCommonColorProfile.mediumTileProperty + } ); + this.verticalPath = new Path( null, { + fill: AreaModelCommonColorProfile.mediumTileProperty + } ); + this.smallPath = new Path( null, { + fill: AreaModelCommonColorProfile.smallTileProperty + } ); + + // @private {Path} - Grid line paths. We'll use clipping to control where they are visible + this.smallGridPath = new Path( null, { + stroke: AreaModelCommonColorProfile.tileBorderProperty + } ); + this.horizontalGridPath = new Path( null, { + stroke: AreaModelCommonColorProfile.tileBorderProperty + } ); + this.verticalGridPath = new Path( null, { + stroke: AreaModelCommonColorProfile.tileBorderProperty + } ); + + Property.multilink( + [ modelViewTransformProperty, this.maximumSizeProperty, this.smallTileSizeProperty ], + function( modelViewTransform, maximumSize, smallTileSize ) { + // Grid line shapes + const smallGridShape = new Shape(); + const horizontalGridShape = new Shape(); + const verticalGridShape = new Shape(); + const maxX = modelViewTransform.modelToViewX( maximumSize ); + const maxY = modelViewTransform.modelToViewY( maximumSize ); + + // We need the grid lines to extend out past each side a bit for correct appearance + for ( let i = -1; i < maximumSize / smallTileSize + 1; i++ ) { + const x = modelViewTransform.modelToViewX( i * smallTileSize ); + const y = modelViewTransform.modelToViewY( i * smallTileSize ); + + smallGridShape.moveTo( x, 0 ).lineTo( x, maxY ); + smallGridShape.moveTo( 0, y ).lineTo( maxX, y ); + + verticalGridShape.moveTo( x, 0 ).lineTo( x, maxY ); + horizontalGridShape.moveTo( 0, y ).lineTo( maxX, y ); + } + + // Made immutable for potential performance gains + self.smallGridPath.shape = smallGridShape.makeImmutable(); + self.horizontalGridPath.shape = horizontalGridShape.makeImmutable(); + self.verticalGridPath.shape = verticalGridShape.makeImmutable(); } ); - Property.multilink( - [ modelViewTransformProperty, this.maximumSizeProperty, this.smallTileSizeProperty ], - function( modelViewTransform, maximumSize, smallTileSize ) { - // Grid line shapes - const smallGridShape = new Shape(); - const horizontalGridShape = new Shape(); - const verticalGridShape = new Shape(); - const maxX = modelViewTransform.modelToViewX( maximumSize ); - const maxY = modelViewTransform.modelToViewY( maximumSize ); - - // We need the grid lines to extend out past each side a bit for correct appearance - for ( let i = -1; i < maximumSize / smallTileSize + 1; i++ ) { - const x = modelViewTransform.modelToViewX( i * smallTileSize ); - const y = modelViewTransform.modelToViewY( i * smallTileSize ); - - smallGridShape.moveTo( x, 0 ).lineTo( x, maxY ); - smallGridShape.moveTo( 0, y ).lineTo( maxX, y ); - - verticalGridShape.moveTo( x, 0 ).lineTo( x, maxY ); - horizontalGridShape.moveTo( 0, y ).lineTo( maxX, y ); - } + // @private {Path} - Contains extra overlay lines to fill in the 'stroked' appearance. + this.extraLinesPath = new Path( null, { + stroke: AreaModelCommonColorProfile.tileBorderProperty + } ); - // Made immutable for potential performance gains - self.smallGridPath.shape = smallGridShape.makeImmutable(); - self.horizontalGridPath.shape = horizontalGridShape.makeImmutable(); - self.verticalGridPath.shape = verticalGridShape.makeImmutable(); - } ); + Node.call( this, { + children: [ + this.bigPath, + this.horizontalPath, + this.verticalPath, + this.smallPath, + this.smallGridPath, + this.horizontalGridPath, + this.verticalGridPath, + this.extraLinesPath + ] + } ); +} - // @private {Path} - Contains extra overlay lines to fill in the 'stroked' appearance. - this.extraLinesPath = new Path( null, { - stroke: AreaModelCommonColorProfile.tileBorderProperty - } ); +areaModelCommon.register( 'TiledAreaNode', TiledAreaNode ); - Node.call( this, { - children: [ - this.bigPath, - this.horizontalPath, - this.verticalPath, - this.smallPath, - this.smallGridPath, - this.horizontalGridPath, - this.verticalGridPath, - this.extraLinesPath - ] +export default inherit( Node, TiledAreaNode, { + /** + * For each partition of a particular orientation, fires the callback with range information already in view + * coordinates. + * @private + * + * @param {Orientation} orientation + * @param {function} callback - callback( largeCount, smallCount, min, border, max ) + */ + forEachPartition: function( orientation, callback ) { + const self = this; + + this.areaDisplay.partitionsProperties.get( orientation ).value.forEach( function( partition ) { + const range = partition.coordinateRangeProperty.value; + + // Ignore partitions without a visible well-defined range. + if ( !partition.visibleProperty.value || range === null ) { + return; + } + + const size = range.getLength(); + const largeCount = Math.floor( Utils.toFixedNumber( size / self.largeTileSizeProperty.value, 3 ) ); + + const smallCount = Utils.roundSymmetric( + ( size - self.largeTileSizeProperty.value * largeCount ) / self.smallTileSizeProperty.value + ); + const min = orientation.modelToView( self.modelViewTransformProperty.value, range.min ); + const border = orientation.modelToView( + self.modelViewTransformProperty.value, range.min + largeCount * self.largeTileSizeProperty.value + ); + const max = orientation.modelToView( self.modelViewTransformProperty.value, range.max ); + + callback( largeCount, smallCount, min, border, max ); } ); - } + }, - areaModelCommon.register( 'TiledAreaNode', TiledAreaNode ); - - return inherit( Node, TiledAreaNode, { - /** - * For each partition of a particular orientation, fires the callback with range information already in view - * coordinates. - * @private - * - * @param {Orientation} orientation - * @param {function} callback - callback( largeCount, smallCount, min, border, max ) - */ - forEachPartition: function( orientation, callback ) { - const self = this; - - this.areaDisplay.partitionsProperties.get( orientation ).value.forEach( function( partition ) { - const range = partition.coordinateRangeProperty.value; - - // Ignore partitions without a visible well-defined range. - if ( !partition.visibleProperty.value || range === null ) { - return; - } + /** + * Updates the view for tiled areas (since it is somewhat expensive to re-draw, and we don't want it being done + * multiple times per frame. + * @private + */ + update: function() { + const self = this; - const size = range.getLength(); - const largeCount = Math.floor( Utils.toFixedNumber( size / self.largeTileSizeProperty.value, 3 ) ); + // Ignore updates if we are not dirty + if ( !this.dirty ) { return; } + this.dirty = false; - const smallCount = Utils.roundSymmetric( - ( size - self.largeTileSizeProperty.value * largeCount ) / self.smallTileSizeProperty.value - ); - const min = orientation.modelToView( self.modelViewTransformProperty.value, range.min ); - const border = orientation.modelToView( - self.modelViewTransformProperty.value, range.min + largeCount * self.largeTileSizeProperty.value - ); - const max = orientation.modelToView( self.modelViewTransformProperty.value, range.max ); + // Coordinate mapping into the view + const modelToViewX = this.modelViewTransformProperty.value.modelToViewX.bind( this.modelViewTransformProperty.value ); + const modelToViewY = this.modelViewTransformProperty.value.modelToViewY.bind( this.modelViewTransformProperty.value ); - callback( largeCount, smallCount, min, border, max ); - } ); - }, - - /** - * Updates the view for tiled areas (since it is somewhat expensive to re-draw, and we don't want it being done - * multiple times per frame. - * @private - */ - update: function() { - const self = this; - - // Ignore updates if we are not dirty - if ( !this.dirty ) { return; } - this.dirty = false; - - // Coordinate mapping into the view - const modelToViewX = this.modelViewTransformProperty.value.modelToViewX.bind( this.modelViewTransformProperty.value ); - const modelToViewY = this.modelViewTransformProperty.value.modelToViewY.bind( this.modelViewTransformProperty.value ); - - const largeTileSize = this.largeTileSizeProperty.value; - const maximumSize = this.maximumSizeProperty.value; - - this.visible = this.tilesVisibleProperty.value; - - const bigShape = new Shape(); - const horizontalShape = new Shape(); - const verticalShape = new Shape(); - const smallShape = new Shape(); - const extraLinesShape = new Shape(); - - this.forEachPartition( Orientation.HORIZONTAL, function( horizontalLargeCount, horizontalSmallCount, xMin, xBorder, xMax ) { - self.forEachPartition( Orientation.VERTICAL, function( verticalLargeCount, verticalSmallCount, yMin, yBorder, yMax ) { - - // Add in extra lines on the far sides of large sections. - let i; - for ( i = 0; i < horizontalLargeCount; i++ ) { - const x = xMin + modelToViewX( ( i + 1 ) * largeTileSize ); - extraLinesShape.moveTo( x, 0 ).lineTo( x, modelToViewY( maximumSize ) ); - } - for ( i = 0; i < verticalLargeCount; i++ ) { - const y = yMin + modelToViewY( ( i + 1 ) * largeTileSize ); - extraLinesShape.moveTo( 0, y ).lineTo( modelToViewX( maximumSize ), y ); - } - - // Add sections to the relevant shapes. - if ( horizontalLargeCount && verticalLargeCount ) { - bigShape.rect( xMin, yMin, xBorder - xMin, yBorder - yMin ); - } - if ( horizontalLargeCount && verticalSmallCount ) { - horizontalShape.rect( xMin, yBorder, xBorder - xMin, yMax - yBorder ); - } - if ( horizontalSmallCount && verticalLargeCount ) { - verticalShape.rect( xBorder, yMin, xMax - xBorder, yBorder - yMin ); - } - if ( horizontalSmallCount && verticalSmallCount ) { - smallShape.rect( xBorder, yBorder, xMax - xBorder, yMax - yBorder ); - } - } ); + const largeTileSize = this.largeTileSizeProperty.value; + const maximumSize = this.maximumSizeProperty.value; + + this.visible = this.tilesVisibleProperty.value; + + const bigShape = new Shape(); + const horizontalShape = new Shape(); + const verticalShape = new Shape(); + const smallShape = new Shape(); + const extraLinesShape = new Shape(); + + this.forEachPartition( Orientation.HORIZONTAL, function( horizontalLargeCount, horizontalSmallCount, xMin, xBorder, xMax ) { + self.forEachPartition( Orientation.VERTICAL, function( verticalLargeCount, verticalSmallCount, yMin, yBorder, yMax ) { + + // Add in extra lines on the far sides of large sections. + let i; + for ( i = 0; i < horizontalLargeCount; i++ ) { + const x = xMin + modelToViewX( ( i + 1 ) * largeTileSize ); + extraLinesShape.moveTo( x, 0 ).lineTo( x, modelToViewY( maximumSize ) ); + } + for ( i = 0; i < verticalLargeCount; i++ ) { + const y = yMin + modelToViewY( ( i + 1 ) * largeTileSize ); + extraLinesShape.moveTo( 0, y ).lineTo( modelToViewX( maximumSize ), y ); + } + + // Add sections to the relevant shapes. + if ( horizontalLargeCount && verticalLargeCount ) { + bigShape.rect( xMin, yMin, xBorder - xMin, yBorder - yMin ); + } + if ( horizontalLargeCount && verticalSmallCount ) { + horizontalShape.rect( xMin, yBorder, xBorder - xMin, yMax - yBorder ); + } + if ( horizontalSmallCount && verticalLargeCount ) { + verticalShape.rect( xBorder, yMin, xMax - xBorder, yBorder - yMin ); + } + if ( horizontalSmallCount && verticalSmallCount ) { + smallShape.rect( xBorder, yBorder, xMax - xBorder, yMax - yBorder ); + } } ); + } ); - // Make the shapes immutable so that listeners don't have to be added - bigShape.makeImmutable(); - horizontalShape.makeImmutable(); - verticalShape.makeImmutable(); - smallShape.makeImmutable(); - extraLinesShape.makeImmutable(); - - // Adjust the backgrounds to fit their respective areas - this.bigPath.shape = bigShape; - this.horizontalPath.shape = horizontalShape; - this.verticalPath.shape = verticalShape; - this.smallPath.shape = smallShape; - - // Selectively display grid lines as a "stroke" over the background - this.smallGridPath.clipArea = smallShape; - this.horizontalGridPath.clipArea = horizontalShape; - this.verticalGridPath.clipArea = verticalShape; - - // Display extra lines, and clip it to fit the active area. - this.extraLinesPath.shape = extraLinesShape; - this.extraLinesPath.clipArea = Shape.rect( - 0, - 0, - modelToViewX( this.areaDisplay.activeTotalProperties.horizontal.value ), - modelToViewY( this.areaDisplay.activeTotalProperties.vertical.value ) - ); - } - } ); -} ); + // Make the shapes immutable so that listeners don't have to be added + bigShape.makeImmutable(); + horizontalShape.makeImmutable(); + verticalShape.makeImmutable(); + smallShape.makeImmutable(); + extraLinesShape.makeImmutable(); + + // Adjust the backgrounds to fit their respective areas + this.bigPath.shape = bigShape; + this.horizontalPath.shape = horizontalShape; + this.verticalPath.shape = verticalShape; + this.smallPath.shape = smallShape; + + // Selectively display grid lines as a "stroke" over the background + this.smallGridPath.clipArea = smallShape; + this.horizontalGridPath.clipArea = horizontalShape; + this.verticalGridPath.clipArea = verticalShape; + + // Display extra lines, and clip it to fit the active area. + this.extraLinesPath.shape = extraLinesShape; + this.extraLinesPath.clipArea = Shape.rect( + 0, + 0, + modelToViewX( this.areaDisplay.activeTotalProperties.horizontal.value ), + modelToViewY( this.areaDisplay.activeTotalProperties.vertical.value ) + ); + } +} ); \ No newline at end of file diff --git a/js/screens/DecimalsScreen.js b/js/screens/DecimalsScreen.js index 2fcae7ee..281e0812 100644 --- a/js/screens/DecimalsScreen.js +++ b/js/screens/DecimalsScreen.js @@ -5,79 +5,76 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const ProportionalAreaModel = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaModel' ); - const ProportionalAreaScreenView = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaScreenView' ); - const Screen = require( 'JOIST/Screen' ); +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import ProportionalAreaModel from '../proportional/model/ProportionalAreaModel.js'; +import ProportionalAreaScreenView from '../proportional/view/ProportionalAreaScreenView.js'; - // strings - const screenDecimalsString = require( 'string!AREA_MODEL_COMMON/screen.decimals' ); +const screenDecimalsString = areaModelCommonStrings.screen.decimals; - /** - * @constructor - */ - function DecimalsScreen() { +/** + * @constructor + */ +function DecimalsScreen() { - const options = { - name: screenDecimalsString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty - }; + const options = { + name: screenDecimalsString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty + }; - const commonAreaOptions = { - eraseWidth: 0.1, - eraseHeight: 0.1, - snapSize: 0.1, - gridSpacing: 0.1, - smallTileSize: 0.1, - largeTileSize: 1 - }; + const commonAreaOptions = { + eraseWidth: 0.1, + eraseHeight: 0.1, + snapSize: 0.1, + gridSpacing: 0.1, + smallTileSize: 0.1, + largeTileSize: 1 + }; - Screen.call( this, - function() { - return new ProportionalAreaModel( [ - merge( { - maximumSize: 1, - minimumSize: 0.1, - initialWidth: 0.5, - initialHeight: 0.5, - initialVerticalSplit: 0.2, - partitionSnapSize: 0.1 - }, commonAreaOptions ), - merge( { - maximumSize: 2, - minimumSize: 0.1, - initialWidth: 1, - initialHeight: 1, - initialVerticalSplit: 0.5, - partitionSnapSize: 0.1 - }, commonAreaOptions ), - merge( { - maximumSize: 3, - minimumSize: 0.1, - initialWidth: 1, - initialHeight: 1, - initialVerticalSplit: 0.5, - partitionSnapSize: 0.1 - }, commonAreaOptions ) - ] ); - }, - function( model ) { - return new ProportionalAreaScreenView( model, { - decimalPlaces: 1 - } ); - }, - options - ); - } + Screen.call( this, + function() { + return new ProportionalAreaModel( [ + merge( { + maximumSize: 1, + minimumSize: 0.1, + initialWidth: 0.5, + initialHeight: 0.5, + initialVerticalSplit: 0.2, + partitionSnapSize: 0.1 + }, commonAreaOptions ), + merge( { + maximumSize: 2, + minimumSize: 0.1, + initialWidth: 1, + initialHeight: 1, + initialVerticalSplit: 0.5, + partitionSnapSize: 0.1 + }, commonAreaOptions ), + merge( { + maximumSize: 3, + minimumSize: 0.1, + initialWidth: 1, + initialHeight: 1, + initialVerticalSplit: 0.5, + partitionSnapSize: 0.1 + }, commonAreaOptions ) + ] ); + }, + function( model ) { + return new ProportionalAreaScreenView( model, { + decimalPlaces: 1 + } ); + }, + options + ); +} - areaModelCommon.register( 'DecimalsScreen', DecimalsScreen ); +areaModelCommon.register( 'DecimalsScreen', DecimalsScreen ); - return inherit( Screen, DecimalsScreen ); -} ); +inherit( Screen, DecimalsScreen ); +export default DecimalsScreen; \ No newline at end of file diff --git a/js/screens/ExploreScreen.js b/js/screens/ExploreScreen.js index d0413e16..8028415d 100644 --- a/js/screens/ExploreScreen.js +++ b/js/screens/ExploreScreen.js @@ -5,72 +5,67 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const ProportionalAreaModel = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaModel' ); - const ProportionalAreaScreenView = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaScreenView' ); - const Screen = require( 'JOIST/Screen' ); +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import exploreScreenIconImage from '../../mipmaps/explore-screen-icon_png.js'; +import exploreScreenNavbarImage from '../../mipmaps/explore-screen-navbar_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import ProportionalAreaModel from '../proportional/model/ProportionalAreaModel.js'; +import ProportionalAreaScreenView from '../proportional/view/ProportionalAreaScreenView.js'; - // images - const exploreScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/explore-screen-icon.png' ); - const exploreScreenNavbarImage = require( 'mipmap!AREA_MODEL_COMMON/explore-screen-navbar.png' ); +const screenExploreString = areaModelCommonStrings.screen.explore; - // strings - const screenExploreString = require( 'string!AREA_MODEL_COMMON/screen.explore' ); - - /** - * @constructor - */ - function ExploreScreen() { +/** + * @constructor + */ +function ExploreScreen() { - const options = { - name: screenExploreString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( exploreScreenIconImage ), - navigationBarIcon: new Image( exploreScreenNavbarImage ) - }; + const options = { + name: screenExploreString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( exploreScreenIconImage ), + navigationBarIcon: new Image( exploreScreenNavbarImage ) + }; - Screen.call( this, - function() { - return new ProportionalAreaModel( [ - { - maximumSize: 20, - minimumSize: 1, - initialWidth: 10, - initialHeight: 10, - initialVerticalSplit: 5, - snapSize: 1, - partitionSnapSize: 1, - gridSpacing: 1, - smallTileSize: 1, - largeTileSize: 10 - }, - { - maximumSize: 100, - minimumSize: 1, - initialWidth: 50, - initialHeight: 50, - eraseWidth: 10, - eraseHeight: 10, - initialVerticalSplit: 30, - snapSize: 1, - gridSpacing: 10, - tilesAvailable: false - } - ] ); - }, - function( model ) { return new ProportionalAreaScreenView( model ); }, - options - ); - } + Screen.call( this, + function() { + return new ProportionalAreaModel( [ + { + maximumSize: 20, + minimumSize: 1, + initialWidth: 10, + initialHeight: 10, + initialVerticalSplit: 5, + snapSize: 1, + partitionSnapSize: 1, + gridSpacing: 1, + smallTileSize: 1, + largeTileSize: 10 + }, + { + maximumSize: 100, + minimumSize: 1, + initialWidth: 50, + initialHeight: 50, + eraseWidth: 10, + eraseHeight: 10, + initialVerticalSplit: 30, + snapSize: 1, + gridSpacing: 10, + tilesAvailable: false + } + ] ); + }, + function( model ) { return new ProportionalAreaScreenView( model ); }, + options + ); +} - areaModelCommon.register( 'ExploreScreen', ExploreScreen ); +areaModelCommon.register( 'ExploreScreen', ExploreScreen ); - return inherit( Screen, ExploreScreen ); -} ); +inherit( Screen, ExploreScreen ); +export default ExploreScreen; \ No newline at end of file diff --git a/js/screens/GenericGameScreen.js b/js/screens/GenericGameScreen.js index 2507e65e..2df4bfa5 100644 --- a/js/screens/GenericGameScreen.js +++ b/js/screens/GenericGameScreen.js @@ -5,45 +5,40 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GameAreaScreenView = require( 'AREA_MODEL_COMMON/game/view/GameAreaScreenView' ); - const GenericGameAreaModel = require( 'AREA_MODEL_COMMON/game/model/GenericGameAreaModel' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Screen = require( 'JOIST/Screen' ); - - // images - const genericGameScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/generic-game-screen-icon.png' ); - const genericGameScreenNavbarImage = require( 'mipmap!AREA_MODEL_COMMON/generic-game-screen-navbar.png' ); - - // strings - const screenGameString = require( 'string!AREA_MODEL_COMMON/screen.game' ); - - /** - * @constructor - */ - function GenericGameScreen() { - - const options = { - name: screenGameString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( genericGameScreenIconImage ), - navigationBarIcon: new Image( genericGameScreenNavbarImage ) - }; - - Screen.call( this, - function() { return new GenericGameAreaModel(); }, - function( model ) { return new GameAreaScreenView( model ); }, - options - ); - } - - areaModelCommon.register( 'GenericGameScreen', GenericGameScreen ); - - return inherit( Screen, GenericGameScreen ); -} ); + +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import genericGameScreenIconImage from '../../mipmaps/generic-game-screen-icon_png.js'; +import genericGameScreenNavbarImage from '../../mipmaps/generic-game-screen-navbar_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import GenericGameAreaModel from '../game/model/GenericGameAreaModel.js'; +import GameAreaScreenView from '../game/view/GameAreaScreenView.js'; + +const screenGameString = areaModelCommonStrings.screen.game; + +/** + * @constructor + */ +function GenericGameScreen() { + + const options = { + name: screenGameString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( genericGameScreenIconImage ), + navigationBarIcon: new Image( genericGameScreenNavbarImage ) + }; + + Screen.call( this, + function() { return new GenericGameAreaModel(); }, + function( model ) { return new GameAreaScreenView( model ); }, + options + ); +} + +areaModelCommon.register( 'GenericGameScreen', GenericGameScreen ); + +inherit( Screen, GenericGameScreen ); +export default GenericGameScreen; \ No newline at end of file diff --git a/js/screens/GenericScreen.js b/js/screens/GenericScreen.js index afda4480..b173b802 100644 --- a/js/screens/GenericScreen.js +++ b/js/screens/GenericScreen.js @@ -5,47 +5,42 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GenericAreaModel = require( 'AREA_MODEL_COMMON/generic/model/GenericAreaModel' ); - const GenericAreaScreenView = require( 'AREA_MODEL_COMMON/generic/view/GenericAreaScreenView' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Screen = require( 'JOIST/Screen' ); - - // images - const genericScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/generic-screen-icon.png' ); - - // strings - const screenGenericString = require( 'string!AREA_MODEL_COMMON/screen.generic' ); - - /** - * @constructor - */ - function GenericScreen() { - - const options = { - name: screenGenericString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( genericScreenIconImage ) - }; - - Screen.call( this, - function() { - return new GenericAreaModel( { - allowExponents: false - } ); - }, - function( model ) { return new GenericAreaScreenView( model, 0 ); }, - options - ); - } - - areaModelCommon.register( 'GenericScreen', GenericScreen ); - - return inherit( Screen, GenericScreen ); -} ); + +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import genericScreenIconImage from '../../mipmaps/generic-screen-icon_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import GenericAreaModel from '../generic/model/GenericAreaModel.js'; +import GenericAreaScreenView from '../generic/view/GenericAreaScreenView.js'; + +const screenGenericString = areaModelCommonStrings.screen.generic; + +/** + * @constructor + */ +function GenericScreen() { + + const options = { + name: screenGenericString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( genericScreenIconImage ) + }; + + Screen.call( this, + function() { + return new GenericAreaModel( { + allowExponents: false + } ); + }, + function( model ) { return new GenericAreaScreenView( model, 0 ); }, + options + ); +} + +areaModelCommon.register( 'GenericScreen', GenericScreen ); + +inherit( Screen, GenericScreen ); +export default GenericScreen; \ No newline at end of file diff --git a/js/screens/MultiplyScreen.js b/js/screens/MultiplyScreen.js index 9651f2b4..97f1c5f0 100644 --- a/js/screens/MultiplyScreen.js +++ b/js/screens/MultiplyScreen.js @@ -5,82 +5,77 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PartialProductsChoice = require( 'AREA_MODEL_COMMON/common/model/PartialProductsChoice' ); - const PartitionLineChoice = require( 'AREA_MODEL_COMMON/proportional/model/PartitionLineChoice' ); - const ProportionalAreaModel = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaModel' ); - const ProportionalAreaScreenView = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaScreenView' ); - const Screen = require( 'JOIST/Screen' ); +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import multiplyScreenIconImage from '../../mipmaps/multiply-screen-icon_png.js'; +import multiplyScreenNavbarImage from '../../mipmaps/multiply-screen-navbar_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../AreaModelCommonA11yStrings.js'; +import PartialProductsChoice from '../common/model/PartialProductsChoice.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import PartitionLineChoice from '../proportional/model/PartitionLineChoice.js'; +import ProportionalAreaModel from '../proportional/model/ProportionalAreaModel.js'; +import ProportionalAreaScreenView from '../proportional/view/ProportionalAreaScreenView.js'; - // images - const multiplyScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/multiply-screen-icon.png' ); - const multiplyScreenNavbarImage = require( 'mipmap!AREA_MODEL_COMMON/multiply-screen-navbar.png' ); +const screenMultiplyString = areaModelCommonStrings.screen.multiply; - // strings - const screenMultiplyString = require( 'string!AREA_MODEL_COMMON/screen.multiply' ); +// a11y strings +const multiplyDescriptionString = AreaModelCommonA11yStrings.multiplyDescription.value; - // a11y strings - const multiplyDescriptionString = AreaModelCommonA11yStrings.multiplyDescription.value; - - /** - * @constructor - */ - function MultiplyScreen() { +/** + * @constructor + */ +function MultiplyScreen() { - const options = { - name: screenMultiplyString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( multiplyScreenIconImage ), - navigationBarIcon: new Image( multiplyScreenNavbarImage ), + const options = { + name: screenMultiplyString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( multiplyScreenIconImage ), + navigationBarIcon: new Image( multiplyScreenNavbarImage ), - // a11y - descriptionContent: multiplyDescriptionString - }; + // a11y + descriptionContent: multiplyDescriptionString + }; - const commonAreaOptions = { - minimumSize: 1, - initialWidth: 1, - initialHeight: 1, - snapSize: 1, - gridSpacing: 1, - partitionLineChoice: PartitionLineChoice.NONE, - tilesAvailable: false, - productsAvailable: false, - countingAvailable: true - }; + const commonAreaOptions = { + minimumSize: 1, + initialWidth: 1, + initialHeight: 1, + snapSize: 1, + gridSpacing: 1, + partitionLineChoice: PartitionLineChoice.NONE, + tilesAvailable: false, + productsAvailable: false, + countingAvailable: true + }; - Screen.call( this, - function() { - return new ProportionalAreaModel( [ - merge( { maximumSize: 10 }, commonAreaOptions ), - merge( { maximumSize: 12 }, commonAreaOptions ) - ], { - initialPartialProductsChoice: PartialProductsChoice.HIDDEN - } ); - }, - function( model ) { - return new ProportionalAreaScreenView( model, { - showProductsSelection: false, - showCalculationSelection: false, - useTileLikeBackground: true, - useSimplifiedNames: true, - useLargeArea: true - } ); - }, - options - ); - } + Screen.call( this, + function() { + return new ProportionalAreaModel( [ + merge( { maximumSize: 10 }, commonAreaOptions ), + merge( { maximumSize: 12 }, commonAreaOptions ) + ], { + initialPartialProductsChoice: PartialProductsChoice.HIDDEN + } ); + }, + function( model ) { + return new ProportionalAreaScreenView( model, { + showProductsSelection: false, + showCalculationSelection: false, + useTileLikeBackground: true, + useSimplifiedNames: true, + useLargeArea: true + } ); + }, + options + ); +} - areaModelCommon.register( 'MultiplyScreen', MultiplyScreen ); +areaModelCommon.register( 'MultiplyScreen', MultiplyScreen ); - return inherit( Screen, MultiplyScreen ); -} ); +inherit( Screen, MultiplyScreen ); +export default MultiplyScreen; \ No newline at end of file diff --git a/js/screens/PartitionScreen.js b/js/screens/PartitionScreen.js index d0b34f93..11dea72d 100644 --- a/js/screens/PartitionScreen.js +++ b/js/screens/PartitionScreen.js @@ -5,83 +5,78 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - // modules - const AreaCalculationChoice = require( 'AREA_MODEL_COMMON/common/model/AreaCalculationChoice' ); - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonA11yStrings = require( 'AREA_MODEL_COMMON/AreaModelCommonA11yStrings' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const merge = require( 'PHET_CORE/merge' ); - const PartitionLineChoice = require( 'AREA_MODEL_COMMON/proportional/model/PartitionLineChoice' ); - const ProportionalAreaModel = require( 'AREA_MODEL_COMMON/proportional/model/ProportionalAreaModel' ); - const ProportionalAreaScreenView = require( 'AREA_MODEL_COMMON/proportional/view/ProportionalAreaScreenView' ); - const Screen = require( 'JOIST/Screen' ); +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import merge from '../../../phet-core/js/merge.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import partitionScreenIconImage from '../../mipmaps/partition-screen-icon_png.js'; +import partitionScreenNavbarImage from '../../mipmaps/partition-screen-navbar_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonA11yStrings from '../AreaModelCommonA11yStrings.js'; +import AreaCalculationChoice from '../common/model/AreaCalculationChoice.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import PartitionLineChoice from '../proportional/model/PartitionLineChoice.js'; +import ProportionalAreaModel from '../proportional/model/ProportionalAreaModel.js'; +import ProportionalAreaScreenView from '../proportional/view/ProportionalAreaScreenView.js'; - // images - const partitionScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/partition-screen-icon.png' ); - const partitionScreenNavbarImage = require( 'mipmap!AREA_MODEL_COMMON/partition-screen-navbar.png' ); +const screenPartitionString = areaModelCommonStrings.screen.partition; - // strings - const screenPartitionString = require( 'string!AREA_MODEL_COMMON/screen.partition' ); +// a11y strings +const partitionDescriptionString = AreaModelCommonA11yStrings.partitionDescription.value; - // a11y strings - const partitionDescriptionString = AreaModelCommonA11yStrings.partitionDescription.value; - - /** - * @constructor - */ - function PartitionScreen() { +/** + * @constructor + */ +function PartitionScreen() { - const options = { - name: screenPartitionString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( partitionScreenIconImage ), - navigationBarIcon: new Image( partitionScreenNavbarImage ), + const options = { + name: screenPartitionString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( partitionScreenIconImage ), + navigationBarIcon: new Image( partitionScreenNavbarImage ), - // a11y - descriptionContent: partitionDescriptionString - }; + // a11y + descriptionContent: partitionDescriptionString + }; - const commonAreaOptions = { - minimumSize: 1, - initialWidth: 5, - initialHeight: 5, - initialVerticalSplit: 2, - initialHorizontalSplit: 2, - partitionLineChoice: PartitionLineChoice.ONE, - snapSize: 1, - gridSpacing: 1, - partitionSnapSize: 1, - tilesAvailable: false, - productsAvailable: false - }; + const commonAreaOptions = { + minimumSize: 1, + initialWidth: 5, + initialHeight: 5, + initialVerticalSplit: 2, + initialHorizontalSplit: 2, + partitionLineChoice: PartitionLineChoice.ONE, + snapSize: 1, + gridSpacing: 1, + partitionSnapSize: 1, + tilesAvailable: false, + productsAvailable: false + }; - Screen.call( this, - function() { - return new ProportionalAreaModel( [ - merge( { maximumSize: 10 }, commonAreaOptions ), - merge( { maximumSize: 12 }, commonAreaOptions ) - ], { - initialAreaCalculationChoice: AreaCalculationChoice.SHOW_ALL_LINES - } ); - }, - function( model ) { - return new ProportionalAreaScreenView( model, { - showCalculationSelection: false, - useTileLikeBackground: true, - useSimplifiedNames: true, - useCalculationBox: true - } ); - }, - options - ); - } + Screen.call( this, + function() { + return new ProportionalAreaModel( [ + merge( { maximumSize: 10 }, commonAreaOptions ), + merge( { maximumSize: 12 }, commonAreaOptions ) + ], { + initialAreaCalculationChoice: AreaCalculationChoice.SHOW_ALL_LINES + } ); + }, + function( model ) { + return new ProportionalAreaScreenView( model, { + showCalculationSelection: false, + useTileLikeBackground: true, + useSimplifiedNames: true, + useCalculationBox: true + } ); + }, + options + ); +} - areaModelCommon.register( 'PartitionScreen', PartitionScreen ); +areaModelCommon.register( 'PartitionScreen', PartitionScreen ); - return inherit( Screen, PartitionScreen ); -} ); +inherit( Screen, PartitionScreen ); +export default PartitionScreen; \ No newline at end of file diff --git a/js/screens/VariablesGameScreen.js b/js/screens/VariablesGameScreen.js index cb1b07e9..6b2f9055 100644 --- a/js/screens/VariablesGameScreen.js +++ b/js/screens/VariablesGameScreen.js @@ -5,45 +5,40 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GameAreaScreenView = require( 'AREA_MODEL_COMMON/game/view/GameAreaScreenView' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Screen = require( 'JOIST/Screen' ); - const VariablesGameAreaModel = require( 'AREA_MODEL_COMMON/game/model/VariablesGameAreaModel' ); - - // images - const variablesGameScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/variables-game-screen-icon.png' ); - const variablesGameScreenNavbarImage = require( 'mipmap!AREA_MODEL_COMMON/variables-game-screen-navbar.png' ); - - // strings - const screenGameString = require( 'string!AREA_MODEL_COMMON/screen.game' ); - - /** - * @constructor - */ - function VariablesGameScreen() { - - const options = { - name: screenGameString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( variablesGameScreenIconImage ), - navigationBarIcon: new Image( variablesGameScreenNavbarImage ) - }; - - Screen.call( this, - function() { return new VariablesGameAreaModel(); }, - function( model ) { return new GameAreaScreenView( model ); }, - options - ); - } - - areaModelCommon.register( 'VariablesGameScreen', VariablesGameScreen ); - - return inherit( Screen, VariablesGameScreen ); -} ); + +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import variablesGameScreenIconImage from '../../mipmaps/variables-game-screen-icon_png.js'; +import variablesGameScreenNavbarImage from '../../mipmaps/variables-game-screen-navbar_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import VariablesGameAreaModel from '../game/model/VariablesGameAreaModel.js'; +import GameAreaScreenView from '../game/view/GameAreaScreenView.js'; + +const screenGameString = areaModelCommonStrings.screen.game; + +/** + * @constructor + */ +function VariablesGameScreen() { + + const options = { + name: screenGameString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( variablesGameScreenIconImage ), + navigationBarIcon: new Image( variablesGameScreenNavbarImage ) + }; + + Screen.call( this, + function() { return new VariablesGameAreaModel(); }, + function( model ) { return new GameAreaScreenView( model ); }, + options + ); +} + +areaModelCommon.register( 'VariablesGameScreen', VariablesGameScreen ); + +inherit( Screen, VariablesGameScreen ); +export default VariablesGameScreen; \ No newline at end of file diff --git a/js/screens/VariablesScreen.js b/js/screens/VariablesScreen.js index 36ccb024..f4ec5c23 100644 --- a/js/screens/VariablesScreen.js +++ b/js/screens/VariablesScreen.js @@ -5,47 +5,42 @@ * * @author Jonathan Olson */ -define( require => { - 'use strict'; - - // modules - const areaModelCommon = require( 'AREA_MODEL_COMMON/areaModelCommon' ); - const AreaModelCommonColorProfile = require( 'AREA_MODEL_COMMON/common/view/AreaModelCommonColorProfile' ); - const GenericAreaModel = require( 'AREA_MODEL_COMMON/generic/model/GenericAreaModel' ); - const GenericAreaScreenView = require( 'AREA_MODEL_COMMON/generic/view/GenericAreaScreenView' ); - const Image = require( 'SCENERY/nodes/Image' ); - const inherit = require( 'PHET_CORE/inherit' ); - const Screen = require( 'JOIST/Screen' ); - - // images - const variablesScreenIconImage = require( 'mipmap!AREA_MODEL_COMMON/variables-screen-icon.png' ); - - // strings - const screenVariablesString = require( 'string!AREA_MODEL_COMMON/screen.variables' ); - - /** - * @constructor - */ - function VariablesScreen() { - - const options = { - name: screenVariablesString, - backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, - homeScreenIcon: new Image( variablesScreenIconImage ) - }; - - Screen.call( this, - function() { - return new GenericAreaModel( { - allowExponents: true - } ); - }, - function( model ) { return new GenericAreaScreenView( model, 0 ); }, - options - ); - } - - areaModelCommon.register( 'VariablesScreen', VariablesScreen ); - - return inherit( Screen, VariablesScreen ); -} ); + +import Screen from '../../../joist/js/Screen.js'; +import inherit from '../../../phet-core/js/inherit.js'; +import Image from '../../../scenery/js/nodes/Image.js'; +import variablesScreenIconImage from '../../mipmaps/variables-screen-icon_png.js'; +import areaModelCommonStrings from '../area-model-common-strings.js'; +import areaModelCommon from '../areaModelCommon.js'; +import AreaModelCommonColorProfile from '../common/view/AreaModelCommonColorProfile.js'; +import GenericAreaModel from '../generic/model/GenericAreaModel.js'; +import GenericAreaScreenView from '../generic/view/GenericAreaScreenView.js'; + +const screenVariablesString = areaModelCommonStrings.screen.variables; + +/** + * @constructor + */ +function VariablesScreen() { + + const options = { + name: screenVariablesString, + backgroundColorProperty: AreaModelCommonColorProfile.backgroundProperty, + homeScreenIcon: new Image( variablesScreenIconImage ) + }; + + Screen.call( this, + function() { + return new GenericAreaModel( { + allowExponents: true + } ); + }, + function( model ) { return new GenericAreaScreenView( model, 0 ); }, + options + ); +} + +areaModelCommon.register( 'VariablesScreen', VariablesScreen ); + +inherit( Screen, VariablesScreen ); +export default VariablesScreen; \ No newline at end of file diff --git a/mipmaps/explore-screen-icon_png.js b/mipmaps/explore-screen-icon_png.js new file mode 100644 index 00000000..15b54596 --- /dev/null +++ b/mipmaps/explore-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 916, + "height": 623, + "url": "data:image/png;base64,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HULcOAPi1jEqBdtgA+L2MCBuiKBtWo4cPcLSoUOsrj5HVVdgBsKoFGyDDYibZ0DcWgaJLeYKBsTVDIjdYowkMK/AgJgLgW2EuH0MiFdmQGwR2FAJ3v3e9yKJiLhWTUTsSyeXQcym6aAziJBE25qHHnqID//EP2LcNIgvIMDsEBPmagLM9QkwExJgQGCzRQKbLQLMhIQkbIMNAsz1iQkzIcBMSGCzRUwYDEhcJrDZIsBcTYC5iiSQcNdxFTFhJgSYHRJgMCBeIrBBgHllEthskQCDAQkB3/it72NjY4O6rmnblqPHjvHQQw+hUrCNeIl4icDmKgLMhJgwIAFmiwEB5moSYDA7JMDYUFWFrjPYXEVMmB0CzA4xYSbESwQ2WwSYCYkJg9khXiKw6UkCia7rkJgw1xKXCTCYVybAgAAzISYMiAkDAswOCWy2larQdQYbJMBsMSDATAgwOySw2SHAIMDsEJcJbLYIMCCBzRYJMJiXqRR6XdchMWGuJsDskMBmi8SE2WImBJhXJybMhAADEpKwDTYIMFcTYEACmy1iwkwIMBMSYLYYkMAGAQYkwGBAgJkQYCYkikRnA2aLmU4CGySwuYa4TGCzRQKbLRLYTCVhm1IKS4cOUUrBNpKIiB01EbEvjRswIMBcTYABAeZaAiTiCvVoxPHFEWJ4zIQYFjMhhuPEXV+JzcskKAyHATE8ZkIMjwExPGZCDI8BMTwGxPAY6AxdZyLiWjURsS9JICbEtcSEiBvRdR1dR+xxEpeJlxkaTETEq5FERFyrJiIiXpUkYh8SCBERERGzKURERERERETMoBARERERERExg0JERERERETEDAoRERERERERMyhEREREREREzKAQERERERERMYNCRERERERExAwKERERERERETMoRERERERERMygEBERERERETGDQkRERERERMQMChEREREREREzKERERERERETMoBARERERERExg0JERERERETEDAoRERERERERMyhEREREREREzKAQERERERERMYNCRERERERExAwKERERERERETMoRERERERERMygEBERERERETGDQkRERERERMQMChEREREREREzKERERERERETMoBARERERERExg0JERERERETEDAoRERERERERMyhEREREREREzKAQERERERERMYNCRERERERExAwKERERERERETMoRERERERERMygEBERERERETGDQkRERERERMQMChEREREREREzKERERERERETMoBARERERERExg0JERERERETEDAoRERERERERMyhEREREREREzKAQERERERERMYNCRERERERExAwKERERERERETMoRERERERERMygEBERERERETGDQkRERERERMQMChEREREREREzKERERERERETMoBARERERERExg0JERERERETEDAoRERERERERMyhEREREREREzOD/A8nhSHfqng4KAAAAAElFTkSuQmCC" +}, { + "width": 458, + "height": 312, + "url": "data:image/png;base64,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" +}, { + "width": 229, + "height": 156, + "url": "data:image/png;base64,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" +}, { + "width": 115, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 39, + "url": "data:image/png;base64,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" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/explore-screen-navbar_png.js b/mipmaps/explore-screen-navbar_png.js new file mode 100644 index 00000000..4e4c832c --- /dev/null +++ b/mipmaps/explore-screen-navbar_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 306, + "height": 208, + "url": "data:image/png;base64,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" +}, { + "width": 153, + "height": 104, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJkAAABoCAYAAADiklIGAAAAAklEQVR4AewaftIAAAOZSURBVO3BXUjddRzH8ff/yw9h4FwrLyocbQwUb3q4WfQA0eAYItFNEl0GsyfwJo+2QTUUTiAWCj2wrIsygj0woth6gPRET45Ro4seqDTdsTZrPiWOHcXjiS6CLkbtoq//c358Xq/k4vpGGRFHhogzQ8SZIeLMEHFmiDgzRJwFUvbS0BCl0joeFhYWCSFQV7eV2GytreWhRx6lGgRSVt4osb+nGw9JkjAwMEA2myU2+bExqoUh4swQcWaIODNEnBkizgwRZ4aIM0PEmSHizBBxZog4M0ScGSLODBFnhogzQ8SZIeLMEHFmiDgzRJwZIs4MEWeGiDNDxJkh4swQcWaIODNEnBkizgwRZ4aIM0OiVSzC7CypMyRKn34CbS0JP3xP6gISlYmf4IVBeG04oVIEJArzc/DWm3CgO6HSBKSqFYvw3gl4+kDC9BQVKZCyiysrFAoFvCwtLVEoFIjN/PwCp09B38GE/CgVLZCyL8bH6evrxUsulyOXyxGX+6mpOcjaWkI1CKSsubmZnu4sHlpaWujo6KC9vZ2YnD27h87ObVSLQMoaGhrIZDJ4aWxsJJPJEJv6+jOc+vIW+nMJlc6QqrStbolnemH8qzKtbWUqmSFV7cab4PBxOPp2mZ27qEgBqXohQNu9cPudZY4dhv3dCatFKkZAorF9Ozz8GNzTWmbwOXj1UEIlCEh0btgJQy/CAw+W2bKF1AUkWrfdQUUwRJwZIs4MEWeGiDNDxJkh4swQcWaIODNEnBkizgwRZ4aIM0PEmSHizBBxZog4M0ScGSLODBFnhogzQ8SZIeLMEHFmiDgzRJwZIs4MEWeGiDNDxJkh4iyQsrkLc+TzeTzsvQomJibJ5/PEZmpqilvvuptqEEhZZ1cXpVKJ/9vGWpEn9tzMdfe1cXVTM7HZ1dRMtQik7Jr6ejwU3j1Ccu5r/hgZoun190lCQNJhRGh1/nemn32cv1z6ZpRfPzqBpMeI0NSRN9goLvK36YEsa4tzSDqMyCz/+C2zw0/yT+vzPzN9bARJhxGZiZcHuJzzw0+xMj2BbD4jIr99PsbyxyNcTnm9yMSh55HNZ0RifWWZyf4e/s3SB69w4fRnyOYyIjFz8jhrhTP8l8mhXjZWi8jmMSJw6fwMM4NZrkTxu1F++fAdZPMEInDu5FFqrt0B7OBKzI70c/3eVkJtHeIvEIHd+7rYva8LqUyGiDNDxJkh4swQcWaIODNEnP0JKwfgICM90LoAAAAASUVORK5CYII=" +}, { + "width": 77, + "height": 52, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAA0CAYAAADPJLW5AAAAAklEQVR4AewaftIAAAIWSURBVO3BTUsUARjA8f88juW60AvsImj04jeYIko8CJ2joDp58OwXCKJDBBEoQRQd6hBBBJ3qYEIQ08tlukTQ0nmj3LRg02yscWmddToFdZuH2RlYfX4/J4o3E4yGLxg1wai5ZPS+VgMS0uh0NnEcBxGHIgyP7KNSrdJtLhntFPC8w6Th+z6VSgXP8yhC/dMCeRCMmmDUBKMmGDXBqAlGTTBqglETjJpg1ASjJhg1wagJRk0wasI2UnsHy9/ITNgGlhbhymUYP+rQapGZS0ZRFBGGIWlEUUSpVCIMQ4rwfSXm+Qu4eN5hdZWucclobm6OIAhIo16vUy6XCYKAvK2vDzMzc5aNDYduc8locnISz/NIw/d9KpUKnudRhIkTi8zPD3LzukM3CVvYgYMdrs7CyyDh5KmEbnHZ4hwHjh2H+w/h2dOEvj4yc9kmBgbg9Bm6QjBqglETjJpg1ASjJhg1wagJRk0waoJRE4yaYNQEoyYYNZeMms0mjUaDNJabTeI4ptFoUIR2u00eXDI6MjZOkiSkMbq2wp7RQ5R276UIu6o7yINLRoPlMmn8WvrMyp0LtMbOMXLjLtLfT68SCvLh3m3YbLH++gFfg1f0MqEAy7W3rD6e4a+P1y7R/rlGrxJy1mn/pn5rln/FX96w8OQRvcolZ+3wB/unpmFqmv84kHRinD6XXuOSs1J1iNLEEFuJYNQEo/YHhHuTDRbF/+8AAAAASUVORK5CYII=" +}, { + "width": 39, + "height": 26, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAAAAklEQVR4AewaftIAAAEvSURBVM3BwUoCQQCA4X+mYd0pLNesUUiiZwhPRdALRJcOvUsP0Dt06VB0CoKil/AYSLeWLu4KWpJRgrbRbfEyOwdtvk98Tn4y/HSusOilKbOyLAMBAoGLIAioRBFFKSz0ksAYQ14cx2itMcbgYvA+xIXEYxKPSTwm8ZjEYxKPSTwmWbDxGB4fYPSBlcKi3W4TRRF5SZIQBAHVahUX3cRwfbPK3a2g28+wUVi0Wi2MMeTFcYzWGmMMLpJ0yAR47mQUoVigoARHx7C3D6UQK8U/WK9RiMRjEo9JPCbxmMRjEo8pLEZfY6Zpj7xh0uW7vMYUgYsMCMsUprBoNJvMer28QGzvUDk5ZZ4UjvqdJwZXZ7yFWzQODlkxdeZF4Wh5s87u/Qt/VBgyTwpHurbBovwCoSRGpVwMZswAAAAASUVORK5CYII=" +}, { + "width": 20, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAAAklEQVR4AewaftIAAAC9SURBVK3BMU7DQBBA0T+7YxmWoYAOl+QSoCinQJyAi6IUHMX1ImdtR1gY0cHgCIH8npTpfeaLcjjwGwmBlBILnhTnPApmRs4ZVcXM8IZxZGZZYGWBlQVWpjht25JSous6YoyklPD6Qdi/NDw8Ql3zjeI0TYOZkXNGVTEzvNKP3G5AhB+UfwgB7u5ZFFhZYGWKM4xHZoS+FLSqmBG8t2nirKpZojgXV9d8et0/U9kltt3hRU5TTrjZ7hAR/uoDFV0ubvPTG6UAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/generic-game-screen-icon_png.js b/mipmaps/generic-game-screen-icon_png.js new file mode 100644 index 00000000..080a13ac --- /dev/null +++ b/mipmaps/generic-game-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 916, + "height": 623, + "url": "data:image/png;base64,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" +}, { + "width": 458, + "height": 312, + "url": "data:image/png;base64,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" +}, { + "width": 229, + "height": 156, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOUAAACcCAYAAACA5GwfAAAw3ElEQVR4AezBB2CdBb338e/veZ4zs5ukSZume9JNgQ5ooWwUkFGgIBdQUK9YvYBwEZHNVRFQwIHKFCkVZIiCyi6jZbW00EVbuneb2eycc57/6ylvMISmpDvB8/moOu4bKSkp7UW1Q0pKSrvikJKS0q44pKSktCsOKSkp7YpDSkpKu+KQkpLSrjikpKS0Kw4pKSntikNKSkq74pCSktKuOKSkpLQrDikpKe2KQ0pKSrvikPIfwcwAw8yojzdgZiSZGSl7RiwWo7RkC2bG7vBI+Yylm5fx3Io3MHaCGecM/Qq5aTm0N2bG4s0f8cLy13h+0yxWN1ZS4EYYmzuE43scxsHdR+C6HkKk7JqGhgbuvP1WotE0plxyKbvDI+UzKmvK+OnKZ6nAaKsMP8bpA4+nvUn4CabOfZIrljxKjUTUDCPBer+e2Ztm8tuNM/ivpcO5+rDvkR3NRIiUnRNrbOSO225lYNGv+HD9d9ldHimf4bkBDo8WYxg7UpWo55X6zSAYEepMeiiNdsWMZz98kcuXPEpM4qLswZw/+HQKMguoa6zjjVVvccnSP3Nv+Qf4b9zJLUddRcANkPIxM0MSO5JIJPjtb37FwQN+zdETo1z8w5WAAWJXeaR8xvDuw/lj8XAQ/2aA+IT5Pne9eR9vrH2BrvL45firyAin056U1VVyzfwHqZO4MHsIPz3qSkJuCEkk9c7tTnY4i6/Pu5eHyz7grLUfcEj3A5HEf7ra2lrmvT+X/gMGkNOpE2YgieZ832fqQw9SnPUzTjgmjXjCKC/dwu7ySPkMISQ+TXzCzHh+6Wv8eM3zeMDPR36LPvk9EaK9MDPmrJvHOosTNp+Lhp9FyA0hiSaSOLrfBLIXPMgmSzB7/TxG9ziQFHAEP77pBgpzPiS/eDLHHX8cgw4YQl7nfMzATySYNvWPhBqu5ozJUSSQwHNr2F0eKTvFzFhbuYEr3v89DRLf7zyWY/qOR4h2RZATyeSG7l/iw8oV9M3rhSRaCnthhgRz2dSwmXV1JYBob8wM833WrFlFbXUNWdk55Bd0xvMCSGJvCIUj/Pd3vkt64puMHPooc+c/zK9vgYqGUxh/+AQWLVzE8F6/49TJUVxHJDkSGWlxzEBil3mk7BTffH4960FWWJz+CvCtg/4LOS7tjRAji4ZxYNEwEGBie6obq3m3YTMCeqYXghlI7E9mhiSaVFVt5a6f/YTyWX8iEnCoixkNGf2ZcNp5TDzqaPLzO4PEniSJwyZM4AffLeKIw0o5akKYow6HrVufZcWqpxnVR/TvE0XiE44LWekbaKivJxyJsKs8UtrMzHhn9XvcX/IeQYlrDjiXgvQ8RPskiU+ITzEzfPN5bN7fqAPSzDi0+8EYIPY9MyMej7F65UqWLlnCyuXLqSkvZWtlOSVrV9LbWUR2fhAJDJCtZNXT13PN/T/muG9dz5dPOplAMIgk9pSM9AzGTryY+YuuYcSQEAKyMl2GD3URrbBaEok4u8Mjpc0aE438/P0/UitxRDCX4/pPRBIdhZlR21hDTWMdK8tX8/ji57i/9D0CwG0DzmZQQX8ksS+ZGY0NDbw6/WWe/eM9hCveJzfdJRwQYUeEgc4hMIT4mPgXGdGgGFIYZ8G0H/D2qy9x6dXX0bmgEEnsCQYcceTRTL37ckYODdFEtM6skrLSMqJp6UhiV3iktImZ8ebKWbxat54I4pIhZxMJhOlopr73Z65f+RSNClEvcIB7Bp/PmUO+jCT2LWP1qpXccdM15Ja/Sf90D8sNIJIMMJqI7ZOM7DSX9NKXufZbi7ny9nvo3bcPIHaXJIq6FVHLN9iwaRpdCjx2yOCbF2Ryx/99mcOOu44TvnQioXAYSewM94fXXnc9KZ8r7if40cw7WRCvYkwwhytGf4OAG6AjcQRTP3yWQidCn0Amy2MVOHJ4ffMcvOpahhQMIOgG2BfMjCWLP+SW70xmQGgF0ZCDb7BgTQ0ZYZeAJ9pKgOtAfrCKJx5/hiFjjiQ7JwdJ7AmhcJgl86cxaEAQiR3K7eRy7JExNq15hp/d9jZFxX0oKOxCkiTaoNH94bXXXU/KDpkZCzYu5qaPnsaVuHHQ2QwpHIgkOhYxvvvBnDHwS5w64Dgu7HUMufUxXqxcxmtbP6KxdAPjexyCI4e9yczYtHEDP/7OVxmWX4HjgCEWrKmhU3qA3IwAu0KCztEGnnz6ZUZPPJ609HQksTvMjAfvvYfjJswnt5OLxA5J4Lqid68ARxy6npf++RD/eKGGAQMHkpaWjiQ+R6NDyucS8OLy16iWCJsxruchSKIjigYiSA6OHPLTc/numK9xVfExxIHfbn6L99fNx8zYm/xEgt/cfgsH5JQigQGbKhoIBRyKOoUAo7nlm+ppjNMmjuCAjA3cfuM1NNTXszvMjPffe48eeffQr08QiTYTkJ3p8t8XpnP0IfdwypeO5fVXXwWMz+OQ8rmqG2u5Z/10kr5WMJb8tFy+KBzH5czBJyFLUCvx7rr3kdhrzIz3Zs/CX/I3PIdtfB8Wr6+hb2EUMJozg5qGOGtL6zGjTTwPckqm89i0qZgZuyoej3Hvb+9g0leiSLSZGVRWJXj5tXouubKGv79xPtdcfzNdunYBxOfxSNkhM2PJ5mWU+XGiEkd1H0NHYWYIgQwQrSnMyKezG2Gt38jymo2A2HuMJx9+gKKsAJJhwJatjfQpiCKM7fEch9VVYXp1FmB8HgGZEZfZ025k7GHj6duvP5LYGWbGzNdf54TDX6RTThpttXZ9nH++WM+b7x/LaWecyw9+fDA52TkYbeeQskMCPti8kFoJ1xIMKhiIJNo733z+uvA57nzzXu5+Zyo7YmY0WIKkiBNgb1q7Zg0Ni/8JGNsYrC9voHNWEInPEgQDDhMPPYjSqhhtZ/QpCPPQb3+F7yfYWVsrK3nkgZs44ZgISWZsY2ZUViUoKU1gxifM4LWZddz2+1MZPv557vrtAxx5zLHk5HQCCUlIoi08UnbIgNc3zsWAo9N7k5/WiY7AlXhn4/vcWTKLwQpw7vBTyAil05JhrK5YR7Ufw5FDv6zumBmS2NPMjA8XLqQgO4jENpJIJIyA6wBGSwLCAZeDDujNvbPfIS9DIMP4F2MbiW3M2EZiG9eBxJJnmPf+1xg+ciSSaItEIsG9v/st509ewqbNHpu2xFi7Ls7SZXEWLu1D56LD2LRhCT+75gO6FnpIbOP7DqefNZkhw4YhiV3lkbJDVY01PF/1EUgcmjcU0TH4Bkd2H8tvS2ax1GK8tPQ1vjL4BCTRXDyR4KEPHqdRDhEzRhcfyN4iwYIP5pIWcgCjScATEttlBq4DkVCQ4SMPpmbtu9Q1+tQ2JKhr9GlM+MQTRlIo4BB0RXrYIyPsEg25dMkO8tfHHmH4iBEg8XnMjBmvv8rTf3mK9etOY+jQYRR1707vkUWMOb4z2dk5BIMB1qxZw/XXncrtN5WRmeGQtH5TggN6pCOJ3eGRskMl1aU04BPGpWd2NwwQ7Z8kxvU8mGMXFfG3unV8Z8GDpIfSObz3WAJugKSSmjLumz2Nu7a8QwC4tseX6ZvXC0nsDWaw/P13GODyKXWNPmYgiVjCSCSM2kafhrjP1ro4lY1RPM9lwkGDmB0NU1yQS252OhlpYaLhEE3MjPKqWmYvXMG015czccKhrHx9Ko2r/8TaNd+lW4/uCLEjkhh32AReevV1gsEAvvEJSSQZUNStmK9/53f8/FfH8aMrsvA8sWCBz8SvdGV3eaTsUEVNGQE8zIzCtDwk0VGEvTC3jL+csldu5O1YOZNn38WY+VMZktWX6lgNr1QsYh0+rhmXFB7KhQedjST2lliskXjJR1hnQ2IbMyM3I8jMJeU0xIwDhh3M8CE9yIiGyclKJzs9QnZmGp7rYAZdD88hSRJJpRVVvD5nMZ0y0xg9tC+FuVn4vnHgAf248vqb2Lz5u/zt6ad595236da9O4jP5XkeSQZIbJckRhw4ipUr7uaJv36P006K8tHaMWTnZLO7PFJaZWZUNFSDNWCWIBrOoCORRHF2EVOP/Ql/mPs4t619npkNpby7pQwfSJjPuFAu3ztgMkf1nUDA9dibaqprsMZyIEoTCfoVRujXJcqmika+dNgI+vfsQlJDY4zX3vuQiq21HDKkDz275oFEc4tXbuCoQwZTWV3H/I/WcOCgXqxYvY6t1Qli8Tj5nQv42kXfoK62lj1NEiefeho/vnE+gX/+jlGjD0dy2F0eKa2TGN97DMt6TCMp6IXpaCSRm96Jyw79JhfUncna8vVsbajCczw6p+dRnNOVgBNAEntbIh4n4Hm0JIFh1Md8sjKiSAKMGXOXMLx/D3Iy01izsRQkWho7vB8Ll69j3eYyjh49hKTK0k3Ea0pprG/ASw8giWhaGnuD63p899JLOW/y23zr270xMySxOzxSWiUg4AYIuAE6MiEQ5EZz6BTNBgMEQuxLcoTv+2yXQX2jj+s6fEwcNXoIr85axKbSSiYdM5rtkcR9T03n2Vff4+X7fkRhXjaxeJzMiMumzZvolZ7O3paVlc1Pbr2V8vJy9gSHlP8oQkhCiH3NCwRI+MYOiU+554mX+dEvH2VTWSXbZXDQAb3ISIsQCQVxHYcevfuRHvFYu2YNZsbeJonBQ4dy2IQJSGJ3OaSk7CPp6RkoUkBrJMD4lMF9i0EgPssMEJx13Fie+dUV5GSlY2YMH9AT3/dZvHA+Yl8RIPYEh5SUfcRxHDK6DUYSnyGIhlwaG+M0MTO+c9bRPP/bH1KQm0Vz8USC9ZvLMDNc16EwLxsBkuiSn0N1fZz3X32ORCJBR+PQgZkZSWaGmWFmmBlmhpmRZGaYGU3MDDMjycwwM8yMjxlmxjZmfMIMM7YxM8zAzDAzkswMM8PMMDMMw4xtzAwz498MMyPJzDAzkswMM8PMMDPMDDPDzGjOjM8wM5LMDDPD+BczmpgZTcwMMyPJzEgyM5LMDDMDjCZmRpKZYWaYGc2ZGW0lQfHAofhmtCQgHHAoqajC+JgkMtOj9CjKRxLNOY7D82/O48W35lO+tYbmcjKi1DcawYp5rF27BjA6Eo8ObP26tbzy4ot80fnmY2a4jkt7k5aWximTzkASn8cM+vbrz7y3jWhItJQRcVm7qYxh/buDRBPxWY7E6UcfzC8e/geHjexPVU09oYBLMBgglkjguVCQFWDue+/RvUdPJDoMjw7KzKisrOSZp57inK+egxlfWO+/P5fly5dz6qmn0Z6sWb2ad2a+ySmTzqAtJFHcowcz6n2iIZeWwgGHuQsW86XxI2jJzKitayDhGxnpETBja009F591DOFQkDkfrmTRivWcc8I4NpVUEg26pIUcXn5qGiee/BVcz6Oj8OigJJGUk9OJyZMn00RiGzOQ2C4zkNjGjG0kdpsZ20hgBhI7xQwkAUYTM8jKyiQajXL22ZORaIX4NAMEGP8mwPiYAAOEmSGJjxmtMWMbCcxg1qxZLPloGTujqLg75bVQkAkSn2JmxCpWsbmskoLcbJqTxD1PvsIBvYuYeMhgAp5Lt4JONMbivLdoBR+uWM/px4wGidkLl5OXEcAwImWzWfzhIgYNHoIkOgKPLwhJNCfRKolPSOwxEp+Q2GkS/5/4N+PTRNuIj4lPE/8mkiTxb6I1Ep+Q2CVZ2dmk9T0c1cwAjOYkKM4N8/YHH3HSEaOQRHPfmXwsS1dv5KmX3mVrTR1J2RlRhvYr5uwTDkWCTSUVLHz/TQ4oCiOMrtkBnn3qCQYNHkJH4dFBGUZLZoYkPo+ZIYm9wcyQRErrxhx5PMueeJ1IULQUCTrMnPkGRxwymMy0CM0FPJdBvboyqHcRDiCJsspqopEQjiMSvs8jz7xG/4IQwkhyXNjwxgMsW3o2ffr1RxLtnUMHJURLkmgLSewtkkhpnSRGHXII68pjmPEZktEnD16Y+QGY0ZIkBMTiCZ557T1mvL8E3/fBjFdnLcLZuhTP5RMCeuaH+MPdvyQWi9EROHRQhtGcmWFmNDEzWmNm7C1mRsqOFXfvQfbISZixXWkhl7nvvMqaTaUkmRkteZ7LCeNH8qXDRhAKBVi8aiMvv/AsnTODSGA0EfWNxqp3/87C+fMxM9o7j47K+BRJmBltIYm9RRIpn++Mc8/ngSsep0deEIlPkYz+XcJc+4s/cPThYxg9pA+9unXGkUiSxDbGNouWrePeh//MAYUhyqrjNMR96hqNWuXQZdgRjBw3gfNGj6awSxdAtHceXyCSSGn/JDHwgMEUHPZ1Ygv+SNATzRnC941O4QYKc7Ooqq3nkWdnEI0E6VXUmfycTELBABVVNby3ZAPVmX049hvXUVBYSEZGJjnZWWRl55CZlUUkEsY3kERH4dFBSWJHJJHSfknivAu/ybXnP8mQznUgw3xRWh1nUyyPQ075OpMKCum05W369+jCyIE9aWiMsam0ko0lFdQ3xlhFN75+9Q9Iz0jHjE9IookBEh2KR0rKfiCJ/IICTv7uTTx/1xQavc70HX8KJxwxkSFDh5GWlkZZaSlv/fEVmoSCAbp3yaO4MBdJLH1xCZFIBN/3aWhoYMvmzcRiMfxEAtd1CYZCdOrUiXA4guM6mPEJSbRXHh2WkdKxmBlJwqirq6OkpJTi4mJ6HjeFgQMHkZGRge8bK1euIDMzk3Vr1tApKw1JNCcJM+PIA3L42fU/ZPHyVQzt8ibjR5WRl2N4jhGPibUVYm65qGw4mvrAMDI796eouDt5efmkZ6STmZlFWno6SZJoHwyPDkuktH9mhoDq6moWf/ghSxbOoW7TDDoFn6Uwr578XOO0YZAW8pADtfU+896P8+4HDptLi7jyvG9iZkiiOUn06JLPhQU+f6r/O4HQBsYd6OCJbYx/E3/H9Hdq61zKKjzKliZYWe4w7bnBHHfGleQXFNK5oDOdO3cmGk0DCUnsH8IjJWUv2rB+HS/+42nStt7NqMGrOHtUnHDAx/g3kRSnSZ9uEHAT1Nav5MlXp3HIAcfTv3shSZJoIoHnCMdJZ0BvsbUKOmWyjfg0GaSFE6QVJuhWyDabS2KMCCxn80dzWf5eDS+t20JtRm8uuPh/yMjMQhL7g0NKyl5i5nPTDy/j1KFXcM6XlzKgZyPhgE+SAAHiswR8+QjRORe6dfmAuHMbD//9GeYuXkVldS3xRIJEwqe6rp7n3vyA8YfMYdlKIz2NNhEfEyItEqZn13xGDOjBqUcexFcGR5n24H1I7DceKSl7mJlRU13FU39+lCP65fCX5ztz0ZkbEG0n4PCDxcp14snnExx7+HTCoVdZssLYXNINKUR6+lpGjmhgznyfo8Y6BFw+YYDYsYbYVmLxBK4jJJGUHg0TKn2fuppaImlp7A8OKSl7kPk+c2bP4r7/+1/G5ZRy9JghZEVOYtkaYewcAT2L4H/Oc4nFjBdnJKipMwb2XkOfHh9RW1fHnAU+JxzucEAfEB+rqoUt5WB8vg1byimtrKa5/Ow0Kqu2sr94pKTsAWZGbW0N0/7wAD0SK/nqUYNxHJF0yODe/P2Nnnz77BXsLAGeCwcPFYcME7X1UF0LrgOHHigCHp8RDMDvH03wvf9yCXh8wvi0hsZ0Xnp7Pud86VCaM8BzPfYXj5SUPaC0ZAv33X4zpx7chbysniDRJBDwcP2xbK1eSVa6sSvEvxhEQxANsUPBAJx4pMubc43xB4u6OoeS8gDlW42aWlFZ7bGxrIgX5xUxeWwRAc+luS3lVUSjEfYXj5Q2MzMk0dGZGUmS2BOqqrbywG03cO6EPoRDAZBoThJD+3Zn0Qoxeqgh9i4B/XrAX54X89b9FxnFE+nevQc5fXPIi0bpm51NMBwh+JcnGZy2Hkk0kUSNk000msb+4rEHJOJGTVWMYMghFPGQ+HxmJOJGfV0cCUIRD8cVkmhPzIx4PM66devYsmULiUSCSCRCly5dyMvLQxKSaO/MjKqqKtatW0dlZSWSyMnJoaioiGg0iiR2hRzxl0f/xKRxPYiEgzRnxr8YkijMy+b1+VEOGVJN3Be+CRDNOfLxPMAMsXsEjDswQP7YH9KjZy+SJNHETyRYO28mE48cSHP1DTFy+wzDALF/eOwmM2PG82t46IpVnHl9N46Z1BMQrTNKNtTx4lOrefvJMrauS5CU2y/AuNNymXhyMZk5ISSxvyUSCV566SXuuOMOpk+fTiKRQBJJkrj44ou56KKLGDhwIJJoj8yMsrIyHnnkEX7xi1+wYcMGzAwzw3EcevfuzaWXXsoZZ5xBZmYmktgZWysqia16h8xeI2hpw5ZyNpRWMKJ/d554dT5zVh1KQ9YE4hYmGEknOzsb13VJisfjlG7ZyOoPHuagAe9y5BiRlQFi1wgYOgCemzObHj17IYnmSkq2UJxpmBmSSDIzVm3YwqCRE9ifPHaDmbFqaSXTrl+N6wqxY2bGRwvKueviRTSWG4YhF8yHypUx/nH7Jt54ooTLfjWYLt0zkMT+Eo/HufPOO7nuuuuoqakhIyODk046ifz8fBYsWMA777zDz3/+c+69916eeuopJk6ciCTaEzNj/fr1XHjhhbzyyitIYsCAARx88MH4vs/MmTNZtmwZU6ZM4bnnnuOXv/wlBQUFSKKtYrFGAk6U7emSn82Wiq1c/cvH+M5Nv+TsbsXk5eUBwsxoSYKH73cY3X8W9z/h862zHNIi7LLsjBglHz0HdjpINDEzVixfTu+izkiiuXkrNvNfZw9EEvuLx64yY9XSSu6ashC/FnDYITMoL6nn1/+ziMYyI6efx1ev6k2vAVkk4sb8WVt45MbVVK1I8KsrFvGj+0cSTQ+yP5gZzz33HNdeey2xWIyLLrqIq666il69epEUi8WYNWsWU6ZMYc6cOZx11lnMmDGDfv36IYn2Ih6Pc8MNN/Dcc88RDAb5zW9+w6RJk8jIyCCpoqKChx9+mB/84Ac88cQT5OXlceeddxIMBmmrTrl5VKUXE4vHCQYCNCeJYf260+2CTvzlsT9w/iU/xAwkkERLZsbAwcOprgjx9UkNuC67xQy6ZTxKefktdMrNpbkVHy3liPwsmqutbyTSazSRSJT9yWEX+L7x9isb+Nl586lZ79MWwvjnoyup22x4mXDJXUMYcnA+6VkhsnLDjDu2G9/7zUBwoPTDGG88tw4zo1XGZ5gZbWFm7EhDQwO33nortbW1HHTQQfz0pz+lV69eSEISwWCQsWPHct999xGNRikpKeGxxx6jPTEz5syZw8MPP4znefzkJz/hggsuIDMzE0lIIicnh4svvpjrr7+eQCDAww8/zAcffICZsTNO/eoFPDF9HomET0uS6JSVzlcP68HU265m9aqVmBnbI4k+/fqxdFUaWekQDrLb+vU0Vq9aiZnRxBGUrlxIMODRxMyY+f5SJh57HMb+5bATzIwNa6r4/c3zuO9/lpGogaxeLrh8rq0Vjbz6QClJx3yrgMJuaUiiiST6D+vEoRfkgMFz928k3ujTKvEZkmgLSezIsmXLmD17NsFgkClTptCpUyck0ZwkRowYwde+9jWSHnroIRKJBO3JjBkzqK+vJxQKccYZZ+A4Di25rstZZ52F4zjU1tayYMECdlaXrkUcd+EPmPbSB9Q3xDAzmpNEOBTkq0cN5S+/voGVy5djZmxPTqdOrCo/BondJqB7F2PFsqU0V1tbS1qsBDOjSUVVLQ2Fo+jWrRhJ7E8OO2Hzulp+dOxc5vx5K0kHn53F5XcPgwQ7ZGasWFwBMTAzhh6ShyG2Z+T4fJBRtSrO2hVVmLFdhtGSmdHEzGiNmdEaM6O+vp4zzzyTsWPHMnz4cCTRmkGDBpG0YcMG6uvraU+CwSCnnnoqJ598Ml27dqU1nTt3Jh6P4/s+VVVV7Io+fftx1qU3MXXGGkorqjEzWvI8l7OPHslff3sTa1atwszYnmD+eBpjYk9Ij8YpWfsBEp/YuGED3Trn0MT3jb/OXMIpZ5wJEvubx07wfR8co3BEiEnf68ngUfnU18RpizXLqsDAN+jSLQ2Jz5BE1+J04nHD8xzWrqyi54AsQLQkREuSaCKJ1kiiNZI48MADuffee/F9H0m0xsxYuHAhSaNHjyYSidBeSOLiiy/m4osvJpFI4Lourdm4cSOu65JUUFDArpBE54JCplx9Ew8/cB/9S9YypG83JNGc57mcffRIpv7qRs7+/s0UFHZBEk3MoHff/mwqCVFcWM9uM8hIvEM8FscLBDAz1qxZQ9f8bCRhZsxeuILDz/pvMjIyaQ8cdkI4GmDKvf350X2jGHJQPo4j2kISm9bWg0Gnvh6hiEdr0jMDeJ4DBlvW1yGJ7TP2FklIwnVdHMdhe8yMN998k/vvv59wOMy5556L4zi0J5KQhOd5tCYWi/HAAw/g+z7hcJiDDjqIXSWJSDSNC789BWfQCTz5yhwaGmOYGc15nsvko4Yy9c7/o7y8DDOjiSS6FhWxYQt7hAF5me9SU1NNkgQrly0lNzsdA0orqlkf6cfIUaOQRHvgsBNy8sKMGFNAIOgiiZ2xZWUDSTndA3ieQ2u8gEt6NxcMtpY10hrj08wMM6OJmdEaM2N3mBnvvvsu5513HvX19Rx55JF85StfQRJmRpKZ0d41NDRw1113ccstt5B0++2307NnTySxOxzH4bAJh/Pli2/kkTc3sHZTGWA0FwoGOGt8b+677Saqtm7FzGiSl5/P6o0RjD0jv1OcstJSzIza6hoqPppNwPPwEz5/m72Os849D8mhvXDYSZLYWQJqqxMkhQIuO+J5DpHOIqm6NEFrhGhOEpJoIonWSGJXmRkvv/wyxx57LMuXL2fMmDH8+te/Jjs7myRJJEmiPautreXmm2/mqquuwvd9rr76as4//3wksSdIokvXIr77o5tYHhzE828tIB5PYGY0iYSCnDG6K/ffdQs1NdWYGUnpGZmU1QxF7D4BWRk+W6uq2LRxA3ffcgNfPqQXZsaMuYs58fzvEIlEaU8c9rFg0GGHBHJEUmOdj2g/zIxXXnmFk08+ma1bt3Lccccxbdo0evTogSQ6ivr6em688UZuvfVWPM/jpptu4sorryQUCrEnSSIYDHHqpDMYPflyHnp1ORtLKjAzkiSRkRbhxMGZ3H3r/1FTU42ZIQkiw0HsEZGgw5tvvMFjv7ias8d2ITsjjVg8QUnaQPoPGIgk2hOHfSyRMNrKCwmjNca+ZGasWrWK888/n9raWk455RQeeOABevTogSQ6CjPj8ccf54477sBxHG655Ra+//3vEw6H2REzY5dJ9OzdhynX3sJC681Lby8gHk9gZkgiJzON00bk8Ouf3kBlRTlgNLqFJBLsEdlZceY8/yiTjx5BOBREEr4ZWZ060R457AMGhEIOSXUNCXYkkTDqy3ySMvI8WmMmWjIzmpgZrTEzdsXTTz/NunXrKCoq4o477qCwsBBJNGdmtGeVlZXcfPPNxGIxLrnkEr797W/jeR6fRxK7QxLhcJgzJp/DqDMv4w/Tl7GptBIzQxLZGVEmH1LA/T/+X+a9/wGZOV3wTewJoQAcNLgHruPQJBIKULpuJZJobxz2kfyeQZKqy+P4vtGaWGOCmjUJEGR0CtAayWhJEk0k0RpJ7Czf9/nzn/+MmTFlyhSKi4uRREuSaK/MjBUrVrBy5UpCoRCTJk3CdV32KYneffvx3et+xvxET155dxGNsTiSyEiLcN6xw1j14n089egj1NSxR4RDkPDLkURzG1cvZ8umTbQ3DvuAmVFQHAFByfwYscYEramriVFf54MgryCMmbF9Yl+qq6tj3rx5uK5Lnz596Ki2bt1KIBAgGAzSrVs3JLGvSSIcDnPmOV9l2Knf5ZGXF+H7PkmO4zBuRH9+cObBPPNKHsYeYBCJbqG56tp6Ppw/h+f++XfMjPbEYx/p1icdtIlEg1GyqY6uPTJoyczYtL4WzxVmRpfidEBsn7EvSeLSSy/FzCgqKqKjysrK4rLLLkMSkUiE/Uv0GzCQMSd9lfVrptOtoBNNuhXkMmvhkVTXPkpGlN1iQCi8koZYjFAgQJLkcNToIRx40MG0Nx77gCR69s3C9w3HE0vnl9OlezqSaGnRnDKEcDOguE8mEq0Q+1I0GuW6666jiSQ6GkkMHz6c4cOH05788cEHOGVYNkWdc5BEkwE9urJ6vRjc19hdhXlVfLR6EwW5WcRiCeYvW0vhIV9h0AEHIIn2xGEf6VQQYfgpGWDwzN3rqKpoxMxoYmZsWV/DC7/fTNKEc/OIpnm0J4lEgkQiQSKRoKPyfZ9EIkEikcDM2N8EHH3s8Tzy95nUN8ZoLhwKUlYpjN0XDTtUdRnHishQygoP5fCvX8uJp56G5NDeeOxDJ57Xkw+ensfWVQl+86P5nPe//elSnI4Bqz+q5L4bFxOvNAI54ujTu2MI0T5s2LCBUaNG4fs+F110ETfffDOS6EjMjKlTp3LFFVfgui5PPPEEY8aMQRL7jcTxJ36ZhTOfx3NdzIy6+kbmLllNSdWzfP10H7H7MtIhd+BAevftR5Ik2iuPfUQSPfpl8dVbejD1f1ex4rU6rn91LgVDQyTiRsmiRoRQCL51ez/yCiLskLHP1dXVUVlZiZnRUZkZJSUlhMNh2otoNI3zLvkRf/3LozgSmQXdWFLyEdeftwZX7DYBkTDEzZBEe+exmyTI6OZhGF7AZUckMeGEYvK7RHjq7lWseKOOTfMaMAMTDDwmyun/3Yue/bMBsUNin5JE//79kUQ4HKajCgQCHHTQQSQ5jkN7IInuPXvyjUuvpMk9y5/CdQDjP47Hbgqnedz6j9E0kcSOSGLQiDwG/jaP8i11VJY0IAey88Jk54VJkkR7U1hYyFtvvUUTSbRnZoYkmpPE5MmTmTx5MkmSkER7IIkm1VVb6Zo9CzMQu8+ArVWQJtEReOwmSewsSUiQWxAltyBKRyAJSXQUktgex3Fo7zauX0+vrhWIPae61iUvGqUjcEhJaUfMjOXLl9G9a5w9qXyryMnOoSNwSElpRxobG3nh2ScIh2IkGXvG1oYjCIVDdAQeKSntiJ+I8847H3D82z05eeJyRg4W3QtFfifIzgAJJDDjc0lgBhu2QIUOwnFdOgKPlHbBzJDEfzIzY/GHH+IiHDeHZ98YydsLc1i0dCmOXLrkhxncp47c7GqKCmrIzGzEc4xQAEIBtokloLYBGhthxZpOLFvXhRXrwtz+uzMwA4l2z6ODMozmzIwkSSSZGZLYHjNDEnuDmSEJM0MSbSWJ/3RmPo889EcK8/NJ+D4fLl1MQ0OCXt17Ew6FMIM1JbB6C8xZCr7vk/AT1NXVEY83EIv7dMrOAYmGhgbKKirIyowQCYdxXRdJdAQeHZQQzUmiOUm0RhJ7iySSJJHSdmbG4kWLmD9rFtlZWbiOw6B+A3EcB4ltJLaR2MZ1HVzXoaGhgeraWnJz8ggGgyQFvADpaen4vs/GzZuR6DA8UlLaiUcfeYSszEwk/kW4rmiLUDBEJJRGNBKhicQ2rusQjUZAoqNw6KAMI+WLwcz4aMli3po+HUnsjFg8TmVVFfl5eTiOw3YZiI7DoYMS4ovEzPhP9uSf/0xOVhYSbWIGDQ2NrFy9mqzMDCRalfB9vECAjsIhJWU/MjNWrljOS8/+HcmhrRpjjaxev5ZePXoQDAT4fKKjcOiwjC8SSfyn+utTT9IpOwuJNonHE3y0YgW9u/fEc10+j5kRDAbpKBw6KhMpHd/G9et55vEncF2XtjAzCAU4/uSTkURbGOC6Lh2FQwdlGF8kZsZ/HuO5f/ydnKws2mpLaRnX3vx/jBw1CqONzEhPS6OjcOigJPFFIon/NBXl5Uz7wx/wXI+2qK9v4NxvfoMDhgwlKzOTtorFYyA6DIeUlP3AzJjx+uukhyO0hRmk5+dyxuTJbCORSMRpC9d1cRyXjsKhwzJSOq54PMaj06ZRXlFORWUFsVgcM1pVsbWS7112OZFIlJ3VvU8fAoEAHYVDhyVSOi7PC/DAww9zyqRTuf7CiZxwcFdqtm6hoaGRlhIJnzETj2DkqFFIYmdlZWfjug4dhUdKyn6yasVKejgb6VM8gD7FBRw9ZghPvzKbZ95aSW5ODklmUFJextcu/AaS+DdDiLYoKi7G6Dg8OiozkhobGygpKeGLrKqqirq6OkpKSmhPKisrMTN21QvPPM3JQ3oj8S8iLRLi7BPG0qsonzsfe4v8vDwaYzHOvegbdOveHUk0MQPHdfk8iYRP165dMAOJDsGjgzI+9tZbbzNo0CDMjC+qWCxGPB7nnnvuoT1JJBKceNLJ7IqSLZvJql5CMDCE5iQxZlhfyiqreeTFDwmmRTll0ulIYlfEEwm6diumI/HooCSRNHbsGH5z92/4InvhhReYO3cuV1xxBTtLEmbG3jB37lz++PAj7CwzY+H8+URCAbZHgqoGOPnsyfTr35+srGxaElBfX4ckkjzXRYikhO/jmw8GtfV1FBYW0pF4dHCBQJDs7Gwk8UVkZqSlpREKhcjOzkYS7UV6ejqS2Fm+n+C9GdM548BeSKI5M2Pp6o30O2ISEyYeieM4SKKlYSNHcsxXTqZzzWKyM9MwM5pIQoJn39vEV785hR69eiOJjsIjpV0wMyTxRWdmvP3mm4zukiASCtJSTV0D75ZEufj8Y3Fdl+2RRJeuRRR3786ooBEJB2mptr6BitxRjDpkNJLoSBxSUvah+ro63vnbHxnQswuSaM7MeH3OEs46/0Jc12VHJFGyaROBgEtLZsbytVsYNHgoHZHDfmIGZoaZkWRmmBntkZlhZpgZZoaZYWaYGXuKJPYmM8PMMDPMDDPDzDAz9hUz4/Xpr3DUiG5IoqV4wqc2ZxCdOxfQFrVbVhPwXLZn6doy+vTtiyQ6Go99zMxIxI2VSytY81EVZVsaMB9yOgcp7p1BrwHZeAEXif3OzKiurmbmzJnMmDGDOXPmEIvFyM7OZty4cYwbN44RI0bgui6SaK/MjFWrVjF9+nRmzpzJmjVrkETfvn0ZO3YsEyZMoGvXrkhib2poqGfRa39h1NHDaMmAtRvLGHHICRggdqyutoaMRDm+X4QkmvN9I57bn3A4TEfksU8Zq5ZW8NBPP2LtrHpkAvExA5NRMDTIBVf3o8+gHJBolbFXmRmLFi3ikksuYcaMGcTjcVzXRRJJjz32GNFolG9+85tcc801ZGdnI4ldZWZIYk+Lx+NMmzaNSy+9lIqKCoLBIElmxvTp07n77rspKCjgzjvv5JRTTsF1XfYGM+O9We9y2KAugGhJGG8tXs/XzxyGJHbEzFi9chW9u+SAREsbSysYMuoIDBAdj8c+YmYs/7Cc285fiF/LNgeelUnvQRkgsXzRVmb/qZLN78e49dyFXPaHQfQb0glJbJeMPcXMkEQTM2P16tWcddZZzJ8/n3A4zG233cb48ePJzMxk3bp1PProo9xzzz386le/orKykrvuuou0tDR2lST2NDPj8ccf59vf/jb19fWMHz+e73//+/Tv3x/f91mwYAE/+9nPeOedd7jgggt48MEHOe2005DE3vD2C89y3vhuSHyKAZtKKul+yAmEwxHaYtmypQwq6IT4NDNjyaqNTDhqIJLoiDz2kVijzwM3LsWvhVCeuOTuwfQamAMYTZadUs6d315EY7lx37VLuGHqwYSjHtsn9qa7776b+fPnEw6HefbZZ5k4cSKSSOrVqxejR4+mT58+XHnllUydOpXjjz+eSZMmIYn2wMxYv349l112GTU1NZx44oncf//95OXlIYmkAQMGMHbsWL72ta/x/PPP873vfY8xY8ZQVFTEjpgZSXV1dTQ2NlJfV0skEgWJ1qxZtYq+mXVslxkvvLeab1x7CZL4PJLYuHYNB/cJ05IkNtR45Obm0lE57ANmxtJ5ZWxZ0IjJOPf6XvQamI0EkpCEJPoMzuGc63uCY1Qsi7NkfilmxvaYGS2ZGU3MjLaSRHMbNmzgl7/8JUmXX345RxxxBJJoIolgMMi3vvUtxo0bR0NDA4888gi+77OrzIw9bebMmZSXlxMOh7nqqqvIy8tDEk0k0aVLF66//noikQglJSXMnj0bM6M1jY2NPPbYY0yZMoWHTz+drD9N5d6xY3jysUdJxONsj5nx9lszGdavGEk0Z2YsWbWRA790DpFoGm21dcMKPNehpcZYnOyeQ5Dj0FE57CPLFlYCwgwGH5iHJFqSxAEjcokl+BexbnkNrZFES5JoIom2MjOamBnLli0jEAiQk5PDscceiyS2JxKJcNJJJ5E0ffp0Ghoa2FWS2NPeeOMNfN9n0KBBjBgxAkm0JIkhQ4aQSCRobGxk9erVtMbMeOyxx7jhwm/w6gMP0amijM5+nIlLFpD7jQt58Pe/w/cTtJRIxNk0bwYZaRFaisXjvLnWGHfYYUiiLfxEgky3Ht+MljaXbaXPwMF0ZB77gCT6Dc/m1B861NXHCUc9WuMFhIxtEnEfSextkmhuyJAhvPnmm5SWljJ06FAk0ZpEIkFSRkYGnufRnlx++eVccMEFNDY2EolEaI3v+yRJIhwO05rS0lJuueZaQr6R9KQb4id+He8aHB6r45Ur/5fXBg7k8IlH0tzK5csZ2CWCmSGJJmbGS+8sYtL5P8RxXNqqpqYaz6+nJTNjxbrNjD6yN5LoqDz2kYHDchk4LJckSWyPmbFmeRWuyza5hWHMDEnsSWaGJLZHEjk5OeTk5GBmSKI15eXlPPbYYySdc845BAIB2gtJFBcX061bN5IksT1mxttvv83/4hnl0QAAC6BJREFUaw9uoKuu7zuOvz+//z/33jzdhCQ8WEqTICFBijxkFOq0WKjinMhEKlLUobbsGJnV6tGNCazj1GK3VmMdiLpNHDih8wGrBR0Wn5DieLLgEI52pqIQICEQCHm6/+9O4HDEDjCJNNzr+b9ekojFYgwYMIATMTPWrFkDNbUcE3WOPQn42GCxQXPzYR697TYGvPgikUiUZ5YsYcCgQfzv797j/KJeSOIYM2PX3jrSS0fzlcJCkGivxsZGCnKz+UOSqNoXMK6gO6nMp4tI4rNYYLy0ZAdCmBklA7shiRMyOk0S7SGJEzEzGhoamDNnDps3byYjI4Orr76aZCSJkzEztmzZwi233EJTUxOTJk2ivLwcSZzIa6++it+a4BhfjlX4jFMreUAfwapt/8OD999HbmuCS+Y/yE4vjTfO7csFd12HmSGJNokgYMVv93DzzDtAoiNqa2rIiEWQxPGaW1rJLR6MPI9U5kgSZsbry3ew5fl62nzzpu4U9MrgZAzjeGaGmdEZZkZ7mRl1dXXceeedzJ8/n7S0NBYsWMDgwYORRKowM9avX89VV13Ftm3bGDJkCPfccw/RaJQTMTN+/8EHfIoZG700ugneARwwRgFfq7wP/vkBMoMW+rU0ULFxKz+f/5/sr2+gjZnx5qbtjLvuJqKxGB1hZjQePkxudgbHM2BHdS0Dhwwl1TmSgJmxcfUuFs+oQiZ6nJvG5df0BYmTkfh/JPHHZGbU1NQwffp0HnnkEXzfp7KyksmTJyOJVGFmrF69mnHjxvHuu+8yfPhwnnjiCYqLi5HEiUiiT2EhfyjqHFUGBwwSgIBzSVBkCTYbR9QECWre2MSH1TW0qd1/kPruQykpLUMSHbV7927SYxE+xYwt739MSf9SJJHKHGeYmbHutZ0sqHgfBSJe7DH93oFkZKdxauJ4kugsSbRHU1MTd999N0uWLME5x8KFC5k6dSqe55EqzIytW7cyceJEdu3axahRo3jyyScpKytDEqcyrLycwHMcz5fjGUUodfCBgXFUuWCjwQaDOQlRPP5C+heeRWDGC299wBUTJyGJzti3r5acrAyOlwgCGrv1Jx6Pk+ocZ1AQGC8vq+KRm98Hg3ixx+3zvkqP3plI4lQMoyuZGStXruSxxx4jEomwePFiJkyYgOd5pJJEIsHcuXOprq5mxIgRPP744xQXFyOJU5HEyJEjOSw+zYyPvDQOG6w2CPjEUMFGg8F5ca6ZOJpIms/W93dw3hVTyczKorMO1e7B9z3amBmtiQS/+e17ZOYWcKD+AGZGKnOcAWbQ3NjKkvnvsnTmh0jirGER7nr4XHp+OQtJfBYhupKZ8fTTT9PU1MSECRMYP348kkg1VVVVLF26lFgsxsyZM+nTpw+SaI+ioiJumPG3BJ7jeFGJhYowTPB8AAYIGCT4roMp9fWseH0Tjc0tPLbsNXr26kVnrXlzNTveeQsnYUBdfQPzH1jCw7MeYvFfT+fmqX9Jzd49mBmpytHFzIyDB5qZN3szryyoQYgBl2Rye+Vg8ntlIIn2MbpSc3MzK1eupM3YsWPxPI9UY2bs3LkT3/fxPI+BAwciifZyzlFRUcHQCX9B4BzHO+BHWGUefRy8YmCAOCovCCiet5Tnvv9Tpqxay69ffAmJDjt8uIF/ueF68jOFmYEZb2zcRu+X13KLJZiXaOQHq15mw/p1pDKfLmRmHNjXxAN3bWbHb5owjFHTCvj2tP6kRTwk2s0QXam5uZm9e/cSi8XIzMwkVbW2tuJ5Hs45cnJy6Kjs7Gzur6xk7lln8dyD84gaYIYHvJEWw2tt5FwSrDQYI3CAgFILKN2xk3XRTL558UWYgUSHtDa3MKJmLy1P/ZrNfXvT1NLCund+hwXGNxx4wKHAiMdzSGU+XcXg4IFmKu/czEdrmzCMCTN7c/GVRTjP0VGia2VkZPD222/TJj8/n1Q1ZMgQ1q1bR5usrCw6ShK5ubnMmTOHsrIyfvj9W4m3JnAGaRKvp6XzXmsz5wfNLDG41EEcEEftGPtnXFlYhCQ6qm7fPnokEgzaWc32239GpuB6M14A3jQYJYi3NPJC5f1kZ2dzzlcHIYlU49NFgiBg0f3b+GhtE4bxnbmFjLq0D5I408wMSZyK7/uUlJSQyiSRk5NDbm4un1daWhoDBw5kyJgx9D27L8vnLyBq4Jmx24/weMIxPWjkxQD6CwaLI1xpKXKio8yMmpq95Ev4wAALwEDAtQ62Ak8GcLkLmPTcU6xf/iveuvcfuXLKFLKz40giVfh0ATNj45pqNj61HyFGTunG8G/05PDBZk7F8x3R9DT+mMyM9qirq2P58uW06dGjB6NHj0YSqcTM2LBhA9u3b6fNyJEjKSoqQhKdlZeXz+wf3UP510Yw+/rryUJgRpbnM48YP7ZGGgxWGIwVRHJzAdEZ1bt20au5iTbiEwIGAL0dPBXAhQ6Gtxxm/50/4KFlyxgzZw5Dy8uRHJJIdj5dwALj+Uc/RIFos3rRPl5btJbP8ue39uTb3y3lRIzTQxLt0dDQQEVFBYcOHeKOO+5g9OjRpKItW7Ywbdo0IpEIL730EkVFRXxeznlcfsUEYukx/u7q7xAzjsjwfGYmYsywRs4WrA4gEo3SWYEFeBZggPg0ATnAFAcrDXYCfksziVX/xZoxb/DqpZdxzjXXcOG3vkU0GkMSycrRBWr3NPL7dU3gAR74noh6jqjniHqOqOeIeo6oc0SdI+o5os7hJE5GdD1J+L5PqvN9H+ccp5MkLhp7CZdNr8D4RMTz+XsvnT0GNUBOXh5mRmekp2fwsEtjB2CcmA+MEqwOIFcw2cFlLYe5ctkvyJ18FZW33sr+/XWYGcnKpwukp/tMf7gE0TG53WMki3g8zrPPPosk4vE4qeq8885jxYoVtCkuLuZ0khxTb/wez85/iKyWBMdkeT73ks40BaRnZtJZObm5lKX5bGn12BQkGOMgHRCfSABPBTDVgzxAfKJXaxPj/v0xFnget/3sPiLRKMnIpwtkxCMM+XovwABxlAECjKNERxhdKzMzkwsuuIBjJJFqJNGvXz/69evHMZI4XSRRWFzMjbNm8h+z/wEXBBxhRpbzWOj7LOrfH0l0lCSGDCun2/qNvPDEE7T85F4WNjYw0RkFgAADNhh83UEeID5NQEbQwp8u/FdeHz+e0RddjCSSjaMLSCCBJCSQQBISSEISEkgggQQSSJyUzOhKkpCEJCSRqiQhCUlI4nSTxJRrryN70ECO1+TE6Btu5OySEjpLEoVFxVTMmMG4deuJTrmWRYFjD2BAAGw36AuIExPw5UQzmxYtwoKAZORIVSKUpLrl5VP5yKPkDi+nAUh8qRd/NffHzJg1G+c8Pg9JSI6z+5Vwy0/+iW5jL+FXAXwI1AJ9Rbt0f+5Zamv2kox8UpQZoSQlidKyMpb+8nk+/mgH+QXd6datGwZI4nSQRF5+PlMfeIClk6rZsGk9TcAgcVLGUQeBN5uaOa+ujoIePUk2PilKEkeII8yMLzJJtDEzUoEkMjIz6de/lGPE6SWJrxQWM+7fFvLK5EkUbn+H/w6gGSgQ5ABpHNUA1Bi8DxwyGJQZo76+HjNDEsnEJ8VV76pm1qzZYMYXkQFVVVXs2b2bWTNnA0ayqKmt5UyTRNk5A3BLfsEz0yu4eO0agtYmdhtUAYcAH4gBBUCpH2X9sD9h6D0/YvDQYUgi2fiksJ49e3Lb39zFF935JK9IJMqZJ0pKS6l4+hlef/VVtv3yObKXLaPg0EHOEjhEreDt4SPod9NNfO+ii8mO5yCJZKSDrYGRosyM0JkniWRhZrQ5VF/Pnj27aWlpoU00GuVLvXvjp0WQRBI76JPCJBEKHU8SbbLicbLicVKRIxQKJRVHKBRKKo5QKJRUHKFQKKk4QqFQUnGEQqGk4giFQknFEQqFkoojFAolFUcoFEoqjlAolFQcoVAoqThCoVBS8YEPCIVCyaLh/wCNPo9DBomCdQAAAABJRU5ErkJggg==" +}, { + "width": 115, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 39, + "url": "data:image/png;base64,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" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/generic-game-screen-navbar_png.js b/mipmaps/generic-game-screen-navbar_png.js new file mode 100644 index 00000000..9b58d3f4 --- /dev/null +++ b/mipmaps/generic-game-screen-navbar_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 306, + "height": 208, + "url": "data:image/png;base64,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" +}, { + "width": 153, + "height": 104, + "url": "data:image/png;base64,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" +}, { + "width": 77, + "height": 52, + "url": "data:image/png;base64,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" +}, { + "width": 39, + "height": 26, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAAAAklEQVR4AewaftIAAANZSURBVM3BS2gcZQDA8f/3zTczO7PbWBpfTTwkmtQ8qmIfoAVjQUHwolQQRYsX9S5YNOAj2INFwUPEYsVTGo32oqQH8XFsKz7qocZbs+2aTdcmVpLsZmd3Zmc+2cPisM62qbtIfj+xXos0m9MRySYm2cQUG6S1JqjkIcoi9BKCEE0KLW5DWoMo8wY6TXENWmv88hxGOEXa/hGpBM2CQFCpPIWwD2BaN9EpiquIIp+gOEUmdRxpCUCQxDQ1pjmDH8xSCSaw03vpBEkLOqpRK07S5U4jpWAjLHOdtPEy1dIZOkHSgl86ScY5yfUyDIFrvIHv5WiXJEFQLeCakwgh+C+UqiGDj9A6oh2SBNr/DqU0DbWa5vz5MuVySJLLl30uFarEualT+N487ZA00TpEMUvcZyeWGLrrZw69mqXZ4mKVPfef5c7Rn5if92gQQiDDX2jlz+VlZr/8gl/PnaMVSZOgegXbWiJudbVGXX6xSjPPCykUAjwvYr0cEieZI+5CNsv3Z05T9+03XzM0PMzHxz6kVCqRRNFERyWkKYh77uAtjI6mGdrh0GxgwOXsD7uo1TQ7R9PECXI0/DY3x+effsLKygpe2ePpZ54lv7CAnbJxHIckin8RNMtkFPvHttLKPXdnSCZpGBgc5PEDT7C4mOe+ffvILyxw9P1Jxl97HcMwSCJpIowthKGmEzR9NNi2zfDICGMP7sd1XWamp1ldXeO9d96lVCySRNHEtLbhl3pxjEu0KxI7MfiH47o4rkvdofFxrkXSRAhJyGM0mzr+B5VKSJJ8vsKp0yvERZFGG7tphySJ/RBBYBHX15di4nCOK38FxF3Mebz51kX6+xziytWHMVN9tEORwLRuxKu+hFJHEEJQN/bAVrq7TV4Zz7Lr3gzbb7WYz3oUCj6HJ/rp6bFpCAIH7OcRQtAORQtW5hGKazm2ODMIIagbHUlz7OgOcr9XWFsL2buni95eCyEEDbWaxNNvY9vbaZeiBSEkVtcLFIvbSFsfYBiCOsMQ3N7vkKRavRlfTmCnR+gExVUIYWB3PUnZ242snMBWX6GUJE5rje9n8PVBZOpRLLOLTlFsgOXcAYxT8V9EBxcQehlBFc0WItGDcvqxjBSdprgOptUNVjf/F8kmJtnE/gbT7y7mPkHllwAAAABJRU5ErkJggg==" +}, { + "width": 20, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAAAklEQVR4AewaftIAAAGLSURBVK3Bz0pUURzA8e85v+N1ujNixCjBNMuoVpGEYIG1aRfkImpVm96gNwh6gqBeIBKiFj2AlptICiTS0VVbKYxGs8nr/XN+ceBeuAvhSvT5mFHulf/ngeMIvkjQYhvIwU4j7iTH5ahR9fjkLZF5ipMhgS8gze6i0T2sdGhiqdGDN8TuMU6GVKyFlnuJpI/wRUITS6nItmm5J6gqo1FOJU09h6kncp8gW6GJpWSLLxgDm1t/WLg9oPLq9Q4vFr8TiC4RJEnC/v4vPq6usrU5oM5RMgwJzp+LWXx+gcrCrS5elcDwFQU21tfZ292l1+txIo6pc5Q8pwhEDFPdiEq7LVSUswSXZmZQVT6vrdGZmKDOUlK5iPeGYGn5J1nmCTYGv9n5kRIU5gaBiOCc4/LsLGf6feosJRk7TeIfoqpcmZvk/Yc93q0MacfCVDciza9CdI0mjhrbusnB4STR+DOuzwuB95Ykv49Gd7A2oomjxhiDtObJ/Bxp/g3IQKaR8Q6G43EcwdoxiPr8i78YV47agXmT+gAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/generic-screen-icon_png.js b/mipmaps/generic-screen-icon_png.js new file mode 100644 index 00000000..78229308 --- /dev/null +++ b/mipmaps/generic-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 916, + "height": 623, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5QAAAJvCAYAAAAEFJ4mAACAAElEQVR4AezBB7ymd13n/c/vf113Ob3XaZnJZJJMKkkILYFIJwRkYWEBCyAgbFDXlz6ij+VZlBXcXdeyCOpKcXmJyyosCIiIJLQkBNNJTyZTz8w5Z86cMqff931d/98zhVUI90m5M3Om5Pt+23wWHREREREREZEnKAQjut8WEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQaEBARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGhAQERERERERaUBAREREREREpAEBERERERERkQYERERERERERBoQEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQaEBARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGhAQERERERERaUBAREREREREpAEBERERERERkQYERERERERERBoQEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQaEBARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGhAQERERERERaUBAREREREREpAEBERERERERkQYERERERERERBoQEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQaEBARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGhAQERERERERaUBAREREREREpAEBERERERERkQYERERERERERBoQEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQakCIiIiIix4RzmLMSwxAROZ2kiIiIiMiT5hzizv9lZhiHGcZhxlGO86/cnX9hhiEicupKERGR05bjuDunIzPDMERWm7vjOMECSQiYgQMOuFOHYRxlBgHjMHfIYyTimBmGISJyqkkREZHTkrsTQqCYcNoxoBohjxEzQ2Q1uDuOU7CENIGKw1xtmZjnTC4f5KHZvYwuTlHJq8wsH2SuMs9h7aU2OsrtlJMiw809XNS1ieZiGQsJLYUSJYNaDpnnGIaZISJyqkgREZHTjrsTQmC5VuGR6X0EM8AAB4yThwPGE+OAcVjuOUMdA7SWWshjxMwQOV4cx91JLKGcwGStwoHZSR6c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PfddXNBzJu+673+yd2kPA4VBPKRMeMZhzuOLPHEGtFlCD4EdtQNAzs9seBXXnv9atvacARGqeSRYQETkZJEiIiJPaw6YGdFhujoHltBjCQ7kOGAc5RhGmcAMxubWQdKQ4A4YIqcFw3CDLI+0pWV+6vxrOKd3M5958B/50N5/gOVFhkqDVMzIcDJ3qkCO4zw5KUYJIwESM4oO49VpZn2CF/e9lLefdTUv2PBMekrN1HLH3QlmiIicTFJERES+L7pDbZwDMQcD3PkhZkCA6h6KlmJm4I7I6cQ4xIwsRsyM5wydwzk9Z3D16JV8adcNfHjPF6BagaQDQkrRUjoIpGYYRoZTxTnMAAcMo4SRABEnurNAZMFrEDPI5yAJXDN8FT+x9kouWXMBm9r7qEWoZhEMzAwRkZNNioiIPK0ZRxkw1NLLT531FppCChjg/DDDDGazCsNt/QQMxxE5HZkZDlSySFtS5sUbLuHCgbN529mv5Ntj3+PjI9/m7tldVLNFJsnAM/AIVgAr8sMcvAKegSVAgFAAilzafTbXDFzCCwcvZl3XMMMtXQSHpSxigJkhInKyShERETnE3bmw50x+v+tnWZkBjgOlUAB3DjMMkdORcYgZuUeyzOkpttA/cCabejbwxrNewujCJHdNb2fb7AhjB/dRXZpjMltkdz7PYQZEnCKBM9J2WkORptZuWps6OKtjHVf2n0dvcydJWqS9UASHahZxIJghInKySxEREfm+QkgpJSlPRHRwHJGnAzPDMGoxUo1O2VJamlrpbGplS88G3B13x4DJyizjSzOAY2ZEd1JLWNPcQ2uhCccxM8wCiYEB0aGaRRwIZhgiIqeGFBERke+LRGLkCTMzRJ5OzAzDyIlkORgQzDAMC4YDA02dDDZ38mjRwfk+B9zJouOAGZgZhojIqSVFRETk+wwDQ0Qeh2GYcUTEwZ0jHCJPgHGEmWGIiJy6UkRERESkYYaBcZQhIvK0EhARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGhAQERERERERaUBAREREREREpAEBERERERERkQYERERERERERBoQEBEREREREWlAQERERERERKQBAREREREREZEGBEREREREREQaEBARERERERFpQEBERERERESkAQERERERERGRBgREREREREREGpAiInIKc3cOMwPnEOeJ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csQYkZnHzHB3dsbMcHeezsxwd3aXmeHumBnuTsrMcHeei5nh7kyXmeHuTMXMcHcqyd3JZDIUCgVS7o67kyqVSkxMTJDL5SiXy5gZ25kZ7s5UzAx3Zzszw91JmRnuTqWZGe7O7jAz3B0zw915vswMd2dHZoa7sytmhrtjZrg7KTMj5e5Ml5nh7swUZoa7s6fMDHdnbwkhUCgUiDFSjpEMTzGewTBEpDISRERmAcNImRlmRsrMMDNk5jEzpmJm7MjM2BNmRsrM2M7MmA4z4/kwM3bFzKikGCMpM2NHZkYIgVQIATPj6cyMXTEzns7M2M7MeCGYGbvLzEiZGbvDzNgZM+O5mBkpM+PpzIznw8yYScyMSjAz9gZ3J2VmpMwMEXlhBURERERE5hRHRCojICIiIiIyhzgiUikBERERERERkd0QEBEREZEXnLszE7k7c41hiEhlBERERETkBWdmzERmxlzjOCJSGQERERERERGR3RAQERHZCXdHREREZFcCIiIiO2FmiIiIiOxKQERERERkDjEMEamMgIiIiIjIHOI4IlIZARERERGROcQQkUoJiIiIiIjMIY6IVEpARERkJ9wdERERkV0JiIiI7ISZISIiIrIrAREREREREZHdEBARERERmUMMQ0QqIyAiIiIiIiKyGwIiIiIiInOI44hIZQREREREREREdkNARERERGQucUSkQgIiIiIiIrOAmTEdZoaIVEZARERERGQWcHemw3FEpDICIiKzjCEiMvO4OzIzGIaIVEZARGSWcUREZh4zQ2YKR0QqIyAiMssYUgnujojIvsWYHkNEKiMgIjLLOFIJZoaIyL7FmQ7HEZHKCIiIiIiIiIjshoCIyCxjiIiITM0wRKQyAiIiIiIic4ojIpUREBGZZRwREZGpOYaIVEZARERERGQucUdEKiMgIiIiIjKHmBkiUhkBEREREZFZwMwQkb0rICIiIiIyC7g70+HuiEhlBERERERERER2Q0BEZJYxREREpmZmiEhlBEREZhlHRERkao4jIpUREBERERGZUwwRqYyAiIiIiMgcYjgiUhkBEREREZE5xDFEpDICIiIiIiJziOGISGUERERERERmATOmxRGRSgmIiIiIiMwC7ojIXhYQERERERER2Q0BERERERERkd0QEBGZZQwREZFdcESkQgIiIrOMIyIiIiJ7Q0BEREREZA4x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" +}, { + "width": 458, + "height": 312, + "url": "data:image/png;base64,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" +}, { + "width": 229, + "height": 156, + "url": "data:image/png;base64,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" +}, { + "width": 115, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 39, + "url": "data:image/png;base64,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" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-1-icon_png.js b/mipmaps/level-1-icon_png.js new file mode 100644 index 00000000..ff854e25 --- /dev/null +++ b/mipmaps/level-1-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAOISURBVO3Be0zUBQDA8e/vcXfci3vxuAPBY3HgEyMdPcBh4mY5ZOthaWur9fqjVltNG9PVlk2dG/2hNsH5B7bl5lq3XJtTLCcboChdAhIQpoDQgcf7cdxxD3+h3R8XA6r1b58P//vXJJZmAyQgxD8gsIA9Owsqky26HaIoWFEIhyP3ewdGps8cdXs+ZQkS87z7XP5eg079gdWoTVSrJEElS1KCWraZjQkb87KT8xpu/v4Ni5CYp6zQdVKUE+xqrRmTxY41ZTmSxsLI2ASyGNWY9Zr0zrujP7IAmb96UhSE7ExnLllZ2ZiMevS6BPoHh7FarULFieqqS57eahYhEqcoLz3foFNLOa4cMtJSMOi1BIKzZC2zsyrHxdZNxS8DIyxCJI5vdOaeIEBHRysoEAqFiUSiTEz5eSDJIK3fs6ugmkWIxOnqH3PPBMPewEQfV65fRRRFrOZETEY9s6EQk+MDQpJJ97zDpt/GAmTmuTfqd+sSVO8PDQ0RCoUJR6KAwvWma4p/xv9re8/wAe/wdH277/ax8cCko9D52IvESMzT2O49n5ak36KVwwajKTW6zJGibvS0NNfUXj5w5FvPa623h8bcbRdu7G46vmVqetxV/1XNzc/37+9kjsgCdpS2jZQ909Aii90B5qQmBW373ut84vQh4WNBEPrC9yP9P0WmqR3vUDUPdL5BjMw8x/cJbxdvoHRqBsmSeIqZqShZjtoMVyav+gMMAhXbV5ZUVYdnM9anrz231p7zCTEC83RfEG4403h0fBLMiTA4DAnaxzHrr+EbhUuNlL9SrhzmT0VAPTEycawmNpoMrGDObJiH7KlbIfMIdK9AUWCNy7Wr8rNnV+flZpV03um7/ObeL+qJkYkzOkGdp+vD1syU7tVq+awf6ekUnFWgsQEmvEMORWv8aF1ern+dSpbxjYw7iSMTx5FsLXSkrFzjm8xoSjacnUDOLmOsFqwlIK3CHzS1KKpw2p2+gZ7233o9h06cOUwcmZjyd3Zu31ZccNCg1+qu/PxLfdCONtd5Ema/hpnXIXoVuxWvq/R8PosQibFZEi2+kbHRtq5uoopSVP2dcouHAhCs5AGtBhtLkIj5ocHTEo0qA5Ik3tWoVbc2b2hyPJLBU8QJhghVnOIoi5CJ475YV+O+WFfDnO+PCbu9Q/TYTCzXqBEm/QS9Ppr5L956gZfOfcnBzQVs4m/8Abf2S0SI34WyAAAAAElFTkSuQmCC" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAFfSURBVK3BO0gCcQAH4J/eKWmmdqU12TvsIfTyRIIo6AU1VEtR0IOG1oaGIJBQHJqEaIgCIZoLbCuXKCJCzLYcHKIHktVVp6Z3Jdc/uEEamvo+/DsFZEsT7Ii5WDsvScg8JPjt9f3LIPJQkPV2VAdKmFKn0WhqUkDsKdJQ19FbLgYZDYJtKO+qqbHWtbex+BF/TKSXN1dOkEcJ4jWZ5ZKvcVEUBdAUBQq5+tW5Th/yUCA4PptgrSYHrdZZDHqDcBE6P7TMLMRapro2jvwHxx63+0kJ2ez4GW+rPU7Riig9OrBnNhoZ/kV4M1zFo3YQNAhGj0oTg2FIYT0KByCl4VCdekP96A7YB5t3QChBqNWMFL1zveQUfY9ayzRS2daUTj80+ZEVKiGjQWx5Fl3vaY2AXPAZt7NluoII5xyPVCAPBUL8/LpW0dRNY1XYplHfWzICkmt++PCXXS/GelhU45dv27d4LkkkYWQAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-2-icon_png.js b/mipmaps/level-2-icon_png.js new file mode 100644 index 00000000..bd2f3588 --- /dev/null +++ b/mipmaps/level-2-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAOUSURBVO3Bb0yUdQDA8e/z/J7nueOOO477hyCEoEgOqcQiaEydzFyZtdaLmm0UaVtbLd+Ypa8ka9WswfJFmtEwGwWZRiPTtXQtV66YuEDSS4k/UYCenHccHHc89yTttp4o2Np62efD//5TNsDHvyDxdze/+ETVJzarWiBJaHrSuBadTHS0nQ7Unbt05RvmIZhl+6Y7T9itWqnDpglVEWiqSEtP0xYvzXNvdKVbBnr6gueZg4LJ5g2lO1x2S5li82MoBl5fDkiCcCRMIhyQ8vzOF4BO4Cf+gYLJTVkZ1YassrpqFUMjQcpKigiGwsQT0wTHwlfr3/nodsDLHGRMNFV4ff48srxuSosLmCGETLbPTcUd5Utr7i7ZAoySYhjGBkwEJmvL8h+T9Wiu070Ql9NB4JcgU8KOasRJ6ro8cX1gpSrExVNf99VW3lp7oKcz+Ghr297P6urqRrlBYLK8wFPqz7RVDA0NkObwUrjQT2aaQFNV+vr7mYgMO1QhO1HXr217baTgcueEtbAsLWPfgT1HuEHG5M2Pz+4OR6eGYpPjhEJhdF3neiRK3+AQ3V1nooMj4eY3Wr5/oGLNgtasUpWqTZkhWZEmSVH4q+ClodArmQ7rrujZb41lSxf7EonpWOuRD5oOft7VOB6b7uCG3EWOnTv23uLwLrC9JUlSNykSs7z3svRkQS6bNRVDszVUGIaSnIw8c1zXGV1Va+wBepiDYJb67dL+RTmUe1zkRsdDOG1XJL/7QpHHxW0bV0tSUxvHmIOMyfuvSk9neVhh0UBTID/7DJo4is9/H4oCS/Kp5k/LgeWYKJiUFHKv1YIYCUKWhz+kF7SDHmV6tJ0MO0Xbau9vuGdNVWU8Me0++sXpnW+3HOsmRcZkW8PKg129zxLoX9KbTAK+I5BZCYoLCZIXBrfKj2xcvzXH7ymPjE9k26zWBZgomNz1Us1zrbEQY76aROlEu+6KBQRjAvQoqkpsLJp9UcgTzo6uQH/nj5eb9n/YfggThZRP9+1uPDV+dVl95DwPpxfmxeNdvxL5Lo/YJkg0I4Fl3ePPVwNjzEEm5YeLvf0lIYvl9d+yKZqyD+vJyWvMSDQzw25DrChmHfMQpJw8c+4rn9BChW5/wBV3HViW/eWD9jQySBEyZHmkQMsJTjIHBZPGw8f3Nh4+zoyKw9JTqoI304lN12E4SF8szs/MQ2J+xe/W8VDSILZlFw1Aknn8DhD5SONRnIGpAAAAAElFTkSuQmCC" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAFrSURBVK3BTyhDcQAH8O97b29v09pMM8wsW8IB5U9o1prSDlamZHZwIA4u2oWLi9VykBIHKeVAuewkKSuFKUopK2uoHdaW2uGtrQ3ZH3t+5R2Wi4vPB/+Ogsg7M7SkqGJHCsVywn8Z8YWifBwVJCDmRjtsrFS+qlSpFTTDwmkpdYaivANACiIahFGnHu/uNSvMFjv6B2xo7zAnAXwKgtAGEQNiqFM/IGMZm7a+CayUA5+MG50TPtPpUWZze2cttru3EaZB+A5uN2Kx6HM2ky6keD759PJ4aLUPHmkbuQdQQh6EBD8+pidvMqWyLg9Kxk05g2qDSRUAEICIAXFziMUWA+ZrlBFOVeeSM18XzX1dK6zbMWz1nwWvQdAgTtTr0pNXT5qqWhY4jRXpnKuob9AuZN/eNRBJQNRnPtxXwhc3lttKs6Xzmtrq0H2rwz+CCjSI8PGdpychn80Xip9COYRCETT+oNn3wgWAwi/fEkt6yXHdSsYAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-3-icon_png.js b/mipmaps/level-3-icon_png.js new file mode 100644 index 00000000..a8628faf --- /dev/null +++ b/mipmaps/level-3-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABiCAYAAAAY7S4UAAAAAklEQVR4AewaftIAABadSURBVO3BB1yV9eL48c/3Oc8ZwDmswzggeyMoiOLIcqRpljYd2R5Xuw1v3Wxb/T32y9avrGyPW2ZlNryaWTnT3HshOFFEQJaHzQHO4flJhSGxPBD499X7LXCQoig6W0XZ29kbfhlv6tPvB62H13gucCocoCjKvwt2b/1sz8vThxx/9zGN5B8TPfubhWlmszmVC5jMOVAUpXf5iaOvpLz36uDjb06lXvorU2XfpD7TgW+4gAnaQFEUna2i9PUTPy+bcPDlR91shek05jvxSXo/+dxLQojHuECpaIWiKHcX7Nry5Z6XzcMyP5ymq6200JTylLU4x10U/crHc781m80WLkASLVAUpXfulrVvbr1jcEjRz5/SmgOvz/Cy5mfP4gKlogVmsznn2Zn/0yd3y47omvx0WmM7lYlkig6fvWDxMbPZvIcLjEQrdN7+/46895EC2ij9lQfkogN7p3EBUtEKs9lseeXjuV4lRTUDy1PW0qpaGzVqD6/3Vvziajabl3EBkWgDIcRjEWNv2CfpPGhN4D0vEX3LpHXAAi4wMm3kFtXj8bCpr/z38HN3yjTBMGAs0ZMfzPDpM/B1IcQsLkAq2shsNh985cOPepzcsiOuJj+derIxjKgn3yqPv+/Rzw3BEaOEEOu4QMmcA4278YHIf04dvHvKCh9OC7j7RcLGXLdRHxzxjBBiBRc4wTlSFGXm/g9ffcIjoV+mb/LAd4UQM/lb8xRFeU5RFA/+9re//e1v5y1B5/AABgDBQBh/SAcOAusBK+c5wV/nZldnzY2X9AwMDfQ1RDhpZVmnkdE7aahXUl5Ftc1OudVmTT1WcHBrWs6Bqhr7bGAt5yFBx5s5sm/oDT3CvEMDfQyoZRVtVWGtIeNkMVv25+zZnJrzLTCD84iKDnbjZd1/GpEcavQw6FBJEudCLavwdncmMcLXNy7Ea2i13T4uu6CsFNjDeUBFxxqod1JPTIjw0dBO7gYdPcN9fEyeLmPSjhWG2WuVpYCNLqSi41zXK9LnhfFDY4NKK6px1qlpL0kIunkZpD7RpsQ8S8WV+UUV3wFldBEVHUCrUb1/z9W9Xry4Z4Cf3knDlrQcAn1dkYSgIzjr1HQPMfpV1divz8gtWQfk0AVUtF/vG4d3fzUpyqQpLq/CRafmcJYFWZJwN+joKBq1ishAT3chxBWHsyy/ADl0Mol2cnXWmHuEebtYSq3kF1VQR6PRcrzASkfTqlUM7x0ccFFct/mAH51Mon16XzMoapjeSUOepQJvd2fqSAKSe/enqsZOR3PWqRlzcUR4qJ/bPDqZTDto1aqHugcbdZyWX1xBdJAndYyuGpLiIvlu8Q4iAzxoLL+ogpKKampsdqzVdsqsCo2phIK7Xo0kQKNW4a7X4WHQUcfNRcsNw2IHz/pq6zvWavs9dBKZdhjZN3Swq4uWOgVFlTQUFuhHtsVOZADkWSrIKyonv0zNxf36EBXogdHdgK/RA3dXPXVsdjubdqWhVatJ7hlNnSdnvkD3YA8OZJ7i5XlbfujmpdfGhXp3C/N3i/A0OMnXXhJ1+7yVaUuA7+kEMo67ObybRzd+5+qioZ4QUGAppl+fZDakHEBWO3PdyBEkxITTkvBAPyqrqqkXEh6Pq7aAhHAfTivLKii7MqugjNP8gEndvPRDgceAFYCVv5iMg1ydNRODfF2p52fUUy/jZBmSJHH9yEE46XT4GN0xuDjTElmlQqVSYbPbqdcvIZZ1a5YQ4udG31i/sC1pOfwuB5iRVVA2A/Cgk0g4KDnWL0yrVlGnqKwKIfjV2j1ZPDD5H3i6GagTGmBCEoJVm3Zhs9tpyYGjmYydMoP8U0XUSYgJp7DKQFWNnV6RvvGAH39mAax0AgnH+EUGeETwO0VREEKw50geN1w/gfAgf+rFhgeRnVfIzHfnsffAUVri7elGaXklx7JyqXf/bWM5mK9BVkk64DE6iKIoHpwjGcckuzhpZBrYd7SAcVddQ2JsOI3FR4YgqyQqKq00tivtCFm5BQy/KImYsCAWvj2dyOBu1PN0M/DwpIk899anxIV6Dd13tID2UBRl3JGSnKlHirM9gSjOgQrHTByRHDJE76ShjrXaxpZDpTxz/800xd1Vz5ih/YkI9ketlmnISafheE4+JWUVBJi8MHl5olbLNCRJEgEmX5au2eCbZ6lIBVI5R4qijLvlobv/89/9K/89buOsAF1VlXH1R4sVs9m8hjaScYyHRlZRT6eRifCVyT9VhLenO00JCTDRFDeDnqS4CI5k5NCSiGB/4sN9URRlasrRgq9pI0VRxm3PPzT1rR1f9Xv64EIstdXUmZGxnNGRQ24GZtBGKhzz0Ngh0eH8Ti1LeLk5UVKjIzzIn3PlpNNi9HBFq1HTkpWb9tAz1BCwaV92CbCJFiiKcs91U2798PN9S6bcvO2dgO8KUrAqdhrys6uMqz9arJjN5jW0gYxjjpRWVF1mcNZSz9VFy08rVzAouSdajZpzIatUGFycaY2/yZ8w9xIu7xf26E+b078EcmhEUZTeByyZH7269bOEaYe/w6rU0pwZGcsZFTFoIjCDNpBwTG5FlY3G4oNdWbc9hZYUWIrJziskO6+Q7LxCsvMKycjKZc+BdLbvO8SGnftIPZxBU5x0WuoM7RVoCvVz+4ym7TtZUeg59dBCrEotrfnx8C8xiqLcQxtIOGZHaUU1jfl4OLN0xY8UWIppzvaUQ3y96RiVXvFUesVT6RWP3b8XpqTLCRt4DUW6QFQqFS0xOGu5ZWT8pVq16jMaEUJYB3dL/HqidwJtMSNjOetyUu6mDSQcs7asssZKE/rG+DJnwVJsdjtNGXlJH8L01Zw4cYKkpCSGDh3KkCFDiI2NZd++fahPHSI6NICmnMzPp57J04X7r+99k4+783z+bNpN4cMyaaMtx3cmKIpyD61Q4RirgGt6Rfn604halqCmhH0ZxSTEhNOU6NBAtFUWli3+lgULFrD8h8Vk7PqFOJMTCbHhNGfx0p8IMRmo52nQER/qFVdUVnX1yVPlKUAmp5nNZtvnr38UnJqV0j+1Mp/W/FJ0iKv8ewe8+9Ib79ICFQ7KLiwbOCDOP9FJq6YxZ52a7JxMThTW0D0imKYYXJyJCgkguXsofbuHEhUSgMHFmeZk5RaQkb4PLzcnGnLWqYkP8/bTO2luTMsoTAdSOG369OmbPdX6uz7NXO9MKxKcjFzl39fpnf+dvchsNhfQDBWOy4zo5nGnyaiXaIKnQUdOTgZ70i10jwhGVqloj7Xb9qKxn0KrkWnMWm3jh03pe0+VWB8BbJxmNputc2a9H52alZKUWplPU4Ybgnkt8fbiJ/rcsjDMvdsEIcQhWiDjuO2rdx3f0iPc5yKVJGhKoI8rRWUZzHzrE24fO5rQQD8cUVFpZfXaNQxJ8KWxsspqFq09tP/wCcuVgJWzPXJ37Jirv16f6kUDww3B/Cv2muJhIX1/dJa104QQ6bSBinYoLLGWRgV4jvNyc6I5Oo2MyV1i1fpNHMgsxs/bE4OLM+fim6Vr8XEux0kr05Cl1Mr36w/vX5+SdSmQQyNms9k6Z9b70alZKUmplfkMNwTzWuLtxU8m37ow3itsgkal/tBsNltoI5n2+XrtnszNYf5u/dSyiuZUVtVQbrVhcHGm2majocKiEozuruxMPUyv7hE0ti3lIFlHdxIbbKShjJPFfLY8dVlWfukNgIXmPfJE4o1X31BykhGh/Rbp1U6PCCEsOEDQfmP/MTphXlKUr0wj9lqFfUfzCQhN5Mqh/fF0M9DYmi17yMjOpX9iLFEhATS0LeUg3yz8ikt6BlKvrLKa7QdOWuav2v8OMI02UBRlHLBCCGGhHQQdwNVF+80TN/e/3s1FS73SiiqWb8tg0MDB3HbtCM5FVXUNC5ev59jhbcSHelOnsspGWkaB7afNR5efyC99GEilk6noAFU19rVatWpseDcPd0kILKVWNqflcFlyKAV5WWzbn0ugyRuDizMtsdntbNqVxpsff4G3rphgkxsFxZXsSc+3frEiddWaXZn3llRUPwvk0wUEHWfS7aN6vN0r0kdetvUYl/cLQyUJ6lRW2dh3rAC9MZSpd46nOYtWbiD32A40ahW5lnL2pRfsWrM7cz3wKpBOF5PpOB988uPeuJKKqAeigzxRSYJ6TlqZPtEmDp3IZv+R48SEB9GUk/mnrAt+ObBlf8apvcDHwHbOIzId68ElG44Euum11w2I60aQryuSAISgTml5NQWWEprj4WrI259xajDnKZkOVlVjvz7PUjFh0bpDGv5QDhwGKv1Deiy7uE98CE0wuDj5cx6T+GvMB+YCc4G5wAJgDzBh296DOprhqneWgZ84T6noWKMnjhKfXD5Q/NPoLm632bnRUsIIwBcY9u2r0kybXdH3TRhBU0rKK/A3/hyxYRc+wA+cZ2Q60JBk8dT/Piz1m/1FLTMfkIiPgNxCOJ7DTet3KSTHCwJNuWzcmcqAXt1prLzCyuSxEjpN7Z2hAWI0vzueTUl5pWJduUUp25nGasBMF5DpOMMfvk3q5+8Nzz8g8dVShQqroG88+BohKkTw8UKFB28WbE15i8yT0wk0edPQxh0bGTcUPFyF7s5rRBBnEezaDx98W2t6e75ipgtIdJAekTwxJJkzxo8UrNuhUFzGr9z0EBsmSDkMk8eWsm7T6+Tkn6Le7v1HuG7oz9QpKaNJ+RaFq4dKMcAYuoBEx7j4qcnSIBcnznLjFYKNuxXqjbwIvl1eS2k5TL31ODt3P82iFRtYtHIDBXkvcnESWKsgKoQ/KSwGSUC/nmAyMokuoKIDJEbz9v9MkWJ0Gs6id4af1kPfHoJ68RGCWXNrGZIs6NujmpjgbSREbqN/Txt1tu4DH0+Bvw9nOXAMhBBEBIFOK3x+XKe8DtjoRBLt1/vRO6RhbnqadP9EQUNeHvDP8RKvfKpQXgluenDTc8aP62rpE8efZGQrdA/nVwN7CQ/gITqZRDslRPHcFYOEjmYUFvEnAb5w21WCFz6qZUcav7JWwVtfKtx2lURT4iIEbnp+1SsGRg8SV9PJJNpn9FN3S8Pc9DTr+Q9raYrJC569X8JmgznfKSxeozB6sCA8kCYdz1bIzuOMyeNEEtCbTiTRDtcPF8+OHiRkWpDUXdCSvj3gtqsE40YIgv34jfFZGjO4CE7kckZynJANzjxEJ5Jw3MvTJkuJOi3NOpgB/j6Cc+L3NfjeR2MmbyirUKhn8oLH7pIG0zYewIux4UEr+vaMWeXr5fEpDpBxzOOfPS892CuGFmXng8lI2/nOAa9raUqQCQ4c5SyX9RfdnprNA8Dr/JkOGAOMnTzhyn4TrhgSHBHsz8qNO/nXs29+gANkHLNNUbABMi3IzlO4OFHQJl5vgM9NnCFHgO0wDe07ApcN4IykWLi0rxi/aovyOn/QxYQHLfrHuFHJod18PdRqmbjIEKqra/jwqx8Lnn37s+eA13CAjGNW3Pdc7dwBCapJ4YE0K/UIyDKt83oD/O7lLMKJxopKOIssw5SbRN9VW5QhQCC/GfvSI/8YkRATTkOvfbHgxOy5C+8AVuAgGQeVlPOvKc/X9vn0OamXlwdNigymdV5vgN+9/ImmJ9TspSUbd8OKzZfI814d+LPexYk35y5i1OC+xIQF0VBGdi6z5y78ClgBRAKHcIAKx9kOH+e7nAJuSYoRLu6unOVYFmTlQc8oQbPczBAwlTNqskFl4FfFK6B6Ow3tPgj9ewrqLFghcariUW4YPYpAPx+KSsuIjwph2IBeyCoVDQlA7+Ickxgb/tB9N131+MIVGwKAxZwjiXbql3Sf57er7+KLH3QcyeRXNhts3qvw9nwlg+a4TYfAxzij8jAotZwhh9GYtwe/OnQcckvu4aKkOOoVFpVg8vKksV1ph/lkwTL27E/3uHvClT4ebgZOy8QBMu0zMsjPW06MjeBUcRJbDxxn1Y5KJj896xjwLuCZeoRHu4dzNrfpEPg4CJkziheA6VHOUPnRmLcHbNoDnywyMHVSEo2pVBKN5Z8qZvyowaTH52ApKWPPgfRi4CUcIOMgRVEenjJlyvDosGDqeLoZuCgpjl1phzntBeA9IC47X3m0e7jgDNf/B4GPg5A5o3g9aBI5i8qbpjwxO/5o77jIUK1GTUPuBj2ZOXn4GN15b9731NYqTL7hSgJM3vj5GFm5caflxqnPbwOWAVYcoMIBiqLotq3NXSmKe0RpTTHYMOHk4Y+rr5GjOadsb30457GXXnqpAMiPjxC3DOwlPKmnGwJCAxojCA0oNjh+N5geAMmJM6zHoPQzGjqeA+Z3Tq555r6bY7w93WnI29OdxT9v4mB6Jomx4YQF+fHvme9kvvj+/MUHj52oeO/LJQuBW4ENOEjGMZfu3mCRf56Tz89z8qmnN6oITRgga3UlaauXnCh00mjSc4rWGmA8ZxSbodgM6EB/K6iCgBqwl4LswRmSRDPWpRw6dk14kD9ajZp6NrsdvbNT+VOzPv7pl89fvV6SJDbv3j8feOSH1VvoCDKOufjo7nIaKyu0s3dVCXtXlXCaETAOv9+JXC/wNdKIFcre54zsF8B2DFzvAH0UqPU0Y/kjL74/fsGydQ/efu2IvlGhAXKNzca3P6099t78JY8AOx547m1vo7urCviSDiTjgIpSW99juypojdpJYvDlcVvTN5Dsa6Rlfg/yq0PdIQ+QPGnB1xt3pn69cWdqb2AMUAm8Dlg5bWfq4cH8BWQckLLZ4kobhCW64N/N9/sjlUoyCFpkzYGaYs6oPUVjQlDHwB+2A9vpJDJtN3zYgF7myy9JDigoKvSnDWL669FqtSvTT3Av4EtLKrOgdA4t0TsLTosB1tMFZNrmX0/de9PTN4251Mvg5s72dA1t4RuoKxdCrL/rOnF08ljhS0sKp4BSTEt8jNSJoYtItK73tHtuevqO60d62WtrOVWtIW1jKW0hK+qjnLY1RSmnNUoxrfH3ok4CXUSiddcZ3Q1e85estlwxadqyMo0x4+jucmxKJemlS1BFvUxuxS5yyrdRXJ1BQ9GJbrmctucghcVltJssQ1IsKrqITOumPfT8u/8BjnCav2+fX0qrfgw2xH3DGzf2p6TMi+8913DrNZfx6kdfk7VrELLkTGxMEkY/3XF+k5ZbCG562q1vvNDvSFPoCjJtc4Tf/fe7t6rvetRAoNswVCqJLxav5K5xo6i0VrN8wxbemt6Lleu30j1uCKd9z2+OlJTRIRKihQkUuoLEOXpz1stSoJtMeaWVtz//jglXDsVJp+WL71ex5INn6BMfhaQRDBzlw2kb+Y1RLdMhAk0EATq6gMw5OnI8e2bUiNsrvDzcRHRogEtCTPjg71ZutNhs9rID6ZmBC9M3FL8558vXZn8y73shRA6/GRDSjQ7h4kSdgcBKOpmg/UYCe4AcIBY4CVhoYNJYse39Z6TedICUw9DjOvvjwIt0Mpn2W8of0viz7mMGiwQ6SGg36vSjC0j89e7tGSVkOoiLEwzugxddQOIv5mskUqmlw1iKwegm3OkCKv5i5ZV885//KsF+3iIiwFdonJ1wiM0GSzfALU/al67exiQgn04m6Dy9TUaeMd8nDR7UW7jFhNJmm/fC7C9q932+RHkDeJ8uIuh8HsDjoweLS++6VsQHmoQuLhx0Ws5irYLNe+HzJbX7P/hWmQfMoIsJupYfMNHFiWFjLxMeiTHC21WP5ngOFZ8trj125ASfAvP42/9//g9urf0PY4SjEwAAAABJRU5ErkJggg==" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAP0SURBVK3BfUyUdQAH8O/z/J574bj3F++O43h5AG8Y8iqgybSEQtfbggnOanVlw5qbm7P+qPX6jwWtJQQsxTbMscgySP7QYcVEKRBPeZM3OcYiXi7A43i91yfcru0Zdc6sz4cgaLK99ZlCvfpMyRP51pOXWk7hARCs4ThO3l1e1uxsOp7gnnKZ3ikt831+9lwr/iUaayiKcskSLI0gGghNMS7v8rIMD4BB0OYDhw7RDBMenZtfKYti2/A/iwPwGAA17hOFv1O+Z93eIZcIWUJo4vUFVlfdvu7rg5NlDVduf4t7IFjnjX2ZLRKxIFkeLqIJTUPIEEYiFpgitNI90Xr5km1ouh0hMOAp3pX4mkIqzlJoouD1rcBsZkETBq6FRfxx+6ZbKRVbAXQCaMM/oMFjiVLtpmgBlb0lG1FsMjJS08DGsIhnE6DQxa2Wfd2RBqADQXbnRCF4CHgez4w9LFfqItNT0qDXqEDTFNweL3QaJeRrRL5p+trA1E+nu86/q3vacqLJftlaX1nXXlX6mR1rCHh2ppr3SoT+eCJSQatWwT6zCk+YHlhxAhwH18xoSoRGOruUFr2nfKYzq89zh1EurWhbay/UYQ0DnrGp+Z/VcnF+783L8PsDSGBjQNMLgFiCvsFxiEWM0qAJL9qf9GRFz7x9h0mknjHLDH0IIuC5Mey4uj3JVERTnE4i18Oo18G1uIzJaQc6r7UsOuYWvvm4rr2o+pOKgbpPv5w+mF70UqZp80UEUVjn2R0JhaxRWRomFjHP7Xs50u3xcFU11RUnznedBHAL90CwzsHiOxl5ORNbHrL8tujnthoJE07YyFPc4eeptKUVOLuHYEcIDNZ56hGUmDYgZdUDjE99BZl4I3QsthGCbUdfpHCmibuEEGjw1LxPWQ1aZDMMwAWAOHM/hKQROkMxKABGLXIQFBup35kUH50HHgY8iSxyxUII5uYBlRwgBDCYGwE6DAFHPRQyRBw7UnA6K2XrJgqU9oqt983e47X4Cw2ersXKGtvw0cDgWNaAzw9AexZQPwwQKRgCdI+8HsjLyX3BqNNkzDpdeqkkbBN4GPD4HTkf/jiYTrvdBVJLXJlbtPSLCJQf4GgQGphbMLWEiVdNv964NVLb0PxFZ8/QD+BhENRQ9UHNyKgztecCYEgWGvzewRGsfG+BrxDwfgehANh94K2PADQjBIKg6IgNsXGsapdxY5dIplM44o3l4woZohDox10CBlCEo/tiG9oQAkHQVVtfe8/AdXtKYmT/xIytOie5p0AqgQY8hKZGa86hCSEw4Bke+73+yLFq3FX8KLWfEGhVcqg5DnDMwj4+DRv+A2HJXljffhWv4D78CfxeWgoApelQAAAAAElFTkSuQmCC" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAGQSURBVGP+//8/u+Pzu6eSrM085588t5IBB2BiZGT8ycTB8YCJg/MhAx7AyAAFdQlWJXxcbO6///5/efLq044NR+5cYUACLAxAEO6kYc7BwV3HLyDEy8LGwWD464/WhiN3AhgYGB4xQAEzAxCEO2rkGRpaO+nqGjNISsoyMLDyXvbpLL8h4afRs2DSgnPTuia8Y2IAgu+//rx4+fw+w6+//xiY2LkZGP9+d7p97GDAlS+PPTde3RnIAATMDEBw5NKTE0bKfH7iEnKCv3/9eHvy1KHlTS3Lc9dMWLQzUtdrNQMQMDNAwYKOxwlc7JwiXByfWPU0N76fvIxh6ey+ac8YoICZAQj2zGJI0lBkyBTku8UhIBXDzvJnt7ypQQVXlI+L48ptB/YxAAETAxBcf36Wc/OhBR8ZOIv+sQtbMnz44v9dSlwi/tPXbwIMUMDCAAQczDeirt8U5PKxW/yK4dkuCRH+K1eUPTfaMiABJgYg6JxVmskhsDX0x8/X3/7+vcLw8xfDPwYCgLkwlsGdAQsAADgojObyWZRiAAAAAElFTkSuQmCC" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-4-icon_png.js b/mipmaps/level-4-icon_png.js new file mode 100644 index 00000000..005b5ea5 --- /dev/null +++ b/mipmaps/level-4-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAQrSURBVK3BC0yUBQDA8f/34OR4P+V1xEs0Hlq+Cp1umamb1TRdzWWycqVhynyks4dDW2qtmdDqUtAayrKVWRnQtKlYIhEpPkB84QOGHsdxHPfguOPuvs7N1u283Fz9fvyfJB5Q1Y/udzPHlOwuLdt4vUK76TI+ZB7A7m/cn2+rYmmzGUEQlA1ANT5EvBRFkSvLLhw58lPHG9xHwQThq7Q4LPEiSCIxiqJk4UPCKyf5xZ2HdvTMb79omVm8ct2o72s/PcA/hgMOwKMt29SxvLgkefqjnF3/ujhbEIRefMh4GXSOyZ4hcNkVMSZe1YbX24sKaqLDgqeKohDuUbA7h9yXrnYZdy4vlIrxKlrIPSS8ao5pD1rcA6lJI4bpFywZ9eraBRN3DVPJ82Mi1OogWUIlS0HqYXJiXKR6Zl5GXGRD661fCEDgXknvLJp0ISkpLWrA1o9Gk06wOhT7oINLF0/bQblV23Dtwz8v6SrwI+OncFbe4lB1UFR6RjYeQUVu1kMgQJfOgFsRpJWbd75ktDquEYCIH018xAhJFBmRkUFedhqyLGG12UnXJDJ54njVrIKRbwJ6AhDxY7U7jeEhKlovtiFLErdMgzhiH0Zv9RAky+Smxz677LmxJQQg4edKp9E6KV+z0GbulgfdKjI1CURgJVQloO/to+f2ZUkSxcy65o59gA0fIn6MVsfJPou9TlEUegwGXC43JrMVk9lCY+NvbqPZ3ljb0F4IdF8/XLPijHb7Hu6SCOD31q7mtITIGR6nmeTULCk+Jkou3/v1ofrT5zfsqj63qstgvdm0teR4Z1XFEtvVy6M3V5RfL62sOicTgNOldM9+6kx3SgKdA0MFkyCOx8cKKa/Mu/HM9BMEr/2YSlGl0rl1TSJevefPFQJ7ZQI4UiFsfGIiU/vMoDfuYdBmoGD04fyYSPKnPSbkgFI5pmjlFqfJNF6dmHj8kWWr36d4HQL3ytQdE+oTYknsM0N4KPQYISLqaTzOGpxDOJ9fo8w61kQdEA3kACfxkvDzyXph8ZRxzJUkBIsNwkMhfHgJqtRVBFk/wz6IlJ1WkDJ7WuH8FYvmbhmXm237+demo3iJ+Fmx1aP940Lx7Zb2J3tEAQshb0FKEcihiCK0tM9Q4hJenpGXnT7H5XLFh4UGZ3GXjJ/yU99+1BYdmSJ6puhfEzSuOLcJDLUQNoY7BpwZZ8Ld7uT6Uy0dLVduHNixr/oD7pLx8cWWNcWO7s45pf2teA1/ISyxDYc2GncnmLTcERJUXjdhnrKaAGR8mMxWIczkHqgwZHBWZVdCou3NQA6uav6WEEsy/0LCx6ETpxoFk1UXHxZxMzdM80NqxPaRcVGMwsfAIH2lVXxJADJ+Dh5t2H/waMN+vOr3CCn6XnpiooiXJejtp1/XQzP/gbypiKXfbeM9IJ/7+AuzrabHKJK6DwAAAABJRU5ErkJggg==" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAGcSURBVGPABRom/G06deWfBgMUMP3//59p+cwbBQxIYMnGv6EbjjBUrtv6v4gBCpiluULbDy1/21hRX/naUOJChqeFUuaLy3M/2XkmbqnMZKpvbGz8zwAELKll2m3MLFd/XzgQqy0iJJQkLCTCyPHlk8uDbZaTGWNP/WOAAkYGKGhKtjnv6h5qIMzPx/Dh0+d/3dNmJq3ef3UhAxQwMUABFzvr1/fvXjH8ZOZi4OHlYzJUFaljYGDgYYACZgYoMFaXYPz08ZODmpIi6+VrVy89ffpwRou9Z16ihYn3/JNnN7AwQIGz3YnXGkoMHz5+V+c20dwoIC1yl/3vCTVRRhYWTgYgYGKAAj01hixBPgY5ZZlLzDKKIfKyElIR303Urx5nZ5jOAAQsDFCw4WMDq/7Pa2/NtP2EGf7/ZHj6LkmBkZGBS0xE4AgDELAwAMG0+tyAl5++Gx38zvPJ7H2rMMP/zwzsTE9arJMZ+hmggJkBCLYePHXDRlLhjpvcgxeiAmct//3/9P/rd4bjU5YzHGLABRoyGMyWtTN4MKABANzIj5111/jOAAAAAElFTkSuQmCC" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-5-icon_png.js b/mipmaps/level-5-icon_png.js new file mode 100644 index 00000000..7e3862a7 --- /dev/null +++ b/mipmaps/level-5-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,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" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAR+SURBVKXBfUyUdQAH8O/vebk7n7vnXrg7EBB5FQ9UYOKp6TQVXLA5NAfOwqEssnCZmvbirCQrs5ybL6hN0c6pM2SlksnmiGlQiHKIaemBiOc8j0CRe+X17umx8Ue7necffT4EIXx2eX/tHYc1fcg/opwRPuX7D2YVr0QIDEKwex/zp1wdOojivJF6vACFEOQM9wQiOQgoQmnxAgxCSIlIrjLpJ7QYx2d0pGpiG3ZiIwJdqOrcn5sft5sQ0k4QGhOh4ZZIWVr9oNtVD8CCUYIgqA9/8+eZ3yqfzsvMU5rXbk1bwGDU4z4hR6tCOyGkA6KxYVz+ugLjt3IZq6Upgv7BkWHv4Ehri8X+xdmGu9XVJ+7tvWzqnQc/0FTpyNSPtZiYT3b5rlmsSFpU6ldveQubAewAEFOyKH23zydoGZrCM5yMZTkZa5w9ZdwxXi7dkLciYVvbH05ja7XLYMjirGnT9RVU5yNoTlugvtILmG9gMkTrC6Z9yHOSaJUuFiO0BrETpiNu4ktg+Th4Bob7NLysmBDSX7gmedXCUl1t6ZZJBZOmai8wehVsABJn6yCwNMIh0qu56QLNY/6cubB3P0Hi+Gg43R4olRo43F532XcnXoYoKl5uA7AQ6/EvxpiBqkMG1OfnUJfClKQWIoamdHp9BHg5Bz6ewzMyqQQaFY+BKZNSVuVOXmOquXUAAQiC+PLNuc08J8nMnJkLhUIFLmEaBELDc7cRTsdTNP1e0222dG2qrLtzHP9BIYjuPm8jTRGYm2rR3fM3vPevY9DagjClHHa7DVKW1kXrFHMwShAELUQMgthT1Vy2ffXcxcBgDCEU+DEMHC4PWjseoN1y3db91HN0348tn1ae931c14gVOw74bQCyaATXP06ncApAqt3+6PHU9Ayt0+1xHDl5YvPeH8zLr9621x0749u33YSPaqzQwYnIc1VlLRSeo3DpX3HLF5uFxa/U0Q7XEzD0sHJd8e1l106R8wCS8nOpiolRggOi+72QNTQJr9N4jh3ryZGocCRGaBHmcj2CRmElEdoHMUo5JuTMJsQwo8xUsnrrtFgZ2OI8lL+xjF5HIYiLh8iucC3ifX5AwgIJ0TchZeqh1cwCRQBDPLIheq+EKpI+XPrVz4ezf4WIRhAbi8iGSB2SXF6AlwMMA8gj9wLqV+HuOQkJow9LiCsxDHVZvo6NijDuO37utMvjtVEIwmHd1tt6axPaH67sBPQAvxOILARoNfx++O51ldLGtImvSSXseIfLEz0zzZAAEYMghLa2BXbTcYBWxbsP5kGhGgP0NQLUGEhYuN0DipvDbgfaOm331n5eXg7gGkQMAlw4uvPiUM0vekEAKJbDkOD0wvEOh8FSYOAgROyCovfnIAgGAdxUWA3JSM0eTE+Brp94h4cqHgJIxsBBPCOTgAMwD8AlBKARoOps9ZUet7e+x+VuvkvkmxdmNL7LySDDKJYFxoWj7afLaEAABkFcunqjDkAdAO3bWeSi34/5KgX0wz6MdPWguacPZvwfSTFYkhiDLITwD3eLpB6Xjpy7AAAAAElFTkSuQmCC" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAGtSURBVGNmQAIlu7v6mH3lN8ZnJzEeWrDtEAMSYGJAAhwsnHf5WTgv/P335z0DFOxa/yCQAQiYGYDg/af/mp3tjW+cmT/7qT9+K8ty6To/LyfrtWi/XQtPbntXUFJe9pglJOfvs6Tyf6/ygo3r2di5SwWERNiZmFkY9H79lhcQZt34S+mfgJ6Z6GkWHk6GC6wsDO8l//J4mxhbs8tISzP8+fuXgY1b5HV0qX4XAwNDV/NsBgbmC8ealp470rTOWlfalJWJwV5IVpOBnYuP4en9q0rS/P8fnrz+/E5jY+NvRgYE4KpPsDru7hGi+vPX79f7925c/krmsPTrDwyO9QWMTiwMCPAtIfwY85//EgwMDEwC0SHHNKae/f/q2w/Gn0dO/DdgZoCCE0sZyhWlGaJEBa6z8okFsTP8PifL84fppDr/zlNJGa5TmRig4Me5bOnT63x+MLAXMbCJ+zN8/Brwg5uLw+fHz18cDEDAwgAFn7iYHf4/YWP99XXHF86nx3hE+E6cUfNe4sEABSwMUNC782CgnLSElO2Pa8tYmBm4f/1h+MVACCjLMpgyoAEA2XyYMcT15/wAAAAASUVORK5CYII=" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/level-6-icon_png.js b/mipmaps/level-6-icon_png.js new file mode 100644 index 00000000..89c85f6b --- /dev/null +++ b/mipmaps/level-6-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 150, + "height": 196, + "url": "data:image/png;base64,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" +}, { + "width": 75, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 38, + "height": 49, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAxCAYAAAC27tuNAAAAAklEQVR4AewaftIAAAxlSURBVK3BB3yU9cHA8d//eZ67y10uew8zyIJAFJQlCDgioAiCQQHBaitVP6W11hf7vo5aD1rEhR+lDt5XEayAA0SWQoFUEAoECCOEBAhJyCCbXC65jFvPe4eBHmkICfr9Cn4GqqombS8//MrQ8LQzQTrjFiHEYX4ihZ/H5Kf3L51T52znoaBBpvnZSxoidYF16WHJ5+9JGTNVCNFMHyl0Q1XV4KbiU68G9EubL4Ro5hrWl+ztX2hvweODhqO4hQAhz3WMjrg3dWwz10GiG6X/2Lz6wNysJwpXL9+vqurdXENTU30K3YjQBdZxnSS6qD64943iT5aNd9TlU/zq4+mHFv3pc3NRwbP0oKH1QjTdCNQHVHKdJLy01VQ+Urzui3ntJzYLOtWu+UvwsSWLF1fuyV7JVVR3mMPoRqB/6Fmuk0QnVVUHnVr7+auNm9/V00XL7pWampx9U1RVHU4XqqqG3Bo+sOrZqFE1fwgfpiYpBjySFAOTE249zXVS6GRvsYxpr6kKoBu+I2c6Eu6d8roQIocuhBANQAZuqqr2X+y0T95Uui8Vuz1JK2s20QNVVcef3fjV4vjMe/6i8fX7Gi8CL3Zrc1bhqhVvlL33QiLOZjyU6GGkv7T4yxvG3jWDn1FrTcWcgr+veKt6xUvh0Y8vqhr8zPOzhBC76CTjZeGiVwve3/jtWvmGtCHNlZZEZ30R/f7wWm7iPfffYzKZXHTPD4gBfIFmeqGp+NQzJz/68I3aNQuDcWs+stPP5hM+5r0NW7JNJlMtboKrqD60b6n5zKnJaTMfnS2E2IuXqFDjk/ePTn4oxF/fX6eVwyUhFBVwOFxma7u97FhR7b7th0oXApV0UZeXu+DU8mXPNW1f5oM3SU/Kn5cfTXlg5lghRLPMVbz5vx9/t3Tt+mVCiGKupJ83dUh2WlxIqr+vzs/go5H0Og0GnQajXusT5OcTkRobNHRIasQjeh8l9GyleQde5t41dknVJy/HgosrqA4aD+yP9B88YsCb/7f8C4keCCHauNK4xyfd+L1OK+vpgSxLxIb5hY0fmvjHR+8ZtAVQ6JSa9fC82KdeK6croRD35P+URgwb/T5uMn0w976bPkmODbqt3ebE7nBh8NHQE40iExHkmxIV4jvm6JnalbiZTKbyD7ZsK7BY1InWvF0G3IQ+hqTn/3ZiwJy5WUKI/bjJ9N6kaWNS/2htt8taRSYoLBHJZeWStg47LW12WjvstHc4aLc5kSTQamTCAgyJAUZdan5J/de4mUymonfWrK5uauIuu1XoUucv2JsybeYEIcQ5Osn00uy70xelxYVkmFs60Gll+qXcRN7JfKxqIAMzRpI2YAgDBw7hhvg0JJ8QfAMiKS8rZv3u0+t8tHKdkMTgI2dqbcBB3P76xpLjb378sT1g8NDW+LsnTRJCWPEi6KXn54w8GxPm16+hqQ2hCSBryjTMlhb0eh0hgf54O3TiNKkJsXzzzWccLKj8+8a9Rb/gR+nASXpBonfi9TolvsPmpLFVYvK9kzH66vEzGnh/1UYuMVtasDsc1DaY8TcaGDl6IlqNdhj/dpJekumdyfeOTMpSZIn4lFtIT07Aw0enZeigFLQaDR4lFdW4XC5uHpiCR0hQAC6hDTly4mR5c6vtCH0g04Wqqg/dnznvuRnTnv71yjVvr+ZHIyaO6DfZR6vQYLaSkZ7OJVqNhkuCA/ww+uoRQnCJtbVN6NWGlAMnq96nD2RVVYdNn/S7P48b+vgLmaOeXLxu2blHty6rHtyu2lN2Hli222QylQLxd90SN0OnUcDZhuwTSmhQAB4Op5Oi8hqa5SCssj+NHRL1jRb8dCDLMheaWnBaq8ICjLrU/JL6r+klBXBt+bxsbt63LRJeCrKtnDpqng78E9jR1uFo8TPojD5ahZycXURHZOHna6CorJpB42cTHR2Nh9PpZPv61Wg1Mh4dNhtajcyw/lGzQMhfZBfMARxcg2wymapmZj39q9LctkC8qRCcKNu+2rh0OWC7OTUiK9hfH42bXqNy7FQpCXGJxESEUJyfS2VdI1U1tRTszyY5WCBLEh4Fp07jaGtAo8giOsQ4yOZwZZRUNX3BNUi4hUf6nKIbjfUdKXT6Z27Zhnabg0sCta1s2PQV+aeLiY8MIlZqILKjlP4ROjSKgoelpZXy0hN4uFwqxVXmwuzccy/TCxJuw8ZE5ip6QVcVRW3hqqpOwe1IUe3CyrrmIry57DQ0mmlt68Aj/0wptQ1mPGx2O9/t3Emov5bWDjvHztb+8O7aw9OAE3g5k9e4YPv6c8dVVR2BFwW3yDjDZxnjjfOPbGhWtEaJjLuNtsBQbWlMnG8h4KLThr1n3pk76aa3jXqtUlxlJj1jNGOGD0EIgcfAlAQ8Kmvq2b1nN7LzAqWNraV78yqW7z1RuZBOqqoqJYWWRXu2n3/o7fkF8U3lDvS+mueBqXQSdMreVLa7o81lvXlk+P7wG/SfCiFK6MaszPS1kcGGrH5RgThdKs0OIzOmTUOn1eBRUl7F52s/qxeI/G05JZuKq8xv4aXgSMOiA9/Xzs7Z2hjXdM7BJSNmBFp/90rGrUKIPNwUOt05OW4svbBmx8mZgxJDt96SFpkUYNTZVdVsqaq7kJEQE6HFTZKk1g83HA3jKixmW/KOj+riVCdXOPCV2femEZUvAw/iJtF3+hMl9XtXbj2x5N21h++Pi8/d2dzS5KCTVqsx3D6cFVzF8NsjF45+OKiZrlxw8kjjBFVVM3BT6KPXnxVvTLtTPNnQBJEhUFaNHZGrcTiSUBQZm83Gi3OlWX97njsAtd5Mx+sfu97/dg/v4CaEyMvZVb1tz6rG6bi4QsXpNt/aitZfAs8q9I0+c6SYmhwHlIG/EdLi0TRatnD6bCChoSNwdOwmNBDtwCTicCuugP96THr42z2ud+g0bGzEgmEP1Ew4uLbJD7eUsXrX4DFBuaPvjPkgLEa/HDeFPnjuMfHagEQicEuOg4oaiI2AmgswJHUVTtcqopLhYD6XNVogPoobgcHAUdyEEHk/bK3ccaHKNvnmcUG5mVPilhkDtcvxotB7wTMmigd9dFymUbgoIwUKisHaBmXnoX8/LgsLgtgIfBb9XjzzwjvqY3S6bUL04tsmRK8VQqymG4JeWjJfrJo3Szys1XCR3QHF5ZCWSDcUkIaBax+HT8It6XAon9Jhs1yJ/Kf7gABgFV4Ueidz0jjxoFbDZVV1EBVGNxSI2QbNOWDZh6+eixJjSUiI5qnS83wIZP7pN7MfS0mIyYgMDc7YlXN8618/XL0KLwq9syO/iINJsYySZS6qb4S4KP5T1GYIvh1a8/FoaeUiPwM8PWf4782tqQ/ER0cMyhx1c5Td4eDtFetWv/fZxtl0IdNLX2xTc/onjfpVQlSFotNCXhGOpBuQ8Ba5EUInAC5oK4XWdTRaIMgPtuc8xW0jHgjVKErSqCHpfrhVVtdzvqYhbPrEsdO/233wY7wo9IKqqv0//dqx0U8945N9rpLmpuM1q9dvW3Zjyo6XI0P5UfiXEDYJ2opAnwxyMB6+Blj+TYozc9wIWZFlJElgtrTgYXc4SI6PMZRX1R2nC4VeaLIydcEqKfGsNQ1Io7//nRH3jX3mpT2NVUwPux2MsyF8Krg6oKMa9Mkga/CQBDil8ac0ipKOm06j4XD+mRYhsOYVlmxbv2PPtpKKmtV0odAL3x9UB5y1clmhBQp3Ib0XpgW1GJoXQsE20N4KvkNAFweygUvmmZa+KARPJcVFp+06cHyzxdpabTToDUtWrHuRq1C4tqzCwvohEEJXgdpaLnPmQFsOBH4L5S+AbR8esoRH1W9eWTqRPlDowYMTx/z3bx+Z9nKZSzLQjYpGazUQiTfzl9CxhkuC/PEYCxygDyR6MCi1X9qhE6e351fqnL+M2MlvY5bzeMQmsDfiERKlO9hs5UptK/Bm0MP9dxBJH8n04PsDxzZs++FgdtOZVb+4K6PKmBhlwag9yX0J+2hRM3liyoUPZfMHE/186ZHdyfn1O/mSPpC5BpPJZLU0VPocP11SGhLob7fbHcUNluZ/vfXalM2PPDBK+0SWeZwi06MLZtGwcqP6CX0g+Ak2LZWy7xvHHVzDsdMUD57uSqIPJH6CdhuKpYUetbVDRTUt9JHMT/DVP9RPzpartqhQEeZyEexvRBaCizpskF9Ew0fr1RVPLlCnAS76QPDzGf7QeGbMniQGaLVo1nxH7qcb1deAC1yH/wdQ3d/K+0DSYAAAAABJRU5ErkJggg==" +}, { + "width": 19, + "height": 25, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAZCAYAAADTyxWqAAAAAklEQVR4AewaftIAAAUASURBVI3BC0zUdQAH8O/v/v97AsLd8SZ5P+Wh4AMCH+hGqMuciGnMhKwkGm0WWk4nimlmyBTTlCQRtaFIaOLGM01AkYlKiAohkHICHnccd9ydHPf4d263dUOoPh+C/8AwzILMmm+Ocil2X7jIvzctclUWIWQck6Bh0VtdsXG4vW1d1BfbPyWEPIHFzw+r4o/J7kUAiFirHVJ9EJX0GabAgtnLF88jn10u+3qwaEdC4+b0WknDtTWw6JL3BMGCy2K/wL9gwazzl9I96oZid5ipW297KXu7Y2ARIfZvyXKNqfhIGHY/2N7rAawwDBPQW3N1CywIzPSa0bB7efsL5JVlsc5J79fN2bozAf8QATAAUMGKsqczrv3E0VOajnZvz5S03cHrUvcTWHlypew7vxWrjxFCnm5Onp3r5mi3gaKIExgY9QZT36BCcyn/YksWzJqyt3YMl+cGwYwb+rYmLGtbBgUrR0pKa3NycpRpy8IzxA78bfY2XBGPQxM2TbF4HFootOO+GRXgEtvQJjmXteljsUYyEmdSKSjh4nfagt5LO0xhEsnxQcdNJsbH1sEDFNsWrh7+MFG2GNXoAKOO5Sq2Cck4WLjVzFEQOk8558vsREKIlOB1Dt+mL+qfJvbhL4iNhUqthaujCP1SOYwGHfILTx+8VN+RC0CKCViw6Gwd3nDtSl8agHlcNs0PCQrBNFsbuDmJoNPr4eLoAB/P6UiIj18BQIpJUOeOPS6c4ZpaVF08mKIz6t3qmgrOvTXXO12t0bK8vX2hNAkgDIjGyBgBz6CCdFDiGOhCRTY+eF4KgIEVFiFkvPfmmGhMboJ6xOAP4OG43thteDmEhpsNIBoZlH2PwdNIYGIYKOQDcBIKEuJnea7HBNQPJw4wzfXSFL6QxYg9uCN1TSdulZw68lJkx1+k0o4TP19/sE06MEYjmu/egUz6tPfPPsWu8vrOojnBqftn+aQe37tv92hhcV4rdfDQN137cncJ1n3it2fpWs/MnJwcyZ2OwRtOQn6MHRdiDl+o93rDndv6qLOjsrbmwKHSlrX3u160uPOSm6t/HHp34OG4SEfp3WpvFhRSMDt74XBd7qF9PbCS95VsecSMvjGjydlGLAqeNqqRmJYvrNAkxpHw85W4kZry+dxHN9SzYcbiwfVyTf4fNCaxJRUrosORPKYDx82xHAoVF55Orc4hPlhvMkEJ4GTyxoCdXW2jKymayKIWiE47e9hcoTCJor3kpJsTfHV6wFkEwNQOe9th8LnTQbGUvCXRhATM3V1ed7ugfn6ie9XZ84dLYEbhdf47N5FsGwF4KjVgKwBsBADfqxrQ66EevQs+z0Ps55Myk6X4a1ts5IyAX39rKoEZjQkYhlGWFv8uiRiv4tOGn+QuYrkbXK4Colhg9BZkCjHDsLcHxsw0BNIUBaVaq4QFjQma25mkjAsLQymyEJmLd7hme68GWHxA2wtQ06DTB3SCEIfuZ/190uGR9u/PXMqHBQ0ra5bOX9Rz517msCkSr8hkWj2MdRwM1AGCLEB7CmJ7xZBXYlMIJkHDSligr9PQiHakMP40uvvtMGBa1qkdQ7iAB0Cbh1c4bIgwBRpWdh05U7Z0/iN5fMysJc52HMSFdtM8DsJhhabhiCnQmKCqseV6VWPLdZhdzCPpgy7oEtnDj8cFS62FfnAIrZgCwf+waglWfpiE6AvVaDhbgUpM4W/olAbnNsFdIwAAAABJRU5ErkJggg==" +}, { + "width": 10, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAANCAYAAACQN/8FAAAAAklEQVR4AewaftIAAAHNSURBVGMAgQvT+nP///8vzAAE8Vuqt0ZuKrv8//9/ZgYkwHRp9tTE5yvndx/KSV7NAAb/Wf79/8/CyMj49////8L3d22xZQAC5kkrVj5/cfmKNo+S8hpZmV9RUvefiglceXTwwIVHexyf3z305tC+2O6FCw4yMkBBXbxVGScXd6uokAjLz18/GZ48e7bMS8zwz98f32Xtp80PZWQAgtMHX7juWx5RYm3n4yYoIMDw+/dvhm37j7RVTVhazQAFTLUpp84t6bu3goHh/+dXL54wMPBKMXDwCjHwsnxPs9eXNWKAAiYuXubTfKIsR5lEDeZcv3Hp9a+3D/7cuXXtzrt3L6c4W69vrE05dYoBCBgZoKA4nkEzP5ph05efmbJsLDfevf+wf/nG3aeM//z6L1nUqRPAzAAFK7sYuoUFGJxE+M+wCIj48/7/c12CV1hh/z+mIxsc/Px3sTBAwfTjL4R0xG7+iPI8ycHAY8zw4SazIOP/f/5ff/x8zAAELAxAUJIUYsb977nprksKf8Kt7BmYv9oxCPMcWqofyJDDAAXMDEBw7Py1p7a6326aqZ09qy59yoGR4SHzp68MF/oXM2xhwAUCnRi0lnUw+DOgAQCNK7rLRecTPgAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/multiply-screen-icon_png.js b/mipmaps/multiply-screen-icon_png.js new file mode 100644 index 00000000..0a557467 --- /dev/null +++ b/mipmaps/multiply-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 1142, + "height": 777, + "url": "data:image/png;base64,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e/dT7t79Vx577M947LEEInvh7t1PuXv3X3nssT/jsccSiOzG3bufcvfuv/LYY3/GY48lENkLd+9+yt27/8pjj/0Zjz2WQGQnxsfHEPnMOCIi2/SXfznO//DfH0FkNz744BPaH3zCX33uz3n66b9AZC988MEntD/4hL/63J/z9NN/gchufPDBJ7Q/+IS/+tyf8/TTf4HIXvjgg09of/AJf/W5P+fpp/8CkZ34y78cR+QzCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlKCUREREREREREZCglEBERERERERGRoZRARERERERERESGUgIRERERERERERlK44iISKxavUkYtvnMhP0UnpfjIFSrDTrRb/jMhP0UnpdDBp8xPcqvrXG/ae9ZbDvFfgqCFuZ2jzBs86AJ+ylsO4XjHMOyksjgKy1UuJ+b/SKum2E/BUGLMGxjbve434T9FLadwnUzyPCoVht0ot/wmQn7KTwvx6AJwzbGfMz9LOsJHCeNDJZavUkYtrlfcd5HRPbWOCIi0lcUdfH9BYzp8RnXzeB5OfZbELQ46y9yP9fN4Hk5ZPCVFlYol9e4n5v9Irad4lEypke9HrBafZcgaLFVjpNm2suRz2ex7RQyeKrVBqXSCvcrFs/huhkeJWN61OsBq9V3CYIWW5GfzJLPZ/G8HDK4wrDNWX+R+7luBs/L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" +}, { + "width": 571, + "height": 389, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjsAAAGFCAYAAAAb/jLDAAA3EklEQVR4AezBC3yOheP//9cu19adtdmJNkbG5JTTUEhK5EN0JFRCOSRySMkph1BOkWPORelAosRHp9EBKcz5lMNk2IzZbKa7uW3/3/3pcf1btc1pX811v59Pr7OuzPGIiIiI2FOKCbyEiIiIiD0dMRARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMREfFgRz79iPj5Y7ha1Wf/lxuKFUdECh4TEREPlrx2Fc7D27laWRcuICIFk4GIiAc7u2UdImJvBiIiHsqZEIcr6RAiYm8GIiIeKv1YHCJifwYiIh4q/VQyImJ/JiIiHiot5gdy4n9/T0IateBymH5FEJGCyURExEOlrf8vOSnW5AFK3NMYEbEHAxERD+Q6m8rvcTvJyY3+voiIfRiIiHigs4f2kZubbimLiNiHgYiIBzqXnEpOzOAy+AQXQ0Tsw0RExAOl7dhITm6qcSdndm/h5OaNpK5dyfkTv+Jm3OjHTXc0Iaj2XYTUqE2hwr6IyPXBRETEA6X9/A05OfPtx2z95j1ycm7POhLngxlchoj+Eyne5EFEpOAzEBHxMJm/Ozm3ez05yXI5uRhX0iH2v/wwO18fxIVz6YhIwWYgIuJh0o8cIMvl5GolLR7DztcHk/m7ExEpuAxERDzMuROJ5JeUFVOI/egdRKTgMhER8TBn434lLzeUrknwAx1wlC6PKy2ZpBXvk77pc3Jz9M0eFK3bAP9bKyMiBY+JiIiHSfvpa3JSyC+MyFFvc/OdjfAyTSwRD7fmxPdfsa/vw2S5nOQkbsl7VB40BhEpeAoNGjpsOCIiHsQRHkGRex6jcM3/4B1SEi9MjJuKUe3tLwiqWgsvw+DvbrqlLDfcGkXSFx+Qk9/2baZ4m+4UctyIiBQoZ0xERDxMwG1RBGB5gksVek8zjtZ6gPRNn/N3WS4nZ37ZSUjtuxCRgsVAREQuWdFHniY3506nIiIFj4GIiFyyG4MCyI0zdi8iUvAYiIjIJbvB7yZE5PpiICIilyzT5UJEri8mIiIeKvN3JxmnT/J70gky0s8RXP12jBsc5OX3tHRy4x1aEhEpeExERDxI3LKFnFg2n4z4w5w/eYjsopbsxC+yEnk5e/ggufG9+WZEpOAxEBHxJL5BpG9fzfmTh/i7kz//SF4yf3dy8uPZ5KZIZHlEpOAxEBHxIP4lS5CbY1NeJv3oYXITt3wRGUdiyEnAfzpzQ9FQRKTgMRAR8SBFKlbjxtsakZNMZzLbu7ci9cBesstyuTiy7H0Ov/Y0uQlv2xkRKZhMREQ8TOnnBrKnRzQ5yTgSw5ZWlShybzuKNGjBhdRkklYsxPnLOnIT9MgLBNe4HREpmExERDxMsTvvJeHh3iR/OpncnFm9kDOrF3Ix3qGVuPX5/ohIwWUgIuKBKvQeTOHbW3E1CvmFcdu0JdwQXAwRKbgMREQ8kE9gCNXGvkXgg724EjdE3km1977HP7ICIlKwmYiIeCifwBCqDH2DE42aETthMBlHYrgYwxFIiV7jKPXgY5g3+SMiBZ+JiIgH8zJNQu/+Dzff2Ygze7Zyet8vpG9bx297NpLlysDNp0QkhSvWIqBGHYJuq4Z3kUBE5PphIiIieJkmAVVqEVClFrR6AhGxDwMRERERGzMQERERsTEDERERERszEPmbbS+1JyMpERERsbc9o3pz9tBe7M5A5G9SvllIZsbviIiIvaVu+o4L585idwYiIiIiNmYikoOtXZriZXojIiL29fvRX/AEJiI5qPj629xQtDgiImJfW7s0xROYiOTghqLFcYSVRERE7MvL9MYTGIiIiIjYmInI39y9NRMREbG/Oz7diicwEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszEBEREbExAxEREREbMxARERGxMQMRERERGzMQERERsTEDERERERszkQJjzbosss6Tp8iyUKqk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aezYd4mJ2Ydl2dJxNGtWF/mTr6+Drl0exjJ06CwSEk6Tl7ff+RynMwNLVI3yiGTXtevDWJYv/4FNm/aSl48++orNMXuxPPhgA+TaMhCR6873329l8pRFWPr1e4oKFUoTF5dIXFwicXGJxMUlEheXSFxcInFxicTFJRIXl0hcXCJxcYl4io4dW2BJTkljwMBpnDp1hr9zuTKZPn0JQ4fOwvLaqOeoUOEWRLK7r0kdHA4fLN17jOXQoePkZMmS1XR8egSWPn0ep3btisi1ZSIi152Jb35AduPHv8f48e9xOVzn1+MJqlaNZMrkF+nVewJuCxd+wbp12xnxalduuSUML8OLk4nJTH9rCdHRG7G0ankvXbs+jMjflQwvyvz5w2jbdjBuMTH7qFrtCUaO6EbNmhVw3HgDaWnpzJu3nMWLv8ESFVWeAf3bI9eeiYhcVw4fTmDFirXIpeva9RFcrgv0fXESbrGxx3mq/XBy065dM94Y34vAQD9EctKqZUPmzhlM5y6v4eZ0ZtDv5SnkpnnzO5k+/WVCQoog156JiFxXkpJSkMtjmga9erXm9tsrM2bsAlasWEtOakZVYNiwzjRpUgfTNBDJS8eOzbn99kpMnrKIefOWk5OIiOIMG9aZRx6+B19fB/LvMBG5jrzY9wle7PsEnqxmzQq4zq9HLl+dOpX5dNk4Dhw4yrFjJ8k478KtUCGDm4sFUblyBJK3+xrXxnV+PfKHSpUimDVzAK8O78qBA3H8nnGezMwsChUyCAr0p0KF0jgc3si/y0RExMNERoYTGRmOSH4JDQ0iNDQIKZgMRERERGzMQERERMTGDERERERszEBERETExgxEREREbMxARERExMYMRERERGzMQERERMTGDERERERszEBERETExgxEREREbMxARERExMYMRERERGzMQERERMTGDERERERszEBERETExgxEREREbMxARERExMYMRERERGzMQERERMTGDERERERszEBERETExkxEcrF3bzq+hVOR3J1JdbFn71m8TQPJ25lUF3v2nsXbNJDcnUl1sWfvWbxNA8nbmVQXe/aexds0kJz99tsFBExEchFe4gYiIwsjuduz9yzhJRz4+ZlI3vbsPUt4CQd+fiaSuz17zxJewoGfn4nkbc/es4SXcODnZyI58/ExEDARycVNfiZBQSaSO2/TwM/PJCjIRPLm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" +}, { + "width": 286, + "height": 195, + "url": "data:image/png;base64,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" +}, { + "width": 143, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 72, + "height": 49, + "url": "data:image/png;base64,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" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/multiply-screen-navbar_png.js b/mipmaps/multiply-screen-navbar_png.js new file mode 100644 index 00000000..1cdd3217 --- /dev/null +++ b/mipmaps/multiply-screen-navbar_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 306, + "height": 208, + "url": "data:image/png;base64,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" +}, { + "width": 153, + "height": 104, + "url": "data:image/png;base64,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" +}, { + "width": 77, + "height": 52, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAA0CAYAAADPJLW5AAAAAklEQVR4AewaftIAAANYSURBVO3Bz2scVQDA8e+8fZPNTLITY9JuEkzSTSi1ZmtMDwoWTCE3wVP/AUUQvNRToDdRPPWiIHoQpfTg1WjxVqggIVKojdX6q2pMY8nEaDe7G5udzczsaEG8dee97GET930+VvIPDB2XBYY2gaFNYGgTGNokB8CtSx9x69Uz3DfywnlOnp2nnSQHQPnHm0yeu8jAYyfIen20m+AA2LqywJ/XrrL66QKIDO0m2OeioMb4i/NMvXQWd2SU66/N026Cfa4Rhbj5IR4+eozBE9PUvv2cdpPsc0La/PzBO9y98SXlmzcYe/kN2k2yz8luh1NvX+CPb5YZeWaOw1PTtJvkAMjmPB55epb9QmBok+xRvV5ncXGR/6N8Pk+xWORBJHsUBAHb1evMzs6gYvV2jSPjDmlWb9c4Mu6g4s6dgHw+i21bpFn5tcZEwUHFwsdfUCwWeRBJC9yebjyvBxW5XgvPc0mT67XwPBcVvTmB53Vj2xZpensEnuegQgiaEhjaBIY2gaFNYGgTGNoEhjaBoU1gaJO0II4SwjBBRRxDGCakiWMIwwQVcQxRlKCi0UgIwwQVSUJTkhaUSrv4GwEqqtUIfyMgTbUa4W8EqKhUQu7LZEhV3Y7wNwJUNBo0JVGQJLC5BQN9IDP859DhLGOjDiriKGFs1CFNHCWMjTqoGh7qxrYt0uzWYWzUQUUmQ1OSFPVdOHcePvsBjg7Ae69Dfx8dTZBi+x5MH4drF2GlDF99T8cTpBjsh+fPwIeXYKIfThbpeAJFjx8HtwuuLtPxBCnWN+HKEsw8CqefhOWv6XiCFJYFr7wFb16A9z+BU0/R8SQphg/B5Xfhu5/g2dNwrEDHkygYGoShQYx/SVrg+3V+WdlBRakU0kh2SFMqhTSSHVSUyxH1IEFkSHW3FGKtJKiIY5qStGB4OMvkhIsKYe1QKLikEdYOhYKLirXfagwPdWPbFmmSRo3JCQcVS0s0JTC0CQxtAkObwNAmMLQJDG0CQ5vA0CZpwebmFmtrv6Ni3a+RyTikWfdrZDIOKtb9gCjMIqVFGt+v0dXloCKOE5qR7JHrukxNPUe5gpJcDsoVUuVyUK6gxHXhr3so6XsIyhWUzM09QTOSPbJtm5mZGTqRwNAmMLQJDG1/A0Kv/h87CIADAAAAAElFTkSuQmCC" +}, { + "width": 39, + "height": 26, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAAAAklEQVR4AewaftIAAAHxSURBVM3BwW4SQRzA4d/MztASKiwYa3ptag/2qLHRu0/g3efxnYyJN3uypgepTTx4MFGKgAUWtrszf6un2THhAgn7fUruUE9vNDWm2bDFeMTXd2+ZDX6yLs2GDb/0WXz/htnZYV2aDWt2uzx8csqPT+esS7Nh2jYYfr7gweMT1mXYsN7hEb3DIzbBsMLl5QUiA2LLhWe3qQktF57dpiaULz2NhkZpKhYLT7OpCU1vhGenLwkZVhDJOH7UIjaZFKSpJTSZFKSpJfT7pmCvZUgSRWg0Kuj1LKH+5TUxTY1pakxTY4YVRMA5Iea94JwQ8l5wTgh5D95zRwiJgHNCyHv+Y4iIwG0BOw1wTpjNS2JZ5kiMIpRljsQoQlnm+EtrKrLMYSwVee6JGSJnH+HsHF6/AmMUnbYlJh46bUtIPHTalthey5AkipArodO2hJpNTUwTef4ETAOE7dNE3n+Ag/swGrF1hsiLp/BrDAf70O+zVYZIw8LBPv8UhTAeF8SmsxIRKqazEhEqZvOSshC0VoSmsxKlqJjPHTHDCtYqul1LTClIU0tIKUhTS0gnsNcyJIkiJALdriXUaiXENDWmqTFNjRlWSJJ7XF1dE8tzz2DgCeW5ZzDwhPJbT8N6lKJimXuGQ09ouWwTM6xwfHzCNmlq7A9LjMHdR1mxmQAAAABJRU5ErkJggg==" +}, { + "width": 20, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAAAklEQVR4AewaftIAAAE3SURBVK3BzWoUQRSA0e9WVc9ULwYnDkoW4sKFGx/LNxVEfA7BTX5EMNVV3al79YZp6F0Czjli/3A5nwMv9OPbV5ZSeE7ghdJ+x1wKz0lslPJAKbc4VSMEwakaw/u3FP3DdPuAUzVCENx+/4rD4YhLbJTym6vjT1ytnZwjrtZOzpHaOrshEIIwTZ1xjLj7X48cDkdc4MISZ6pgZkxTx7XWMeNJax0zaLOiHUSgVmXVu7FKnH35Dh/eCa+vIk4Eco44Ecg5IgF2QyAEwY1jxE1VWAXO3py4iMTZp49wc2NMU8e1ppjxpDXFDOZZ0Q4iUJuy6t1YJTZEhHGMOBHIOeJEIOeIBNgNgRAEN44RN1VhldgQCdzdPeKWRRkGwy2LMgzGsigpGSIwz0ophjMCq8TG6XQNXPM//gLWqojF/39//wAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/partition-screen-icon_png.js b/mipmaps/partition-screen-icon_png.js new file mode 100644 index 00000000..1db08487 --- /dev/null +++ b/mipmaps/partition-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 1142, + "height": 777, + "url": "data:image/png;base64,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KgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCXVAgD8nbU32rlV9tLpdPNhJicnMjk1kelPNtNo1AMAAPulFgC4D5VlL2+80c7aWjtrb7TT6XQzjMnJiczNzWbu0dksLMyn0agHgNGw9kY7d0xNTmRyciIAB1EtAHAfWXujnStXWrlypZW7YXNzK1eutHLlSit3nDixkBMnFjL36GwAuPfW3mjnjbV21jvdbG5updPp5sNMTk5kamoi059sZm5uNtPTzUxOTgSgqmoBgPvAlSutfOPlq+l0urmXrlxp5cqVVubmZvPss09l7tHZAHB3XbnSyrXWSlqtlezU5uZWNje3srbWzjdevpo7pqebOXFiIccW5jM5ORGAKqkFAA6wTqebLz/ztayttbOX1tbaWVs7lYWF+bx66VwajXoAGF5Z9vLyy1fzjZevpix7uZs6nW6+/OWv5ctf/loWFubzxS8ez9yjswGogloA4IB6/vkLOff8heynVmsl/92v/E/58z9/KXOPzgaAnSnLXl5++Wq+8fLVlGUv91qrtZJWayVzc7N59tmnMvfobABGWS0AcMCUZS+Pf+ZUOp1uRkFZ9vL446fy6qVzOXFiIQB8NGtvtPPkk89lc3Mre21trZ21tVM5cWIhL77wlTQa9QCMoloA4ADpdLp5/DOnUpa9jJonTz2XO06cWAgAH+755y/k3PMXst+uXGml1VrJq5fOZWFhPgCjpggAHBCdTjePf+ZUyrKXUfXkqedy5UorAPxsZdnL4585lXPPX8ioKMte/tnvPJ3nn78QgFFTBAAOgE6nm8c/cypl2cuoe/LUc2m1VgLA/19Z9vL4Z05lba2dUXTu+Qt58tRzARgltcAe+s73k+98P/ne27dzq5987+3k1vv5KZ/85eTQx5JPf/KBfPK/TT79yeTQxwLwM21ubuXxz5xKWfayG5OTE5mbm830dDPT0838Q51ON51ON63WSsqyl9148tRzaf/Nn2VyciIAJGXZy+OfOZVOp5tRduVKK51ON69/+1IajXoA9lstcI995/vJ1ddv55vfTW69n4/ke2/n73zn+7fzgd/4VPJ7/+MD+Y1PBeDvlWUv/+x3nk5Z9jKsEycWcuLEQuYenc2HmXt0Nh9otVbyjZevZm2tnWGUZS9Pnnour3/7UgDud2XZy+OfOZVOp5u7aW5uNv9Qp9NNWfayG51ON7/zPz+d1799KQD7rRa4R77z/eSrV2/nO9/PXfGt7ybf+u7tTD6Y/NHpB/IbnwpAvvzM19LpdDOM6elmXnzxK5l7dDY7tbAwn4WF+ay90c6TTz6Xzc2t7NTaWjtXrrRy4sRCAO5nT556Lp1ON7s1OTmRkycWsrAwn+npZn6ezc2trK21c+U/tLK21s4w1tbaefLUc3n10rkA7Kda4C679X5y5qXb+dZ3c09svpf87r+9nU//avLK0w/kv3kwwH2q1VrJlSutDOOLXzieF1/8SnZr7tHZtP/mz/LkqefSaq1kp849fyELC/NpNOoBuB994+WrabVWshvT0828+OJXMvfobD6KycmJnDixkBMnFrK5uZVzz1/IlSut7NSVK61MTzfzxS8cD8B+KQJ30Xe+n/z3T9zOt76be+47308+9YXb+c73A9yHyrKXJ089l2G8eulcXnzxK7lbGo16/rc/fyknTixkpzY3t9JqrQTgftTpdPPlL38tw2o06nnxxa+k/Td/lrlHZzOMycmJvHrpXF5//VImJyeyU1/+8tfS6XQDsF+KwF1y9fXkn/7r27n1fvbMrfeTf/qvb+fq6wHuMy+/fDVl2ctOvXrpXE6cWMi98Oqlc1lYmM9OnXv+QgDuR0+eei7Dmp5u5vVvX8oXv3A8d8Pco7Np/82fZW5uNjv15KnnArBfisBdcPX15MxLt7Nfzrx0O1dfD3Cf2NzcyrnnL2SnXr10LidOLOReevXSuTQa9ezE5uZWWq2VANxPrlxppdPpZhjT0828/u1LmZ5u5m5qNOp5/duXcuLEQnai0+nm+ecvBGA/FIFd+t7byb/849vZb//yj2/ne28HuA+ce/5CduqLXzieEycWcq81GvW8+MJXslPXWisBuJ+ce/5ChjE93czr376URqOee+XVS+eysDCfnfjGy1ezubkVgL1WBHbpqZdu59b72Xe33k/++b+9nVvvBzjANje3cuVKKzsxNzebF1/8SvbKiRMLmZycyE60WisBuF9cudLK5uZWdmp6upnXv30pjUY999qrl85lerqZj6osezn3/IUA7LUisAv//lryvbczMjbfS7569XaAg+sb37ianWg06nn10rnsteeefSo7UZa9dDrdANwPzj1/ITvVaNTz6qVzaTTq2QuNRj2vXjqXnbhypZXNza0A7KUiMKRb7ydfvXo7o+bfX0v+03sBDqgr/6GVnfjiF45ncnIie21hYT6NRj07sfZGOwAH3dob7WxubmWnnn32qUxPN7OXpqebee7Zp7IT3/jG1QDspSIwpG99N7n1foY2+WDyL44lf/pvHshf/eED+as/fCCvPP1Afu/x5NDHsitffe12gIPnypVWyrKXj2pyciLPPvtU9kOjUc/Cwnx2Ym2tHYCD7sqVVnZqerqZL37hePbDF75wPI1GPR/Vlf/QSln2ArBXisCQvvra7Qzrj/7ggfzgTx7IH/3BA/mNTyWf/tXk07+aHH88ufD0A/m/Lz+Q3/hUhvYfX09uvR/ggLnWWslOPPfsU9lPxxbmsxObm1sBOOharZXs1IsvfiX7pdGo54tfOJ6Pqix7abVWArBXisAQvvd2svleduzQx5L/8+UH8i+O5UMd+ljyp//mgfze4xnat74b4AApy15arZV8VJOTEzlxYiH76dFHZ7MTnU43AAfZ/yoArgUAAB4CSURBVNse/IXGnRh4gv/qh958hX9PMeihyzQ3U3Bg1zxUYPvAKgTqhwx95YPkyBD11MBZmzEXZPA4zYRm7Ad5Ccn2+BpsevEO8i6jiZeE7cC6rpk8tEGUDNsHqYcpGwa0s3hd/SDoPJVQ/Has9npCD/MvHZVsWfWTPp/PcLiV8Xg3k2i3W2nPt3KUVlaWMokHvY0AvCqzgQO4/3AvB/Hj6zM5/3r27e7VmTx+upfHTzOxR0/2srQ4E+B46PU2Mok/6HZy1MqylmazkfF4N2fPzuVzp0/X8jvNRr4w327lC83zjQAcZ/3NQSbV/f1OjlpZ1tLpLKTX28h+9HobGY93U5a1ABy22cABPHqSib29mFw4l4m9+62Z/N6/2sukRp8FOEYe9DYyiW63k2kw+PlPAsCv9PuDTKrTWcg0uNhZSK+3kf3a3Byk01kIwGErAhPaeZ48fpqJvfutmRzEW2/kQB49CXCMbG4Osl+dzkLq9bkAMF2Gw61MotNZSFnWMg3a7VYm0e8PAvAqFIEJPXqciZ1/PXntTA7swrkAJ9hwuJXxeDf7dbGzEACmz2i0nUm0261Mi3p9LmVZy371NwcBeBWKwIRO/0/Jdy4mF84lp09lX956YyYAB9XfHGQS7XYrAEyX4XArk2o2G5kmzWYj+zUcbmU83g3AYZsNTOjCueTCuZl84dPPktEvkkdPkk8/28vos+TRk/wDF87llTt9KsAx0e8Psl/1+lzq9bkAMF3GO7uZVHu+lWlSr89lEsPHW2nPtwJwmGYDL+i1M8lrZ5IL5/L/m8kXPv0sGf0iefQkqX8lL2TneSZ2/vUAx8RwuJX9ardbAaD6yrKWaXO2PpdJDIdbac+3AnCYZgOH5LUzyWtnkgvn8kJ2niePn2Zi9TMBjoHxeDej0Xb2q9lsBIDpMxxuZRLNZiNVN3q2HYDDVgSm3AcPciBv/YuZANU3fLyVSTSbjQAwfXbGuzlpho+3AnDYZgNTbOd58sF/2sukTp9K3nojwDEwHG5lEu35Vl6m/uYgXyhP19JsNgIA+/Hs2XYADttsYIr93s297DzPxL7zv88EOB5Gz7azX/X6XA6qvznIZn+QvxpuZTjcymi0nS/TbDbSbDbSbDbSnm+l2WwEAP6+0Wg7AIdtNjCFdp4nv3dzL4+eZGKnTyXfuRjgmBg+3sp+nT07l0kMh1u5fed+er2NjMe7mcRwuJXhcCtfqNfn8gfdTrrdTur1uQDA50aj7dTrcwE4LLOBKbLzPPnRw+T79/ey8zwH8m+vzuT0qQDHxHi8m/2q1+eyH+vrvdy+cz/D4VZeltFoO6s372b15t10u53cuH459fpcAPiVZrORk+jZaDv1+lwADsts4Ig8fpp8+lny+L/lbz16vJdHT/JC3l5M3nojwDEyHG5lv87W5/Jl+puDXLv2XobDrRym9fVe1td7ubKylOvXL6csawE46U6XtUxiONzKtOlvDgIwbWYDR+Rr39vLzvO8NG8vJnevzgTgHxuPd3Pz5t3cvnM/r9LtO/fzoLeRe/dW055vBYD9G493Mx7vpixrmRbPnm1nUqNn28l8AA5NETgiO8/z0ry9mNy9OhPgeOlvDjKJZrORf2w43Mrim8u5fed+jsJotJ3FxeXcvHk3ACdZe76VSQ0fb2VajMe7GY22M6nRaDsAh6kIHIFHT/LS/PDbM7l7dSYAp8ta/r7+5iCLby5nONzKUVu9eTeXlm8E4CQry1omsdkfZFpsbg4CMI2KwBHY+WVe2PnXk/98ZybfuRiAf2J9vZfFxeWMx7uZFuvrvbS++s2Mx7sBOImazUYm8aC3kWnR7w8CMI2KwBF4/N/yQi6cS378JzM5/3qAY2yzP8hBDIdbubR8I9NoONzKN/6PqwE4idrzrUxiONzKaLSdafCgtxGAaVQEjsDOL/fyIh49Sf6X/3Mv/+vKXu4/DMDfGQ63svjmcqZZvz/IpeUbAThpms1GJrV6826OWq+3kdFoOwfxbLQdgMM0GzgCj5/mpXj8NPnD9/fy/f+Q/PBfzuStNwKcYM3zjSy+uZzxeDeTKsta5udb+Z1mI/X6XOpn5/KF0bPtjEbb+avhVjY3BxmPd/Oi1td7aTYbubKyFICTYn6+lUmtr/dy4/rl1OtzOSq379zPQY1G2wE4TLOBI/DpL/JSjT5Lfu9f7eXtxeSH357J6VMBTqCbN+9mONzKJLrdTrrdTtrzrfxa8/kHer2NPOhtZH29lxdx7dp7ac+30mw2AnASlGUtnc5Cer2NTOKPrr2Xn374fo5Cf3OQfn8QgGlVBI7A6LMcih89TL72vb3sPA9wAt2+cz/71e128l//5i9zb2017flWJtHpLOTe2mr+69/8ZTqdhbyIr3/jasbj3QCcFBc7C5lUr7eRXm8jr9p4vJtLl24EYJoVgVfs08/yT9TPJBfOJRfOJadP5YU8fpp87Xt72XkeoOKejbbzstXrc3n4cC331lZTr8/lRdTrc/nph+/npx++n7Ks5SBGo+3cuXM/ACdFp7OQsqxlUpeWb2Q43MqrdO2772U02g7ANJsNvGLj58nbi8mFczM593py/vX8E4+fJvcf7uVHD5Od55nY46fJH76/lx//yUyA6hqNtvMyNZuNPPx4LWVZy8vU6Sxk8POf5OvfuJrhcCuTun3nfrrdTur1uQAcd2VZS/f3O7l9534mMR7vZvHN5Qx+/pPU63M5bLfv3M/6ei8A064IvGLnX0/uXp3J0mJy/vX8s86/nvzw2zP55M5Mzr+eA/nok+SDBwH4W91uJ4Of/yRlWcthqNfn8vDjtTSbjUxqPN7N6s27ATgprlxZykGMx7tpffWbGQ63cpjW13u5du29AFRBEZhir51JfvaDmZx/PQfy/ft72Xke4IRrt1u5t7aaw1aWtTz8eC1lWcuk1td7GY93A3AS1OtzuXH9cg5iPN7N4pvL6W8OchguLd/IpeUbAaiKIjDlTp9KfvaDmdTPZGI7z5MPHgQ4wer1uXz4H9/Pq1KWtXz44fs5iPW/6AXgpFhZWUpZ1nIQ4/FuFheXc+3aexmPd/MyDIdbaX31m1lf7+VlqtfnAnCYikAFnD6V3L06k4P44D/tBTi5fvrh+ynLWl6l9nwrV1aWMqn19V4AToqyrOXe2mpexO079/Nbv/27uXnzbsbj3RzEaLSdS8s30vrqNzMcbuU3KctaJnG2PheAwzQbqIgL55IL55JHTzKRnefJR58kb70R4IS5srKUZrORo3D9+uWs/0Uv4/Fu9ms43MpotJ16fS4AJ0Gns5But5P19V4OajzezerNu1m9eTedzkIudhbSbDbSbDby6/Q3BxkOt7K+3stwuJVJ3Ftbzde/cTUA02I2UCFvL87k0ZO9TOrRk7289cZMgGppnm+k3x/kIMqyluvXL+eolGUtV1aWsnrzbibxoLeRKytLATgpbv3pOxkOtzIcbuVF9Xob6fU28oV6fS5nz87lC8PhVsbj3RzUlZWldDoLAZgmRaBCLpzLgTx+GqCCyrKWg+p0FlKWtRyllZWlTKrfHwTgJCnLWh5+vJayrOVlG4220+8P0u8P0u8PMh7v5qDa7VZu3XonANOmCFTIa2dyII+eBDhhrqws5aiVZS2dzkImsbk5CMBJU5a1PPx4LWVZyzRqNhv58D++H4BpVAQqpn4mAF+qXp9Ls9nINLjYWcgkxuPdjEbbAThpms1GHn68lrKsZZo0m408/HgtZVnL5/qbg0xivt0KwGEqAhXz2lcC8KUudhYyLTqdhUzq2Wg7ACdRs9nI3/yXv0yz2cg06HY7Gfz8JynLWgCmVRGomJ3nAU6IZrORg2g2G5kWZVlLvT6XSWz2BwE4qcqylocfr6Xb7eSolGUt99ZWc29tNQDTbjbwgj79LBn9Ivn0s2T0i+TTz/Yy+iz59BfJ6LPk/OvJf74zk5fl8dMAJ8TpspaDaDYbmSZnz85lNNoOAPtTlrXcW1vNxc5C/ujaexmNtvOqtNut3FtbTb0+l3/O6Nl2JtGebwXgMM0GJvDoSfLBg73s/DJ5/DTZeZ7f6PHTvDQ7zwPwGzWbjUyT9nwr/f4g+zUe7waApNNZyPx8K3fu3M/tO/czHu/msNTrc/m/b72TTmchX2Y02g7ANJkNTGDnl8lHn2Rij54kF87lhT16nAOpnwlQQc3zjZxEw8dbAeBXyrKW69cvZ2VlKXfu3M+fr/cyGm3nZWk2G7myspRut5P9eDbazn7V63MBOGyzgQm8diYH8tEne7lwbiYv6qP/dy8H8dpXAlRQWdYCAJ8ry1quX7+c69cvp9fbSL8/yIPeRkaj7Uyq2WzkYmch3W4n9fpcJjEabWe/zp6dC8Bhmw1M4PzrOZAfPUzeXUpOn8qB7TxP/p9PciAXzs8EqKZms5HhcCv71W63Mm3m263kZgB4STqdhXQ6C7l1652Mx7sZPt7KcLiVnfFuxuPdDB9v5QvN842UZS2ny1qazUba8628iH5/kP1qnm8E4LDNBib01hvJR59kIjvPkw8eJO9+Kwf2/ft72XmeA7lwLkBFlWUtk+j3BwHg5CjLWtrzrbTnWzlso9F2JlGWtQActiIwoQvnZnIQ37+/l8dPcyAffZJ88CAHcvpUcuFcgIpqz7dSdcPhVgCovuFwK5OYb7cCcNiKwIT+t3+RA/va9/by+Gkm8uhJ8ofv7+Wg3l4MUGH1+lyqbme8m0m051sBYPr0+4NM4mx9LgCHrQhM6LUzyVtv5EB2nidf+95ePniQffn+f0i+9r297DzPgX3n4kyA6mo2G5lUf3MQAHjZ+puD7FdZ1lKvzwXgsM0GDuA7F2fy0Sd7OYid58kf/9le/s2D5P+6OJML55Lzr+fvPH6aPHqS/JsHexl9lhfy9mLy2pkAFdZsNjKp0bPtZD5T46+GW5lEvT4XAKbLeLyb4XAr+zU/3wrAqzAbOIAL55K33kg++iQHNvos+eM/28thOX0q+eG3ZwJUX7vdSr8/yH4Nh1uZJjs7u5lE/excAJgum5uDTOJ3mo0AvApF4ID+9b+cyelTmVr/9upMTp8KcAy051uZRH9zkGnS7w8yieb5RgCYLg96G5nEfLsVgFehCBzQa2eSf/3tmUyjtxeTt94IcEzMt1uZxHC4ldFoO9NgONzKJOr1uZRlLQBMl15vI/tVlrW051sBeBWKwAtYWkzeXsxUOf96cvfqTIDjoz3fSlnWMokHvY1Mg15vI5Not1sBOKnG4930Nwfpbw6yvt7L+nov06DX28h4vJv9mp9vBeBVmQ28oLtXZ5Ls5UcPc+TOv5787AczAY6f+flWer2N7Nft2/dzZWUpR+1BbyOTaM+3AnCcra/3Mhpt56+GW9nZ2c3n+v1B/jnNZiPdbidH7UFvI5O42FkIwKsyG3gJ7l6dSbKXHz3MkblwLvnx9ZmcPhXgGLrYWUivt5H9Go22098cpD3fylEZDrcyHG5lEu12KwDHWX9zkPX1XvZjONzKeLybsqzlqIzHu1lf72USnc5CAF6VIvCS3L06k+9czJH4zsXkZz+YyelTAY6pbreTsqxlEjdv3s1Run3nfibRbDZSr88F4Dg7W5/LJDY3BzlKd+7czyQ6nYWUZS0Ar0oReIl++O2Z/PhPZnL6VF6J06eSH//JTH747ZkAx1+ns5BJ9PuD9DcHOQqj0XbW13uZxJWVpQAcd/PtVibxoLeRozIe7+b2nfuZxB90OwF4lYrAS/bWG8lf//uZvLs0k8P07tJM/vrfz+StNwKcEFdWljKpS5duZDzezat2aflGJlGWtXQ6CwE47prnG5lEr7eRo3Lnzv2Mx7vZr3p9Lp3OQgBepSJwCE6fSt79VvLX/24m7y7NpH4mL0X9TPLu0kz++t/N5N1vJadPBThBms1G2u1WJjEabefmzbt5ldbXe+n3B5lEp7OQsqwF4Lgry1qazUb2azzezfp6L6/aaLSd1Zt3M4k/6HYC8KrNBg7Ra2eSd7+VvPutmTx6knz0yV4eP00ePcm+XTiXnH89eeuNmVw4F+CEu379cvr95Uzi9p37aTYb6XY7OWzD4Vauffe9TOrG9csBOCna860Mh1vZr/W/6KXb7eRVurR8I5Moy1pWVpYC8KrNBl6RC+eSC+dm8oVPP0tGv8jf+vSzZPSLpP6V5LUz+Vv1rySvnQnAP9Ceb6XdbqXfH2QSl5Zv5HPdbieHZTjcyuKbyxmPdzOJbreTen0uACdFt9vJ7Tv3s1/9/iC93kY6nYW8CteuvZd+f5BJXFlZSlnWAvCqzQaOyGtnktfO5FfOBWDf7q2t5n/+rd/NpC4t38jnut1OXrbhcCuLby5nPN7NJMqylhvXLwfgJGk2G6nX5zIabWe//ujae5mfb6UsazlM6+u93L5zP5Oo1+eysrIUgKNQBAAqpl6fy43rl3MQl5Zv5Nq19zIe7+Zl6W8Osvjmcsbj3UzqyspS6vW5AJw0V64sZRKj0XYuLd/IYVpf7+XS8o1M6sb1yynLWgCOQhEAqKDr1y+n2WzkIG7fuZ/WV7+ZXm8jL2I83s21a+9lcXE54/FuJtVsNnL9+uUAnETd3++kLGuZRK+3kUvLN3IYrl17L5eWb2RS7XYr3W4nAEelCABU1E8/fD9lWctBjEbb+fo3rmbxzeWsr/cyifF4Nzdv3s1v/fbv5vad+zmoe2urATipyrKWKytLmdT6ei9f/8bVjMe7eRlGo+0svrmc23fuZ1JlWcu9tdUAHKXZAEBF1etzefjxWhbfXM54vJuD6PcH6fcHufbd9zI/30q73Uqz2cjZ+lzq9bl8bjTazrPRdobDrfT7g/R6G3lR99ZW02w2AnCSraws5c/XexmNtjOJXm8jv/Xbv5tbf/pOut1ODmI83s2dO/ezevNuDure2mrq9bkAHKXZAECFNZuN3Ftbzde/cTUvYjzeTa+3kV5vI4ftyspSut1OAE66sqzl3r3VLC4uZ1Lj8W4uLd/I6s27uXJlKe35VprNRr7MeLybzc1BHvQ2sr7ey4u4srKUTmchAEdtNgBQcZ3OQu6trebad9/LeLybadbtdnLr1jsB4Ffa861cWVnK7Tv3cxCj0XauXXsvnyvLWprNRk6fruV3mo187tloO6PRdp49285otJ2Xodvt5NatdwIwDWYDAMdAt9tJs9nI4pvLGY93M4263U7ura0GgH/o1q130t8cZDjcyosYj3fT7w/yuV5vI4eh2+3k3tpqAKZFEQA4JprNRgY//0mazUamza1b7+Te2moA+Oc9/HgtzWYj06zb7eTe2moApkkRADhG6vW5PPx4LVdWljIN6vW5PHy4lisrSwHg1yvLWh5+vJZms5FpdOP65dxbWw3AtCkCAMdMWdZy69Y7efhwLc1mI0flyspSBj//SdrzrQDwm5VlLQ8/Xkuns5BpUZa1/PTD93P9+uUATKPZAMAx1Z5vZfDzn2R9vZfVm3czGm3nVWi3W7n1p++k2WwEgMmUZS0//fD93Lx5N6s37+YodToLube2mrKsBWBazQYAjrlut5Nut5NebyN/vt5Lr7eRl60sa+l0FnLj+uXU63MB4MVcv345nc5Crn33vfT7g7xKzWYjt269k/Z8KwDTbjYAcEJ0OgvpdBYyHu+m19vIg95GNjcHGY93cxD1+lza7VYudhbS6SwEgJer2Wzk4cdr6W8OcvPm3fT7gxymdruVKytL6XQWAlAVswGAE6Ysa+l2O+l2O/ncaLSdZ6PtbPYH+dyz0XZGo+38ffX6XM7W5/K5+XYrzfONlGUtABy+9nwr7Y/XMhxuZX29lwe9jYxG23kZ6vW5XOws5MqVpdTrcwGomtkAwAlXr8+lXp9Le74VAKZXs9nIrVvv5NatdzIcbqW/OchwuJXRaDv9/iC/SVnW0mw20jzfSLPZSLvdSr0+F4Aqmw0AAEDFNJuNNJuN/GPj8W6Gj7fyhfJ0Lc1mIwDH1WwAAACOibKspT3fCsBJUQQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEqaDUBF9DcHAaiy8Xg3f9+z0Xb6m4MAwLR7NtoO02k2wJf64z/by+On+bUeP83f+dr39vJlfvaDmXBwi4vLAThO1td7WV/vBQDgoGYDfKnHT5NHT7Ivj54EAAAAXpkiAAAAAFTSbIAv9fbiTC6cDwAAAEyd2QBfamkxHIEL7XZ++f/99wAAAPDrFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKikIgAAAABUUhEAAAAAKqkIAAAAAJVUBAAAAIBKKgIAAABAJRUBAAAAoJKKAAAAAFBJRQAAAACopCIAAAAAVFIRAAAAACqpCAAAAACVVAQAAACASioCAAAAQCUVAQAAAKCSigAAAABQSUUAAAAAqKQiAAAAAFRSEQAAAAAqqQgAAAAAlVQEAAAAgEoqAgAAAEAlFQEAAACgkooAAAAAUElFAAAAAKik/wHbamiPIG61JwAAAABJRU5ErkJggg==" +}, { + "width": 571, + "height": 389, + "url": "data:image/png;base64,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" +}, { + "width": 286, + "height": 195, + "url": "data:image/png;base64,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" +}, { + "width": 143, + "height": 98, + "url": "data:image/png;base64,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" +}, { + "width": 72, + "height": 49, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAAAxCAYAAAB5wO9OAAAAAklEQVR4AewaftIAAAOjSURBVO3BS0xcVQCA4f+euQMMd+Q5lFfpRG2VFhomsbGJMdWIrY+ykESNwcRYXXTjQjeu3LgwunHRxHShCVht8VWtNU0To+mi2oo2hhRisbyFMogwwwDzHuYe484o3Al4ZiDmfJ8RXbUX0dYk4S0TqEBbT4lAc2SyTV1/83XsZILaw4/TcP8htopgG5K2TXxogLK2e6ja18JWEmxD0rZpfu0NKltamfj8U7aSYBvKppLcunCe2PQUxb4atpKJIlLaGIZABbfl5fZnniUZCtH4YDv5JKWNYQjWY6JIKhLBEAIVMokEbsuL2/KSiUXJp9VkEqu2jvWYKFJSWYUqpqcUV1ERhVBcjiNBAS2ODDPy8RkiY6M4cRUVsVHpaJTxc58x23cVlQQFtHCtj8b2w4y88zaqxX4PUtnaxszZXlYTcVQRFNCerucI/zJI9aGHUK1y911kU0mEx4PhMlFFUEDBK5dZuTmE/7EOVFuaGMOqb8B7dwsr01OoIigQaduE+38mE40xfOYDVDM9pYx+2I20s5T5/ahiUiCGELS+9Ar5YtXVs//lV1HNZINiccnSMjTUGfzdbHCa+EoIFVazNlJK3KaLfLOlpLb+DsrKy1mLyQZZpQbRmOSfUvEF9u1xocLSUoxUKsOOHVXkWzqd5re5CGXl5axFoDkSaI4EmiOB5kigORJojgSaI4HmSKA5EhRQJpNhbGyaSGQF1aSUzM8vEo8nUUmQg5Rw6bLk9CeS5RXJZmWzWU6cOM1iZJl33zvL/PwiKp06dZ4ffxqgt/cCk5MzqCLIIZ2ReDywsxGuD7Jp4xMzHDjQin9XPceefwLLKkGVRCJJOLxEx9EH6Oo6ysWL36GKIIfiIoNAK1z6Hnw+Ni0civDNtz/Q3/8rJ09+RDKZRhW3281CKEIqlWZuLkQw+AeqCHKIxSU3bsKLXdB3jU1zuVy0tx/kyJH7ePKpRxgYHEYV03TxwrFOenrOMTEZpLKqDFUEOXhKYOoWfPU1PPowm+b31zM6MoWUktngPL7qClS6MTTO8eNPs6upjr1770QVkxyEMOjs4D+rqani3oP76Xn/S5p21tLSshuVdjXV0d39BZZVSmdnO6qYFFCgrZlAWzP5EAg0Ewg0o5pAcyTQHAk0RwLNkUBzJNAcCTRHAs2RQHMk0ByZbFA0JlnLbRVNDI2HUUHKEv4SipJ3khIaGmpYj8kGeS0Dr8W/VPt8VPt8/N8INEcmcAVtPdN/AgNgNr92T81gAAAAAElFTkSuQmCC" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/partition-screen-navbar_png.js b/mipmaps/partition-screen-navbar_png.js new file mode 100644 index 00000000..ab255976 --- /dev/null +++ b/mipmaps/partition-screen-navbar_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 306, + "height": 208, + "url": "data:image/png;base64,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" +}, { + "width": 153, + "height": 104, + "url": "data:image/png;base64,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" +}, { + "width": 77, + "height": 52, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAA0CAYAAADPJLW5AAAAAklEQVR4AewaftIAAAPNSURBVO3Bb0yUdQDA8e/97uH4c3BA5ME6kCZB4CKBOQRyNpCQjWYrWSXNqOl4QVrT0ZuyPy8a8iJnzf4u55qNidaGcyhZEobN3HJyBROncmAhf64dDA+QO+G5cr1x9YZfe55jk9/nYwn9DUXG9wJFmkCRJlCkCRRpGmEUnLrJ1WPfMO39k5TVq1m+bj1mmfaO0vPpPgLeYR6u20nKqgKMIgijK61HmejpJu3xUn57rZzJ6x7McuOnThJX5pK28Vm6d23BSBphlPVUNaGNmwjxj5CuY5asZzYTnPLTc+ATllXVYCRBGNkcCWjRMbj372VZ9ZvEP5iBmYJTfkKheUK6znwwgFEEYaTP3ebiB01YLFCw6w0sFgtmmfGOoMXYKdjewFjz20x4rmEUQRgNdpxirOU97Kmp9Le14h8Zwix9hw/Rva+JwR9OIezp2JNTMIogjAITPh54qZHgpJ+ZkWH0YBCz5G6tJyF7Jf5BD0Vffkd0YhJG0QijnOdrCRdbbBw5z23BDBoGcbvd+Hw+7jXZ2dm4XC7upmGQoaE+SoqXY5Qfuy6Qn5eDw2FnsYyN+RgYGMDlcnE3DYNERFhxOGIxij0mGofDjsMRy2KZmbmFb5z/ECjSBIo0gSJNoEgTKNIEijSBIk2gSBMo0gT3uJmZWYymEUaBQJAjR76l232ZDRUlVFauxSy6rvPRx4cZH59E13W2v7IZpzMJIwgkzQbh9hz/y8n2s2RmprP3/Qau/z6C1zuOWTyeIRIT4nj3nXpeb3iZ48c7MYpAQvsZyKyBolrovYK08+d/xeGw09raQfn6IpzO+zDL/LxOXJydOzTNSt/lAYyiIWFgGM7thxOdcOI0PJKFlN7eq3i94+Tn53DwYCs7dtSQnJyEGVasSKW5uY2BwRtYrVYsGEdDQn0N9F2DY13Q9CrSHs3NorS0kDsqKkro9/xBcnISZtB1nbq6aiIjbQghaGlpxygCSZGRUFYAbWeQVlycR1fXBYaGxjjd8TMPZaRhllAIGhu/4NIlD599fpTKyrUYRbBAs0E4dxHuT4Cny+GtNpieRUpV1Trm5nXa28/yQs2TOJ1JmCUqysaePTux2SLYtnUTGRlpGEVjgWwaHPga0lNgNgC7nwB7FFKsVitlpYWUlRYSDvHxsRQXr8JoGgskBHy4G35xg1WDNXksWRoS4uxQ9hhLnkCRJlCkCRRpAkWaQJEmUKQJFGkCRZpAkSZQpGkYZGz0Joe+OolRPJ5h+vtHiYyKYLFM+W+xpqiKf9MwyIu121gqBIo0gSJNoEgTKNL+AmazK2lAJmHqAAAAAElFTkSuQmCC" +}, { + "width": 39, + "height": 26, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAAAAklEQVR4AewaftIAAAHGSURBVM3By04TUQCA4b+npz2CCLUVmN5ramtS0rBRty58DJe+jHtfwDfQhW5NXLKkkdSZtJEB2oi1oZRClM5FWchqSM/MQub7Ev5fxNNrQYwJIvBch+MvHX5NTwljcrDPyOyiSxDBxc8RvjOn9+E9YTjnM+yP79AliODuxiYnPYvK8xeEsVIocmczz+X5DB2CCE76PaZWl9P9HmEcfP5EQgiSaYUOiYbBYIDjOFxLKYyXr/AA27bRpbafoICj4ZCbGIaBUoorEg1n0z3K5fssYlk2zWaVqGazC0ajJKVSiSsSDamURKk0i6TTKZRKE9V8PmfucE0QY4IYE8SY4D9zXQ9dkhs4LsgkgcbjCbu7JuvrWdrtBrp2djr4vk+5kqdY2GARQQCzD2/eQt8m0FfzG8vLS0iZJAzP80irFEeH39EhCPC4DtUi+D6B1lZXqNdLHP8YE0Y2m8HzfAzjAToEATpduLcEh0MCbW09YjI549nTNmHU62Ue1opUqwV0SAK0mpBZhVKeQIlEgkajSlhSJsnlMuiSBJBJqBS5dYIYE8SYIMYEMSbR8Psyh2m5LHI5z2NaLlF5nqJWW+MfiYZWa5vbIIixP+n7jHzwt6voAAAAAElFTkSuQmCC" +}, { + "width": 20, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAAAklEQVR4AewaftIAAAD7SURBVK3BwU7CMACA4b+1iykuwiCCCRcTPXj0nXxSb55MuHAznkQBK0RgwLq1SkKWZekuhu8T/g+n8yhpkO/3fIxeCNkuDN9vr4RIGnhXkE4/CXF5TrZeE6KoWS6mWGs4uHy4YT4bk273tPQ5VWeDiPlszEFRONqdW7TWKGq835EklirnfkiSDk2yLMNai9YayYlJKrynZG3OZDIjZLXaMP9aECI5Srfw9EzJmCXGLAlJ0x2T9ykhiiPn4PqK0mDQI45bhPT7XbrdNiGSo/gC7u8oCSGI4xYhQgiiSBEiOTFFjfMKYxxVm00EOJrkhSBJFAeKml5vCAz5r19cbGPOu9H+QgAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/variables-game-screen-icon_png.js b/mipmaps/variables-game-screen-icon_png.js new file mode 100644 index 00000000..13fcad1e --- /dev/null +++ b/mipmaps/variables-game-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 916, + "height": 623, + "url": "data:image/png;base64,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" +}, { + "width": 458, + "height": 312, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcoAAAE4CAYAAADbxrPOAACAAElEQVR4AezBB6Df873/8efr8/3+1vmdmZOcc7L3TkSGiBWE1B5RLdpSo6W3WuqqDrWKVlvULq1VlFKuXUWMCCJ2EzEiQ5YsmWef3/i+/w7/KK0TCefI6OfxUG0uMjzP8zzP+w8SSx2e53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53me57XI4Xme53leixye53met5kxM8yMzYHD87ytkplhZjRzQCAjkBHIcDIEmBlmhpnheZsDM6NZfW0NUZTHzNjUQjzP26qYGU4iY3mWVC9hYfVy3l67kMaGtYDRzLmQ8qJKhpR2p7KkkvJUCWZgZkjC8zYFM0MSTz81iROOPZbfXHQRB02YgLFphXiet1UwM5zE8obVPDp7Mv/3zkRealgEUZ46l6AQB+IDeYOsZUlbE5WxcvaqGMXB/fdiWGU/MIckPO/LZGZI8MC99/C9444inkizZMkSHJBn0wrxPG+LZ2bkLcf/vTmRc2fczJIoS0Ih1YoTBXxgFR8jQDHqiVEfZbh26bNct/gJjqnalZNGH01Fuh0GCOF5bc3MkOD+e+/l+G9/k223CVmzVkRRxObA4XneFs0wGnKNnDX5cn4y7TretTwNcqwhIgICIIUoxVGOox2OQkScD9VhVANrXYIblj/PMQ+fxoz35iCE57U1M6PZ5EmTOPE7R7Ln7iG3XFtGn545li5ZQs4MM2NTcniet8UyMzL5LGc/fQW3LX2O5S6giQ/FgBKLiEcZhqTa852K7Tin696c1ml3di/uSY6IdJSjELFONcYruVqOn3Q2c1cvBDM8ry1J8OpLL/Ltwyew284hf7i4Hd26hBQX51m2dCn5XJ5NLcTzvC2SYUji9tce4I7lU1klxzpFiLzl+HHPAziw3550La4kFsQIBRHie/kc1U01TJ73IhfNuIW3o0Ya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" +}, { + "width": 229, + "height": 156, + "url": "data:image/png;base64,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" +}, { + "width": 115, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 39, + "url": "data:image/png;base64,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" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/variables-game-screen-navbar_png.js b/mipmaps/variables-game-screen-navbar_png.js new file mode 100644 index 00000000..9b58d3f4 --- /dev/null +++ b/mipmaps/variables-game-screen-navbar_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 306, + "height": 208, + "url": "data:image/png;base64,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" +}, { + "width": 153, + "height": 104, + "url": "data:image/png;base64,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" +}, { + "width": 77, + "height": 52, + "url": "data:image/png;base64,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" +}, { + "width": 39, + "height": 26, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAaCAYAAAA0R0VGAAAAAklEQVR4AewaftIAAANZSURBVM3BS2gcZQDA8f/3zTczO7PbWBpfTTwkmtQ8qmIfoAVjQUHwolQQRYsX9S5YNOAj2INFwUPEYsVTGo32oqQH8XFsKz7qocZbs+2aTdcmVpLsZmd3Zmc+2cPisM62qbtIfj+xXos0m9MRySYm2cQUG6S1JqjkIcoi9BKCEE0KLW5DWoMo8wY6TXENWmv88hxGOEXa/hGpBM2CQFCpPIWwD2BaN9EpiquIIp+gOEUmdRxpCUCQxDQ1pjmDH8xSCSaw03vpBEkLOqpRK07S5U4jpWAjLHOdtPEy1dIZOkHSgl86ScY5yfUyDIFrvIHv5WiXJEFQLeCakwgh+C+UqiGDj9A6oh2SBNr/DqU0DbWa5vz5MuVySJLLl30uFarEualT+N487ZA00TpEMUvcZyeWGLrrZw69mqXZ4mKVPfef5c7Rn5if92gQQiDDX2jlz+VlZr/8gl/PnaMVSZOgegXbWiJudbVGXX6xSjPPCykUAjwvYr0cEieZI+5CNsv3Z05T9+03XzM0PMzHxz6kVCqRRNFERyWkKYh77uAtjI6mGdrh0GxgwOXsD7uo1TQ7R9PECXI0/DY3x+effsLKygpe2ePpZ54lv7CAnbJxHIckin8RNMtkFPvHttLKPXdnSCZpGBgc5PEDT7C4mOe+ffvILyxw9P1Jxl97HcMwSCJpIowthKGmEzR9NNi2zfDICGMP7sd1XWamp1ldXeO9d96lVCySRNHEtLbhl3pxjEu0KxI7MfiH47o4rkvdofFxrkXSRAhJyGM0mzr+B5VKSJJ8vsKp0yvERZFGG7tphySJ/RBBYBHX15di4nCOK38FxF3Mebz51kX6+xziytWHMVN9tEORwLRuxKu+hFJHEEJQN/bAVrq7TV4Zz7Lr3gzbb7WYz3oUCj6HJ/rp6bFpCAIH7OcRQtAORQtW5hGKazm2ODMIIagbHUlz7OgOcr9XWFsL2buni95eCyEEDbWaxNNvY9vbaZeiBSEkVtcLFIvbSFsfYBiCOsMQ3N7vkKRavRlfTmCnR+gExVUIYWB3PUnZ242snMBWX6GUJE5rje9n8PVBZOpRLLOLTlFsgOXcAYxT8V9EBxcQehlBFc0WItGDcvqxjBSdprgOptUNVjf/F8kmJtnE/gbT7y7mPkHllwAAAABJRU5ErkJggg==" +}, { + "width": 20, + "height": 13, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAAAklEQVR4AewaftIAAAGLSURBVK3Bz0pUURzA8e85v+N1ujNixCjBNMuoVpGEYIG1aRfkImpVm96gNwh6gqBeIBKiFj2AlptICiTS0VVbKYxGs8nr/XN+ceBeuAvhSvT5mFHulf/ngeMIvkjQYhvIwU4j7iTH5ahR9fjkLZF5ipMhgS8gze6i0T2sdGhiqdGDN8TuMU6GVKyFlnuJpI/wRUITS6nItmm5J6gqo1FOJU09h6kncp8gW6GJpWSLLxgDm1t/WLg9oPLq9Q4vFr8TiC4RJEnC/v4vPq6usrU5oM5RMgwJzp+LWXx+gcrCrS5elcDwFQU21tfZ292l1+txIo6pc5Q8pwhEDFPdiEq7LVSUswSXZmZQVT6vrdGZmKDOUlK5iPeGYGn5J1nmCTYGv9n5kRIU5gaBiOCc4/LsLGf6feosJRk7TeIfoqpcmZvk/Yc93q0MacfCVDciza9CdI0mjhrbusnB4STR+DOuzwuB95Ykv49Gd7A2oomjxhiDtObJ/Bxp/g3IQKaR8Q6G43EcwdoxiPr8i78YV47agXmT+gAAAABJRU5ErkJggg==" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file diff --git a/mipmaps/variables-screen-icon_png.js b/mipmaps/variables-screen-icon_png.js new file mode 100644 index 00000000..2d516dde --- /dev/null +++ b/mipmaps/variables-screen-icon_png.js @@ -0,0 +1,38 @@ +/* eslint-disable */ +var mipmaps = [ { + "width": 916, + "height": 623, + "url": "data:image/png;base64,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IjIbUkREZE4xwIE8OhcsOZ1rn/xevrPrWvoP7cWzKvcKgYaWTi5ceibn9qynEAJZHsHAMP5PGUYeI0sbO3j7WS9jY9da7ui9g6RWIwINzR08dsnpPGHRRlpLDXiELEbMDBGZmwyjFp2nrDqP31l5LicaBwKQWCBzx8wQkUdeioiIzDnGUbXorGlfwpvan89M3CHLI2aG8V/HzKjmkc5SCy895SlwylN4EIc8Ou6OmSEic19KggXu54Dx6HLAmJlzlPGwojsiMntSRERkznKcLHfMjOm4O0eYGY8EMyOPETP7/9iDEyi/74Lu9+/P9/+fmcxksjWTTraWpGUvrbIUKnIEgfbc5/iwFAqiICLlHg/XcxU3QOnxglR9POcKaBFBURbZuQUuKhdEaqulLD4tm20fKpCkbfZMlpnM/v//Pje//AnTJDNdhsw0bT6vFyexMSAJSUTEQ0OFoTLHMTMEGBBgZic6TIcA0yHAnEyA6RBgOgQYMCA6DAgwszMgwJxEEhGxeJpERMRpSwjEUcYIMDUhQBILTRI1Y0CAEQIJEREPNeIIiXslOsS9EzPEDDE7MUPMEMcTHWJ2okNExIOsSUREPCQIURMPDiE6REREREStEBERERERETEPhYiIiIiIiIh5KERERERERETMQyEiIiIiIiJiHgoRERERERER81CIiIiIiIiImIdCRERERERExDwUIiIiIiIiIuahEBERERERETEPhYiIiIiIiIh5KERERERERETMQyEiIiIiIiJiHgoRERERERER81CIiIiIiIiImIdCRERERERExDwUIiIiIiIiIuahEBERERERETEPhYiIiIiIiIh5KERERERERETMQyEiIiIiIiJiHgoRERERERER81CIiIiIiIiImIdCRERERERExDwUIiIiIiIiIuahEBEREREREXG/mHtqEhELxjbHsUGiw4DABnGEOJ4B0WE6RIcBgQ3iCNFhbJAEGAxIgAEBpkPMMBiQwAZxhJhhQBzHBokOA+LeGRBgjifAgJhhQIDpEMczGJDoMCA6DAgwILBBYoYBAaZDzMY2kugwIDAg0yGwQfyQ6DAGhOgwNkgCDKZDgAEJMCCOskHigTEgasYIgQ0SYEBggzhC3DvTIY6yQQLMDHGUDRKzMzMEGBA120gCDIijbJD4ERskOgyIDgMCDIgO0yEwINMhjmdAgOkQ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4jQjiYg4PUgiYi6FiIiIiIiIiHkoRERERERERMxDISIiIiIiImIeChERERERERHzUIiIiIh4iLBNREScPgoRERERDxGSiIiI00chIiIiIiIiYh4KEREREREREfNQiIiIiIiIiJiHQkRERERERMQ8FCIiIiIiIiLmoRARERFxmrFNRJwebBMxl0JERETEaUYSERFx+itEREREREREzEMhIiIiIiIiYh4KERERERERc5BExFwKEREREREREfNQiIiIiIiIiJiHQkRERERERMQ8FCIiIiIiIiLmoRARERERERExD4WIiIiIiIiIeShEREREREREzEMhIiIiIuI0Z5t4cNgmYi6FiIiIiIjTnCQi4vRTiIiIiHiIsE1ELC5JRMylEBEREfEQIYmIWFy2iZhLISIeVmwTEfFwZZuHKttELCbbnAqSiJhLISIeViQREfFwJYmHKklELCZJRCy0QkRERERERMQ8FCIiIiIiIiLmoRARERERERExD4WIiIiIiIiIeShEREREREREzEMhIiIiIiIiYh4KERERERERc7BNxFwKEfGwYptYHLaJiIiIOJMVIiJiXiQRERERcSYrRMTDiiQiIiIiIhZDISIiIiIiYg6SiJhLISIiIiIiImIeChERERERERHzUIiIiIiIiIiYh0JERERERETEPBQiIiIiIiIi5qEQERERERERMQ+FiIiIiIiIiHkoRMTDim1icdjmvtgmIiLiocw2EXMpRMTDiiRicUjivkgiIiIi4uGqEBERERERETEPhYiIiIiIiIh5KERERERERETMQyEiIiIiImIOkoiYSyEiIiIiIiJiHgoRERERERER81CIiIiIiIiImIdCRERERERExDwUIiIiIiIiIuahEBERERERETEPhYiIiIiIiIh5KERERERERETMQyEiIiIiImIOtomYSyEiIiLOSLaJiIj4cRQiIiLijCSJiIiIH0chIiIiIiIiYh4KERERERERc5BExFwKEfGwYptYHLaJiMVlm4cq20REPNwUIuJhRRKxOCQREYtLEg9VkoiIeLgpRERERERERMxDISIiIiIiImIeChEREREREXOwTcRcChEREREREXOQRMRcChERERERERHzUIiIiIiIiJiDbSLmUoiIiIiIiJiDJCLmUoiIiIiIiIiYh0JERERERETEPBQiIiIiIiLmYJuIuRQiIiIi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" +}, { + "width": 458, + "height": 312, + "url": "data:image/png;base64,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Xe96F+6tYWbk83mmT5+OmVESQiBJEiZMmMDGkEQcx7S2tlImCVfdAgOYJEoMMAMEiA1iBgKmP7iU2kxgtQi22buWuqYYEG7DSEISkigJISCJDWFmJEnCU089RTqdZm1jxoyhoaEBSZRJIoTASSedxAEHHEAmk0ESksjlctxxxx38+te/Zn2YGSU33HADd999N4VCAUmEEGhqamLixIkceuihuLdWd3c3N998M52dnZTU1tbS2NjI6NGjqcTMMDPMDDPDzFibJCQhCUm46hdwK0kgCUlsGOOF5zp57GftWIHV8j0JEw7ZAgMk3OsgCUlIYkPNmjWLb37zm7S3t1NWLBY58sgjMTPWJYnm5mYuueQS8vk8xWKRbDZLNpulv7+fs846i+eeew4z47U8/PDDnH322bS3t5PNZslms6TTaQ499FBOO+00QghIwr11Fi5cSBRFFItFSqIo4uCDDyadTrM2M8PMMDOSJKGrq4vly5fT3d1NkiSYGWaGmeE2PzFuo5gZEix9Jcv3L5hNiIEiKymGoTvUsMc7hmFmSML965gZJfPnz+e8886jUCiQJAklLS0t7LPPPhxwwAH8M2ZGydixY7n66qs555xzWLJkCSW9vb2k02m+9rWvcd1111FTU4Mk1mVmtLW1cd555xFFEYVCgZJMJsPgwYP52te+RkNDA5Jwb625c+dSKBQoi6KIAw44gDiOkYSZUZLNZpk5cyYPPPAA8+fP5/HHH2fevHmMHj2asWPHsu2223LQQQcxduxY0uk0JZJwm4cY95rMjDIhJMj1FZn+p8VMvngeufYEElYJUOgxTrhgFLV1ESDcm8fMKJOEmdHd3c19993Heeedx3PPPUcul6OksbGRYrHIRRddRH19PZJYlyRKzIxjjz2WBx98kF/84hd0d3dT0t7ezm9+8xuOPPJIjjnmGNZlZhQKBb75zW8yY8YMurq6KKurq+PKK69kxx13RBLurdfb24uZUZbL5WhoaKDEzMhms9x///1861vfYvr06SRJQjqdpre3l0KhQHt7O08++ST9/f1cfPHF7Lfffpx99tm84x3vII5jJOGqX4x7Td3teSwxersLdHflmPXn5Uz93VIWz84RxwESVlIMhR7jP7+9PTvvMRgzkNgkmBmSqDZmhiTKzAxJlC1evBgzo7Ozk+7ubh555BFuu+02pk6dSj6fJ5fL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6GO4+OKLefTRR9m6dSt9fX0cOHCAtsHBQV5//XV27drFrl27mC8ziQiGhoY4rNls0t3dzdVXX82tt95Ko9EgIni/zGRgYICbbrqJUgqZSVsphcxkx44dLF++nIjgw6xdu5adO3eyc+dO9u/fT9uBAwf46U9/yv33309/fz+lFCICfbYigrbrrruOzOSWW26h1WoxODjI5OQk77zzDhMTE/T391NKISLITFqtFp2dnRw8eJDDms0mjUaD22+/na9+9au0RQRauuoc5yIgM1l34e/xud2dfO/vf83BvVOUEjANTDMjqHVAjWBOQraYVSAKZIErt/0+m//mdGr1IAJ9DBFBZnLZZZexZ88ebrrpJp5//nlGRkYYGxtjeHiYD9PV1UV3dzcnnHACd955J1/+8pfp7OwkIni/zKTVanHffffxi1/8gkOHDhERtK1cuZLbbruNL37xi3wUEUHbNddcw549e3j66acZHBykbXh4mHvvvZf169dz8cUXo8UhIqjX61x//fWcccYZ3Hzzzezdu5exsTHGx8cZHBzkSEZHR2nr6Oig2WyyfPly7r33Xi677DJqtRoRgZa2OiIiyIQ/OncFtz9yPv/5b/v4j/v/l6H9U9S7glpHkAkkswIioDWVTI0l9VLY8M0VXHT56Xz+jCbTCRGBPr6IIDNZt24du3fvZvfu3dx9990MDAzQarVoNBpMTEyQmbRFBF1dXYyMjFCr1Wi1Wmzbto0tW7awevVq2iKCKj/+8Y+57777mJycpNls0lar1bjgggvYunUrbRHBRxER9Pb2cuutt3LRRRfRbDY5rKOjg+3bt/OFL3yB008/nYhAn72IoO2SSy7hvPPO44c//CE7duygp6eHqakpenp6GB8fJzNp6+rqYnJykunpacbGxvjOd77D1772NVavXk1bRKClr47eFcGMoKe3g7+6ajV/celpvPTCAL/6rwFe2zvEgdcnmZ7iXVGHE06t8/lTmpyz8XOc+cd99K3qJkmSIAJ9giKCthUrVnDttddy5ZVX8sILL/DUU0/x2muv8fLLLzM1NUVbR0cHZ511FieeeCKbNm1izZo1nHjiiUQEEcEHiQhOPfVUnnjiCebLTE4++WSWLVtGRHC01q5dyzPPPMPU1BTvV0pBi0tE0HbKKafwrW99iy1btvDiiy/y5JNP8tZbb/Gb3/yGsbExMpMzzzyTFStWsGnTJs4991xOO+00IoKIQMeOOvotEUEmNJbVOeeCkzh3/Um0jY+2yAQSokBXo0ZbJmQmCUQE+v8TEWQmfX19bNiwgQ0bNtA2PDzM9PQ0baUUms0m7xcRfBRr1qyhSkRwtCKCtjVr1lAlItDiExFkJqtWrWLjxo1s3LiRtpGREVqtFm3Lli0jIpgvItCxpY4WCgiCtkze1dFVmC+TORGBPh0Rwfs1m03miwh+VxHBJy0i0NIUEbxfT08P80UEOrbV0UcSEWhxigg+KZlJRCBViQh0fClImhMRaPHLTI4VmYkWt4IkLTERwbEiItDiVpAkSZUKkiSpUkGSJFUqSJKkSgVJczITSZqvIGlORCBJ8xUkSVKlgqQ5mYkkzVeQNCcikKT5CpIkqVJBkiRVKkiSpEoFSZJUqSBpTmYiSfMVpBmZiSAikKT5CpIkqVJBmhERSJIWKkgzMhNJ0kIFaUZEIElaqCBpTmYiSfMVJM2JCCRpvoI0IzORJC1UkGZEBJKkhQqSJKlSQZIkVSrouJCZSJKOXkHHhYhAknT0CpIkqVJBmpGZSDp6mYmObQVpRkQg6ehFBDq2FSRJUqWCNCMzkSQtVJBmRASSpIUKkiSpUkGSJFUqSJKkSgVJklSpIEmSKhUkSVKlgiRJqlSQJEmVCpIkqVJBkiRVKkjScSwzkT5IQZKOYxGB9EEK0ozMRJK0UEGaERFIkhaqoyUvM5EWq8xEWsrqaMnJTNqee+45uru7kRaLV155hVarRdvPf/5zenp60NLzxhtvMDk5iWbV0dISECTdjQZf+cpXIAJpMQhgbGyMtq7ubv52yxYiAi0tAQyPjBBRINCMOlp6otBoNBifmEBaVCLobjRom5iYQEtTrVajVqujWXW0ZGTCn234c372y1/yYQJIPlgwK/nsBLOST0cAyScrmJXMCiCZFUAyK1goeU8wK1kogOQ9ASQLBZBAAMl7AkgggOTDBZB8sgJIjiyAZFYAyW8LIKkWQPLxBJB8NAEkRy+ABAJIIIDkPQEk7wkgmRVA8rsJIIEAkvcEkFTr7OwkIjje1dGS0t1o0N1oIEn6dNTRkhIRSJI+PQVJklSpIEmSKhUkSVKlgiRJqlSQJEmVCpIkqVJBkiRVKkiSpEoFSZJUqSBJkioVJElSpYIkSapUkCRJlQqSJKlSQZIkVSpIkqRKBUmSVKkgSZIqFSRJUqWCJEmqVJAkSZUKkiSpUkGSJFUqSJKkSgVJklSpIEmSKhUkSVKlgiRJqlSQJEmVCpIkqVJBkiRVKkiSpEoFSZJUqSBJkioVJElSpYIkSapUkCRJlQqSJKlSQZIkVSpIkqRKBUmSVKkgSZIqFSRJUqWCJEmqVJAkSZXqwB4kSdKR7P8/1Fd+r+PQ+8gAAAAASUVORK5CYII=" +}, { + "width": 229, + "height": 156, + "url": "data:image/png;base64,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" +}, { + "width": 115, + "height": 78, + "url": "data:image/png;base64,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" +}, { + "width": 58, + "height": 39, + "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADoAAAAnCAYAAABe81ttAAAAAklEQVR4AewaftIAAAOmSURBVOXBz0/TdxzH8efr0y+zKKj8kA1E14RmTEKGdttRknHxRBYTg4fFG3/J7tz8CzyYJcAO27KDO6AGQ+JC6kbssrlFkBL5Ufk1GAXK9730QOKaSb/9tt3UPh7ayvnG2+9LR41w1AhHjXDUCEeN8HjNLaw/5+GzJA3v1PPZB5fxnEcYjteYmTHxxySDvVdoazjDzEKKsBxVlF5d4Nel33k4O42ZUSpJfJG4RsQ5nq0v0HqimbAcVdRxup17s1N88n4CSYR155cJzhxvprPpLGE5qsTM2NjZoD5yjNxBjjDMjO8e3+HsyXf5NHYJMyMsR5XMrc6zs5/l446PeLG9ShiGsZPL8nj5N8Z++panL+YIy6NKYi3nyes43U5YTo6hi59TCR4hrK2tsby0SEUZIEpn0BWP49XV8WqGRwjLz5/T1/MhkqiUmZkZent7kUQp0uk0O9ksjXV1vJrwCMk5hyQqRRLOOSRRCkkE4SiDmVENZkYhM6OQmRGUowrMjHJIopAkCkkiKMf/zMwoZGZUmqMMkvg3kghKEoUkUWmOIjJL2zy8t8Dqyl8ENTs7y927d9nY2KBce3t7PHjwgEePHmFmmBlhOI6Qy/lMfDNPz6VWvv9qFvONYjY3N7l//z59fX3cunUL3/fxfZ+8g4MDzAwzI6jx8XFisRjr6+vMzc0hiTAcR4hExLXhbl6s7HD8RATEP5gZhRobG7lx4wbz8/O0traytbXFzZs3SafTjI2NkSeJIMyMpaUlkskkuVyOc+fOYWYcMjOCchxBEnl1dY7cvs/21h4vk0QhSZgZ9fX1LC4uEo1G6e/vZ2RkhKtXryKJYsyMQ9PT0wwMDHDq1CmSySSSOCSJoBxHyO7s8/OPy3ScP0lnVwN/ru9RTCaTIZVKEY/HaWlpIZvN8uTJE+LxOCsrK5QqkUgQjUZpbm5md3eXsBxHOBb12Fzb5Yevn7KXPeC9zgaKaWpqIpVKMTo6SmdnJ9vb27S1tTE8PMzk5CS+71OMJPIkMTg4yO3bt5mamiKRSBCWxxEkcfnKecwMSQQRiUQYGhrCzJCEmdHe3k7e9evXCcLMkERePB6nq6uLPEmYGZIolUcAkiiVJMKSxMskcUgSYTjKZGa8CRxlMDOKkcTrwFEGSfxXzIxyOMokiWoyM/IkUQ6PEAzjcSpFJc2n07hIhFJlMhl6LiYoxiOE7gs9VFqs+wJhxLoJxCMESbxpHDXCUSMcNcIDsrzlDHJ/A37OZMZTtzIsAAAAAElFTkSuQmCC" +} ]; +mipmaps.forEach( function( mipmap ) { + mipmap.img = new Image(); + window.phetImages.push( mipmap.img ); // make sure it's loaded before the sim launches + mipmap.img.src = mipmap.url; // trigger the loading of the image for its level + mipmap.canvas = document.createElement( 'canvas' ); + mipmap.canvas.width = mipmap.width; + mipmap.canvas.height = mipmap.height; + var context = mipmap.canvas.getContext( '2d' ); + mipmap.updateCanvas = function() { + if ( mipmap.img.complete && ( typeof mipmap.img.naturalWidth === 'undefined' || mipmap.img.naturalWidth > 0 ) ) { + context.drawImage( mipmap.img, 0, 0 ); + delete mipmap.updateCanvas; + } + }; +} ); +export default mipmaps; \ No newline at end of file