Skip to content
Snippets Groups Projects
Index.vue 6.91 KiB
Newer Older
Griefed's avatar
Griefed committed
<template>
Trungel's avatar
Trungel committed
  <span v-if="store.state.lttMap">
    <span v-for="(xRow, index) in store.state.lttMap" :key="index">
Trungel's avatar
Trungel committed
      <div class="row no-wrap"
        v-bind:class="[{
Trungel's avatar
Trungel committed
          firstRow: (index == 0),
          moveup: (index !=0),
        }, (index != 0 && !(index%2))?'shifted':'notShifted']"
Trungel's avatar
Trungel committed
      >
        <Tile
          v-for="(tile, i) in xRow"
Trungel's avatar
Trungel committed
          :tile="tile"
          :typeValue="tile.typeId"
          @update:typeValue="tile.typeId = $event"
Trungel's avatar
Trungel committed
          v-bind:id="tile.x+'_'+tile.y"
Trungel's avatar
Trungel committed
          :class="{tileMl: (i!=0)?1:0}"
Trungel's avatar
Trungel committed
          v-bind:key="i">
          </Tile>
Trungel's avatar
Trungel committed
      </div>
    </span>
  </span>
Trungel's avatar
Trungel committed
  <span v-else>
    <div class="row no-wrap q-pa-md absolute-center">
      <q-card>
        <q-card-section>
          <div class="column" style="width: 600px;">
              <div class="text-h6 q-mb-md text-black">New Map Dimensions</div>
              <q-item>
                <q-item-section avatar>
                  <q-icon size="30px" color="secondary" name="mdi-arrow-expand-horizontal" />
                </q-item-section>
                <q-item-section>
                  <q-slider v-model="store.state.mapSizeX" :min="1" :max="101" label color="secondary" :step="1" label-always/>
                  <q-tooltip :disable="$q.platform.is.mobile">
                      Size along the X-axis.
                  </q-tooltip>
                </q-item-section>
              </q-item>

              <q-item>
                <q-item-section avatar>
                  <q-icon size="30px" color="secondary" name="mdi-arrow-expand-vertical" />
                </q-item-section>
                <q-item-section>
                  <q-slider v-model="store.state.mapSizeY" :min="1" :max="101" label color="secondary" :step="1" label-always/>
                  <q-tooltip :disable="$q.platform.is.mobile">
                    Size along the Y-axis.
                  </q-tooltip>

              <q-btn class="q-mr-xs" color="secondary" label="Generate Empty Map" @click='createMap()'>
                <q-tooltip :disable="$q.platform.is.mobile">
                  Generate empty map with size set above

          </div>
        </q-card-section>

        <q-card-section>
          <div class="column" style="width: 600px;">
            <q-input color="black" filled v-model="store.state.seed" label="Seed" type="number" maxlength="15">
              <template v-slot:append>
                <q-icon name="cancel" @click.stop="store.state.seed = null" class="cursor-pointer" />
                <q-icon name="refresh" @click.stop="store.state.seed = store.seedGenerator.random_int31()" class="cursor-pointer" />
              <q-tooltip :disable="$q.platform.is.mobile">
                Numbers only.
              </q-tooltip>
            </q-input>
            <q-btn class="q-mr-xs" color="secondary" label="Generate Random Map" @click='createRandomMap()'>
                <q-tooltip :disable="$q.platform.is.mobile">
                  Generate random map with size set above
            </q-btn>
          </div>
        </q-card-section>

        <q-card-section>
          <div class="column">
            <div class="text-h6 q-mb-md text-black">Load Existing Map</div>
            <q-input
              v-model="mapString"
              filled
              placeholder="Paste Map Data"
              type="textarea"
              input-class="pastCodeArea"
            >
              <q-tooltip :disable="$q.platform.is.mobile">
                Valid map-json only.
              </q-tooltip>
            </q-input>
            <q-btn class="q-mr-xs" color="secondary" label="Load Map From Filedata" @click='loadMapData()'>
              <q-tooltip :disable="$q.platform.is.mobile">
                Load Map From Data
              </q-tooltip>
            </q-btn>
          </div>
Trungel's avatar
Trungel committed
        <q-card-section>
          <div class="column">
            <div class="text-h6 q-mb-md text-black">Load Map from File</div>
            <q-file
              v-model="file"
              label="Pick one file"
              filled
              clearable
              accept=".json, application/*"
              max-file-size="800000"
              style="max-width: 100%"
              @rejected="onRejected"
            >
              <q-tooltip :disable="$q.platform.is.mobile">
                Only one file of max 800Kb in size.
              </q-tooltip>
            </q-file>
Trungel's avatar
Trungel committed
            <q-btn class="q-mr-xs" color="secondary" label="Load Map From Filedata" @click='loadMapFile()'>
              <q-tooltip :disable="$q.platform.is.mobile">
Trungel's avatar
Trungel committed
              </q-tooltip>
            </q-btn>
          </div>
        </q-card-section>


Trungel's avatar
Trungel committed
    </div>
  </span>
Trungel's avatar
Trungel committed

Griefed's avatar
Griefed committed
</template>

<script>
Trungel's avatar
Trungel committed
import { defineComponent, inject, ref } from 'vue';
Griefed's avatar
Griefed committed
import Tile from "../components/Tile.vue";
Trungel's avatar
Trungel committed
import { useQuasar } from 'quasar';
Griefed's avatar
Griefed committed

export default defineComponent({
    setup() {
Trungel's avatar
Trungel committed

      const store = inject('store');

Trungel's avatar
Trungel committed
      const $q = useQuasar()

      var mapString = ref('');
Trungel's avatar
Trungel committed

Trungel's avatar
Trungel committed
      const parseJsonFromString = function(mapString) {
        let mapObject;
        try {
          mapObject = JSON.parse(mapString);
        } catch (e) {
            if (e instanceof SyntaxError) {
              $q.notify({
                type: 'negative',
                message: 'Input is not a valid JSON'
              })
          } else {
              $q.notify({
                type: 'negative',
                message: 'An unknown error occured'
              })
              console.log(e);
          }
          return;
        }
        this.file = null;
        this.mapString = null;
        store.methods.loadMap(mapObject);
      }

Trungel's avatar
Trungel committed
      const loadMapData = function() {
Trungel's avatar
Trungel committed
        this.parseJsonFromString(mapString.value);
      };

      const loadMapFile = function() {
        const reader = new FileReader();
        reader.onload = e => this.parseJsonFromString(e.target.result);
        reader.readAsText(this.file);
      const createMap = function() {
Trungel's avatar
Trungel committed
        store.methods.generateMap();
      };

      const createRandomMap = function() {
        store.methods.generateRandomMap();
      };

      const onRejected = function(rejectedEntries) {
        $q.notify({
          type: 'negative',
          message: `${rejectedEntries[0].file.name} file(s) did not pass validation constraints`
        });
      };

Griefed's avatar
Griefed committed
      return {
Trungel's avatar
Trungel committed
        parseJsonFromString,
        file: ref(null),
Trungel's avatar
Trungel committed
        mapString,
Trungel's avatar
Trungel committed
        store,
        createMap,
Trungel's avatar
Trungel committed
        loadMapData,
Trungel's avatar
Trungel committed
      }
    },
Trungel's avatar
Trungel committed

Trungel's avatar
Trungel committed
    methods:{
Trungel's avatar
Trungel committed

Griefed's avatar
Griefed committed
    },
    components: {
      Tile
    },
  }
)
</script>

<style>
Griefed's avatar
Griefed committed
.shifted {
Griefed's avatar
Griefed committed
  margin-left: 49px;
}

Trungel's avatar
Trungel committed
.tileMl {
  margin-left: -2px;
}

Griefed's avatar
Griefed committed
.moveup {
Griefed's avatar
Griefed committed
}
</style>