View Issue Details

IDProjectCategoryView StatusLast Update
0001751WishesMacropublic2013-02-03 00:33
ReporterDAtaMan Assigned To 
PrioritynormalSeverityfeatureReproducibilityhave not tried
Status closedResolutionfixed 
Product Version3.0 
Summary0001751: Создание меню в макросе
DescriptionВ предлагаемом патче реализована макрофункция Menu.Show
Additional InformationS=Menu.Show(Items[,Title[,Bottom[,Flags[,BoxType[,X[,Y]]]]]])
Items - пункты меню, разделённые запятой или точкой с запятой.

Если первый символ пункта меню начинается с ~, то пункт будет разделителем.
При этом флаги 0x002 и/или 0x004 никак не учитываются.

Title - заголовок меню

Bottom - нижний заголовок меню

Flags - комбинация битов:
  0x001 - разрешена отметка нескольких пунктов
  0x002 - убирать дублирующиеся пункты
  0x004 - отсортировать (с учетом регистра)
  0x008 - автоматически назначить горячие клавиши

BoxType - тип рамки меню:
  0 - без рамки
  1 - одинарная рамка
  2 - одинарная рамка, без окружающих пробелов
  3 - двойная рамка (по-умолчанию)
  4 - двойная рамка, без окружающих пробелов

X, Y - координаты меню.
Если какая-то (или обе) отсутствует или равна -1, то меню по ней центрируется.
По-умолчанию равны -1 (меню показывается в центре экрана)

Возвращаемый результат:
  -1 - при выходе из меню по Esc или F10
  >=0 - номер выбранного пункта (по Enter), если не установлен флаг 0x001
  строка - выбранный пункт меню (если ничего не отмечено) или список отмеченных, разделённые запятой.
TagsNo tags attached.
Build0

Relationships

has duplicate 0001519 closed Far Manager Создание меню в макросах 
has duplicate 0000346 closedvskirdin Wishes Возможность построения меню выбора выполняющегося макроса 

Activities

DAtaMan

2011-04-12 18:01

reporter  

menushow.diff.7z (2,172 bytes)

DAtaMan

2011-04-12 18:02

reporter   bugnote:0006758

Или можно было подобный тикет переоткрыть ?

vskirdin

2011-04-12 19:07

administrator   bugnote:0006759

> Если первый символ пункта меню начинается с ~, то пункт будет разделителем.
Смущает символ '~'.
Может имеет смысл сделать как в Info.Message:
------
Для отрисовки одинарной разделительной линии начните строку с символа с кодом 1 (\x001).
Для отрисовки двойной разделительной линии начните строку с символа с кодом 2 (\x002).
------
?

DAtaMan

2011-04-12 19:28

reporter   bugnote:0006760

>Смущает символ '~'.
Сначала функция имела ещё один параметр - "Separator". Потом убрал, и так рекордсменша получилась :)

>...начните строку с символа с кодом...
Честно говоря не пробовал, а как задать такие коды в verbatim string ? Двойным "\" ?

А так, да, иметь два вида линий будет лучше.

DrKnS

2011-04-12 19:31

administrator   bugnote:0006761

А зачем столько наворотов - разные рамки, разные сепараторы, позиция, футер и т.п.?

Это же макросы, а не апи.

DAtaMan

2011-04-12 19:48

reporter   bugnote:0006762

>А зачем столько наворотов - разные рамки, разные сепараторы, позиция, футер и т.п.?
Хотелось как можно гибче.
Разные рамки - в случае "нестандартных", можно на вид определить, что это макроменю (для некоторых пользователей полезно)
Без рамки - например, удобен список слов в редакторе. Типа макросовое автодополнение
Позиция - меню можно вызывать по координатам мыши
Футер - можно подсказку написать, типа Ins - пометить, Esc - выход.

И т.д. :)

Я, к примеру, использую для отображения закладок редактора.

vskirdin

2011-04-12 20:26

administrator   bugnote:0006763

Flags и BoxType можно объединить
Title и Bottom так же объединить, применив разделитель '\n'
В сухом остатке останется
S=Menu.Show(Items[,Title[,Flags[,X[,Y]]]])

DAtaMan

2011-04-12 20:42

reporter   bugnote:0006764

>В сухом остатке останется
>S=Menu.Show(Items[,Title[,Flags[,X[,Y]]]])
Замечательно!

ЗЫ Баг - хоткеи не работают :(

vskirdin

2011-04-13 07:33

administrator   bugnote:0006768

> Замечательно!
а патч?

> Баг - хоткеи не работают :(
эээ... не понял, где не работают?

JohnDoe

2011-04-13 10:16

updater   bugnote:0006774

Last edited: 2011-04-13 10:18

Я не понял что всё-таки возвращается - число или строка?

По описанию похоже что число, кроме случая когда присутствует флаг 0x001.
Но что если я хочу строку, но не хочу несколько пунктов?

DAtaMan

2011-04-13 20:13

reporter   bugnote:0006789

>а патч?
Пока нет. udlist крут, конечно, но спотыкается на многих строках. Придётся отказаться.

> эээ... не понял, где не работают?
По нажатию хоткея меню закрывается, но строка не выбирается.

>Но что если я хочу строку, но не хочу несколько пунктов?
Пока никак, только через добавление дополнительного параметра/флага.

JohnDoe

2011-04-14 09:51

updater   bugnote:0006790

>только через добавление дополнительного параметра/флага.
Зачем же дополнительный параметр, можно добавить к имеющимся флагам.

Альтернативно, пусть функция во всех случаях возвращает строку - название выбранного пункта.

DAtaMan

2011-04-15 22:03

reporter  

MenuShowV2.diff.7z (3,132 bytes)

DAtaMan

2011-04-15 22:03

reporter  

SeparatorNotFiltered.diff (513 bytes)   
Index: vmenu.cpp
===================================================================
--- vmenu.cpp	(revision 5963)
+++ vmenu.cpp	(working copy)
@@ -661,7 +661,7 @@
 		//������ ������ ���������
 		for (int i=0; i < ItemCount; i++)
 		{
-			if (ItemIsVisible(Item[i]->Flags) && !StrStrI(Item[i]->strName, strFilter))
+			if (ItemIsVisible(Item[i]->Flags) && !StrStrI(Item[i]->strName, strFilter) && !(Item[i]->Flags & LIF_SEPARATOR))
 			{
 				Item[i]->Flags |= LIF_HIDDEN;
 				ItemHiddenCount++;
SeparatorNotFiltered.diff (513 bytes)   

DAtaMan

2011-04-15 22:04

reporter   bugnote:0006794

S=Menu.Show(Items[,Title[,Flags[,Select[,X[,Y]]]]])

Items - пункты меню, разделённые \r\n
  сепаратор должен начинаться с \0x1пробел (с двойным чего-то не разобрался, как сделать :( )
Title - Title и Bottom, разделённые \n
Flags:
бит 0 - возвращаемый результат - индекс или строка
бит 1 - разрешена отметка нескольких пунктов
бит 2 - отсортировать. Теперь выполняется регистронезависимая числовая сортировка. Нужен ли для неё отдельный флаг ?
бит 3 - убирать дублирующиеся пункты
бит 4 - автоматически назначать хоткеи
биты 5-7 - BoxType

Select - пункт, на который позиционируемся при показе меню.
Может быть числом (если отрицательное, то поиск с конца) или строкой

Возвращаемый результат функции - номер пункта, строка или список пунктов, разделённые \r\n
-1 - при выходе по Esc, F10 или при клике вне меню

Добавлены кнопкосочетания Ctrl-Add/Ctrl-Subtract - пометить/снять пометку.
В сочетании с фильтром - лепота :)


Сначала был вариант со вспомогательным массивом, но в целях экономии памяти :) сделал небольшие добавки к VMenu


P.S. Очень не хватает макрофункции разбиения строки на слова (Split, например). Можно завишировать ?

DAtaMan

2011-04-15 22:04

reporter   bugnote:0006795

Также есть предложение не фильтровать сепараторы.
Когда меню с их помощью структурировано, то при фильтрации структура ломается.
Отдельный патч приложен.

vskirdin

2011-04-16 08:31

administrator   bugnote:0006796

> P.S. Очень не хватает макрофункции разбиения строки на слова (Split, например). Можно завишировать ?
можно конечно, но здесь бы массивы пригодились, которых в языке нет.

JohnDoe

2011-04-16 09:14

updater   bugnote:0006797

>Items - пункты меню, разделённые \r\n
>Title - Title и Bottom, разделённые \n
Может лучше как-то однотипненько?

vskirdin

2011-04-16 09:46

administrator   bugnote:0006798

кстати да, нужна однотипность...

JohnDoe

2011-04-16 11:55

updater   bugnote:0006799

Как насчёт того чтобы разделителями могли быть и \n и \r\n?

DAtaMan

2011-04-16 23:51

reporter  

MenuShowV3.diff.7z (3,069 bytes)

DAtaMan

2011-04-16 23:54

reporter   bugnote:0006800

>Как насчёт того чтобы разделителями могли быть и \n и \r\n?
Да, логично. Вроде сделал. :)

Насчёт каких-либо ещё дополнительных клавиш управления идеи есть ?
Т.к. макросы в этом меню работать не будут.

JohnDoe

2011-04-18 08:51

updater   bugnote:0006803

>бит 0 - возвращаемый результат - индекс или строка
Из описания неочевидно, что соответствует 0 а что 1.
Как по мне, то строка полезнее, а значит её удобнее получать по умолчанию.

DAtaMan

2011-04-18 12:00

reporter  

MenuShowV4.diff.7z (3,173 bytes)

DAtaMan

2011-04-18 12:17

reporter   bugnote:0006804

>строка полезнее, а значит её удобнее получать по умолчанию
Можно и так. Сделал.
Если бит 0 установлен, то возвращается индекс.

Измененено расположение управляющих символов - теперь они должны быть расположены после текста пункта меню, и могут быть сочетанием следующих:
\x1 - сепаратор
\x2 - отмеченный
\x3 - запрещённый
\x4 - серый

Тестовый макрос print(menu.show("a\x1\nb\2\nb\3\nd\4\nf\ne","Title\nCtrl-Add, Ctrl-Subtract - пометка",0x16))

vskirdin

2011-04-18 13:00

administrator   bugnote:0006805

Хмм... а почему "они должны быть расположены после текста пункта меню"?
Почему не в начале?
Поясни логику.

DAtaMan

2011-04-18 14:09

reporter   bugnote:0006806

>Почему не в начале?
Если строка начинается с числа (или a-f), то эти символы тоже считаются кодом символа.
Поэтому сначала и было \xпробел.
Как это побороть, не придумал (я же в Це начинающий :) )

vskirdin

2011-04-18 14:38

administrator   bugnote:0006807

Как вариант - принять тезис, что hex считается как \xHHHH, т.е. после x идут 4 (или 5?) 16-ричных числа с ведущим нулем.
Из диапазона всех символов выпадают \x0001..\x0004 - наши управляющие символы.

Если мы считаем, что не будем поддерживать в строках меню (для обсуждаемой функции) esc-последовательности, то можно ограничиться шаблоном \xH, т.е. 1 символ.

DAtaMan

2011-04-18 15:07

reporter   bugnote:0006808

>не будем поддерживать в строках меню (для обсуждаемой функции) esc-последовательности
Да, это плохо. Можно было бы показывать таблицу символов с их кодами, например.

Может быть опять вернутся к варианту "[\x1..\x4]пробелПункт меню" ?

DAtaMan

2011-04-21 14:02

reporter  

MenuShowV5.diff.7z (3,686 bytes)

DAtaMan

2011-04-21 14:03

reporter   bugnote:0006817

S=Menu.Show(Items[,Title[,Flags[,FindOrFilter[,X[,Y]]]]])
Нумерация пунктов меню начинается с 1.

Items - пункты меню, разделённые \n или \r\n
  начало пунктов может иметь специальный формат:
  \1пробел - сепаратор
  \2пробел - пункт отмечен
  \3пробел - пункт недоступен
  \4пробел - серый
  Возможна их комбинация в любом порядке.

Title - заголовок и(или) нижний заголовки меню, разделённые \n или \r\n
Flags, если установлен бит:
0 - возвращаемый результат - индекс, иначе строка
1 - разрешена отметка нескольких пунктов
2 - отсортировать пункты. Выполняется регистронезависимая числовая сортировка
3 - убирать дублирующиеся пункты
4 - автоматически назначать хоткеи
5 - трактовать FindOrFilter как строку для фильтра
6 - автоматическая нумерация пунктов
биты 7-9 - тип рамки меню:
  001 - без рамки
  010 - одинарная рамка
  011 - одинарная рамка
  100 - двойная рамка (по умолчанию)
  101 - двойная рамка без окружающих пробелов

Если FindOrFilter:
  - число, то номер пункта, на который при показе меню позиционируется курсор
    если число отрицательное, то отсчёт с конца меню
  - строка, то в меню производится поиск этой строки (возможны символы маски)
  - строка и установлен 5-ый бит флагов, то строка передаётся в фильтр меню

Возвращаемый результат функции - номер пункта, строка или список пунктов, разделённые \r\n
-1 - при выходе по Esc, F10 или при клике вне меню.

В меню доступны сочетания клавиш Ctrl-Add/Ctrl-Subtract - пометить/снять пометку (только при установленном бите 1).

DAtaMan

2011-04-21 14:04

reporter   bugnote:0006818

Выше описал новый синтаксис. Вроде всё :)

JohnDoe

2011-04-21 17:47

updater   bugnote:0006819

>Возможна их комбинация в любом порядке.
Что-то не понимаю как такое возможно, и для чего нужно.

>0 - возвращаемый результат - индекс, иначе строка
>1 - разрешена отметка нескольких пунктов
Что будет если оба установлены?

>5 - трактовать FindOrFilter как строку для фильтра
Не очень понятно зачем может понадобиться такое. Рельно полезный пример можно?

>список пунктов, разделённые \r\n
Может лучше просто \n?

vskirdin

2011-04-21 18:07

administrator   bugnote:0006820

будет 1983 (первое приближение, дальше дум щупать)

DAtaMan

2011-04-21 21:13

reporter   bugnote:0006822

>>Возможна их комбинация в любом порядке.
>Что-то не понимаю как такое возможно, и для чего нужно.
Например, отмеченный+серый. Для чего - практика покажет. :)

>Что будет если оба установлены?
Вернётся строка - список отмеченных.

>>список пунктов, разделённые \r\n
>Может лучше просто \n?
\n - удобно в меню, формируемых в макросе.
\r\n - для строк, получаемых по CtrlIns (чтобы не делать Replace в макросе)

>>5 - трактовать FindOrFilter как строку для фильтра
>Не очень понятно зачем может понадобиться такое. Рельно полезный пример можно?

Clip(5,0)
$selword;
CtrlIns
%word=Clip(0);
CtrlA CtrlIns CtrlU
%Line=menu.show(Clip(0),"Список строк - Grep",0x71,%word);
$If (%Line)
   editor.pos(1, 1, %Line);
   editor.pos(1, 2, index(editor.value, %word)+1);
   $selword;
$End
Clip(5,0)

Вариант без фильтрации:

Clip(5,0)
$selword;
CtrlIns
%word=Clip(0);
CtrlA CtrlIns CtrlU
%Line=menu.show(Clip(0),"Список строк - Grep",0x51,"*"+lcase(%word)+"*");
$If (%Line)
   editor.pos(1, 1, %Line);
   editor.pos(1, 2, index(editor.value, lcase(%word))+1);
   $selword;
$End
Clip(5,0)

________________________________________
>будет 1983
Ура! :-)

vskirdin

2011-04-22 09:43

administrator   bugnote:0006823

build 1983

JohnDoe

2011-04-22 10:13

updater   bugnote:0006824

Last edited: 2011-04-22 10:16

>Например, отмеченный+серый. Для чего - практика покажет. :)
Я лично за разумный минимализм.
Практической пользы пока не видно, а значит описание напрасно усложняется.
Причём из вышеприведённого описания также следует возможность и таких комбинаций:
сепаратор+пункт отмечен
сепаратор+пункт недоступен
сепаратор+серый
... и ещё масса других безумных 2х- и 3х-компонентных сочетаний.

>>Что будет если оба установлены?
>Вернётся строка - список отмеченных.
В описании надо указать.
Но лучше возвращать ошибку.

>>Может лучше просто \n?
> \r\n - для строк, получаемых по CtrlIns (чтобы не делать Replace в макросе)
Я имел ввиду в возвращаемом значении.

DAtaMan

2011-04-22 12:07

reporter   bugnote:0006825

>Причём из вышеприведённого описания также следует возможность и таких комбинаций:
>сепаратор+пункт отмечен
>сепаратор+пункт недоступен
>сепаратор+серый

Комбинации возможны, но показан будет обычный сепаратор.
После обкатки будет описано предельно понятно.

>Я имел ввиду в возвращаемом значении.

panel.select не понимает только \n

DAtaMan

2011-04-22 12:08

reporter  

MenuShowV6.diff.7z (1,555 bytes)

DAtaMan

2011-04-22 12:09

reporter   bugnote:0006826

Мда, с самого начала расположение битов рамки было не там. Посему перетасовка.
Теперь если во Flags, установлен бит(ы):
биты 0-2 - тип рамки меню:
  001 - без рамки
  010 - одинарная рамка
  011 - одинарная рамка
  100 - двойная рамка (по умолчанию)
  101 - двойная рамка без окружающих пробелов
3 - возвращаемый результат - индекс, иначе строка
4 - разрешена отметка нескольких пунктов
5 - отсортировать пункты. Выполняется регистронезависимая числовая сортировка
6 - убирать дублирующиеся пункты
7 - автоматически назначать хоткеи
8 - трактовать FindOrFilter как строку для фильтра
9 - автоматическая нумерация пунктов

Добавлено/изменено:
10 - выход из меню производится при изменении выбранного пункта (т.е. при навигации по меню)

Возвращаемый результат функции
строка - выбранный пункт или список пунктов, разделённые \r\n
         если установлены биты 3 и 4, то возвращаются номера пунктов, разделённые \r\n
>0 - номер пункта
=0 - при выходе по Esc, F10 или при клике вне меню.
<0 - при установленном бите 10, номер пункта со знаком минус, если произошёл выход по Esc или F10

Теперь стал возможен такой макрос:

  %I = 1;
  %S = "";
  $While (%I <= Bm.Stat(0))
    Bm.Goto(%I);
    %S = %S + Editor.Value + "\n";
    %I = %I + 1;
  $End

  %I = 1;
  $While (%I!=0)
    %I=Menu.Show(%S, "Editor bookmarks\nUp/Down - Navigate, Exit - Esc, F10", 0x608, %I);
    $If (%I>0)
      Bm.Goto(%I);
    $Else
      %I=0;
    $End
  $End

JohnDoe

2011-04-22 12:53

updater   bugnote:0006827

> Комбинации возможны, но показан будет обычный сепаратор.
> После обкатки будет описано предельно понятно.
"Предельно понятно" это хорошо, лишь бы ещё и лаконично.

> panel.select не понимает только \n
Тогда понятно.
Наверно стоит как-то привести всё к общему знаменателю.
Т.е. в данном случае научить panel.select понимать одиночный \n

DAtaMan

2011-04-22 14:41

reporter   bugnote:0006828

>лишь бы ещё и лаконично
Цена универсальности не очень высока.

>Наверно стоит как-то привести всё к общему знаменателю.
>Т.е. в данном случае научить panel.select понимать одиночный \n
Да, стоит. Уже сделал.
После тестов выложу общий патч.

JohnDoe

2011-04-22 15:44

updater   bugnote:0006829

offtopic
>Цена универсальности не очень высока.
По моим наблюдениям цена универсальности обычно высока, и не оправдывает чрезмерную универсальность.

В частности, это делает синтаксис громоздким, а Писание запутанным. И читать такой код труднее.
Предполагается что програмисты народ привыкший...
Но применительно к макроязыку - всё это это может увеличить порог вхождения, а ведь предполагается что макроязык он и для домохозяек тоже.

Menu.Show очень универсальна, и этим выбивается из общего ряда.
Я не уверен что это правильный путь развития макроязыка.
А если уж идти по этому пути (наворачивать), то учитывая в каком виде макроязык сейчас - его стоит спроектировать заново...

DAtaMan

2011-04-22 16:41

reporter  

panels.html.diff (1,179 bytes)   
Index: panels.html
===================================================================
--- panels.html	(revision 6049)
+++ panels.html	(working copy)
@@ -514,7 +514,7 @@
     <tr><td></td><td colspan="2">
     <p>�� ������� ������� <var>Items</var>:</p>
     <ul>
-      <li><p>������� ����� �� �������� � ����� ������, ���� � ������, ��� <code>CrLf</code> ("\r\n").</p>
+      <li><p>������� ����� �� �������� � ����� ������, ���� � ������, <code>Lf</code> ("\n") ��� <code>CrLf</code> ("\r\n").</p>
           <p>����� ����� �� � ����� �����.</p>
       </li>
       <li>� ����� ���� <var>Items</var> ����� "" (��� �����������) - �������� �� ��������.</li>
@@ -542,7 +542,7 @@
 
     <p>�� ������� ������� ���������� <var>Items</var> ������ ������� ������� ��������:</p>
     <ul>
-    <li>����������� - ����� ������� ���� ������������: ���� � ������, ����� ��� <code>CrLf</code> ("\r\n");</li>
+    <li>����������� - ����� ������� ���� ������������: ���� � ������, �����, <code>Lf</code> ("\n") ��� <code>CrLf</code> ("\r\n");</li>
     <li>����� � ����� �����.</li>
     </ul>
       -->
panels.html.diff (1,179 bytes)   

DAtaMan

2011-04-22 16:42

reporter  

MenuShowV7.diff.7z (1,973 bytes)

DAtaMan

2011-04-22 16:50

reporter   bugnote:0006830

>учитывая в каком виде макроязык сейчас - его стоит спроектировать заново...
Я когда-то на форуме предлагал, чтобы все функции имели объекто-подобный синтаксис. Мне сказали погодить :)
_______________________________________________________________________________
Приложил два патча. В Писании поправил описание для panel.select.
Теперь она понимает \n. Возможно, стоит упомянуть об этом в changelog.
menu.show разделяет элементы списка только \n

Тестовый макрос: panel.select(0,1,2,menu.show(clip(0),"Title",0x10))

JohnDoe

2011-04-22 17:14

updater   bugnote:0006831

>Я когда-то на форуме предлагал, чтобы все функции имели объекто-подобный синтаксис.
Дело ведь не в синтаксисе отдельных функций, а в стройности всей системы языка.
По историческим причинам макроязыку это никак не грозит.

DAtaMan

2011-04-23 07:17

reporter   bugnote:0006832

Last edited: 2011-04-23 07:22

Подумалось тут, может сделать так:

handle=Menu.Create(Title[,Flags[,BoxType[,X[,Y]]]]);
Menu.AddItem(handle,Text[,Flags]);
Menu.AddItems(handle,TextWithCrLf[,Flags]);
S=Menu.Show(handle[,X[,Y]]);
Menu.Hide(handle);

??

P.S. Тем более, что где-то на форуме была идея о handle=FindFirstFile(Dir,Mask); S=FindNextFile(handle)

vskirdin

2011-04-23 18:35

administrator   bugnote:0006833

хмм... да, принципе можно и так.
MenuShowV7.diff не коммитить?

DAtaMan

2011-04-23 22:19

reporter   bugnote:0006834

Да, не надо пока.

vskirdin

2011-04-24 08:38

administrator   bugnote:0006835

Last edited: 2011-04-24 08:39

Каким образом предполагается убивать меню:
- отдельной функцией типа Menu.Destroy? а если забыли вызвать?
- в menu.hide? а если потом снова хотим menu.show?
- в конце работы "этого" макроса? а если handle будет глобальной переменной?

И вот тут, с началом появления подобного функционала, появляется вопрос в стиле сборки мусора :-)

DAtaMan

2011-04-24 08:57

reporter   bugnote:0006836

Last edited: 2011-04-24 09:14

Ага, тоже над этим голову ломаю :)

Но плюсов от подхода с handle много.
В перспективе, можно "научить" все функции menu.* работе с макро-меню.
Ну и желателен набор функций для работы с фильтром.

DAtaMan

2011-04-25 14:08

reporter   bugnote:0006840

Так нет принципиальных возражений против handle-функций ?
А то уже потихонечку делаю (уборка мусора на совести юзера)

И нужны ли функции Menu.Count() и Menu.Get(N) (N - индекс, а не handle) ?
(Menu.Free(-1) - удаляет все меню.)

DrKnS

2011-04-25 14:44

administrator   bugnote:0006841

> уборка мусора на совести юзера

Не, это не дело.
Пускай всё само удаляется при завершении макроса.

DAtaMan

2011-04-25 14:47

reporter   bugnote:0006842

>Пускай всё само удаляется при завершении макроса.
Так основная же фишка в том, что однажды созданное меню (например в автостартующем макросе) можно будет вызывать из разных макросов.

DrKnS

2011-04-25 15:49

administrator   bugnote:0006843

А зачем тебе хранить меню как объект?

Сделай создание и инициализацию одной большой глобальной переменной, а потом eval её где нужно.

DAtaMan

2011-04-25 20:22

reporter  

macromenus_draft.7z (4,906 bytes)

DAtaMan

2011-04-25 20:24

reporter   bugnote:0006844

Приложил очень чёрный черновик. Есть что не так ?

JohnDoe

2011-04-26 11:21

updater   bugnote:0006845

Last edited: 2011-04-26 11:23

>Так нет принципиальных возражений против handle-функций ?
Очень есть, изложены чуть выше http://bugs.farmanager.com/view.php?id=1751#c6829
На форуме тоже было http://forum.farmanager.com/viewtopic.php?f=15&t=5410
Не надо превращать макроязык в монстра.

vskirdin

2011-04-26 13:17

administrator   bugnote:0006846

Да, в принципе согласен.
Пусть будет только 1 функция.
Позже (уф... надо как то с силами собраться) сделаешь плагин, который будет предоставлять макросам вариант с хэндлом

JohnDoe

2011-04-26 14:32

updater   bugnote:0006847

Last edited: 2011-04-26 14:33

>плагин, который будет предоставлять макросам вариант с хэндлом
Вот против этого ничего против не имею и иметь не могу.

>надо как то с силами собраться
Ждём!

DAtaMan

2011-04-26 23:05

reporter   bugnote:0006848

>Пусть будет только 1 функция.
Тогда V7 в commit ?

vskirdin

2011-04-27 06:52

administrator   bugnote:0006849

да, V7 (эх, до V8 не дотянули :-), ну и славненько, а то потом с Гуглом разбираться)
сейчас оформлю...

vskirdin

2011-04-27 07:01

administrator   bugnote:0006850

Last edited: 2011-04-27 07:07

Вопрос.
Зачем в panelselectFunc() вместо "\r\n" делается только "\n"?
Если в угоду Menu.Show, то не все так просто.

Hint: FileList::CopyNames()


Upd: Отбой, слона то я и не приметил...

vskirdin

2011-04-27 07:08

administrator   bugnote:0006851

патчик для Писания в студию на основе V7

vskirdin

2011-04-27 07:14

administrator   bugnote:0006852

build 2000 (миллениум)

DAtaMan

2011-04-27 09:01

reporter   bugnote:0006853

патчик для Писания в студию на основе V7
Ага, делаю. А можно отдельную страничку для примеров ? :)

vskirdin

2011-05-19 15:04

administrator   bugnote:0006937

> А можно отдельную страничку для примеров ? :)
эээ... не понял вопроса.

JohnDoe

2011-05-19 16:16

updater   bugnote:0006944

DAtaMan не хочет втискивать примеры в общую таблицу, а просит выделить для этого отдельную html-страницу.

Имхо это лишнее.

vskirdin

2011-05-19 17:33

administrator   bugnote:0006946

согласен.
лучше вместе с конкретной функцией (а еще лучше каждую функцию, константу etc. в отдельном файле)

vskirdin

2011-05-19 18:01

administrator   bugnote:0006949

кстати, вариант "macromenus_draft" можно расширить... - добавить функцию-биндинг, позволяющую на пункт меню назначать макро... (как в eval)

vskirdin

2011-05-23 13:39

administrator   bugnote:0007010

Где Писание?

JohnDoe

2011-05-25 13:24

updater   bugnote:0007035

>7 - автоматически назначать хоткеи
Что-то я пропустил, а как вручную? Через "&"?

>9 - автоматическая нумерация пунктов
Что значит "нумерация"?
Номера являются хоткеями или нет?

JohnDoe

2011-05-25 13:26

updater   bugnote:0007036

>добавить функцию-биндинг, позволяющую на пункт меню назначать макро... (как в eval)
Это здорово, но зачем втискиваться в рамки eval? Предлагаю произвольную строку.

Вот только функция сейчас и так уже сильно перегружена...

Что если убрать BoxType и X, Y?
Например сделать для них отдельную функцию типа Menu.SetStyle()

vskirdin

2011-05-25 13:38

administrator   bugnote:0007037

> но зачем втискиваться в рамки eval? Предлагаю произвольную строку.
что подразумевается под "произвольную строку"?

> Например сделать для них отдельную функцию типа Menu.SetStyle()
это глобальное влияние или для проекта с хэндлом?

JohnDoe

2011-05-25 13:59

updater   bugnote:0007039

>что подразумевается под "произвольную строку"?
Задаются соответствия "имя пункта"/"значение пункта".
При выборе пункта функция возвращает соответствующий ему текст.
Что с этим текстом делать дальше - дело пользователя: можно исполнить через eval, можно передать в командную строку, и т.п.

>это глобальное влияние или для проекта с хэндлом?
Глобальное.
И думаю достаточно будет ограничиться контекстом текущего макроса.

JohnDoe

2011-05-25 14:07

updater   bugnote:0007040

>Задаются соответствия "имя пункта"/"значение пункта".
>...
Но опять же: эта функциональность врядли может красиво совместиться с уже имеющейся.
Вероятно лучше отдельной функцией.

DAtaMan

2011-05-29 02:47

reporter   bugnote:0007103

>Где Писание?
К сожалению, будет не скоро - проблемы со здоровьем (как буду дома, оформлю патч).

DAtaMan

2011-06-30 10:15

reporter  

enc_menu_show.diff.7z (2,548 bytes)

DAtaMan

2011-06-30 10:15

reporter  

MenuShowV8.diff.7z (2,118 bytes)

DAtaMan

2011-06-30 10:16

reporter   bugnote:0007226

И всё-таки V8 :)

Писание + багофиксы:
- поломалась обработка CtrlAdd/CtrlSubtract
- более корректный парсинг пустых строк
- при пустом Title, в заголовке было "0"
+ автонумерация выполняется после сортировки/удаления дубликатов
+ сепараторы при сортировке/удалении дубликатов пропускаются

vskirdin

2011-06-30 10:58

administrator   bugnote:0007227

build 2089

DAtaMan

2011-07-11 22:42

reporter  

menu.show.smallfix.diff (1,662 bytes)   
Index: macro.cpp
===================================================================
--- macro.cpp	(revision 6465)
+++ macro.cpp	(working copy)
@@ -2672,6 +2672,9 @@
 	Menu.Show();
 	int PrevSelectedPos=Menu.GetSelectPos();
 	DWORD Key=0;
+	int RealPos;
+	bool CheckFlag;
+	int X1, Y1, X2, Y2, NewY2;
 	while (!Menu.Done() && !CloseFARMenu)
 	{
 		SelectedPos=Menu.GetSelectPos();
@@ -2689,16 +2692,38 @@
 
 			case KEY_CTRLADD:
 			case KEY_CTRLSUBTRACT:
+			case KEY_CTRLMULTIPLY:
 				if (bMultiSelect)
 				{
 					for(int i=0; i<Menu.GetShowItemCount(); i++)
 					{
-						Menu.SetCheck((Key==KEY_CTRLADD), Menu.VisualPosToReal(i));
+						RealPos=Menu.VisualPosToReal(i);
+						if (Key==KEY_CTRLMULTIPLY)
+						{
+							CheckFlag=Menu.GetCheck(RealPos)?false:true;
+						}
+						else
+						{
+							CheckFlag=(Key==KEY_CTRLADD);
+						}
+						Menu.SetCheck(CheckFlag, RealPos);
 					}
 					Menu.Show();
 				}
 				break;
 
+			case KEY_CTRLA:
+			{
+				Menu.GetPosition(X1, Y1, X2, Y2);
+				NewY2=Y1+Menu.GetShowItemCount()+1;
+
+				if (NewY2>ScrY-2)
+					NewY2=ScrY-2;
+
+				Menu.SetPosition(X1,Y1,X2,NewY2);
+				Menu.Show();
+				break;
+			}
 			case KEY_BREAK:
 				CtrlObject->Macro.SendDropProcess();
 				Menu.SetExitCode(-1);
@@ -2761,13 +2786,19 @@
 	else
 	{
 		Menu.Hide();
-		Result=0;
 		if (bExitAfterNavigate)
 		{
 			Result=SelectedPos+1;
 			if ((Key == KEY_ESC) || (Key == KEY_F10) || (Key == KEY_BREAK))
 				Result=-Result;
 		}
+		else
+		{
+			if(bResultAsIndex)
+				Result=0;
+			else
+				Result=L"";
+		}
 	}
 
 	VMStack.Push(Result);
menu.show.smallfix.diff (1,662 bytes)   

DAtaMan

2011-07-11 22:42

reporter  

menu.show.enc2.diff (3,613 bytes)   
Index: enc_rus2/meta/macro/macrocmd/prop_func/general.html
===================================================================
--- enc_rus2/meta/macro/macrocmd/prop_func/general.html	(revision 6465)
+++ enc_rus2/meta/macro/macrocmd/prop_func/general.html	(working copy)
@@ -1410,7 +1410,7 @@
                                                                 </table>
                                             </td></tr>
         <tr><td><code>3 (0x8)</code></td><td>���������� �������� - ������ ��������� ������ ���</td></tr>
-        <tr><td><code>4 (0x10)</code></td><td>�������� ������� �������� ������� � � �����<br>(�������� <code>Ins</code>, <code>CtrlAdd</code>, <code>CtrlSubtract</code>)</td></tr>
+        <tr><td><code>4 (0x10)</code></td><td>�������� ������� �������� ������� � � �����</td></tr>
         <tr><td><code>5 (0x20)</code></td><td>������������ (����������� ������������������ ������� ����������)</td></tr>
         <tr><td><code>6 (0x40)</code></td><td>����� ���������� ����� ��� (� ����� ��������)</td></tr>
         <tr><td><code>7 (0x80)</code></td><td>������������ ������� "�����" ������</td></tr>
@@ -1439,11 +1439,22 @@
                                        <table class="cont2 params lite tiny">
                                        <col class="widevalue">
                                        <tr><th>���</th><th>��������</th></tr>
-                                       <tr><td>����� == 0</td><td>��� �� ��� �� <code>Esc</code>, <code>F10</code> ��� ��� ����� ��� ���</td></tr>
+                                       <tr><td>����� ������</td><td>��� �� ��� �� <code>Esc</code>, <code>F10</code> ��� ��� ����� ��� ���</td></tr>
+                                       <tr><td>����� == 0 (���� ���������� ��� 3)</td><td>��� �� ��� �� <code>Esc</code>, <code>F10</code> ��� ��� ����� ��� ���</td></tr>
                                        <tr><td>����� > 0</td><td>������ ��������� ������</td></tr>
                                        <tr><td>����� < 0</td><td>���� ���������� ��� 10, �� ������ ��������� ������ �� ������ �����</td></tr>
                                        <tr><td>������</td><td>������� ����� ���.<br>���� ���������� ��� 4, �� ������ ������� ������� ���, �������� \n.<br>���� ���������� � ��� 3 � ��� 4, �� ������ �������� ������� ������� ���, �������� \n</td></tr>
                                        </table>
+      <p>� ��� ������� ������� ������� �����: (������� �������� ����� ��� ������������� ���� 4)</p>
+                                       <table class="cont2 params lite tiny">
+                                       <col class="widevalue">
+                                       <tr><th>��������</th><th>��������</th></tr>
+                                       <tr><td><code>Ins</code></td><td>������� ������</td></tr>
+                                       <tr><td><code>Ctrl-Add</code></td><td>������� ��� ����� �������</td></tr>
+                                       <tr><td><code>Ctrl-Subtract</code></td><td>����� ������� �� ��� ����� �������</td></tr>
+                                       <tr><td><code>Ctrl-Multiply</code></td><td>������� ������� � ��� ����� �������</td></tr>
+                                       <tr><td><code>Ctrl-A</code></td><td>�������� ��� �� �����</td></tr>
+                                       </table>
              ������ ����������� - ������� �� ������������ ��������� ���������:
              <pre class="codesample"><code>%I = 1;
 %S = "";
menu.show.enc2.diff (3,613 bytes)   

DAtaMan

2011-07-11 22:45

reporter   bugnote:0007268

+ в Menu.Show добавлены дополнительные сочетания клавиш:
  Ctrl-Multiply - инверсия пометки
  Ctrl-A - подогнать меню по высоте
- при нажатии Esc возвращалось "0". Теперь - пустая строка (или 0, если результат, как индекс)

+ Соответствующие правки в Писании

vskirdin

2011-07-24 07:20

administrator   bugnote:0007301

build 2115

Maximus

2011-08-03 16:10

reporter   bugnote:0007392

Если пока висит menu.show под ним обновляется панель (или обе) то половина (или все) меню пропадает.

vskirdin

2011-08-03 23:36

administrator   bugnote:0007399

боюсь, это не сюда...
без макросов так же? если да, то в отдельный Инц.

Maximus

2011-08-03 23:42

reporter   bugnote:0007400

Дык... без макросов такое меню не покажешь :)
По крайней мере, те меню, которые я сходу нашел, такими безобразиями не страдают.
Хотя, можно и отдельный инц завести...

Issue History

Date Modified Username Field Change
2011-04-12 18:01 DAtaMan New Issue
2011-04-12 18:01 DAtaMan File Added: menushow.diff.7z
2011-04-12 18:02 DAtaMan Note Added: 0006758
2011-04-12 19:07 vskirdin Note Added: 0006759
2011-04-12 19:28 DAtaMan Note Added: 0006760
2011-04-12 19:31 DrKnS Note Added: 0006761
2011-04-12 19:48 DAtaMan Note Added: 0006762
2011-04-12 20:26 vskirdin Note Added: 0006763
2011-04-12 20:42 DAtaMan Note Added: 0006764
2011-04-13 07:33 vskirdin Note Added: 0006768
2011-04-13 10:16 JohnDoe Note Added: 0006774
2011-04-13 10:18 JohnDoe Note Edited: 0006774
2011-04-13 20:13 DAtaMan Note Added: 0006789
2011-04-14 09:51 JohnDoe Note Added: 0006790
2011-04-15 22:03 DAtaMan File Added: MenuShowV2.diff.7z
2011-04-15 22:03 DAtaMan File Added: SeparatorNotFiltered.diff
2011-04-15 22:04 DAtaMan Note Added: 0006794
2011-04-15 22:04 DAtaMan Note Added: 0006795
2011-04-16 08:31 vskirdin Note Added: 0006796
2011-04-16 09:14 JohnDoe Note Added: 0006797
2011-04-16 09:46 vskirdin Note Added: 0006798
2011-04-16 11:55 JohnDoe Note Added: 0006799
2011-04-16 23:51 DAtaMan File Added: MenuShowV3.diff.7z
2011-04-16 23:54 DAtaMan Note Added: 0006800
2011-04-18 08:51 JohnDoe Note Added: 0006803
2011-04-18 12:00 DAtaMan File Added: MenuShowV4.diff.7z
2011-04-18 12:17 DAtaMan Note Added: 0006804
2011-04-18 13:00 vskirdin Note Added: 0006805
2011-04-18 14:09 DAtaMan Note Added: 0006806
2011-04-18 14:38 vskirdin Note Added: 0006807
2011-04-18 15:07 DAtaMan Note Added: 0006808
2011-04-21 14:02 DAtaMan File Added: MenuShowV5.diff.7z
2011-04-21 14:03 DAtaMan Note Added: 0006817
2011-04-21 14:04 DAtaMan Note Added: 0006818
2011-04-21 17:47 JohnDoe Note Added: 0006819
2011-04-21 18:07 vskirdin Note Added: 0006820
2011-04-21 21:13 DAtaMan Note Added: 0006822
2011-04-22 09:43 vskirdin Note Added: 0006823
2011-04-22 09:43 vskirdin Assigned To => vskirdin
2011-04-22 09:43 vskirdin Status new => feedback
2011-04-22 10:13 JohnDoe Note Added: 0006824
2011-04-22 10:16 JohnDoe Note Edited: 0006824
2011-04-22 12:07 DAtaMan Note Added: 0006825
2011-04-22 12:07 DAtaMan Status feedback => assigned
2011-04-22 12:08 DAtaMan File Added: MenuShowV6.diff.7z
2011-04-22 12:09 DAtaMan Note Added: 0006826
2011-04-22 12:53 JohnDoe Note Added: 0006827
2011-04-22 14:41 DAtaMan Note Added: 0006828
2011-04-22 15:44 JohnDoe Note Added: 0006829
2011-04-22 16:41 DAtaMan File Added: panels.html.diff
2011-04-22 16:42 DAtaMan File Added: MenuShowV7.diff.7z
2011-04-22 16:50 DAtaMan Note Added: 0006830
2011-04-22 17:14 JohnDoe Note Added: 0006831
2011-04-23 07:17 DAtaMan Note Added: 0006832
2011-04-23 07:21 DAtaMan Note Edited: 0006832
2011-04-23 07:22 DAtaMan Note Edited: 0006832
2011-04-23 18:35 vskirdin Note Added: 0006833
2011-04-23 22:19 DAtaMan Note Added: 0006834
2011-04-24 08:38 vskirdin Note Added: 0006835
2011-04-24 08:39 vskirdin Note Edited: 0006835
2011-04-24 08:57 DAtaMan Note Added: 0006836
2011-04-24 09:14 DAtaMan Note Edited: 0006836
2011-04-25 14:08 DAtaMan Note Added: 0006840
2011-04-25 14:44 DrKnS Note Added: 0006841
2011-04-25 14:47 DAtaMan Note Added: 0006842
2011-04-25 15:49 DrKnS Note Added: 0006843
2011-04-25 20:22 DAtaMan File Added: macromenus_draft.7z
2011-04-25 20:24 DAtaMan Note Added: 0006844
2011-04-26 11:21 JohnDoe Note Added: 0006845
2011-04-26 11:23 JohnDoe Note Edited: 0006845
2011-04-26 13:17 vskirdin Note Added: 0006846
2011-04-26 14:32 JohnDoe Note Added: 0006847
2011-04-26 14:33 JohnDoe Note Edited: 0006847
2011-04-26 23:05 DAtaMan Note Added: 0006848
2011-04-27 06:52 vskirdin Note Added: 0006849
2011-04-27 07:01 vskirdin Note Added: 0006850
2011-04-27 07:06 vskirdin Note Edited: 0006850
2011-04-27 07:07 vskirdin Note Edited: 0006850
2011-04-27 07:08 vskirdin Note Added: 0006851
2011-04-27 07:14 vskirdin Note Added: 0006852
2011-04-27 07:14 vskirdin Status assigned => feedback
2011-04-27 09:01 DAtaMan Note Added: 0006853
2011-04-27 09:01 DAtaMan Status feedback => assigned
2011-05-19 15:04 vskirdin Note Added: 0006937
2011-05-19 16:16 JohnDoe Note Added: 0006944
2011-05-19 17:33 vskirdin Note Added: 0006946
2011-05-19 18:01 vskirdin Note Added: 0006949
2011-05-23 13:39 vskirdin Note Added: 0007010
2011-05-23 13:39 vskirdin Status assigned => feedback
2011-05-25 13:24 JohnDoe Note Added: 0007035
2011-05-25 13:26 JohnDoe Note Added: 0007036
2011-05-25 13:38 vskirdin Note Added: 0007037
2011-05-25 13:59 JohnDoe Note Added: 0007039
2011-05-25 14:07 JohnDoe Note Added: 0007040
2011-05-29 02:47 DAtaMan Note Added: 0007103
2011-05-29 02:47 DAtaMan Status feedback => assigned
2011-06-30 10:15 DAtaMan File Added: enc_menu_show.diff.7z
2011-06-30 10:15 DAtaMan File Added: MenuShowV8.diff.7z
2011-06-30 10:16 DAtaMan Note Added: 0007226
2011-06-30 10:58 vskirdin Note Added: 0007227
2011-06-30 10:58 vskirdin Status assigned => feedback
2011-07-11 22:42 DAtaMan File Added: menu.show.smallfix.diff
2011-07-11 22:42 DAtaMan File Added: menu.show.enc2.diff
2011-07-11 22:45 DAtaMan Note Added: 0007268
2011-07-11 22:45 DAtaMan Status feedback => assigned
2011-07-24 07:20 vskirdin Note Added: 0007301
2011-07-24 07:20 vskirdin Status assigned => feedback
2011-08-03 16:10 Maximus Note Added: 0007392
2011-08-03 23:36 vskirdin Note Added: 0007399
2011-08-03 23:42 Maximus Note Added: 0007400
2011-08-18 13:04 vskirdin Relationship added has duplicate 0001519
2011-08-18 13:04 vskirdin Relationship added has duplicate 0000346
2012-11-06 11:10 vskirdin Build => 0
2012-11-06 11:10 vskirdin Status feedback => closed
2012-11-06 11:10 vskirdin Assigned To vskirdin =>
2012-11-06 11:10 vskirdin Resolution open => fixed
2013-02-03 00:33 alexy Severity minor => feature