Мне не хватает места в интерфейсе Manipulate. Итак, я хочу посмотреть, смогу ли я перегрузить PopupMenu, чтобы служить более чем одной цели.
Вот проблема:
У меня есть PopupMenu, где я использую, чтобы выбрать из него запись. Но в зависимости от другого выбора, который я сделаю где-то еще, некоторые из этих пунктов меню больше не будет иметь смысла выбирать.
Мне было интересно, могу ли я сделать некоторые записи в PopupMenu «выбираемыми» на основе настройки Dynamic? (может быть отключен или выделен серым цветом, или, что было бы лучше, иметь весь список динамически, т.е.все всплывающее меню должно быть динамическим, поэтому я могу выбирать разные меню в зависимости от значения другой динамики. Но я не думаю, что это возможно)
В настоящее время ВСЕ всплывающее меню может быть включено или отключено в зависимости от динамической настройки. Но я хочу сделать это на начальном уровне внутри Popupmenu.
Вот пример для иллюстрации:
Manipulate[selection,
Grid[{
{"x", SetterBar[Dynamic[x], {1, 2}]},
{"selection", PopupMenu[Dynamic[selection],
{
"NONE", "SOR", "SSOR"
}, Enabled -> Dynamic[x == 1]], SpanFromLeft
}
}]
]
В приведенном выше примере, когда X = 1, доступно все меню.
Но то, что я хочу, если X = 1, - это иметь возможность выбирать только «НЕТ» (или в списке просто отображается «НЕТ»), а когда X = 2, то иметь возможность выбирать только «SOR». и «SSOR» (или в списке просто показаны эти 2 варианта).
т.е. система не позволит выбрать «SOR», если x = 2. Попытка выбрать его не вызовет никаких изменений, и в меню останется прежняя настройка и не изменится.
Опять же, я знаю, что могу разбить вещи на 2 popuMenus и управлять каждым из них на основе настройки X, как показано ниже, но у меня нет места для добавления дополнительных меню:
Manipulate[If[x == 1, selectionA, selectionB],
Grid[{
{"x", SetterBar[Dynamic[x], {1, 2}]},
{"selection", PopupMenu[Dynamic[selectionA],
{
"NONE"
}, Enabled -> Dynamic[x == 1]], SpanFromLeft
},
{"selection", PopupMenu[Dynamic[selectionB],
{
"SOR", "SSOR"
}, Enabled -> Dynamic[x == 2]], SpanFromLeft
}
}]
]
Мой вопрос: есть ли способ сделать это в Mathematica? Я использую 8.04.
Лучшим решением было бы иметь список элементов для самого меню с помощью Dynamic (или все меню было динамическим), поэтому я могу указать ему использовать listA, когда X = 1, или использовать listB, когда X = 2, и т. Д. Но я не знаю, как это сделать, и не знаю, возможно ли это вообще.
пс. Это моя текущая попытка решения
Manipulate[selection,
Grid[{
{"x", SetterBar[Dynamic[x], {1, 2}]},
{"selection", PopupMenu[Dynamic[selection],
{
Dynamic[If[x == 1, listA, listB]]
}
]
}
}
],
Initialization :>
(
listA = {"A", "B"};
listB = {"C", "D"};
)
]
, но оно пока работает не очень хорошо. Я буду продолжать ....
спасибо
Обновление:
Взгляд на решение Саймона ниже вдохновил меня немного больше, так что это то, что у меня есть на данный момент:
Manipulate[selection,
Grid[{
{"x", SetterBar[Dynamic[x], {1, 2}]},
{"selection",
Dynamic[If[x == 1,
(
selection = "A";
PopupMenu[Dynamic[selection], {"A", "B"}]
),
(
selection = "C";
PopupMenu[Dynamic[selection], {"C", "D"}]
)
]
]
}
}
]
]