Как отсортировать виджеты в FLTK, чтобы навигация по клавишам со стрелками работала?

В документации FLTK говорится:

Клавиши со стрелками, табуляции и Shift+Tab «перемещаются» по выбору. Влево, вправо, вкладка или Shift+Tab переход к следующему или предыдущему виджету в иерархии. Если кажется, что навигация не работает, вам, вероятно, нужно "Сортировать" виджеты. Это важно, если у вас есть поля ввода, поскольку FLTK использует те же правила при использовании клавиш со стрелками для перемещения между полями ввода.

Мой проект имеет следующие характеристики:

  1. Многие виджеты создаются и удаляются бессистемно, что затрудняет отслеживание порядка создания виджетов (на основе которого работает навигация по умолчанию)
  2. Виджеты бывают разного типа, вход, выход, кнопки и т.д.
  3. Я уже сделал Fl::option(Fl::OPTION_ARROW_FOCUS, 1), чтобы включить навигацию со стрелками, чтобы навигация со стрелками не приводила к тому, что фокус (курсор) оставался в текстовых полях.

Что они подразумевают под «сортировкой виджетов»? Как отсортировать виджеты, чтобы навигация работала интуитивно? Есть ли какой-то алгоритм для этого?

Спасибо.


person harishankarv    schedule 19.03.2014    source источник
comment
Под сортировкой они, вероятно, подразумевают (повторное) создание виджетов в определенном порядке внутри группы.   -  person DejanLekic    schedule 05.06.2014


Ответы (1)


Вы можете сделать сортировку следующим образом:

void User_Group :: SortWidgets()
{
    Fl_Widget   *pt[TOTAL_WIDGETS], *temp;
    int         i, j, TotalNoOfChild = children();

//----------INITIALIZE TO NULL THE CHILD ARRAY *pt[]----------
    for (i = 0; i < TOTAL_WIDGETS; i++)
    pt[i]= NULL;

//----------COPYING CHILDREN FROM THE GROUP INTO POINTER ARRAY *pt[]----------
    for (i = 0; i < TotalNoOfChild; i++)
    pt[i]= (child(i));

//----------REMOVING CHILDREN FROM CHILDREN FROM THE GROUP----------
    while (children() > 0)
    remove(0);

//----------SORTING CHILD ARRAY *pt[] ACCORDING TO CO-ORDINATES----------
    for (i = 0; i < TotalNoOfChild + 1; i++)
    {
    for (j = i + 1; j < TotalNoOfChild; j++)
    {
        if ((pt[i]->y()) > (pt[j]->y()))
        {
            temp=pt[i];
            pt[i]=pt[j];
            pt[j]=temp;
        }
    }
    }

for (i = 0; i < TotalNoOfChild + 1; i++)
{
    for (j = i + 1; j < TotalNoOfChild; j++)
    {
        if (((pt[i]->x())>(pt[j]->x())) && ((pt[i]->y()) >= (pt[j]->y())))
        {
            temp=pt[i];
            pt[i]=pt[j];
            pt[j]=temp;
        }
    }
}

/*
 //----------ALTERNATE SORTING----------
for (i = 0; i < TotalNoOfChild + 1; i++)
{
    for (j = i+1; j < TotalNoOfChild; j++)
    {
      if (((pt[i]->y())*1000+(pt[i]->x()))>((pt[j]->y())*1000+(pt[j]->x())))
      {
            temp=pt[i];
            pt[i]=pt[j];
            pt[j]=temp;
      }
    }
}
*/

//----------RE-ADDING CHILDREN INTO THE GROUP----------
for (i = 0; i < TotalNoOfChild; i++)
    add(pt[i]);

}

person Mani    schedule 04.06.2014