diff --git a/src/components/common/DropdownItem.vue b/src/components/common/DropdownItem.vue new file mode 100644 index 0000000000..6e82bbad75 --- /dev/null +++ b/src/components/common/DropdownItem.vue @@ -0,0 +1,65 @@ + + + + + + {{ item.label }} + + + + + + + + + + + {{ item.label }} + + + diff --git a/src/components/common/DropdownMenu.vue b/src/components/common/DropdownMenu.vue new file mode 100644 index 0000000000..6cec4542cc --- /dev/null +++ b/src/components/common/DropdownMenu.vue @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/common/ScrubableNumberInput.vue b/src/components/common/ScrubableNumberInput.vue index df13408ef3..da6df65358 100644 --- a/src/components/common/ScrubableNumberInput.vue +++ b/src/components/common/ScrubableNumberInput.vue @@ -8,7 +8,7 @@ v-if="!hideButtons" :aria-label="t('g.decrement')" data-testid="decrement" - class="h-full w-8 rounded-r-none hover:bg-base-foreground/20 disabled:opacity-30" + class="h-full aspect-8/7 rounded-r-none hover:bg-base-foreground/20 disabled:opacity-30" variant="muted-textonly" :disabled="!canDecrement" tabindex="-1" @@ -53,7 +53,7 @@ v-if="!hideButtons" :aria-label="t('g.increment')" data-testid="increment" - class="h-full w-8 rounded-l-none hover:bg-base-foreground/20 disabled:opacity-30" + class="h-full aspect-8/7 rounded-l-none hover:bg-base-foreground/20 disabled:opacity-30" variant="muted-textonly" :disabled="!canIncrement" tabindex="-1" diff --git a/src/components/sidebar/ModeToggle.vue b/src/components/sidebar/ModeToggle.vue deleted file mode 100644 index dff2f5277e..0000000000 --- a/src/components/sidebar/ModeToggle.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - diff --git a/src/components/sidebar/tabs/AssetsSidebarGridView.vue b/src/components/sidebar/tabs/AssetsSidebarGridView.vue index 124dea50d7..3116da661f 100644 --- a/src/components/sidebar/tabs/AssetsSidebarGridView.vue +++ b/src/components/sidebar/tabs/AssetsSidebarGridView.vue @@ -81,7 +81,7 @@ const assetItems = computed(() => const gridStyle = { display: 'grid', - gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', + gridTemplateColumns: 'repeat(auto-fill, minmax(min(200px, 30vw), 1fr))', padding: '0 0.5rem', gap: '0.5rem' } diff --git a/src/locales/en/main.json b/src/locales/en/main.json index 5210317122..4b7ebf2d6d 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -966,7 +966,8 @@ "settings": "Settings", "help": "Help", "helpAndFeedback": "Help & Feedback", - "queue": "Queue Panel" + "queue": "Queue Panel", + "fullscreen": "Fullscreen" }, "tabMenu": { "duplicateTab": "Duplicate Tab", @@ -3024,10 +3025,13 @@ "giveFeedback": "Give feedback", "graphMode": "Graph Mode", "dragAndDropImage": "Click to browse or drag an image", + "mobileControls": "Edit & Run", "runCount": "Number of runs", "rerun": "Rerun", "reuseParameters": "Reuse Parameters", "downloadAll": "Download All", + "viewJob": "View Job", + "enterNodeGraph": "Enter node graph", "welcome": { "title": "App Mode", "message": "A simplified view that hides the node graph so you can focus on creating.", diff --git a/src/renderer/extensions/linearMode/ImagePreview.vue b/src/renderer/extensions/linearMode/ImagePreview.vue index 1b2b83df9f..ffabdf04fa 100644 --- a/src/renderer/extensions/linearMode/ImagePreview.vue +++ b/src/renderer/extensions/linearMode/ImagePreview.vue @@ -31,7 +31,7 @@ const height = ref('') { diff --git a/src/renderer/extensions/linearMode/LinearControls.vue b/src/renderer/extensions/linearMode/LinearControls.vue index 9c3539fdc1..c6dbf09756 100644 --- a/src/renderer/extensions/linearMode/LinearControls.vue +++ b/src/renderer/extensions/linearMode/LinearControls.vue @@ -5,6 +5,7 @@ import { storeToRefs } from 'pinia' import { computed, ref, shallowRef } from 'vue' import { useI18n } from 'vue-i18n' +import ScrubableNumberInput from '@/components/common/ScrubableNumberInput.vue' import Popover from '@/components/ui/Popover.vue' import Button from '@/components/ui/button/Button.vue' import { extractVueNodeData } from '@/composables/graph/useGraphNodeManager' @@ -17,20 +18,16 @@ import { useTelemetry } from '@/platform/telemetry' import { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore' import DropZone from '@/renderer/extensions/linearMode/DropZone.vue' import NodeWidgets from '@/renderer/extensions/vueNodes/components/NodeWidgets.vue' -import WidgetInputNumberInput from '@/renderer/extensions/vueNodes/widgets/components/WidgetInputNumber.vue' import { api } from '@/scripts/api' import { app } from '@/scripts/app' import { useCommandStore } from '@/stores/commandStore' -import { useExecutionStore } from '@/stores/executionStore' import { useExecutionErrorStore } from '@/stores/executionErrorStore' import { useQueueSettingsStore } from '@/stores/queueStore' -import type { SimplifiedWidget } from '@/types/simplifiedWidget' import { cn } from '@/utils/tailwindUtil' import { useAppMode } from '@/composables/useAppMode' import { useAppModeStore } from '@/stores/appModeStore' const { t } = useI18n() const commandStore = useCommandStore() -const executionStore = useExecutionStore() const executionErrorStore = useExecutionErrorStore() const { batchCount } = storeToRefs(useQueueSettingsStore()) const settingStore = useSettingStore() @@ -45,9 +42,11 @@ const props = defineProps<{ mobile?: boolean }>() +defineEmits<{ navigateAssets: [] }>() + const jobFinishedQueue = ref(true) const { ready: jobToastTimeout, start: resetJobToastTimeout } = useTimeout( - 5000, + 8000, { controls: true, immediate: false } ) @@ -134,17 +133,6 @@ const partitionedNodes = computed(() => { return parts }) -const batchCountWidget: SimplifiedWidget = { - options: { - precision: 0, - min: 1, - max: settingStore.get('Comfy.QueueButton.BatchCountLimit') - }, - value: 1, - name: t('linearMode.runCount'), - type: 'number' -} as const - //TODO: refactor out of this file. //code length is small, but changes should propagate async function runButtonClick(e: Event) { @@ -179,44 +167,13 @@ defineExpose({ runButtonClick }) - - - - - - {{ t('menu.run') }} - - - - - - - {{ t('menuLabels.publish') }} + + + + + + + {{ t('linearMode.viewJob') }} + + + + + + + + - + + + + + + + + + + + + + + {{ t('menu.run') }} + + + + + + - - - - - - - diff --git a/src/renderer/extensions/linearMode/MobileDisplay.vue b/src/renderer/extensions/linearMode/MobileDisplay.vue new file mode 100644 index 0000000000..ec632f7df5 --- /dev/null +++ b/src/renderer/extensions/linearMode/MobileDisplay.vue @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ t(label) }} + + + + diff --git a/src/renderer/extensions/linearMode/MobileMenu.vue b/src/renderer/extensions/linearMode/MobileMenu.vue deleted file mode 100644 index ce90b75f68..0000000000 --- a/src/renderer/extensions/linearMode/MobileMenu.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - {{ t('Workflows') }} - - - - - - - {{ t('sideToolbar.templates') }} - - - - {{ t('linearMode.graphMode') }} - - - - - diff --git a/src/stores/menuItemStore.ts b/src/stores/menuItemStore.ts index 553ae146a0..51a14eaa97 100644 --- a/src/stores/menuItemStore.ts +++ b/src/stores/menuItemStore.ts @@ -65,21 +65,20 @@ export const useMenuItemStore = defineStore('menuItem', () => { ) } } + function commandIdToMenuItem(commandId: string, path?: string[]): MenuItem { + const command = commandStore.getCommand(commandId) + return { + command: () => commandStore.execute(command.id), + label: command.menubarLabel, + icon: command.icon, + tooltip: command.tooltip, + comfyCommand: command, + parentPath: path?.join('.') + } + } const registerCommands = (path: string[], commandIds: string[]) => { - const items = commandIds - .map((commandId) => commandStore.getCommand(commandId)) - .map( - (command) => - ({ - command: () => commandStore.execute(command.id), - label: command.menubarLabel, - icon: command.icon, - tooltip: command.tooltip, - comfyCommand: command, - parentPath: path.join('.') - }) as MenuItem - ) + const items = commandIds.map((id) => commandIdToMenuItem(id, path)) registerMenuGroup(path, items) } @@ -114,6 +113,7 @@ export const useMenuItemStore = defineStore('menuItem', () => { loadExtensionMenuCommands, registerCoreMenuCommands, menuItemHasActiveStateChildren, - hasSeenLinear + hasSeenLinear, + commandIdToMenuItem } }) diff --git a/src/views/LinearView.vue b/src/views/LinearView.vue index c910960650..6dec5543ef 100644 --- a/src/views/LinearView.vue +++ b/src/views/LinearView.vue @@ -4,22 +4,19 @@ import Splitter from 'primevue/splitter' import SplitterPanel from 'primevue/splitterpanel' import { storeToRefs } from 'pinia' import { computed, useTemplateRef } from 'vue' -import { useI18n } from 'vue-i18n' import AppBuilder from '@/components/builder/AppBuilder.vue' import AppModeToolbar from '@/components/appMode/AppModeToolbar.vue' import ExtensionSlot from '@/components/common/ExtensionSlot.vue' -import ModeToggle from '@/components/sidebar/ModeToggle.vue' import TopbarBadges from '@/components/topbar/TopbarBadges.vue' import TopbarSubscribeButton from '@/components/topbar/TopbarSubscribeButton.vue' import WorkflowTabs from '@/components/topbar/WorkflowTabs.vue' -import TypeformPopoverButton from '@/components/ui/TypeformPopoverButton.vue' import { useSettingStore } from '@/platform/settings/settingStore' import { cn } from '@/utils/tailwindUtil' import LinearControls from '@/renderer/extensions/linearMode/LinearControls.vue' import LinearPreview from '@/renderer/extensions/linearMode/LinearPreview.vue' import LinearProgressBar from '@/renderer/extensions/linearMode/LinearProgressBar.vue' -import MobileMenu from '@/renderer/extensions/linearMode/MobileMenu.vue' +import MobileDisplay from '@/renderer/extensions/linearMode/MobileDisplay.vue' import { useWorkspaceStore } from '@/stores/workspaceStore' import { useAppMode } from '@/composables/useAppMode' import { @@ -30,7 +27,6 @@ import { } from '@/constants/splitterConstants' import { useAppModeStore } from '@/stores/appModeStore' -const { t } = useI18n() const settingStore = useSettingStore() const workspaceStore = useWorkspaceStore() const { isBuilderMode, isArrangeMode } = useAppMode() @@ -78,7 +74,8 @@ const bottomRightRef = useTemplateRef('bottomRightRef') const linearWorkflowRef = useTemplateRef('linearWorkflowRef') - + + @@ -88,32 +85,7 @@ const linearWorkflowRef = useTemplateRef('linearWorkflowRef') - - - - - - - - - - - - - - -