GUI: Made slider controls movable even if you bring mouse cursor far from them. Makes it much easier to maximize or minimize a value.

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@920 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2009-07-14 20:43:51 +00:00
parent 3a5b460184
commit c596b80b8d

370
engine.c
View File

@ -2334,60 +2334,7 @@ short Window_normal_button_onclick(word x_pos, word y_pos, word width, word heig
} }
} }
// Returns true if the mouse cursor sits inside the boundary of control. // --- Returns the number of the clicked button (-1:out of the window, 0:none) ---
short Window_click_in_control(short control)
{
T_Normal_button * temp1;
T_Palette_button * temp2;
T_Scroller_button * temp3;
T_Special_button * temp4;
T_Dropdown_button * temp5;
for (temp1=Window_normal_button_list; temp1; temp1=temp1->Next)
{
if (temp1->Number == control)
return Window_click_in_rectangle(temp1->Pos_X,temp1->Pos_Y,temp1->Pos_X+temp1->Width-1,temp1->Pos_Y+temp1->Height-1);
}
for (temp2=Window_palette_button_list; temp2; temp2=temp2->Next)
{
if (temp2->Number == control)
return Window_click_in_rectangle(temp2->Pos_X+5,temp2->Pos_Y+3,temp2->Pos_X+160,temp2->Pos_Y+82);
}
for (temp3=Window_scroller_button_list; temp3; temp3=temp3->Next)
{
if (temp3->Number == (control & 1023))
{
// top scroller arrow
if (control & 1024)
return Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y,temp3->Pos_X+10,temp3->Pos_Y+10);
// bottom scroller arrow
if (control & 2048)
return Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-1);
// middle slider
return Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+12,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-13);
}
}
// Test du click sur une zone spéciale
for (temp4=Window_special_button_list; temp4; temp4=temp4->Next)
{
if (temp4->Number == control)
return Window_click_in_rectangle(temp4->Pos_X,temp4->Pos_Y,temp4->Pos_X+temp4->Width-1,temp4->Pos_Y+temp4->Height-1);
}
// Test du click sur une dropdown
for (temp5=Window_dropdown_button_list; temp5; temp5=temp5->Next)
{
if (temp5->Number == control)
return Window_click_in_rectangle(temp5->Pos_X,temp5->Pos_Y,temp5->Pos_X+temp5->Width-1,temp5->Pos_Y+temp5->Height-1);
}
return 0;
}
// --- Renvoie le numéro du bouton clicke (-1:hors de la fenêtre, 0:aucun) ---
short Window_get_clicked_button(void) short Window_get_clicked_button(void)
{ {
T_Normal_button * temp1; T_Normal_button * temp1;
@ -2400,10 +2347,11 @@ short Window_get_clicked_button(void)
Window_attribute1=Mouse_K; Window_attribute1=Mouse_K;
// Test du click sur les boutons normaux // Test click on normal buttons
for (temp1=Window_normal_button_list; temp1; temp1=temp1->Next) for (temp1=Window_normal_button_list; temp1; temp1=temp1->Next)
{ {
if (Window_click_in_rectangle(temp1->Pos_X,temp1->Pos_Y,temp1->Pos_X+temp1->Width-1,temp1->Pos_Y+temp1->Height-1)) if ((Input_sticky_control == 0 || Input_sticky_control == temp1->Number)
&& Window_click_in_rectangle(temp1->Pos_X,temp1->Pos_Y,temp1->Pos_X+temp1->Width-1,temp1->Pos_Y+temp1->Height-1))
{ {
Input_sticky_control = temp1->Number; Input_sticky_control = temp1->Number;
if (temp1->Repeatable) if (temp1->Repeatable)
@ -2421,141 +2369,143 @@ short Window_get_clicked_button(void)
} }
} }
// Test du click sur les zones "palette" // Test click on "Palette" buttons
for (temp2=Window_palette_button_list; temp2; temp2=temp2->Next) for (temp2=Window_palette_button_list; temp2; temp2=temp2->Next)
{ {
if (Window_click_in_rectangle(temp2->Pos_X+5,temp2->Pos_Y+3,temp2->Pos_X+160,temp2->Pos_Y+82)) if ((Input_sticky_control == 0 || Input_sticky_control == temp2->Number)
&& Window_click_in_rectangle(temp2->Pos_X+5,temp2->Pos_Y+3,temp2->Pos_X+160,temp2->Pos_Y+82))
{ {
Input_sticky_control = temp2->Number; Input_sticky_control = temp2->Number;
// On stocke dans Attribut2 le numero de couleur cliqué // We store the clicked color in Attribute2
Window_attribute2 = (((Mouse_X-Window_pos_X)/Menu_factor_X)-(temp2->Pos_X+2)) / 10 * 16 + Window_attribute2 = (((Mouse_X-Window_pos_X)/Menu_factor_X)-(temp2->Pos_X+2)) / 10 * 16 +
(((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-(temp2->Pos_Y+3)) / 5; (((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-(temp2->Pos_Y+3)) / 5;
return temp2->Number; return temp2->Number;
} }
} }
// Test du click sur les barres de défilement // Test click oin slider/scroller bars
for (temp3=Window_scroller_button_list; temp3; temp3=temp3->Next) for (temp3=Window_scroller_button_list; temp3; temp3=temp3->Next)
{ {
if (Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-1)) // Button Up arrow
if ((Input_sticky_control == 0 || Input_sticky_control == (temp3->Number|1024))
&& Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y,temp3->Pos_X+10,temp3->Pos_Y+10))
{ {
// Button flèche Haut Input_sticky_control = temp3->Number | 1024;
if (Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y,temp3->Pos_X+10,temp3->Pos_Y+10)) Hide_cursor();
{ Window_select_normal_button(temp3->Pos_X,temp3->Pos_Y,11,11);
Input_sticky_control = temp3->Number | 1024;
Hide_cursor();
Window_select_normal_button(temp3->Pos_X,temp3->Pos_Y,11,11);
if (temp3->Position) if (temp3->Position)
{
temp3->Position--;
Window_attribute1=1;
Window_attribute2=temp3->Position;
Window_draw_slider(temp3);
}
else
Window_attribute1=0;
Display_cursor();
Slider_timer((Mouse_K==1)? Config.Delay_left_click_on_slider : Config.Delay_right_click_on_slider);
Hide_cursor();
Window_unselect_normal_button(temp3->Pos_X,temp3->Pos_Y,11,11);
Display_cursor();
return (Window_attribute1)? temp3->Number : 0;
}
// Button Down arrow
if ((Input_sticky_control == 0 || Input_sticky_control == (temp3->Number|2048))
&& Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-1))
{
Input_sticky_control = temp3->Number | 2048;
Hide_cursor();
Window_select_normal_button(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,11,11);
if (temp3->Position+temp3->Nb_visibles<temp3->Nb_elements)
{
temp3->Position++;
Window_attribute1=2;
Window_attribute2=temp3->Position;
Window_draw_slider(temp3);
}
else
Window_attribute1=0;
Display_cursor();
Slider_timer((Mouse_K==1)? Config.Delay_left_click_on_slider : Config.Delay_right_click_on_slider);
Hide_cursor();
Window_unselect_normal_button(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,11,11);
Display_cursor();
return (Window_attribute1)? temp3->Number : 0;
}
// Middle slider
if ((Input_sticky_control == temp3->Number) || (Input_sticky_control==0 &&
Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+12,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-13)))
{
Input_sticky_control = temp3->Number;
if (temp3->Nb_elements>temp3->Nb_visibles)
{
// If there is enough room to make the cursor move:
max_slider_height=(temp3->Height-24);
// Window_attribute2 receives the position of the cursor.
Window_attribute2 =(Mouse_Y-Window_pos_Y) / Menu_factor_Y;
Window_attribute2-=(temp3->Pos_Y+12+((temp3->Cursor_height-1)>>1));
Window_attribute2*=(temp3->Nb_elements-temp3->Nb_visibles);
if (Window_attribute2<0)
Window_attribute2=0;
else
{ {
temp3->Position--; Window_attribute2 =Round_div(Window_attribute2,max_slider_height-temp3->Cursor_height);
Window_attribute1=1; if (Window_attribute2+temp3->Nb_visibles>temp3->Nb_elements)
Window_attribute2=temp3->Position; Window_attribute2=temp3->Nb_elements-temp3->Nb_visibles;
}
// If the cursor moved
if (temp3->Position!=Window_attribute2)
{
temp3->Position=Window_attribute2;
Window_attribute1=3;
Hide_cursor();
Window_draw_slider(temp3); Window_draw_slider(temp3);
Display_cursor();
} }
else else
Window_attribute1=0; // If the cursor moved
Display_cursor();
Slider_timer((Mouse_K==1)? Config.Delay_left_click_on_slider : Config.Delay_right_click_on_slider);
Hide_cursor();
Window_unselect_normal_button(temp3->Pos_X,temp3->Pos_Y,11,11);
Display_cursor();
}
else
// Button flèche Bas
if (Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-1))
{
Input_sticky_control = temp3->Number | 2048;
Hide_cursor();
Window_select_normal_button(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,11,11);
if (temp3->Position+temp3->Nb_visibles<temp3->Nb_elements)
{
temp3->Position++;
Window_attribute1=2;
Window_attribute2=temp3->Position;
Window_draw_slider(temp3);
}
else
Window_attribute1=0;
Display_cursor();
Slider_timer((Mouse_K==1)? Config.Delay_left_click_on_slider : Config.Delay_right_click_on_slider);
Hide_cursor();
Window_unselect_normal_button(temp3->Pos_X,temp3->Pos_Y+temp3->Height-11,11,11);
Display_cursor();
}
else
// Jauge
if (Window_click_in_rectangle(temp3->Pos_X,temp3->Pos_Y+12,temp3->Pos_X+10,temp3->Pos_Y+temp3->Height-13))
{
Input_sticky_control = temp3->Number;
if (temp3->Nb_elements>temp3->Nb_visibles)
{
// S'il y a la place de faire scroller le curseur:
max_slider_height=(temp3->Height-24);
// Window_attribute2 reçoit la position dans la jauge correspondant au click
Window_attribute2 =(Mouse_Y-Window_pos_Y) / Menu_factor_Y;
Window_attribute2-=(temp3->Pos_Y+12+((temp3->Cursor_height-1)>>1));
Window_attribute2*=(temp3->Nb_elements-temp3->Nb_visibles);
if (Window_attribute2<0)
Window_attribute2=0;
else
{
Window_attribute2 =Round_div(Window_attribute2,max_slider_height-temp3->Cursor_height);
if (Window_attribute2+temp3->Nb_visibles>temp3->Nb_elements)
Window_attribute2=temp3->Nb_elements-temp3->Nb_visibles;
}
// Si le curseur de la jauge bouge:
if (temp3->Position!=Window_attribute2)
{
temp3->Position=Window_attribute2;
Window_attribute1=3;
Hide_cursor();
Window_draw_slider(temp3);
Display_cursor();
}
else
// Si le curseur de la jauge ne bouge pas:
Window_attribute1=0;
}
else
// S'il n'y a pas la place de bouger le curseur de la jauge:
Window_attribute1=0; Window_attribute1=0;
} }
else else
// Le click se situe dans la zone de la jauge mais n'est sur aucune // If there's not enough room to make the cursor move:
// des 3 parties importantes de la jauge
Window_attribute1=0; Window_attribute1=0;
return (Window_attribute1)? temp3->Number : 0; return (Window_attribute1)? temp3->Number : 0;
} }
} }
// Test du click sur une zone spéciale // Test click on a special button
for (temp4=Window_special_button_list; temp4; temp4=temp4->Next) for (temp4=Window_special_button_list; temp4; temp4=temp4->Next)
{ {
if (Window_click_in_rectangle(temp4->Pos_X,temp4->Pos_Y,temp4->Pos_X+temp4->Width-1,temp4->Pos_Y+temp4->Height-1)) if ((Input_sticky_control == 0 || Input_sticky_control == temp4->Number)
&& Window_click_in_rectangle(temp4->Pos_X,temp4->Pos_Y,temp4->Pos_X+temp4->Width-1,temp4->Pos_Y+temp4->Height-1))
{ {
Input_sticky_control = temp4->Number; Input_sticky_control = temp4->Number;
return temp4->Number; return temp4->Number;
} }
} }
// Test du click sur une dropdown // Test click on a dropdown box
for (temp5=Window_dropdown_button_list; temp5; temp5=temp5->Next) for (temp5=Window_dropdown_button_list; temp5; temp5=temp5->Next)
{ {
if (Window_click_in_rectangle(temp5->Pos_X,temp5->Pos_Y,temp5->Pos_X+temp5->Width-1,temp5->Pos_Y+temp5->Height-1)) if ((Input_sticky_control == 0 || Input_sticky_control == temp5->Number)
&& Window_click_in_rectangle(temp5->Pos_X,temp5->Pos_Y,temp5->Pos_X+temp5->Width-1,temp5->Pos_Y+temp5->Height-1))
{ {
Input_sticky_control = temp5->Number; Input_sticky_control = temp5->Number;
if (Mouse_K & temp5->Active_button) if (Mouse_K & temp5->Active_button)
@ -2661,77 +2611,69 @@ short Window_clicked_button(void)
} }
} }
if (Input_sticky_control != 0 && !Window_click_in_control(Input_sticky_control)) if (!Input_sticky_control && Mouse_Y < Window_pos_Y+(12*Menu_factor_Y))
{ {
// do nothing Move_window(Mouse_X-Window_pos_X,Mouse_Y-Window_pos_Y);
} }
else else
{ {
short clicked_button;
T_List_button * list;
if (Mouse_Y < Window_pos_Y+(12*Menu_factor_Y)) // Check which controls was clicked (by rectangular area)
clicked_button = Window_get_clicked_button();
// Check if it's part of a list control
for (list=Window_list_button_list; list!=NULL; list=list->Next)
{ {
Move_window(Mouse_X-Window_pos_X,Mouse_Y-Window_pos_Y); if (list->Entry_button->Number == clicked_button)
}
else
{
short clicked_button;
T_List_button * list;
// Check which controls was clicked (by rectangular area)
clicked_button = Window_get_clicked_button();
// Check if it's part of a list control
for (list=Window_list_button_list; list!=NULL; list=list->Next)
{ {
if (list->Entry_button->Number == clicked_button) // Click in the textual part of a list.
{ short clicked_line;
// Click in the textual part of a list. clicked_line = (((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-list->Entry_button->Pos_Y)>>3;
short clicked_line; if (clicked_line == list->Cursor_position || // Same as before
clicked_line = (((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-list->Entry_button->Pos_Y)>>3; clicked_line >= list->Scroller->Nb_elements) // Below last line
if (clicked_line == list->Cursor_position || // Same as before return 0;
clicked_line >= list->Scroller->Nb_elements) // Below last line
return 0;
Hide_cursor(); Hide_cursor();
// Redraw one item as disabled // Redraw one item as disabled
if (list->Cursor_position>=0 && list->Cursor_position<list->Scroller->Nb_visibles) if (list->Cursor_position>=0 && list->Cursor_position<list->Scroller->Nb_visibles)
list->Draw_list_item( list->Draw_list_item(
list->Entry_button->Pos_X, list->Entry_button->Pos_X,
list->Entry_button->Pos_Y + list->Cursor_position * 8, list->Entry_button->Pos_Y + list->Cursor_position * 8,
list->List_start + list->Cursor_position, list->List_start + list->Cursor_position,
0); 0);
list->Cursor_position = clicked_line; list->Cursor_position = clicked_line;
// Redraw one item as enabled // Redraw one item as enabled
if (list->Cursor_position>=0 && list->Cursor_position<list->Scroller->Nb_visibles) if (list->Cursor_position>=0 && list->Cursor_position<list->Scroller->Nb_visibles)
list->Draw_list_item( list->Draw_list_item(
list->Entry_button->Pos_X, list->Entry_button->Pos_X,
list->Entry_button->Pos_Y + list->Cursor_position * 8, list->Entry_button->Pos_Y + list->Cursor_position * 8,
list->List_start + list->Cursor_position, list->List_start + list->Cursor_position,
1); 1);
Display_cursor(); Display_cursor();
// Store the selected value as attribute2 // Store the selected value as attribute2
Window_attribute2=list->List_start + list->Cursor_position; Window_attribute2=list->List_start + list->Cursor_position;
// Return the control ID of the list. // Return the control ID of the list.
return ((Input_sticky_control = list->Number)); return list->Number;
} }
else if (list->Scroller->Number == clicked_button) else if (list->Scroller->Number == clicked_button)
{ {
// Click in the scroller part of a list // Click in the scroller part of a list
if (list->List_start == list->Scroller->Position) if (list->List_start == list->Scroller->Position)
return 0; // Didn't actually move return 0; // Didn't actually move
// Update scroller indices // Update scroller indices
list->Cursor_position += list->List_start; list->Cursor_position += list->List_start;
list->List_start = list->Scroller->Position; list->List_start = list->Scroller->Position;
list->Cursor_position -= list->List_start; list->Cursor_position -= list->List_start;
// Need to redraw all // Need to redraw all
Hide_cursor(); Hide_cursor();
Window_redraw_list(list); Window_redraw_list(list);
Display_cursor(); Display_cursor();
}
} }
return clicked_button;
} }
return clicked_button;
} }
} }