Питання
Я б хотів створити інтерфейс користувача у вигляді спливаючого меню , спливаючого меню, подібного до використовуваного в Magit .
Особливості
Визначення спливаючого вікна
Спливаюче вікно в контексті цього питання означає невелике тимчасове вікно, яке містить колекцію пунктів меню, щоб користувач міг вибрати один і лише один із цих пунктів.
Позиція на екрані
Спливаюче вікно дозволяється відображати в будь-якій частині екрана, але бажано, щоб воно було досить очевидним, і, таким чином, воно повинно з’являтися біля активного вікна.
Зміст буфера Popup
Елементи повинні бути відображені у вигляді симпатичної таблиці. Досить те , що контекст питання означає візуально привабливий, цього ефекту можна найпростіше досягти, розміщуючи елементи меню в прямі рядки, див
complete--insert-string
. Цей пункт служить для додаткового роз'яснення, ви можете це зробити по-своєму, це не зробить вашу відповідь неправильною.
Вибір пункту меню
Очікується, що вибір буде здійснено одним натисканням клавіші або, за бажанням, мишкою (хоча це не так важливо, тому відповіді, що містять пропозиції, які не підтримують мишу, є законними). Якщо ви пропонуєте рішення, яке підтримує мишу, зауважте, що користувач повинен мати можливість інтуїтивно вибрати пункт меню, тобто клацанням лівою кнопкою на потрібному виборі.
NB миша може бути використана багатьма способами, і альтернативні способи вказувати на вибір також вітаються.
Ліквідація спливаючих вікон
Після того як користувач обрав пункт меню описаним вище способом, буфер і, таким чином, його вікно повинні бути видалені з виду, а також знищені. Вікно, яке було активним до виклику спливаючого меню, має знову зосередити увагу (тобто стати активним).
Повернене значення та аргументи
Переважно, цей наслідок дій повинен призводити до повернення об'єкта Lisp. Об'єктом Lisp може бути:
nil
- це вказує на те, що користувач скасував спливаюче меню або натисканням, C-gабо іншим способом †.string
- рядок (дозволяється використовувати символ) повинен міститиstring-equal
один із рядків, що надходять до спливаючого меню як колекцію фактичних елементів.
Альтернативні способи повідомити решту програми про вибір користувача, або, можливо, про його відсутність, є прийнятними. Однак, якщо незрозуміло, як це ще можна зробити, я прошу всіх відповідачів імпровізувати і не вимагати від мене подальшого роз'яснення цього аспекту.
Це все для повернутого значення. Що стосується вхідних параметрів, вони повинні принаймні включати колекцію рядків, які представляють можливий вибір (тобто пункти меню).
Прийнятні відповіді
Очікувана відповідь може мати такі форми:
Достатній фрагмент коду, який дозволяє освіченому читачеві записувати таку функцію, як описана вище; не передбачається і не потрібно писати всю робочу функцію. Однак, щоб уникнути невизначеності (чи можуть бути пропущені значні частини коду?), Слід зазначити, що відсутні фрагменти фрагмента повинні бути описані в текстовій складовій відповіді.
Посилання на існуючу бібліотеку, яка реалізує аналогічні функції. Щоб уникнути невизначеності, слід зазначити, що подібне в нашому випадку означає, що бібліотеку можна використовувати для створення спливаючого вікна (див. Визначення вище), який має щонайменше 2 або 3 функції, описані вище. Якщо запропонована бібліотека відрізняється від того, що раніше не може бути виконано заявлену умову, кожен такий випадок буде розглядатися незалежно і завжди буде апробовано, якщо ОП вважає це корисним.
Опис вбудованих функцій Emacs або сторонніх функцій, які можна використовувати для реалізації будь-якої функції, описаної в розділі «Особливості», див. Вище. Щоб уникнути невизначеності, будь ласка, чітко вкажіть, як ваша відповідь може бути корисною для майбутніх читачів, які хочуть реалізувати спливаюче , спливаюче меню, подібне до того, яке використовується у Magit .
† Альтернативні способи скасування спливаючого меню можуть включати такі (але не обмежуючись цим):
клацання поза вікном спливаючого меню;
вбивство буфера, що містить спливаюче вікно без вибору.
magit-popup
. Новий пакет називаєтьсяtransient
, і саме це використовується в сучасних версіяхmagit
. Див. Документацію на magit.vc/manual/transient .