|
|
@@ -1,6 +1,7 @@
|
|
|
import React, { useEffect, useMemo, useRef } from "react"
|
|
|
import { ContextMenuOptionType, ContextMenuQueryItem, getContextMenuOptions } from "../../utils/context-mentions"
|
|
|
import { removeLeadingNonAlphanumeric } from "../common/CodeAccordian"
|
|
|
+import { ModeConfig } from "../../../../src/shared/modes"
|
|
|
|
|
|
interface ContextMenuProps {
|
|
|
onSelect: (type: ContextMenuOptionType, value?: string) => void
|
|
|
@@ -10,6 +11,7 @@ interface ContextMenuProps {
|
|
|
setSelectedIndex: (index: number) => void
|
|
|
selectedType: ContextMenuOptionType | null
|
|
|
queryItems: ContextMenuQueryItem[]
|
|
|
+ modes?: ModeConfig[]
|
|
|
}
|
|
|
|
|
|
const ContextMenu: React.FC<ContextMenuProps> = ({
|
|
|
@@ -20,12 +22,13 @@ const ContextMenu: React.FC<ContextMenuProps> = ({
|
|
|
setSelectedIndex,
|
|
|
selectedType,
|
|
|
queryItems,
|
|
|
+ modes,
|
|
|
}) => {
|
|
|
const menuRef = useRef<HTMLDivElement>(null)
|
|
|
|
|
|
const filteredOptions = useMemo(
|
|
|
- () => getContextMenuOptions(searchQuery, selectedType, queryItems),
|
|
|
- [searchQuery, selectedType, queryItems],
|
|
|
+ () => getContextMenuOptions(searchQuery, selectedType, queryItems, modes),
|
|
|
+ [searchQuery, selectedType, queryItems, modes],
|
|
|
)
|
|
|
|
|
|
useEffect(() => {
|
|
|
@@ -46,6 +49,25 @@ const ContextMenu: React.FC<ContextMenuProps> = ({
|
|
|
|
|
|
const renderOptionContent = (option: ContextMenuQueryItem) => {
|
|
|
switch (option.type) {
|
|
|
+ case ContextMenuOptionType.Mode:
|
|
|
+ return (
|
|
|
+ <div style={{ display: "flex", flexDirection: "column", gap: "2px" }}>
|
|
|
+ <span style={{ lineHeight: "1.2" }}>{option.label}</span>
|
|
|
+ {option.description && (
|
|
|
+ <span
|
|
|
+ style={{
|
|
|
+ opacity: 0.5,
|
|
|
+ fontSize: "0.9em",
|
|
|
+ lineHeight: "1.2",
|
|
|
+ whiteSpace: "nowrap",
|
|
|
+ overflow: "hidden",
|
|
|
+ textOverflow: "ellipsis",
|
|
|
+ }}>
|
|
|
+ {option.description}
|
|
|
+ </span>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
case ContextMenuOptionType.Problems:
|
|
|
return <span>Problems</span>
|
|
|
case ContextMenuOptionType.URL:
|
|
|
@@ -101,6 +123,8 @@ const ContextMenu: React.FC<ContextMenuProps> = ({
|
|
|
|
|
|
const getIconForOption = (option: ContextMenuQueryItem): string => {
|
|
|
switch (option.type) {
|
|
|
+ case ContextMenuOptionType.Mode:
|
|
|
+ return "symbol-misc"
|
|
|
case ContextMenuOptionType.OpenedFile:
|
|
|
return "window"
|
|
|
case ContextMenuOptionType.File:
|
|
|
@@ -174,15 +198,17 @@ const ContextMenu: React.FC<ContextMenuProps> = ({
|
|
|
overflow: "hidden",
|
|
|
paddingTop: 0,
|
|
|
}}>
|
|
|
- <i
|
|
|
- className={`codicon codicon-${getIconForOption(option)}`}
|
|
|
- style={{
|
|
|
- marginRight: "6px",
|
|
|
- flexShrink: 0,
|
|
|
- fontSize: "14px",
|
|
|
- marginTop: 0,
|
|
|
- }}
|
|
|
- />
|
|
|
+ {option.type !== ContextMenuOptionType.Mode && getIconForOption(option) && (
|
|
|
+ <i
|
|
|
+ className={`codicon codicon-${getIconForOption(option)}`}
|
|
|
+ style={{
|
|
|
+ marginRight: "6px",
|
|
|
+ flexShrink: 0,
|
|
|
+ fontSize: "14px",
|
|
|
+ marginTop: 0,
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
{renderOptionContent(option)}
|
|
|
</div>
|
|
|
{(option.type === ContextMenuOptionType.File ||
|