Compare commits

...

7 Commits

Author SHA1 Message Date
Florian Rival
e8ce83b162 Bump version 2018-03-29 22:34:06 +02:00
Florian Rival
9b91f06011 Add menu item to set an object as global 2018-03-29 22:09:23 +02:00
Florian Rival
17247cbbf1 Ensure coordinates of objects moved with the mouse are round 2018-03-29 22:05:42 +02:00
Florian Rival
10b81dd232 Fix StartPage snapshot test 2018-03-25 20:19:48 +02:00
Florian Rival
3f3a5dbd3b Remove warnings and add Flow on StartPage 2018-03-25 20:05:35 +02:00
Florian Rival
6ff8ee749d Fix changes wrongly discarded in ObjectField 2018-03-17 17:21:40 +01:00
Florian Rival
db5f146818 Fix errors with some parameter fields 2018-03-17 17:18:03 +01:00
16 changed files with 118 additions and 45 deletions

View File

@@ -87,11 +87,20 @@ export default class InstructionParametersEditor extends Component {
<div key={type} style={styles.parametersContainer}>
{mapFor(0, instructionMetadata.getParametersCount(), i => {
const parameterMetadata = instructionMetadata.getParameter(i);
const parameterMetadataType = parameterMetadata.getType();
const ParameterComponent = ParameterRenderingService.getParameterComponent(
parameterMetadata.getType()
parameterMetadataType
);
if (parameterMetadata.isCodeOnly()) return null;
if (!ParameterComponent) {
console.warn(
'Missing parameter component for',
parameterMetadataType
);
return null;
}
return (
<ParameterComponent
parameterMetadata={parameterMetadata}

View File

@@ -1,6 +1,4 @@
// @flow
import ParameterRenderingService from '../ParameterRenderingService';
export type ParameterFieldProps = {|
parameterMetadata?: gdParameterMetadata,
project: gdProject,
@@ -8,5 +6,8 @@ export type ParameterFieldProps = {|
onChange: string => void,
value: string,
isInline?: boolean,
parameterRenderingService?: typeof ParameterRenderingService,
parameterRenderingService?: {
components: any,
getParameterComponent: (type: string) => any,
},
|};

View File

@@ -12,7 +12,7 @@ export default class InstancesResizer {
}
_roundXPosition(x) {
if (!this.options.snap || !this.options.grid) return x;
if (!this.options.snap || !this.options.grid) return Math.round(x);
return (
Math.round((x - this.options.gridOffsetX) / this.options.gridWidth) *
@@ -22,7 +22,7 @@ export default class InstancesResizer {
}
_roundYPosition(y) {
if (!this.options.snap || !this.options.grid) return y;
if (!this.options.snap || !this.options.grid) return Math.round(y);
return (
Math.round((y - this.options.gridOffsetY) / this.options.gridHeight) *

View File

@@ -8,7 +8,7 @@ export default class BaseEditor extends React.Component<*,*> {
setToolbar: () => {},
};
getProject(): gdProject {
getProject(): ?gdProject {
return this.props.project;
}

View File

@@ -0,0 +1,16 @@
// @flow
import * as React from 'react';
import muiThemeable from 'material-ui/styles/muiThemeable';
const styles = {
logo: {
width: '100%',
},
};
const ThemableGDevelopLogo = ({ muiTheme }) => (
<img src={muiTheme.logo.src} alt="" style={styles.logo} />
);
const GDevelopLogo = muiThemeable()(ThemableGDevelopLogo);
export default GDevelopLogo;

View File

@@ -0,0 +1,25 @@
// @flow
import * as React from 'react';
import muiThemeable from 'material-ui/styles/muiThemeable';
const styles = {
scrollContainer: {
flex: 1,
display: 'flex',
overflowY: 'scroll',
},
};
const ThemableScrollBackground = ({ muiTheme, children }) => (
<div
style={{
...styles.scrollContainer,
backgroundColor: muiTheme.palette.canvasColor,
}}
>
{children}
</div>
);
const ScrollBackground = muiThemeable()(ThemableScrollBackground);
export default ScrollBackground;

View File

@@ -2,8 +2,8 @@
import React from 'react';
import renderer from 'react-test-renderer';
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
import defaultTheme from '../../UI/Theme/DefaultTheme';
import StartPage from './StartPage';
import defaultTheme from '../../../UI/Theme/DefaultTheme';
import StartPage from '.';
const gd = global.gd;
describe('StartPage', () => {

View File

@@ -48,7 +48,7 @@ exports[`StartPage renders the start page with a project 1`] = `
style={
Object {
"WebkitTapHighlightColor": "rgba(0,0,0,0)",
"backgroundColor": "#f7f7f7",
"backgroundColor": "#f0f0f0",
"borderRadius": 2,
"boxShadow": "0 1px 6px rgba(0, 0, 0, 0.12),
0 1px 4px rgba(0, 0, 0, 0.12)",
@@ -634,7 +634,7 @@ exports[`StartPage renders the start page with no project opened 1`] = `
style={
Object {
"WebkitTapHighlightColor": "rgba(0,0,0,0)",
"backgroundColor": "#f7f7f7",
"backgroundColor": "#f0f0f0",
"borderRadius": 2,
"boxShadow": "0 1px 6px rgba(0, 0, 0, 0.12),
0 1px 4px rgba(0, 0, 0, 0.12)",

View File

@@ -1,18 +1,15 @@
// @flow
import React from 'react';
import FlatButton from 'material-ui/FlatButton';
import Paper from 'material-ui/Paper';
import IconButton from 'material-ui/IconButton';
import muiThemeable from 'material-ui/styles/muiThemeable';
import BaseEditor from './BaseEditor';
import Window from '../../Utils/Window';
import { Line } from '../../UI/Grid';
import BaseEditor from '../BaseEditor';
import Window from '../../../Utils/Window';
import { Line } from '../../../UI/Grid';
import GDevelopLogo from './GDevelopLogo';
import ScrollBackground from './ScrollBackground';
const styles = {
scrollContainer: {
flex: 1,
display: 'flex',
overflowY: 'scroll',
},
innerContainer: {
display: 'flex',
flexDirection: 'column',
@@ -35,14 +32,11 @@ const styles = {
buttonsPaper: {
width: '100%',
},
logo: {
width: '100%',
},
};
class ThemableStartPage extends BaseEditor {
constructor(props) {
super(props);
class StartPage extends BaseEditor {
constructor() {
super();
this.state = {
aboutDialogOpen: false,
@@ -65,28 +59,21 @@ class ThemableStartPage extends BaseEditor {
onCreate,
onOpenProjectManager,
onCloseProject,
muiTheme,
onOpenAboutDialog,
} = this.props;
return (
<div
style={{
backgroundColor: muiTheme.palette.canvasColor,
...styles.scrollContainer,
}}
>
<ScrollBackground>
<div style={styles.innerContainer}>
<Line expand justifyContent="center">
<div style={styles.centerContainer}>
<Paper
zDepth={1}
style={{
backgroundColor: muiTheme.startPage.backgroundColor,
...styles.logoPaper,
}}
>
<img src={muiTheme.logo.src} alt="" style={styles.logo} />
<GDevelopLogo />
<p>
GDevelop is an easy-to-use game creator with no programming
language to learn.
@@ -160,10 +147,9 @@ class ThemableStartPage extends BaseEditor {
</div>
</Line>
</div>
</div>
</ScrollBackground>
);
}
}
const StartPage = muiThemeable()(ThemableStartPage);
export default StartPage;

View File

@@ -47,6 +47,11 @@ class ThemableObjectRow extends React.Component {
enabled: !!this.props.onEdit,
click: () => this.props.onEditName(),
},
{
label: 'Set as a global object',
enabled: !!this.props.onSetAsGlobalObject,
click: () => this.props.onSetAsGlobalObject(),
},
{
label: 'Delete',
enabled: !!this.props.onEdit,

View File

@@ -69,6 +69,7 @@ export default class ObjectSelector extends Component {
layout,
allowedObjectType,
noGroups,
onBlur,
...rest
} = this.props;
@@ -97,6 +98,8 @@ export default class ObjectSelector extends Component {
focused: false,
text: null,
});
if (onBlur) onBlur(event);
}}
onNewRequest={data => {
// Note that data may be a string or a {text, value} object.

View File

@@ -111,6 +111,11 @@ class ObjectsList extends Component<*, *> {
onPaste={() => this.props.onPaste(objectWithContext)}
onRename={newName =>
this.props.onRename(objectWithContext, newName)}
onSetAsGlobalObject={
objectWithContext.global
? undefined
: () => this.props.onSetAsGlobalObject(objectWithContext)
}
onAddNewObject={this.props.onAddNewObject}
editingName={nameBeingEdited}
getThumbnail={this.props.getThumbnail}
@@ -355,6 +360,35 @@ export default class ObjectsListContainer extends React.Component<
this.forceUpdateList();
};
_setAsGlobalObject = (objectWithContext: ObjectWithContext) => {
const { object } = objectWithContext;
const { project, objectsContainer } = this.props;
const objectName = object.getName();
if (!objectsContainer.hasObjectNamed(objectName)) return;
if (project.hasObjectNamed(objectName)) {
showWarningBox(
'A global object with this name already exists. Please change the object name before setting it as a global object'
);
return;
}
//eslint-disable-next-line
const answer = confirm(
"This object will be loaded and available in all the scenes. This is only recommended for objects that you reuse a lot and can't be undone. Make this object global?"
);
if (!answer) return;
project.insertObject(
objectsContainer.getObject(objectName),
project.getObjectsCount()
);
objectsContainer.removeObject(objectName);
this.forceUpdateList();
};
forceUpdateList = () => {
this.forceUpdate();
this.sortableList.getWrappedInstance().forceUpdateGrid();
@@ -403,6 +437,7 @@ export default class ObjectsListContainer extends React.Component<
onEditObject={this.props.onEditObject}
onCopyObject={this._copyObject}
onCutObject={this._cutObject}
onSetAsGlobalObject={this._setAsGlobalObject}
onPaste={this._paste}
onAddNewObject={() =>
this.setState({ newObjectDialogOpen: true })}

View File

@@ -95,9 +95,6 @@ const theme: Theme = {
logo: {
src: 'res/GD-logo.png',
},
startPage: {
backgroundColor,
},
mosaicRootClassName: 'mosaic-gd-dark-theme',
eventsSheetRootClassName: 'gd-events-sheet-dark-theme',
};

View File

@@ -80,9 +80,6 @@ const theme = {
logo: {
src: 'res/GD-logo-big.png',
},
startPage: {
backgroundColor,
},
mosaicRootClassName: 'mosaic-gd-default-theme',
eventsSheetRootClassName: 'gd-events-sheet-default-theme',
};

View File

@@ -79,7 +79,6 @@ export default class Authentification {
getUserProfile = (cb: (any, ?Profile) => void) => {
if (!this.isAuthenticated()) return cb({ unauthenticated: true });
console.log('User found', this.user);
cb(null, this.user);
};

View File

@@ -2,7 +2,7 @@
"name": "gdevelop",
"productName": "GDevelop 5",
"description": "GDevelop 5 IDE running on the Electron runtime",
"version": "5.0.0-beta27",
"version": "5.0.0-beta28",
"author": "Florian Rival",
"license": "MIT",
"homepage": "http://gdevelop-app.com",