disable copilot in sketch mode (#2865)
* disable copilot in sketch mode Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
This commit is contained in:
		@ -1246,6 +1246,138 @@ test.describe('Copilot ghost text', () => {
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('copilot disabled in sketch mode no select plane', async ({ page }) => {
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
			
		||||
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
			
		||||
 | 
			
		||||
    await u.waitForAuthSkipAppStart()
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
			
		||||
 | 
			
		||||
    // Click sketch mode.
 | 
			
		||||
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
			
		||||
 | 
			
		||||
    // Exit sketch mode.
 | 
			
		||||
    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
			
		||||
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
			
		||||
    )
 | 
			
		||||
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
			
		||||
      `fn cube = (pos, scale) => {`
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // We should be able to hit Tab to accept the completion.
 | 
			
		||||
    await page.keyboard.press('Tab')
 | 
			
		||||
    await expect(page.locator('.cm-content')).toContainText(
 | 
			
		||||
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
			
		||||
    )
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('copilot disabled in sketch mode after selecting plane', async ({
 | 
			
		||||
    page,
 | 
			
		||||
  }) => {
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
			
		||||
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
			
		||||
 | 
			
		||||
    await u.waitForAuthSkipAppStart()
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
			
		||||
 | 
			
		||||
    // Click sketch mode.
 | 
			
		||||
    await expect(
 | 
			
		||||
      page.getByRole('button', { name: 'Start Sketch' })
 | 
			
		||||
    ).not.toBeDisabled()
 | 
			
		||||
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
			
		||||
 | 
			
		||||
    // select a plane
 | 
			
		||||
    await page.mouse.click(700, 200)
 | 
			
		||||
    await page.waitForTimeout(700) // wait for animation
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `const sketch001 = startSketchOn('XZ')`
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Escape to exit the tool.
 | 
			
		||||
    await u.openDebugPanel()
 | 
			
		||||
    await u.closeDebugPanel()
 | 
			
		||||
    await page.keyboard.press('Escape')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `const sketch001 = startSketchOn('XZ')`
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Escape again to exit sketch mode.
 | 
			
		||||
    await u.openDebugPanel()
 | 
			
		||||
    await u.closeDebugPanel()
 | 
			
		||||
    await page.keyboard.press('Escape')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
 | 
			
		||||
    await u.codeLocator.click()
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.waitForTimeout(500)
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
			
		||||
    )
 | 
			
		||||
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
			
		||||
      `fn cube = (pos, scale) => {`
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // We should be able to hit Tab to accept the completion.
 | 
			
		||||
    await page.keyboard.press('Tab')
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Hit enter a few times.
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)    `
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('ArrowUp in code rejects the suggestion', async ({ page }) => {
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
			
		||||
 | 
			
		||||
@ -163,6 +163,12 @@ export const ModelingMachineProvider = ({
 | 
			
		||||
    modelingMachine,
 | 
			
		||||
    {
 | 
			
		||||
      actions: {
 | 
			
		||||
        'disable copilot': () => {
 | 
			
		||||
          editorManager.setCopilotEnabled(false)
 | 
			
		||||
        },
 | 
			
		||||
        'enable copilot': () => {
 | 
			
		||||
          editorManager.setCopilotEnabled(true)
 | 
			
		||||
        },
 | 
			
		||||
        'sketch exit execute': () => {
 | 
			
		||||
          ;(async () => {
 | 
			
		||||
            await sceneInfra.camControls.snapToPerspectiveBeforeHandingBackControlToEngine()
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ function diagnosticIsEqual(d1: Diagnostic, d2: Diagnostic): boolean {
 | 
			
		||||
 | 
			
		||||
export default class EditorManager {
 | 
			
		||||
  private _editorView: EditorView | null = null
 | 
			
		||||
  private _copilotEnabled: boolean = true
 | 
			
		||||
 | 
			
		||||
  private _isShiftDown: boolean = false
 | 
			
		||||
  private _selectionRanges: Selections = {
 | 
			
		||||
@ -47,6 +48,14 @@ export default class EditorManager {
 | 
			
		||||
 | 
			
		||||
  private _highlightRange: [number, number] = [0, 0]
 | 
			
		||||
 | 
			
		||||
  setCopilotEnabled(enabled: boolean) {
 | 
			
		||||
    this._copilotEnabled = enabled
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get copilotEnabled(): boolean {
 | 
			
		||||
    return this._copilotEnabled
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setEditorView(editorView: EditorView) {
 | 
			
		||||
    this._editorView = editorView
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -40,6 +40,7 @@ import { CopilotLspCompletionParams } from 'wasm-lib/kcl/bindings/CopilotLspComp
 | 
			
		||||
import { CopilotCompletionResponse } from 'wasm-lib/kcl/bindings/CopilotCompletionResponse'
 | 
			
		||||
import { CopilotAcceptCompletionParams } from 'wasm-lib/kcl/bindings/CopilotAcceptCompletionParams'
 | 
			
		||||
import { CopilotRejectCompletionParams } from 'wasm-lib/kcl/bindings/CopilotRejectCompletionParams'
 | 
			
		||||
import { editorManager } from 'lib/singletons'
 | 
			
		||||
 | 
			
		||||
const copilotPluginAnnotation = Annotation.define<null>()
 | 
			
		||||
export const copilotPluginEvent = copilotPluginAnnotation.of(null)
 | 
			
		||||
@ -269,6 +270,11 @@ export class CompletionRequester implements PluginValue {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Make sure we are in a state where we can request completions.
 | 
			
		||||
    if (!editorManager.copilotEnabled) {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.lastPos = this.viewUpdate.state.selection.main.head
 | 
			
		||||
    this._deffererCodeUpdate(true)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -709,6 +709,7 @@ export const modelingMachine = createMachine(
 | 
			
		||||
          'remove sketch grid',
 | 
			
		||||
          'engineToClient cam sync direction',
 | 
			
		||||
          'Reset Segment Overlays',
 | 
			
		||||
          'enable copilot',
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
        entry: [
 | 
			
		||||
@ -719,7 +720,11 @@ export const modelingMachine = createMachine(
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      'Sketch no face': {
 | 
			
		||||
        entry: ['show default planes', 'set selection filter to faces only'],
 | 
			
		||||
        entry: [
 | 
			
		||||
          'disable copilot',
 | 
			
		||||
          'show default planes',
 | 
			
		||||
          'set selection filter to faces only',
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
        exit: ['hide default planes', 'set selection filter to defaults'],
 | 
			
		||||
        on: {
 | 
			
		||||
@ -727,6 +732,9 @@ export const modelingMachine = createMachine(
 | 
			
		||||
            target: 'animating to plane',
 | 
			
		||||
            actions: ['reset sketch metadata'],
 | 
			
		||||
          },
 | 
			
		||||
          Cancel: {
 | 
			
		||||
            actions: ['enable copilot'],
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
@ -748,7 +756,7 @@ export const modelingMachine = createMachine(
 | 
			
		||||
            id: 'animate-to-sketch',
 | 
			
		||||
            onDone: {
 | 
			
		||||
              target: 'Sketch',
 | 
			
		||||
              actions: 'set new sketch metadata',
 | 
			
		||||
              actions: ['disable copilot', 'set new sketch metadata'],
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user