summaryrefslogtreecommitdiff
path: root/lib/project.dart
blob: 1f9b0ad70c7a60d38829fec8b5ce6f962e721859 (plain)
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';

enum WindowMode {
  windowed,
  borderlessFullscreen;

  String get displayString {
    switch (this) {
      case WindowMode.windowed:
        return "Windowed";
      case WindowMode.borderlessFullscreen:
        return "Borderless Fullscreen";
    }
  }

  String get pascalCase {
    switch (this) {
      case WindowMode.windowed:
        return "Windowed";
      case WindowMode.borderlessFullscreen:
        return "BorderlessFullscreen";
    }
  }

  static WindowMode fromPascalCase(String pascalCase) {
    return WindowMode.values.firstWhere((mode) => mode.pascalCase == pascalCase);
  }
}

class ProjectConfig extends ChangeNotifier {
  final TextEditingController _gameName;
  final TextEditingController _defaultWindowWidth;
  final TextEditingController _defaultWindowHeight;

  bool _defaultVsync;
  WindowMode _defaultWindowMode;

  String get gameName => this._gameName.text;
  set gameName(String gameName) {
    this._gameName.text = gameName;
  }

  int get defaultWindowWidth => int.parse(this._defaultWindowWidth.text);

  set defaultWindowWidth(int defaultWindowWidth) {
    this._defaultWindowWidth.text = defaultWindowWidth.toString();
  }

  int get defaultWindowHeight => int.parse(this._defaultWindowHeight.text);

  set defaultWindowHeight(int? defaultWindowHeight) {
    this._defaultWindowHeight.text = defaultWindowHeight.toString();
  }

  bool get defaultVsync => this._defaultVsync;
  set defaultVsync(bool defaultVsync) {
    this._defaultVsync = defaultVsync;
    notifyListeners();
  }

  WindowMode get defaultWindowMode => this._defaultWindowMode;
  set defaultWindowMode(WindowMode defaultWindowMode) {
    this._defaultWindowMode = defaultWindowMode;
    notifyListeners();
  }

  ProjectConfig({
    String gameName = "Black Screen",
    int defaultWindowWidth = 1280,
    int defaultWindowHeight = 720,
    bool defaultVsync = true,
    WindowMode defaultWindowMode = WindowMode.windowed,
  })  : this._gameName = TextEditingController(text: gameName),
        this._defaultWindowWidth = TextEditingController(text: defaultWindowWidth.toString()),
        this._defaultWindowHeight = TextEditingController(text: defaultWindowHeight.toString()),
        this._defaultVsync = defaultVsync,
        this._defaultWindowMode = defaultWindowMode;
}

class ProjectPage extends StatelessWidget {
  const ProjectPage({super.key});

  int getWidth(ProjectConfig config) => int.tryParse(config._defaultWindowWidth.text) ?? 1280;
  int getHeight(ProjectConfig config) => int.tryParse(config._defaultWindowHeight.text) ?? 720;

  @override
  Widget build(BuildContext context) {
    var config = Provider.of<ProjectConfig>(context, listen: false);

    return Padding(
      padding: const EdgeInsets.all(20),
      child: Form(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            SizedBox(
              width: 600,
              child: TextFormField(
                decoration: const InputDecoration(
                  labelText: "Project Name",
                  //helperText: "This will appear as the game window's title",
                  border: OutlineInputBorder(),
                ),
                controller: config._gameName,
              ),
            ),
            const SizedBox(height: 20),
            DropdownMenu(
              width: 600,
              label: const Text("Default Window Mode"),
              initialSelection: config.defaultWindowMode,
              onSelected: (v) => config.defaultWindowMode = v!,
              dropdownMenuEntries: WindowMode.values
                  .map(((mode) => DropdownMenuEntry(value: mode, label: mode.displayString)))
                  .toList(),
            ),
            const SizedBox(height: 20),
            Consumer<ProjectConfig>(
              builder: (context, config, child) => Row(
                children: [
                  SizedBox(
                    width: 300,
                    child: TextFormField(
                      decoration: const InputDecoration(
                        labelText: "Default Resolution Width",
                        border: OutlineInputBorder(),
                      ),
                      controller: config._defaultWindowWidth,
                      keyboardType: TextInputType.number,
                      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
                    ),
                  ),
                ],
              ),
            ),
            const SizedBox(height: 20),
            Consumer<ProjectConfig>(
              builder: (context, config, child) => Row(
                children: [
                  SizedBox(
                    width: 300,
                    child: TextFormField(
                      decoration: const InputDecoration(
                        labelText: "Default Resolution Height",
                        border: OutlineInputBorder(),
                      ),
                      controller: config._defaultWindowHeight,
                      keyboardType: TextInputType.number,
                      inputFormatters: [FilteringTextInputFormatter.digitsOnly],
                    ),
                  ),
                ],
              ),
            ),
            const SizedBox(height: 20),
            SizedBox(
              width: 250,
              child: Consumer<ProjectConfig>(
                builder: (context, config, child) => CheckboxListTile(
                  value: config.defaultVsync,
                  onChanged: (v) => config.defaultVsync = v!,
                  title: const Text("Default Vsync", style: TextStyle(fontSize: 20)),
                  controlAffinity: ListTileControlAffinity.leading,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}