mirror of
https://github.com/modrinth/code.git
synced 2026-08-30 11:36:05 +00:00
* feat: base of instances v2 * feat: use old profiles with compat layer * prototype: instances v2 * fix: install_from using profile * fix: skins migration fix * fix: frontend still using profile path * fix: add update proj multiselect guard * fix: cargo fmt * fix: content missing fields * feat: break up app-lib/api/instance.rs * fix: check_content_updates mismatch * fix: updater modal cleanup w/new structure * feat: better update all handling * fix: remove preview_update_all * fix: feedback on bulk update + lint * fix: rem transitions * fix: change to jsonb * feat: app db backup after update * fix: lint * fix: sqlx prepare + use sqlx macros * fix: lint * fix: bugs * feat: defuck the installing process up * fix: bug of hell * fix: shear * fix: fmt * fix: install progress spacing + change mc/content/overrides to bytes * fix: lint * fix: prepr * fix: navtabs anim not working in app * fix: worlds.vue improvements + browse page fixes * feat: optimise queries + adapter fns * fix: lint * fix: lint * feat: shared modrinth-content-management crate (#6469) * feat: disable warnings setting * feat: add instances shortcuts (#6329) * Add modrinth://launch deep link to start a profile Support external profile launching via modrinth://launch/{profile_path} for integrations such as Stream Deck. * Change route to /launch/profile/{id} for future extensibility * fix: ensure profile path is url decoded * fix: URL-decode profile path from deep link * fix: use urlencoding crate for URL decoding * feat: implement app instance shortcuts * feat: change windows shortcut creation to use windows api instead * feat: implement creating a shortcut launching world/server * format * fmt * fix multiline inline tables * pnpm prepr * feat: move create shortcut to last item * refactor: split up shortcuts.rs for individual platforms * refactor: turn profile launch url into url type * use string literal and add safety comment * pt2 * refactor: rename anything that's profile into instance * update mac shortcut --------- Co-authored-by: DJCheesusReal <134006619+DJCheesusReal@users.noreply.github.com> --------- Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com> Co-authored-by: DJCheesusReal <134006619+DJCheesusReal@users.noreply.github.com>
162 lines
4.3 KiB
Vue
162 lines
4.3 KiB
Vue
<script setup lang="ts">
|
|
import {
|
|
Checkbox,
|
|
defineMessages,
|
|
injectNotificationManager,
|
|
StyledInput,
|
|
Toggle,
|
|
useVIntl,
|
|
} from '@modrinth/ui'
|
|
import { computed, type Ref, ref, watch } from 'vue'
|
|
|
|
import { edit } from '@/helpers/instance'
|
|
import { get } from '@/helpers/settings.ts'
|
|
import { injectInstanceSettings } from '@/providers/instance-settings'
|
|
|
|
import type { AppSettings } from '../../../helpers/types'
|
|
|
|
const { handleError } = injectNotificationManager()
|
|
const { formatMessage } = useVIntl()
|
|
|
|
const { instance } = injectInstanceSettings()
|
|
|
|
const globalSettings = (await get().catch(handleError)) as AppSettings
|
|
|
|
const overrideWindowSettings = ref(
|
|
!!instance.value.game_resolution || !!instance.value.force_fullscreen,
|
|
)
|
|
const resolution: Ref<[number, number]> = ref(
|
|
instance.value.game_resolution ?? (globalSettings.game_resolution.slice() as [number, number]),
|
|
)
|
|
const fullscreenSetting: Ref<boolean> = ref(
|
|
instance.value.force_fullscreen ?? globalSettings.force_fullscreen,
|
|
)
|
|
|
|
const editInstanceObject = computed(() => {
|
|
if (!overrideWindowSettings.value) {
|
|
return {
|
|
force_fullscreen: null,
|
|
game_resolution: null,
|
|
}
|
|
}
|
|
return {
|
|
force_fullscreen: fullscreenSetting.value,
|
|
game_resolution: fullscreenSetting.value ? null : resolution.value,
|
|
}
|
|
})
|
|
|
|
watch(
|
|
[overrideWindowSettings, resolution, fullscreenSetting],
|
|
async () => {
|
|
await edit(instance.value.id, editInstanceObject.value)
|
|
},
|
|
{ deep: true },
|
|
)
|
|
|
|
const messages = defineMessages({
|
|
customWindowSettings: {
|
|
id: 'instance.settings.tabs.window.custom-window-settings',
|
|
defaultMessage: 'Custom window settings',
|
|
},
|
|
fullscreen: {
|
|
id: 'instance.settings.tabs.window.fullscreen',
|
|
defaultMessage: 'Fullscreen',
|
|
},
|
|
fullscreenDescription: {
|
|
id: 'instance.settings.tabs.window.fullscreen.description',
|
|
defaultMessage: 'Make the game start in full screen when launched (using options.txt).',
|
|
},
|
|
width: {
|
|
id: 'instance.settings.tabs.window.width',
|
|
defaultMessage: 'Width',
|
|
},
|
|
widthDescription: {
|
|
id: 'instance.settings.tabs.window.width.description',
|
|
defaultMessage: 'The width of the game window when launched.',
|
|
},
|
|
enterWidth: {
|
|
id: 'instance.settings.tabs.window.width.enter',
|
|
defaultMessage: 'Enter width...',
|
|
},
|
|
height: {
|
|
id: 'instance.settings.tabs.window.height',
|
|
defaultMessage: 'Height',
|
|
},
|
|
heightDescription: {
|
|
id: 'instance.settings.tabs.window.height.description',
|
|
defaultMessage: 'The height of the game window when launched.',
|
|
},
|
|
enterHeight: {
|
|
id: 'instance.settings.tabs.window.height.enter',
|
|
defaultMessage: 'Enter height...',
|
|
},
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div class="flex flex-col gap-6">
|
|
<Checkbox
|
|
v-model="overrideWindowSettings"
|
|
:label="formatMessage(messages.customWindowSettings)"
|
|
/>
|
|
<div class="flex items-center gap-4 justify-between">
|
|
<div class="flex flex-col gap-1">
|
|
<h2 class="m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.fullscreen) }}
|
|
</h2>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.fullscreenDescription) }}
|
|
</p>
|
|
</div>
|
|
<Toggle
|
|
id="fullscreen"
|
|
:model-value="overrideWindowSettings ? fullscreenSetting : globalSettings.force_fullscreen"
|
|
:disabled="!overrideWindowSettings"
|
|
@update:model-value="
|
|
(e) => {
|
|
fullscreenSetting = e
|
|
}
|
|
"
|
|
/>
|
|
</div>
|
|
|
|
<div class="flex items-center gap-4 justify-between">
|
|
<div class="flex flex-col gap-1">
|
|
<h2 class="m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.width) }}
|
|
</h2>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.widthDescription) }}
|
|
</p>
|
|
</div>
|
|
<StyledInput
|
|
id="width"
|
|
v-model="resolution[0]"
|
|
autocomplete="off"
|
|
:disabled="!overrideWindowSettings || fullscreenSetting"
|
|
type="number"
|
|
:placeholder="formatMessage(messages.enterWidth)"
|
|
/>
|
|
</div>
|
|
|
|
<div class="flex items-center gap-4 justify-between">
|
|
<div class="flex flex-col gap-1">
|
|
<h2 class="m-0 text-lg font-semibold text-contrast">
|
|
{{ formatMessage(messages.height) }}
|
|
</h2>
|
|
<p class="m-0">
|
|
{{ formatMessage(messages.heightDescription) }}
|
|
</p>
|
|
</div>
|
|
<StyledInput
|
|
id="height"
|
|
v-model="resolution[1]"
|
|
autocomplete="off"
|
|
:disabled="!overrideWindowSettings || fullscreenSetting"
|
|
type="number"
|
|
:placeholder="formatMessage(messages.enterHeight)"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</template>
|