From 3538abadb9d5f95134905d3423993bd0e72e98af Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Thu, 26 Nov 2009 00:32:45 +0000 Subject: [PATCH] Added support for hiding the main toolbar, keeping the status line and optionally layer bar. Made it the default behaviour of F10 / right-click 'hide', for testing and feedback. (IMO it's less unforgiving for new users, and we can provide alternative shortcut with old behaviour for veterans). git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1225 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- buttons.c | 71 +++++++++++++++++++++++++++++++++++++----------------- buttons.h | 11 +++++++-- engine.c | 72 ++++++++++++++++++++++--------------------------------- global.h | 8 +++---- init.c | 2 +- main.c | 1 - struct.h | 1 + windows.c | 69 +++++++++++++++++++++++++--------------------------- windows.h | 3 ++- 9 files changed, 127 insertions(+), 111 deletions(-) diff --git a/buttons.c b/buttons.c index b0017d73..5af0a375 100644 --- a/buttons.c +++ b/buttons.c @@ -333,23 +333,12 @@ void Button_Select_backcolor(void) } } - -//---------------------- Cacher ou réafficher le menu ------------------------ -void Pixel_in_hidden_toolbar(__attribute__((unused)) word x,__attribute__((unused)) word y,__attribute__((unused)) byte color) -{ - // C'est fait exprès que ce soit vide... - // C'est parce que y'a rien du tout à afficher vu que la barre d'outil est - // cachée... C'est simple non? -} - - void Button_Hide_menu(void) { Hide_cursor(); if (Menu_is_visible) { Menu_is_visible=0; - Pixel_in_menu=Pixel_in_hidden_toolbar; Menu_Y=Screen_height; if (Main_magnifier_mode) @@ -393,7 +382,6 @@ void Button_Hide_menu(void) { byte current_menu; Menu_is_visible=1; - Pixel_in_menu=Pixel_in_toolbar; Menu_Y=Screen_height; for (current_menu = 0; current_menu < MENUBAR_COUNT; current_menu++) if (Menu_bars[current_menu].Visible) @@ -412,15 +400,28 @@ void Button_Hide_menu(void) Display_cursor(); } -void Button_Show_layerbar(void) + +void Set_bar_visibility(word bar, byte visible) { - Hide_cursor(); - if (Menu_bars[MENUBAR_LAYERS].Visible) + int i; + int offset; + + if (!visible && Menu_bars[bar].Visible) { // Hide it - Menu_bars[MENUBAR_LAYERS].Visible=0; - Menu_Y += Menu_bars[MENUBAR_LAYERS].Height * Menu_factor_Y; - Menu_height -= Menu_bars[MENUBAR_LAYERS].Height; + Menu_bars[bar].Visible=0; + + // Recompute all offsets + offset=0; + for (i = MENUBAR_COUNT-1; i >=0; i--) + { + Menu_bars[i].Top = offset; + if(Menu_bars[i].Visible) + offset += Menu_bars[i].Height; + } + // Update global menu coordinates + Menu_Y += Menu_bars[bar].Height * Menu_factor_Y; + Menu_height -= Menu_bars[bar].Height; if (Main_magnifier_mode) { @@ -460,12 +461,21 @@ void Button_Show_layerbar(void) Display_menu(); Display_all_screen(); } - else + else if (visible && !Menu_bars[bar].Visible) { // Show it - Menu_bars[MENUBAR_LAYERS].Visible = 1; - Menu_Y -= Menu_bars[MENUBAR_LAYERS].Height * Menu_factor_Y; - Menu_height += Menu_bars[MENUBAR_LAYERS].Height; + Menu_bars[bar].Visible = 1; + // Recompute all offsets + offset=0; + for (i = MENUBAR_COUNT-1; i >=0; i--) + { + Menu_bars[i].Top = offset; + if(Menu_bars[i].Visible) + offset += Menu_bars[i].Height; + } + // Update global menu coordinates + Menu_Y -= Menu_bars[bar].Height * Menu_factor_Y; + Menu_height += Menu_bars[bar].Height; Compute_magnifier_data(); if (Main_magnifier_mode) @@ -476,10 +486,27 @@ void Button_Show_layerbar(void) if (Main_magnifier_mode) Display_all_screen(); } +} + +void Button_Toggle_layerbar(void) +{ + Hide_cursor(); + + Set_bar_visibility(MENUBAR_LAYERS, !Menu_bars[MENUBAR_LAYERS].Visible); + Unselect_button(BUTTON_HIDE); Display_cursor(); } +void Button_Toggle_toolbox(void) +{ + Hide_cursor(); + + Set_bar_visibility(MENUBAR_TOOLS, !Menu_bars[MENUBAR_TOOLS].Visible); + + Unselect_button(BUTTON_HIDE); + Display_cursor(); +} //--------------------------- Quitter le programme --------------------------- byte Button_Quit_local_function(void) diff --git a/buttons.h b/buttons.h index 6faa3027..d4dcbfbd 100644 --- a/buttons.h +++ b/buttons.h @@ -629,8 +629,15 @@ void Button_Quit(void); */ void Button_Hide_menu(void); -/// Shows or hide the layerbar -void Button_Show_layerbar(void); +/*! + Shows or hide the layerbar +*/ +void Button_Toggle_layerbar(void); + +/*! + Shows or hide the main toolbox +*/ +void Button_Toggle_toolbox(void); /*! diff --git a/engine.c b/engine.c index 5135a3d6..b7c9a543 100644 --- a/engine.c +++ b/engine.c @@ -155,7 +155,6 @@ int Button_under_mouse(void) short x_pos; short y_pos; byte current_menu; - word current_offset = Screen_height; byte first_button; x_pos = Mouse_X / Menu_factor_X; @@ -165,12 +164,15 @@ int Button_under_mouse(void) { if (Menu_bars[current_menu].Visible) { - current_offset -= Menu_bars[current_menu].Height * Menu_factor_Y; - if (Mouse_Y >= current_offset) + if (Mouse_Y >= Menu_Y+Menu_factor_Y*(Menu_bars[current_menu].Top) && + Mouse_Y < Menu_Y+Menu_factor_Y*(Menu_bars[current_menu].Top + Menu_bars[current_menu].Height)) break; } } - y_pos=(Mouse_Y - current_offset)/Menu_factor_Y; + if (current_menu==MENUBAR_COUNT) + return -1; + + y_pos=(Mouse_Y - Menu_Y)/Menu_factor_Y - Menu_bars[current_menu].Top; if (current_menu == 0) first_button = 0; else first_button = Menu_bars[current_menu - 1].Last_button_index + 1; @@ -207,8 +209,6 @@ int Button_under_mouse(void) return -1; } -#define Pixel_in_skinmenu(x,y,color) Menu_bars[current_menu].Skin[(y - y_off)*Menu_bars[current_menu].Skin_width + x] = color -#define Pixel_in_menu_and_skin(x,y,color) Pixel_in_skinmenu(x,y,color); if(visible) Pixel_in_menu(x,y,color) ///Draw the frame for a menu button void Draw_menu_button_frame(byte btn_number,byte pressed) @@ -223,34 +223,20 @@ void Draw_menu_button_frame(byte btn_number,byte pressed) word x_pos; word y_pos; byte current_menu; - byte visible = 0; - word y_off = 0; // Find in which menu the button is for (current_menu = 0; current_menu < MENUBAR_COUNT; current_menu++) { - if(Menu_bars[current_menu].Visible) + // We found the right bar ! + if (Menu_bars[current_menu].Last_button_index >= btn_number && + (current_menu==0 || Menu_bars[current_menu -1].Last_button_index < btn_number)) { - y_off += Menu_bars[current_menu].Height; - // We found the right bar ! - if (Menu_bars[current_menu].Last_button_index >= btn_number && (current_menu==0 || Menu_bars[current_menu -1].Last_button_index < btn_number)) - { - visible = 1; - break; - } else - // We missed the bar, it's hidden ! But we still need to draw in the skin... - if (Menu_bars[current_menu].Last_button_index > btn_number) - { - current_menu--; // We can't enter the if with current_menu=0, so that's ok. - break; - } + break; } } - y_off = Menu_height - y_off; - start_x=Buttons_Pool[btn_number].X_offset; - start_y=Buttons_Pool[btn_number].Y_offset + y_off; + start_y=Buttons_Pool[btn_number].Y_offset; end_x =start_x+Buttons_Pool[btn_number].Width; end_y =start_y+Buttons_Pool[btn_number].Height; @@ -273,66 +259,66 @@ void Draw_menu_button_frame(byte btn_number,byte pressed) break; case BUTTON_SHAPE_RECTANGLE : // On colorie le point haut droit - Pixel_in_menu_and_skin(end_x,start_y,color_diagonal); + Pixel_in_menu_and_skin(current_menu, end_x, start_y, color_diagonal); // On colorie le point bas gauche - Pixel_in_menu_and_skin(start_x,end_y,color_diagonal); + Pixel_in_menu_and_skin(current_menu, start_x, end_y, color_diagonal); // On colorie la partie haute for (x_pos=start_x;x_pos<=end_x-1;x_pos++) { - Pixel_in_menu_and_skin(x_pos,start_y,color_top_left); + Pixel_in_menu_and_skin(current_menu, x_pos, start_y, color_top_left); } for (y_pos=start_y+1;y_pos<=end_y-1;y_pos++) { // On colorie la partie gauche - Pixel_in_menu_and_skin(start_x,y_pos,color_top_left); + Pixel_in_menu_and_skin(current_menu, start_x, y_pos, color_top_left); // On colorie la partie droite - Pixel_in_menu_and_skin(end_x,y_pos,color_bottom_right); + Pixel_in_menu_and_skin(current_menu, end_x, y_pos, color_bottom_right); } // On colorie la partie basse for (x_pos=start_x+1;x_pos<=end_x;x_pos++) { - Pixel_in_menu_and_skin(x_pos,end_y,color_bottom_right); + Pixel_in_menu_and_skin(current_menu, x_pos, end_y, color_bottom_right); } break; case BUTTON_SHAPE_TRIANGLE_TOP_LEFT: // On colorie le point haut droit - Pixel_in_menu_and_skin(end_x,start_y,color_diagonal); + Pixel_in_menu_and_skin(current_menu, end_x, start_y, color_diagonal); // On colorie le point bas gauche - Pixel_in_menu_and_skin(start_x,end_y,color_diagonal); + Pixel_in_menu_and_skin(current_menu, start_x, end_y, color_diagonal); // On colorie le coin haut gauche for (x_pos=0;x_pos