Working layer bar. Champagne!

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1193 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2009-11-15 19:24:04 +00:00
parent 353f5dbbd2
commit 883653480b
10 changed files with 234 additions and 332 deletions

View File

@ -431,12 +431,6 @@ enum SPECIAL_ACTIONS
SPECIAL_LAYER7_TOGGLE, SPECIAL_LAYER7_TOGGLE,
SPECIAL_LAYER8_SELECT, SPECIAL_LAYER8_SELECT,
SPECIAL_LAYER8_TOGGLE, SPECIAL_LAYER8_TOGGLE,
SPECIAL_LAYER_ADD,
SPECIAL_LAYER_DELETE,
SPECIAL_LAYER_MERGE,
SPECIAL_LAYER_SWAP_UP,
SPECIAL_LAYER_SWAP_DOWN,
SPECIAL_LAYER_MENU,
NB_SPECIAL_SHORTCUTS ///< Number of special shortcuts NB_SPECIAL_SHORTCUTS ///< Number of special shortcuts
}; };

114
engine.c
View File

@ -39,6 +39,7 @@
#include "input.h" #include "input.h"
#include "engine.h" #include "engine.h"
#include "pages.h" #include "pages.h"
#include "layers.h"
// we need this as global // we need this as global
@ -1066,119 +1067,6 @@ void Main_handler(void)
Layer_activate((key_index-SPECIAL_LAYER1_TOGGLE)/2, RIGHT_SIDE); Layer_activate((key_index-SPECIAL_LAYER1_TOGGLE)/2, RIGHT_SIDE);
action++; action++;
break; break;
case SPECIAL_LAYER_ADD:
// Backup with unchanged layers
Backup_layers(0);
if (!Add_layer(Main_backups,Main_current_layer+1))
{
Update_depth_buffer();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
action++;
break;
case SPECIAL_LAYER_DELETE:
// Backup with unchanged layers
Backup_layers(0);
if (!Delete_layer(Main_backups,Main_current_layer))
{
Update_screen_targets();
Redraw_layered_image();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
action++;
break;
case SPECIAL_LAYER_MERGE:
if (Main_current_layer>0)
{
// Backup layer below the current
Backup_layers(1<<(Main_current_layer-1));
Merge_layer();
Update_screen_targets();
Redraw_layered_image();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
action++;
break;
case SPECIAL_LAYER_SWAP_UP:
if (Main_current_layer < (Main_backups->Pages->Nb_layers-1))
{
byte * tmp;
dword layer_flags;
// Backup with unchanged layers
Backup_layers(0);
// swap
tmp = Main_backups->Pages->Image[Main_current_layer];
Main_backups->Pages->Image[Main_current_layer] = Main_backups->Pages->Image[Main_current_layer+1];
Main_backups->Pages->Image[Main_current_layer+1] = tmp;
// Swap visibility indicators
layer_flags = (Main_layers_visible >> Main_current_layer) & 3;
// Only needed if they are different.
if (layer_flags == 1 || layer_flags == 2)
{
// One is on, the other is off. Negating them will
// perform the swap.
Main_layers_visible ^= (3 << Main_current_layer);
}
Main_current_layer++;
Update_screen_targets();
Redraw_layered_image();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
action++;
break;
case SPECIAL_LAYER_SWAP_DOWN:
if (Main_current_layer > 0)
{
byte * tmp;
dword layer_flags;
// Backup with unchanged layers
Backup_layers(0);
// swap
tmp = Main_backups->Pages->Image[Main_current_layer];
Main_backups->Pages->Image[Main_current_layer] = Main_backups->Pages->Image[Main_current_layer-1];
Main_backups->Pages->Image[Main_current_layer-1] = tmp;
// Swap visibility indicators
layer_flags = (Main_layers_visible >> (Main_current_layer-1)) & 3;
// Only needed if they are different.
if (layer_flags == 1 || layer_flags == 2)
{
// Only needed if they are different.
// One is on, the other is off. Negating them will
// perform the swap.
Main_layers_visible ^= (3 << (Main_current_layer-1));
}
Main_current_layer--;
Update_screen_targets();
Redraw_layered_image();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
action++;
break;
} }
} }
} // End of special keys } // End of special keys

View File

@ -287,12 +287,13 @@ static const T_Help_table helptable_help[] =
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("LAYERS") HELP_TEXT ("LAYERS")
HELP_TEXT ("") HELP_TEXT ("")
HELP_LINK (" Menu : %s", SPECIAL_LAYER_MENU) HELP_LINK (" Menu : %s", 0x100+BUTTON_LAYER_MENU)
HELP_LINK (" Add new : %s", SPECIAL_LAYER_ADD) HELP_LINK (" Add new : %s", 0x100+BUTTON_LAYER_ADD)
HELP_LINK (" Delete : %s", SPECIAL_LAYER_DELETE) HELP_LINK (" Delete : %s", 0x100+BUTTON_LAYER_REMOVE)
HELP_LINK (" Merge : %s", SPECIAL_LAYER_MERGE) HELP_LINK (" Merge : %s", 0x100+BUTTON_LAYER_MERGE)
HELP_LINK (" Move up : %s", SPECIAL_LAYER_SWAP_UP) HELP_LINK (" Move up : %s", 0x100+BUTTON_LAYER_UP)
HELP_LINK (" Move down : %s", SPECIAL_LAYER_SWAP_DOWN) HELP_LINK (" Move down : %s", 0x100+BUTTON_LAYER_DOWN)
//HELP_LINK (" Set transp: %s", 0x100+BUTTON_LAYER_COLOR)
HELP_TEXT (" Select :") HELP_TEXT (" Select :")
HELP_LINK (" 1 : %s", SPECIAL_LAYER1_SELECT) HELP_LINK (" 1 : %s", SPECIAL_LAYER1_SELECT)
HELP_LINK (" 2 : %s", SPECIAL_LAYER2_SELECT) HELP_LINK (" 2 : %s", SPECIAL_LAYER2_SELECT)
@ -2487,6 +2488,8 @@ static const T_Help_table helptable_layermenu[] =
HELP_TITLE("LAYERS MENU") HELP_TITLE("LAYERS MENU")
HELP_TEXT ("") HELP_TEXT ("")
HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_MENU)
HELP_TEXT ("")
HELP_TEXT ("* Not implemented yet! *") HELP_TEXT ("* Not implemented yet! *")
}; };
@ -2495,7 +2498,8 @@ static const T_Help_table helptable_layertrans[] =
HELP_TITLE("LAYERS TRANSPARENCY") HELP_TITLE("LAYERS TRANSPARENCY")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("* Not implemented yet! *") HELP_TEXT ("The current Background color becomes the")
HELP_TEXT ("color considered transparent for the layers.")
}; };
static const T_Help_table helptable_layermerge[] = static const T_Help_table helptable_layermerge[] =
@ -2503,15 +2507,24 @@ static const T_Help_table helptable_layermerge[] =
HELP_TITLE("LAYERS MERGE") HELP_TITLE("LAYERS MERGE")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("Merge layer with the one below") HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_MERGE)
HELP_TEXT ("")
HELP_TEXT ("Merges the current layer with the one below")
HELP_TEXT ("it, and sets the resulting layer as current")
HELP_TEXT ("one for editing.")
HELP_TEXT ("This function has no effect if you're")
HELP_TEXT ("editing the lowest layer.")
}; };
static const T_Help_table helptable_layeradd[] = static const T_Help_table helptable_layeradd[] =
{ {
HELP_TITLE("ADD LAYER") HELP_TITLE("ADD LAYER")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("Add a new layer above the current one") HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_ADD)
HELP_TEXT ("")
HELP_TEXT ("Add a new layer above the current one,")
HELP_TEXT ("and selects this new (empty) layer for")
HELP_TEXT ("editing.")
}; };
static const T_Help_table helptable_layerdel[] = static const T_Help_table helptable_layerdel[] =
@ -2519,7 +2532,9 @@ static const T_Help_table helptable_layerdel[] =
HELP_TITLE("DROP LAYER") HELP_TITLE("DROP LAYER")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("Drop the current layer") HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_REMOVE)
HELP_TEXT ("")
HELP_TEXT ("Deletes the current layer.")
}; };
static const T_Help_table helptable_layerup[] = static const T_Help_table helptable_layerup[] =
@ -2527,7 +2542,11 @@ static const T_Help_table helptable_layerup[] =
HELP_TITLE("MOVE LAYER UP") HELP_TITLE("MOVE LAYER UP")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("Move current layer above the next one") HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_UP)
HELP_TEXT ("")
HELP_TEXT ("Swaps the current layer with the one")
HELP_TEXT ("above it. This has no effect if this")
HELP_TEXT ("layer is already on top.")
}; };
static const T_Help_table helptable_layerdown[] = static const T_Help_table helptable_layerdown[] =
@ -2535,8 +2554,11 @@ static const T_Help_table helptable_layerdown[] =
HELP_TITLE("MOVE LAYER DOWN") HELP_TITLE("MOVE LAYER DOWN")
HELP_TEXT ("") HELP_TEXT ("")
HELP_TEXT ("Move the current layer below the previous one") HELP_LINK ("(Key:%s)",0x100+BUTTON_LAYER_DOWN)
HELP_TEXT ("")
HELP_TEXT ("Swaps the current layer with the one")
HELP_TEXT ("below it. This has no effect if this")
HELP_TEXT ("layer is already on the bottom.")
}; };
static const T_Help_table helptable_layerselect[] = static const T_Help_table helptable_layerselect[] =
{ {

View File

@ -1656,10 +1656,10 @@ word Ordering[NB_SHORTCUTS]=
SPECIAL_LAYER7_TOGGLE, SPECIAL_LAYER7_TOGGLE,
SPECIAL_LAYER8_SELECT, SPECIAL_LAYER8_SELECT,
SPECIAL_LAYER8_TOGGLE, SPECIAL_LAYER8_TOGGLE,
SPECIAL_LAYER_ADD, 0x100+BUTTON_LAYER_ADD,
SPECIAL_LAYER_DELETE, 0x100+BUTTON_LAYER_REMOVE,
SPECIAL_LAYER_MERGE, 0x100+BUTTON_LAYER_MERGE,
SPECIAL_LAYER_SWAP_UP, 0x100+BUTTON_LAYER_UP,
SPECIAL_LAYER_SWAP_DOWN, 0x100+BUTTON_LAYER_DOWN,
SPECIAL_LAYER_MENU, 0x100+BUTTON_LAYER_MENU,
}; };

2
init.c
View File

@ -1313,7 +1313,7 @@ void Init_buttons(void)
142,0, 142,0,
13,9, // Will be updated according to actual number of layers 13,9, // Will be updated according to actual number of layers
BUTTON_SHAPE_NO_FRAME, BUTTON_SHAPE_NO_FRAME,
Button_Layer_select, Button_Layer_select, Button_Layer_select, Button_Layer_toggle,
Do_nothing, Do_nothing,
FAMILY_INSTANT); FAMILY_INSTANT);
// Status bar // Status bar

256
layers.c
View File

@ -26,107 +26,132 @@
#include "engine.h" #include "engine.h"
#include "pages.h" #include "pages.h"
void Layer_activate(short layer, short side)
{
word old_layers;
if (layer >= Main_backups->Pages->Nb_layers)
return;
// Keep a copy of which layers were visible
old_layers = Main_layers_visible;
#ifndef NOLAYERS
if (side == RIGHT_SIDE)
{
// Right-click on current layer
if (Main_current_layer == layer)
{
if (Main_layers_visible == (dword)(1<<layer))
{
// Set all layers visible
Main_layers_visible = 0xFFFFFFFF;
}
else
{
// Set only this one visible
Main_layers_visible = 1<<layer;
}
}
else
{
// Right-click on an other layer : toggle its visibility
Main_layers_visible ^= 1<<layer;
}
}
else
{
// Left-click on any layer
Main_current_layer = layer;
Main_layers_visible |= 1<<layer;
}
#else
// Handler for limited layers support: only allow one visible at a time
if (side == LEFT_SIDE)
{
Main_current_layer = layer;
Main_layers_visible = 1<<layer;
Update_screen_targets();
}
#endif
Hide_cursor();
if (Main_layers_visible != old_layers)
Redraw_layered_image();
else
Update_depth_buffer(); // Only need the depth buffer
//Download_infos_page_main(Main_backups->Pages);
//Download_infos_backup(Main_backups);
Display_all_screen();
Display_layerbar();
Display_cursor();
}
void Button_Layer_add(void) void Button_Layer_add(void)
{ {
// Backup with unchanged layers Hide_cursor();
Backup_layers(0);
if (!Add_layer(Main_backups,Main_current_layer+1)) if (Main_backups->Pages->Nb_layers < 32)
{ {
Update_depth_buffer(); // Backup with unchanged layers
Hide_cursor(); Backup_layers(0);
Display_all_screen(); if (!Add_layer(Main_backups,Main_current_layer+1))
Display_cursor(); {
End_of_modification(); Update_depth_buffer();
Display_all_screen();
Display_layerbar();
End_of_modification();
}
} }
Hide_cursor();
Unselect_button(BUTTON_LAYER_ADD); Unselect_button(BUTTON_LAYER_ADD);
Display_cursor(); Display_cursor();
} }
void Button_Layer_remove(void) void Button_Layer_remove(void)
{ {
// Backup with unchanged layers
Backup_layers(0);
if (!Delete_layer(Main_backups,Main_current_layer))
{
Update_screen_targets();
Redraw_layered_image();
Hide_cursor();
Display_all_screen();
Display_cursor();
End_of_modification();
}
Hide_cursor(); Hide_cursor();
if (Main_backups->Pages->Nb_layers > 1)
{
// Backup with unchanged layers
Backup_layers(0);
if (!Delete_layer(Main_backups,Main_current_layer))
{
Update_screen_targets();
Redraw_layered_image();
Display_all_screen();
Display_layerbar();
End_of_modification();
}
}
Unselect_button(BUTTON_LAYER_REMOVE); Unselect_button(BUTTON_LAYER_REMOVE);
Display_cursor(); Display_cursor();
} }
void Button_Layer_select(void) void Button_Layer_select(void)
{ {
Hide_cursor(); word layer;
Unselect_button(BUTTON_LAYER_SELECT); // Determine which button is clicked according to mouse position
Display_cursor(); layer = (Mouse_X/Menu_factor_X - Menu_bars[MENUBAR_LAYERS].Skin_width)
/ Layer_button_width;
Layer_activate(layer, LEFT_SIDE);
} }
/* void Button_Layer_toggle(void)
void Button_Layer_1(void)
{ {
Hide_cursor(); word layer;
Unselect_button(BUTTON_LAYER_1); // Determine which button is clicked according to mouse position
Display_cursor(); layer = (Mouse_X/Menu_factor_X - Menu_bars[MENUBAR_LAYERS].Skin_width)
/ Layer_button_width;
Layer_activate(layer, RIGHT_SIDE);
} }
void Button_Layer_2(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_2);
Display_cursor();
}
void Button_Layer_3(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_3);
Display_cursor();
}
void Button_Layer_4(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_4);
Display_cursor();
}
void Button_Layer_5(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_5);
Display_cursor();
}
void Button_Layer_6(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_6);
Display_cursor();
}
void Button_Layer_7(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_7);
Display_cursor();
}
void Button_Layer_8(void)
{
Hide_cursor();
Unselect_button(BUTTON_LAYER_8);
Display_cursor();
}
*/
void Button_Layer_menu(void) void Button_Layer_menu(void)
{ {
Hide_cursor(); Hide_cursor();
@ -136,25 +161,27 @@ void Button_Layer_menu(void)
void Button_Layer_color(void) void Button_Layer_color(void)
{ {
Hide_cursor();
if (Main_backups->Pages->Transparent_color != Back_color) if (Main_backups->Pages->Transparent_color != Back_color)
{ {
Backup_layers(-1); Backup_layers(-1);
Main_backups->Pages->Transparent_color = Back_color; Main_backups->Pages->Transparent_color = Back_color;
Redraw_layered_image(); Redraw_layered_image();
Hide_cursor();
Display_all_screen(); Display_all_screen();
Display_cursor(); Display_cursor();
End_of_modification(); End_of_modification();
} }
Hide_cursor();
Unselect_button(BUTTON_LAYER_COLOR); Unselect_button(BUTTON_LAYER_COLOR);
Display_cursor(); Display_cursor();
} }
void Button_Layer_merge(void) void Button_Layer_merge(void)
{ {
Hide_cursor();
if (Main_current_layer>0) if (Main_current_layer>0)
{ {
// Backup layer below the current // Backup layer below the current
@ -164,58 +191,58 @@ void Button_Layer_merge(void)
Update_screen_targets(); Update_screen_targets();
Redraw_layered_image(); Redraw_layered_image();
Hide_cursor();
Display_all_screen(); Display_all_screen();
Display_cursor(); Display_layerbar();
End_of_modification(); End_of_modification();
} }
Hide_cursor();
Unselect_button(BUTTON_LAYER_MERGE); Unselect_button(BUTTON_LAYER_MERGE);
Display_cursor(); Display_cursor();
} }
void Button_Layer_up(void) void Button_Layer_up(void)
{ {
Hide_cursor();
if (Main_current_layer < (Main_backups->Pages->Nb_layers-1)) if (Main_current_layer < (Main_backups->Pages->Nb_layers-1))
{ {
byte * tmp; byte * tmp;
dword layer_flags; dword layer_flags;
// Backup with unchanged layers // Backup with unchanged layers
Backup_layers(0); Backup_layers(0);
// swap // swap
tmp = Main_backups->Pages->Image[Main_current_layer]; tmp = Main_backups->Pages->Image[Main_current_layer];
Main_backups->Pages->Image[Main_current_layer] = Main_backups->Pages->Image[Main_current_layer+1]; Main_backups->Pages->Image[Main_current_layer] = Main_backups->Pages->Image[Main_current_layer+1];
Main_backups->Pages->Image[Main_current_layer+1] = tmp; Main_backups->Pages->Image[Main_current_layer+1] = tmp;
// Swap visibility indicators // Swap visibility indicators
layer_flags = (Main_layers_visible >> Main_current_layer) & 3; layer_flags = (Main_layers_visible >> Main_current_layer) & 3;
// Only needed if they are different. // Only needed if they are different.
if (layer_flags == 1 || layer_flags == 2) if (layer_flags == 1 || layer_flags == 2)
{ {
// One is on, the other is off. Negating them will // One is on, the other is off. Negating them will
// perform the swap. // perform the swap.
Main_layers_visible ^= (3 << Main_current_layer); Main_layers_visible ^= (3 << Main_current_layer);
} }
Main_current_layer++; Main_current_layer++;
Update_screen_targets(); Update_screen_targets();
Redraw_layered_image(); Redraw_layered_image();
Hide_cursor(); Display_all_screen();
Display_all_screen(); Display_layerbar();
Display_cursor(); End_of_modification();
End_of_modification();
} }
Hide_cursor();
Unselect_button(BUTTON_LAYER_UP); Unselect_button(BUTTON_LAYER_UP);
Display_cursor(); Display_cursor();
} }
void Button_Layer_down(void) void Button_Layer_down(void)
{ {
Hide_cursor();
if (Main_current_layer > 0) if (Main_current_layer > 0)
{ {
byte * tmp; byte * tmp;
@ -242,12 +269,11 @@ void Button_Layer_down(void)
Main_current_layer--; Main_current_layer--;
Update_screen_targets(); Update_screen_targets();
Redraw_layered_image(); Redraw_layered_image();
Hide_cursor(); Display_layerbar();
Display_all_screen(); Display_all_screen();
Display_cursor();
End_of_modification(); End_of_modification();
} }
Hide_cursor();
Unselect_button(BUTTON_LAYER_DOWN); Unselect_button(BUTTON_LAYER_DOWN);
Display_cursor(); Display_cursor();
} }

View File

@ -22,20 +22,13 @@
void Button_Layer_add(void); void Button_Layer_add(void);
void Button_Layer_remove(void); void Button_Layer_remove(void);
/*
void Button_Layer_1(void);
void Button_Layer_2(void);
void Button_Layer_3(void);
void Button_Layer_4(void);
void Button_Layer_5(void);
void Button_Layer_6(void);
void Button_Layer_7(void);
void Button_Layer_8(void);
*/
void Button_Layer_menu(void); void Button_Layer_menu(void);
void Button_Layer_color(void); void Button_Layer_color(void);
void Button_Layer_merge(void); void Button_Layer_merge(void);
void Button_Layer_up(void); void Button_Layer_up(void);
void Button_Layer_down(void); void Button_Layer_down(void);
void Button_Layer_select(void); void Button_Layer_select(void);
void Button_Layer_toggle(void);
void Layer_activate(short layer, short side);

View File

@ -469,65 +469,4 @@ void Transparency_set(byte amount)
Compute_colorize_table(); Compute_colorize_table();
} }
void Layer_activate(short layer, short side)
{
word old_layers;
if (layer >= Main_backups->Pages->Nb_layers)
return;
// Keep a copy of which layers were visible
old_layers = Main_layers_visible;
#ifndef NOLAYERS
if (side == RIGHT_SIDE)
{
// Right-click on current layer
if (Main_current_layer == layer)
{
if (Main_layers_visible == (dword)(1<<layer))
{
// Set all layers visible
Main_layers_visible = 0xFFFFFFFF;
}
else
{
// Set only this one visible
Main_layers_visible = 1<<layer;
}
}
else
{
// Right-click on an other layer : toggle its visibility
Main_layers_visible ^= 1<<layer;
}
}
else
{
// Left-click on any layer
Main_current_layer = layer;
Main_layers_visible |= 1<<layer;
}
#else
// Handler for limited layers support: only allow one visible at a time
if (side == LEFT_SIDE)
{
Main_current_layer = layer;
Main_layers_visible = 1<<layer;
Update_screen_targets();
}
#endif
Hide_cursor();
if (Main_layers_visible != old_layers)
Redraw_layered_image();
else
Update_depth_buffer(); // Only need the depth buffer
//Download_infos_page_main(Main_backups->Pages);
//Download_infos_backup(Main_backups);
Display_all_screen();
Display_cursor();
}

View File

@ -39,6 +39,9 @@
#include "readline.h" #include "readline.h"
#include "sdlscreen.h" #include "sdlscreen.h"
/// Width of one layer button, in pixels before scaling
word Layer_button_width = 1;
// L'encapsulation tente une percée...ou un dernier combat. // L'encapsulation tente une percée...ou un dernier combat.
// Nombre de cellules réel dans la palette du menu // Nombre de cellules réel dans la palette du menu
@ -420,6 +423,18 @@ int Pick_color_in_palette()
return color; return color;
} }
/// Draws a solid textured area, to the right of a toolbar.
void Draw_bar_remainder(word current_menu, word x_off, word y_off)
{
word y_pos;
word x_pos;
for (y_pos=0;y_pos<Menu_bars[current_menu].Height;y_pos++)
for (x_pos=x_off;x_pos<Screen_width/Menu_factor_X;x_pos++)
Pixel_in_menu(x_pos, y_pos + y_off, Menu_bars[current_menu].Skin[y_pos * Menu_bars[current_menu].Skin_width + Menu_bars[current_menu].Skin_width - 2 + (x_pos&1)]);
}
/// Display / update the layer menubar /// Display / update the layer menubar
void Display_layerbar(void) void Display_layerbar(void)
{ {
@ -446,6 +461,9 @@ void Display_layerbar(void)
// Don't display all buttons if not enough room // Don't display all buttons if not enough room
if (horiz_space/button_width < button_number) if (horiz_space/button_width < button_number)
button_number = horiz_space/button_width; button_number = horiz_space/button_width;
// Only 16 icons at the moment
if (button_number > 16)
button_number = 16;
// Enlarge the buttons themselves if there's enough room // Enlarge the buttons themselves if there's enough room
while (button_number*(button_width+2) < horiz_space && repeats < 20) while (button_number*(button_width+2) < horiz_space && repeats < 20)
@ -494,8 +512,22 @@ void Display_layerbar(void)
// Next button // Next button
x_off+=button_width; x_off+=button_width;
} }
// Texture any remaining space to the right.
// This overwrites any junk like deleted buttons.
Draw_bar_remainder(MENUBAR_LAYERS, x_off, y_off);
// Update the active area of the layers pseudo-button // Update the active area of the layers pseudo-button
Buttons_Pool[BUTTON_LAYER_SELECT].Width = button_number * button_width; Buttons_Pool[BUTTON_LAYER_SELECT].Width = button_number * button_width;
// Required to determine which layer button is clicked
Layer_button_width = button_width;
// A screen refresh required by some callers
Update_rect(
Menu_bars[MENUBAR_LAYERS].Skin_width,
Menu_Y+y_off*Menu_factor_Y,
horiz_space*Menu_factor_X,
Menu_bars[MENUBAR_LAYERS].Height*Menu_factor_Y);
} }
@ -520,14 +552,18 @@ void Display_menu(void)
for (x_pos=0;x_pos<Menu_bars[current_menu].Skin_width;x_pos++) for (x_pos=0;x_pos<Menu_bars[current_menu].Skin_width;x_pos++)
Pixel_in_menu(x_pos, y_pos + y_off, Menu_bars[current_menu].Skin[y_pos * Menu_bars[current_menu].Skin_width + x_pos]); Pixel_in_menu(x_pos, y_pos + y_off, Menu_bars[current_menu].Skin[y_pos * Menu_bars[current_menu].Skin_width + x_pos]);
// If some area is remaining to the right, texture it with a copy of
// the last two columns
for (y_pos=0;y_pos<Menu_bars[current_menu].Height;y_pos++)
for (x_pos=Menu_bars[current_menu].Skin_width;x_pos<Screen_width/Menu_factor_X;x_pos++)
Pixel_in_menu(x_pos, y_pos + y_off, Menu_bars[current_menu].Skin[y_pos * Menu_bars[current_menu].Skin_width + Menu_bars[current_menu].Skin_width - 2 + (x_pos&1)]);
if (current_menu == MENUBAR_LAYERS) if (current_menu == MENUBAR_LAYERS)
{
// The layerbar has its own display, for the whole length.
Display_layerbar(); Display_layerbar();
}
else
{
// If some area is remaining to the right, texture it with a copy of
// the last two columns
Draw_bar_remainder(current_menu, Menu_bars[current_menu].Skin_width, y_off);
}
// Next bar // Next bar
y_off += Menu_bars[current_menu].Height; y_off += Menu_bars[current_menu].Height;
} }

View File

@ -56,6 +56,7 @@ void Set_back_color(byte color);
void Frame_menu_color(byte id); void Frame_menu_color(byte id);
void Display_menu_palette(void); void Display_menu_palette(void);
void Display_menu(void); void Display_menu(void);
void Display_layerbar(void);
void Reposition_palette(void); void Reposition_palette(void);
void Change_palette_cells(void); void Change_palette_cells(void);
int Pick_color_in_palette(void); int Pick_color_in_palette(void);
@ -102,4 +103,7 @@ void Vertical_XOR_line_zoom(short x_pos, short y_pos, short height);
void Change_magnifier_factor(byte factor_index); void Change_magnifier_factor(byte factor_index);
/// Width of one layer button, in pixels before scaling
extern word Layer_button_width;
#endif #endif