import { Button, Form, Icon, Input, Modal, Select, Upload } from "antd"; import { UploadChangeParam } from "antd/lib/upload"; import { UploadFile } from "antd/lib/upload/interface"; import { observer } from "mobx-react"; import React, { ChangeEvent, ReactNode, Component } from "react"; import { quest_editor_store } from "../../stores/QuestEditorStore"; import { EntityInfoComponent } from "./EntityInfoComponent"; import "./QuestEditorComponent.css"; import { QuestInfoComponent } from "./QuestInfoComponent"; import { RendererComponent } from "../RendererComponent"; import { get_quest_renderer } from "../../rendering/QuestRenderer"; import { application_store } from "../../stores/ApplicationStore"; @observer export class QuestEditorComponent extends Component< {}, { debug: boolean; filename?: string; save_dialog_open: boolean; save_dialog_filename: string; } > { state = { debug: false, save_dialog_open: false, save_dialog_filename: "Untitled", }; componentDidMount(): void { application_store.on_global_keyup("quest_editor", this.keyup); } render(): ReactNode { const quest = quest_editor_store.current_quest; return (
); } private save_as_clicked = (filename?: string) => { const name = filename ? filename.endsWith(".qst") ? filename.slice(0, -4) : filename : this.state.save_dialog_filename; this.setState({ save_dialog_open: true, save_dialog_filename: name, }); }; private save_dialog_filename_changed = (filename: string) => { this.setState({ save_dialog_filename: filename }); }; private save_dialog_affirmed = () => { quest_editor_store.save_current_quest_to_file(this.state.save_dialog_filename); this.setState({ save_dialog_open: false }); }; private save_dialog_cancelled = () => { this.setState({ save_dialog_open: false }); }; private keyup = (e: KeyboardEvent) => { if (e.ctrlKey && e.key === "z" && !e.altKey) { quest_editor_store.undo_stack.undo(); } else if (e.ctrlKey && e.key === "Z" && !e.altKey) { quest_editor_store.undo_stack.redo(); } else if (e.ctrlKey && e.altKey && e.key === "d") { this.setState(state => ({ debug: !state.debug })); } }; } @observer class Toolbar extends Component<{ on_save_as_clicked: (filename?: string) => void }> { state = { filename: undefined, }; render(): ReactNode { const undo = quest_editor_store.undo_stack; const quest = quest_editor_store.current_quest; const areas = quest ? Array.from(quest.area_variants).map(a => a.area) : []; const area = quest_editor_store.current_area; const area_id = area && area.id; return (
false} >
); } private set_filename = (info: UploadChangeParam) => { if (info.file.originFileObj) { this.setState({ filename: info.file.name }); quest_editor_store.load_file(info.file.originFileObj as File); } }; private save_as = () => { this.props.on_save_as_clicked(this.state.filename); }; private undo = () => { quest_editor_store.undo_stack.undo(); }; private redo = () => { quest_editor_store.undo_stack.redo(); }; } class SaveAsForm extends React.Component<{ is_open: boolean; filename: string; on_filename_change: (name: string) => void; on_ok: () => void; on_cancel: () => void; }> { render(): ReactNode { return ( Save as... } visible={this.props.is_open} onOk={this.props.on_ok} onCancel={this.props.on_cancel} >
); } private name_changed = (e: ChangeEvent) => { this.props.on_filename_change(e.currentTarget.value); }; }