Split Dropdown in 2 columns if too many items
useful for file format dropdown in 320x200
This commit is contained in:
parent
7db03f7aab
commit
f9dc0358c4
54
src/engine.c
54
src/engine.c
@ -2425,6 +2425,8 @@ void Open_popup(word x_pos, word y_pos, word width,word height)
|
|||||||
height = Screen_height/Menu_factor_Y;
|
height = Screen_height/Menu_factor_Y;
|
||||||
if (y_pos + height*Menu_factor_Y > Screen_height) // fix dropdown that would get bellow the screen
|
if (y_pos + height*Menu_factor_Y > Screen_height) // fix dropdown that would get bellow the screen
|
||||||
y_pos = Screen_height - height*Menu_factor_Y;
|
y_pos = Screen_height - height*Menu_factor_Y;
|
||||||
|
if (y_pos + width*Menu_factor_X > Screen_width)
|
||||||
|
x_pos = Screen_width - width*Menu_factor_X;
|
||||||
|
|
||||||
Window_width=width;
|
Window_width=width;
|
||||||
Window_height=height;
|
Window_height=height;
|
||||||
@ -2870,7 +2872,9 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
short choice_index;
|
short choice_index;
|
||||||
short selected_index;
|
short selected_index;
|
||||||
short old_selected_index;
|
short old_selected_index;
|
||||||
short box_height;
|
short box_width, box_height;
|
||||||
|
short x, y;
|
||||||
|
short item_width;
|
||||||
T_Dropdown_choice *item;
|
T_Dropdown_choice *item;
|
||||||
|
|
||||||
// Taille de l'ombre portée (en plus des dimensions normales)
|
// Taille de l'ombre portée (en plus des dimensions normales)
|
||||||
@ -2885,12 +2889,19 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
nb_choices++;
|
nb_choices++;
|
||||||
}
|
}
|
||||||
box_height = 3+nb_choices*8+1;
|
box_height = 3+nb_choices*8+1;
|
||||||
|
box_width = item_width = button->Dropdown_width;
|
||||||
|
if ((box_height+SHADOW_BOTTOM)*Menu_factor_Y >= Screen_height)
|
||||||
|
{
|
||||||
|
// Overflow : split to 2 columns
|
||||||
|
box_width = 2*item_width - 5;
|
||||||
|
box_height = 3+((nb_choices+1)/2)*8+1;
|
||||||
|
}
|
||||||
|
|
||||||
// Open a new stacked "window" to serve as drawing area.
|
// Open a new stacked "window" to serve as drawing area.
|
||||||
Open_popup(
|
Open_popup(
|
||||||
off_x+(button->Pos_X)*Menu_factor_X,
|
off_x+(button->Pos_X)*Menu_factor_X,
|
||||||
off_y+(button->Pos_Y+(button->Bottom_up?-box_height:button->Height))*Menu_factor_Y,
|
off_y+(button->Pos_Y+(button->Bottom_up?-box_height:button->Height))*Menu_factor_Y,
|
||||||
button->Dropdown_width+SHADOW_RIGHT,
|
box_width+SHADOW_RIGHT,
|
||||||
box_height+SHADOW_BOTTOM);
|
box_height+SHADOW_BOTTOM);
|
||||||
|
|
||||||
// Dessin de la boite
|
// Dessin de la boite
|
||||||
@ -2898,13 +2909,13 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
// Bord gauche
|
// Bord gauche
|
||||||
Window_rectangle(0,0,1,box_height,MC_Black);
|
Window_rectangle(0,0,1,box_height,MC_Black);
|
||||||
// Frame fonce et blanc
|
// Frame fonce et blanc
|
||||||
Window_display_frame_out(1,0,button->Dropdown_width-1,box_height);
|
Window_display_frame_out(1,0,box_width-1,box_height);
|
||||||
// Ombre portée
|
// Ombre portée
|
||||||
if (SHADOW_BOTTOM)
|
if (SHADOW_BOTTOM)
|
||||||
{
|
{
|
||||||
Window_rectangle(SHADOW_RIGHT,
|
Window_rectangle(SHADOW_RIGHT,
|
||||||
box_height,
|
box_height,
|
||||||
button->Dropdown_width,
|
box_width,
|
||||||
SHADOW_BOTTOM,
|
SHADOW_BOTTOM,
|
||||||
MC_Black);
|
MC_Black);
|
||||||
Window_rectangle(0,
|
Window_rectangle(0,
|
||||||
@ -2915,12 +2926,12 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
}
|
}
|
||||||
if (SHADOW_RIGHT)
|
if (SHADOW_RIGHT)
|
||||||
{
|
{
|
||||||
Window_rectangle(button->Dropdown_width,
|
Window_rectangle(box_width,
|
||||||
SHADOW_BOTTOM,
|
SHADOW_BOTTOM,
|
||||||
SHADOW_RIGHT,
|
SHADOW_RIGHT,
|
||||||
box_height-SHADOW_BOTTOM,
|
box_height-SHADOW_BOTTOM,
|
||||||
MC_Black);
|
MC_Black);
|
||||||
Window_rectangle(button->Dropdown_width,
|
Window_rectangle(box_width,
|
||||||
1,
|
1,
|
||||||
1,
|
1,
|
||||||
SHADOW_BOTTOM,
|
SHADOW_BOTTOM,
|
||||||
@ -2932,7 +2943,9 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
{
|
{
|
||||||
old_selected_index = selected_index;
|
old_selected_index = selected_index;
|
||||||
// Fenêtre grise
|
// Fenêtre grise
|
||||||
Window_rectangle(2,1,button->Dropdown_width-3,box_height-2,MC_Light);
|
Window_rectangle(2,1,box_width-3,box_height-2,MC_Light);
|
||||||
|
x = 3;
|
||||||
|
y = 2;
|
||||||
// Affichage des items
|
// Affichage des items
|
||||||
for(item=button->First_item,choice_index=0; item!=NULL; item=item->Next,choice_index++)
|
for(item=button->First_item,choice_index=0; item!=NULL; item=item->Next,choice_index++)
|
||||||
{
|
{
|
||||||
@ -2942,15 +2955,21 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
{
|
{
|
||||||
color_1=MC_White;
|
color_1=MC_White;
|
||||||
color_2=MC_Dark;
|
color_2=MC_Dark;
|
||||||
Window_rectangle(3,2+choice_index*8,
|
Window_rectangle(x, y,
|
||||||
(button->Dropdown_width-5),8,MC_Dark);
|
item_width-5,8,MC_Dark);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
color_1=MC_Black;
|
color_1=MC_Black;
|
||||||
color_2=MC_Light;
|
color_2=MC_Light;
|
||||||
}
|
}
|
||||||
Print_in_window(3,2+choice_index*8,item->Label,color_1,color_2);
|
Print_in_window(x, y, item->Label,color_1,color_2);
|
||||||
|
y += 8;
|
||||||
|
if ((y+7) >= box_height)
|
||||||
|
{
|
||||||
|
y = 2;
|
||||||
|
x += item_width - 5;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Update_window_area(0,0,Window_width,Window_height);
|
Update_window_area(0,0,Window_width,Window_height);
|
||||||
Display_cursor();
|
Display_cursor();
|
||||||
@ -2960,8 +2979,19 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
|||||||
// Attente
|
// Attente
|
||||||
Get_input(20);
|
Get_input(20);
|
||||||
// Mise à jour du survol
|
// Mise à jour du survol
|
||||||
selected_index=Window_click_in_rectangle(2,2,button->Dropdown_width-2,box_height-1)?
|
if (Window_click_in_rectangle(2,2,box_width-2,box_height-3))
|
||||||
(((Mouse_Y-Window_pos_Y)/Menu_factor_Y-2)>>3) : -1;
|
{
|
||||||
|
selected_index = ((Mouse_Y-Window_pos_Y)/Menu_factor_Y-2) >> 3;
|
||||||
|
if (((Mouse_X-Window_pos_X)/Menu_factor_X-2) > item_width)
|
||||||
|
selected_index += (nb_choices + 1) / 2;
|
||||||
|
if (selected_index != old_selected_index)
|
||||||
|
GFX2_Log(GFX2_DEBUG, "x=%d y=%d index=%d\n",
|
||||||
|
((Mouse_X-Window_pos_X)/Menu_factor_X-2),
|
||||||
|
((Mouse_Y-Window_pos_Y)/Menu_factor_Y-2),
|
||||||
|
selected_index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
selected_index = -1;
|
||||||
|
|
||||||
} while (Mouse_K && selected_index==old_selected_index);
|
} while (Mouse_K && selected_index==old_selected_index);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user