diff --git a/.circleci/config.yml b/.circleci/config.yml index 02db88d0db8d4835a4ac3dae183d29ff3e207d49..4e82a0d88ee1ed884742ab40733bacd41c2ec10a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -198,13 +198,14 @@ workflows: - master - develop - /^hotfix\/.*/ - # - deploy-gh-pages: - # requires: - # - lint - # - unit - # - integration - # - build - # filters: - # branches: - # ignore: - # - ^dependabot/.*/ + - deploy-gh-pages: + requires: + - lint + - unit + - integration + - build + filters: + branches: + only: /^(?!pull\/).*$/ # don't deploy to gh pages on PRs. + ignore: + - ^dependabot/.*/ diff --git a/.travis.yml b/.travis.yml index f8c867727d9b938c44fde6d91883afc2964b4952..1c7e8de238ceb9ac2943f65b74fd6bab680aa52d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,13 +51,14 @@ deploy: condition: $TRAVIS_EVENT_TYPE != cron skip_cleanup: true script: if npm info scratch-gui | grep -q $RELEASE_VERSION; then git tag $RELEASE_VERSION && git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git $RELEASE_VERSION; fi -- provider: script - on: - all_branches: true - condition: $TRAVIS_EVENT_TYPE != cron && ! $TRAVIS_BRANCH =~ ^dependabot/ - tags: false # Don't push tags to gh-pages - skip_cleanup: true - script: npm run deploy -- -x -e $TRAVIS_BRANCH -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git +# Skip deploy to gh pages. Circle will do it instead. +# - provider: script +# on: +# all_branches: true +# condition: $TRAVIS_EVENT_TYPE != cron && ! $TRAVIS_BRANCH =~ ^dependabot/ +# tags: false # Don't push tags to gh-pages +# skip_cleanup: true +# script: npm run deploy -- -x -e $TRAVIS_BRANCH -r https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git - provider: script on: branch: develop diff --git a/package-lock.json b/package-lock.json index 8e736e4633d5c2a4d43b393bdaa55721d1ba54cb..135134ecf0eb9e3a1aeb5b5b6e236640c26b1bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13985,9 +13985,9 @@ } }, "scratch-paint": { - "version": "0.2.0-prerelease.20200813210710", - "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200813210710.tgz", - "integrity": "sha512-zvQIp3P0P6vN68z6h5aQKvUYXYX+f6vM3Wyw1wrieMXwQ3G7VKRGteM5q43VzNbpniN3NfRcYkQGw7385+jA7Q==", + "version": "0.2.0-prerelease.20200831213104", + "resolved": "https://registry.npmjs.org/scratch-paint/-/scratch-paint-0.2.0-prerelease.20200831213104.tgz", + "integrity": "sha512-SIZ6+POlAd5M3WtVHWJ+s8fpLTan/JXx9LmBvWZqaASknyWQyJxOPPEU7DNnpWNqJ/NfaWxgoAw48lQmKupa+g==", "requires": { "@scratch/paper": "0.11.20200728195508", "classnames": "2.2.5", @@ -14088,9 +14088,9 @@ } }, "scratch-render": { - "version": "0.1.0-prerelease.20200826001335", - "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20200826001335.tgz", - "integrity": "sha512-UeHqSeHfHlRn7YttbxfagJtSC8g8pLQLZ8dp7Ox1HdfFBiMUn/mRzH3Y/YTv+znA7fPH4MoNAuIotzVjkoYlyg==", + "version": "0.1.0-prerelease.20200827214414", + "resolved": "https://registry.npmjs.org/scratch-render/-/scratch-render-0.1.0-prerelease.20200827214414.tgz", + "integrity": "sha512-8J4+70+0Rdk4Cff7AZwje/ilkqKqML9rphT2JYOJ6wUE+YgNAS3h4DOxpmAaXK+O7Ldkbb30CW1rL4b52aHT8Q==", "requires": { "grapheme-breaker": "0.3.2", "hull.js": "0.2.10", diff --git a/package.json b/package.json index 83397e8d361aa19a840f0bb2f9eda44edf3d6a4e..24c565f77bc1b1e6b9bea6a2243653a09f5dce8f 100644 --- a/package.json +++ b/package.json @@ -74,8 +74,8 @@ "scratch-audio": "0.1.0-prerelease.20200528195344", "scratch-blocks": "0.1.0-prerelease.20200818140148", "scratch-l10n": "3.10.20200826030836", - "scratch-paint": "0.2.0-prerelease.20200813210710", - "scratch-render": "0.1.0-prerelease.20200826001335", + "scratch-paint": "0.2.0-prerelease.20200831213104", + "scratch-render": "0.1.0-prerelease.20200827214414", "scratch-storage": "1.3.3", "scratch-svg-renderer": "0.2.0-prerelease.20200610220938", "scratch-vm": "0.2.0-prerelease.20200820211625", diff --git a/src/components/drag-layer/drag-layer.css b/src/components/drag-layer/drag-layer.css index af6ae5dac2cb920bebbc6ee83351894e60826aa8..926c0ee9fc694ef3b7e09a1420cb379664681bf8 100644 --- a/src/components/drag-layer/drag-layer.css +++ b/src/components/drag-layer/drag-layer.css @@ -9,7 +9,8 @@ left: 0; top: 0; width: 100%; - height: 100% + height: 100%; + direction: ltr; } .image-wrapper { diff --git a/src/containers/costume-tab.jsx b/src/containers/costume-tab.jsx index 6be2cf26849361758013e13d98a800e9a7b8ab9a..c201efb8f982382c505e95347be33b56626d6f60 100644 --- a/src/containers/costume-tab.jsx +++ b/src/containers/costume-tab.jsx @@ -158,14 +158,17 @@ class CostumeTab extends React.Component { const blob = new Blob([item.asset.data], {type: item.asset.assetType.contentType}); downloadBlob(`${item.name}.${item.asset.dataFormat}`, blob); } - handleNewCostume (costume, fromCostumeLibrary) { + handleNewCostume (costume, fromCostumeLibrary, targetId) { const costumes = Array.isArray(costume) ? costume : [costume]; return Promise.all(costumes.map(c => { if (fromCostumeLibrary) { return this.props.vm.addCostumeFromLibrary(c.md5, c); } - return this.props.vm.addCostume(c.md5, c); + // If targetId is falsy, VM should default it to editingTarget.id + // However, targetId should be provided to prevent #5876, + // if making new costume takes a while + return this.props.vm.addCostume(c.md5, c, targetId); })); } handleNewBlankCostume () { @@ -204,13 +207,14 @@ class CostumeTab extends React.Component { } handleCostumeUpload (e) { const storage = this.props.vm.runtime.storage; + const targetId = this.props.vm.editingTarget.id; this.props.onShowImporting(); handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => { costumeUpload(buffer, fileType, storage, vmCostumes => { vmCostumes.forEach((costume, i) => { costume.name = `${fileName}${i ? i + 1 : ''}`; }); - this.handleNewCostume(vmCostumes).then(() => { + this.handleNewCostume(vmCostumes, false, targetId).then(() => { if (fileIndex === fileCount - 1) { this.props.onCloseImporting(); } @@ -220,9 +224,10 @@ class CostumeTab extends React.Component { } handleCameraBuffer (buffer) { const storage = this.props.vm.runtime.storage; + const targetId = this.props.vm.editingTarget.id; costumeUpload(buffer, 'image/png', storage, vmCostumes => { vmCostumes[0].name = this.props.intl.formatMessage(messages.costume, {index: 1}); - this.handleNewCostume(vmCostumes); + this.handleNewCostume(vmCostumes, false, targetId); }); } handleFileUploadClick () { diff --git a/src/containers/sound-tab.jsx b/src/containers/sound-tab.jsx index 984975e0d3136c132e9714e3f99607bb08e272ca..8d42e8e910cd0cdf78b9b04567706c3e78235b38 100644 --- a/src/containers/sound-tab.jsx +++ b/src/containers/sound-tab.jsx @@ -130,11 +130,12 @@ class SoundTab extends React.Component { handleSoundUpload (e) { const storage = this.props.vm.runtime.storage; + const targetId = this.props.vm.editingTarget.id; this.props.onShowImporting(); handleFileUpload(e.target, (buffer, fileType, fileName, fileIndex, fileCount) => { soundUpload(buffer, fileType, storage, newSound => { newSound.name = fileName; - this.props.vm.addSound(newSound).then(() => { + this.props.vm.addSound(newSound, targetId).then(() => { this.handleNewSound(); if (fileIndex === fileCount - 1) { this.props.onCloseImporting();